2014-04-25 35 views
14

我們在WebSphere V8.5使用JSF 2.0與幾個組件庫PrimeFaces 4.0,戰斧2.0,RichFaces的,等純Java/JSF實現雙提交預防

我找了通用的機制,以避免形式刷新頁面時重新提交,或再次單擊提交按鈕時。我有許多不同場景的應用程序。

現在我已經考慮用onclick屬性中的一段JavaScript禁用按鈕,但這並不令人滿意。我正在爲此尋找一個純Java實現,就像Struts2 <s:token>一樣。

+0

阿賈克斯是否來過的形式重新提交問題?因爲只有頁面的一部分呈現,而不是整個頁面或重定向 – Sarz

+0

禁用onClick事件可能不會被sufissiant延時定時器需要做的伎倆 –

+0

是@NassimMOUALEK我實現按鈕的禁用,直到阿賈克斯完成渲染 – Sarz

回答

17

我找的通用機制避免頁面刷新時重新提交表格

對於有至少2個解決方案,不能組合:

  1. 執行後同步交重定向。這樣刷新只會重新執行重定向的GET請求,而不是初始請求。缺點:您無法再使用請求範圍來向最終用戶提供任何反饋。 JSF 2.0通過提供新的flash scope解決了這個問題。另見How to show faces message in the redirected page

  2. 在後臺異步執行POST(使用ajax)。這樣刷新只會重新執行打開表單的初始GET請求。您只需確保這些表單最初僅通過GET請求打開,即,您絕不應該通過POST執行頁面到頁面導航(無論如何,這本身就是一個糟糕的設計)。另請參見When should I use h:outputLink instead of h:commandLink?


或當提交按鈕被再次點擊

對於有也基本上至少2解決方案,必要時可結合使用:

  1. Just block t他最終用戶無法在提交期間和/或成功提交後按下提交按鈕。這有多種方法,全部取決於具體的功能和設計要求。您可以在提交期間使用JavaScript來禁用按鈕。您可以在提交後使用JSF的disabledrendered屬性來禁用或隱藏按鈕。另請參閱How to do double-click prevention in JSF 2。您還可以在處理ajax請求期間使用覆蓋窗口來阻止任何最終用戶交互。PrimeFaces有<p:blockUI>的目的。在服務器側的新添加實體的

  2. 驗證唯一性。如果您出於技術原因而不是出於功能原因絕對要避免重複,則這種方法更加穩健。這很簡單:在有問題的數據庫列上輸入UNIQUE約束。如果違反了這個約束,那麼DB(和JPA等數據庫交互框架)將拋出違反約束的異常。這最好是與定製的JSF驗證器結合使用,該驗證器通過在該列上執行SELECT並檢查是否沒有記錄返回來預先驗證輸入。 JSF驗證器允許您以友好的面孔消息的風格顯示問題。另請參閱Validate email format and uniqueness against DB

+0

布拉沃@BalusC非常有效點 – Sarz

+0

我使用''各種形式的我的應用程序,這'FlashScope'事情說成'重定向/ reload'頁。我如何解決這個問題? – Sarz

+0

在「另請參見」鏈接中有一個示例。 – BalusC

3

您可以使用BalusC的解決方案來代替手動創建令牌。他his blog提出後重定向-GET模式

替代解決方案,可以在這些答案中找到:

+0

當我在h將:現在的commandButton它不是重新提交表單。它是否完全滿足要求? – Sarz

+0

這已經由IT – Sarz

+0

的問題是更高的管理拒絕我們需要雙提交根據我們的場景中啓用和禁用。 – Sarz