2009-10-28 69 views
4

我有一個wicket web應用程序,並且頁面安裝了可加入書籤的別名。該頁面包含一個包含提交操作的表單對象。如何控制Wicket窗體中的提交url操作?

問題是,儘管表單屬於頁面,但動作url不包含頁面別名,而是以隱藏形式引用了wicket動作。 有沒有辦法調整這種行爲,所以鏈接將會像page_alias /提交

... 
setRenderStrategy(IRequestCycleSettings.ONE_PASS_RENDER); 
mountBookmarkablePage("/resetpwd", ResetPasswordPage.class); 
... 
public ResetPasswordPage(final String id, final PageParameters parameters) { 
    final Form form = new StatelessForm(); 
    form.add(new Button("submit") { 
    public void onSubmit() { 
     ... 
     }); 
add(form); 

回答

1

您可以通過使用HybridUrlCodingStrategy像這樣隱藏了很多的要求魔神的:

mount(new HybridUrlCodingStrategy("/resetpwd", ResetPasswordPage.class)); 

然後,當點擊提交,假設你不重定向到一個新的頁面,網址將從

mysite.com/DocRoot/resetpwd

改變

mysite.com/DocRoot/resetpwd.1

,或者如果你真的希望它是mysite.com/DocRoot/resetpwd/submit你可以創建一個新的可收藏頁面,說ResetPasswordResult.class,設置您的響應頁面,這一點,在「/ RESETPWD /提交」

你可以看看其他的編碼策略,看看他們是另一種更適合你安裝它: http://cwiki.apache.org/WICKET/url-coding-strategies.html

+0

我認爲這略低於這一點。表單的'action'默認情況下不會使用它周圍頁面的漂亮url,而只是一些Wicket參數來檢索序列化表單實例並調用它的'onSubmit'處理程序,儘管那樣可能會重定向到一個漂亮的URL 。 – 2011-07-19 14:29:58

3

如果您將子類StatelessForm而不是Form,這將帶你的一部分。而不是像

行動= 「的myapp /檢票:界面= 1:eventEditor :: IFormSubmitListener ::」

包含表單的頁面安裝在書籤的網址,你會得到類似的東西,例如,

行動= 「的myapp /安裝/路徑/一些/ PARAMS /檢票:界面= 0:eventEditor :: IFormSubmitListener ::」

這用來安裝一個MixedParamUrlCodingStrategyWebApplication.init()

然後,您可以覆蓋encodeUrlInHiddenFields()返回true,這將給你在action屬性乾淨的URL。

但是,所有這些並沒有真正改變Wicket使用窗體的方式。即,客戶的標記中仍然存在一些Wicket特定的狀態數據。我相信這是如此困難的原因在於Wicket旨在幫助您構建一個具有狀態的Web應用程序。我注意到Wicket在幕後做了很多事情(比如提交的表單值與模型的getter返回值之間的比較),我知道當裁剪出來時我很少感到舒適。

儘管您可以使用Wicket來提供REST風格的Web服務,如this blog post中所述。還有一個project on Google code called wicket-rest擴展了這個想法。請注意,這看起來像它一樣簡單,因爲它從不使用整個基於組件的UI構建。

寫了this post的那個人有一個不同的問題,但它幫助我理解Wicket反正變得好一點。

+0

我試過這個解決方案,但是如果我重寫encodeUrlInHiddenFields(),Wicket實際上並沒有在單擊表單按鈕時調用我的onSubmit()方法。如果我再次評論該方法,表單工作正常。關於encoreUrlInHiddenFields()和StatelessForm的組合似乎並不奏效(可能它們只是不兼容)。 – Trejkaz 2012-04-16 05:08:30

+0

@Trejkaz基於我做過的一些調試,請求處理程序因'AbstractBookmarkableMapper#mapRequest '而且這個原因似乎又回到了頁面安裝上。一些邏輯可能需要在安裝類中更改以完全允許像這樣的覆蓋。 – rveach 2018-02-13 02:31:22