2011-10-21 29 views
8

我正在開發JSF開發的項目。無論何時刷新JSF頁面,都會重新執行最後一個操作事件。例如,當我提交表單以刪除列表條目並刷新結果頁面時,同樣位置的列表中的另一個條目也會被刪除。這是如何造成的,我該如何解決這個問題?如何避免頁面刷新時重新執行上次表單提交操作?

我曾嘗試在faces-config.xml中,但這並不解決我的問題,

要獲得更清晰的問題,我現在面臨的是,我commandLink來,我使用的ActionListener從數據表中刪除一個資源屬性,它調用了我的backingbean中的一個方法,所以問題是當我刷新正在發生的頁面操作事件並執行從表中移除另一個資源的方法時。提前致謝

回答

18

症狀表明頁面是由POST請求請求的,並且您忽略了瀏覽器的警告,即在刷新請求時數據將被重新發送。刷新POST請求當然會導致它被重新執行。這不是JSF特定的問題。

通常的解決方案是在執行POST請求後發送重定向到GET請求。這樣客戶端將最終在瀏覽器視圖中獲得GET請求。刷新這個只會重新執行GET請求,它不會(不應該)修改任何東西(除非您在與視圖關聯的請求作用域bean的構造函數中執行此操作)。這也被稱爲POST-Redirect-GET模式。

使用JSF 2.0,只需將faces-redirect=true參數添加到bean操作的結果中即可實現此目的。

public String submit() { 
    // ... 

    return "viewid?faces-redirect=true"; 
} 

如果你仍然在使用faces-config.xml老式<navigation-case> s,則同樣的效果可以通過添加<redirect/>的情況下實現的。

唯一的缺點是請求範圍的bean以這種方式被垃圾回收(重定向基本上指示webbrowser創建一個全新的請求),因此您無法在請求範圍中傳遞數據以便在重定向頁面中重新顯示它。例如,顯示成功消息。在JSF 2.0中,您可以改爲使用Flash範圍,或者僅通過<f:ajax>提交而不是正常提交​​來提交POST。

+0

每當我看到像這樣的答案,我覺得有一大段「手冊」,我應該讀,但沒有。 @BalusC是否碰巧鏈接了所有適用於** action **方法返回值的規則?這是我聽說的第一個** faces-redirect **參數。那裏還有其他什麼參數?我懷疑有些東西可能是我不知道的有用的東西。 – AlanObject

+4

@Alan:這個特定的(PRG模式)是一般網頁開發知識和對HTTP和webbrowsers如何工作的理解。至於支持的特殊操作參數,另一個是'includeViewParams = true'。這包括當前視圖的所有聲明的「」作爲結果目標的請求參數。我通過閱讀博客/文檔/資源瞭解了它。在Java EE 6教程中也提到了它。它還應該在一個體面的JSF 2.0書籍中提及,例如[JSF 2.0:The Complete Reference](http://jsfcompref.com/)和[Core JSF](http://horstmann.com/corejsf/)。 – BalusC

+0

@BalusC我有同樣的問題,只有我有一個數據表,我可以在行上執行CRUD。當我刷新頁面時,最後一個操作再次重新提交。我該如何解決它?我沒有提交按鈕? – giorgimode