2010-04-21 66 views
2

我在用作portlet的一些facelets(我在這裏使用Jboss Portlet Bridge 2.0)中使用帶有Richfaces(3.3.2)的JSF(Mojarra 1.2)。現在我正面臨着一些奇怪的事情:我的<h:commandButton>上有一個actionlistener,它被觸發,當點擊按鈕時,但當我簡單地重新加載頁面時,每次我再次加載頁面時都會執行該操作。只有在我之前已經觸發過此動作時纔會發生這種情況這種行爲是否正常?JSF,facelets的actionlistener

我應該注意到Spring 2.5被用來管理我的bean,上面提到的bean是會話範圍的bean,也許這是一個互動點?!

回答

3

是的,重新加載HTTP POST請求將再次執行HTTP POST請求,從而再次觸發所有關聯的服務器端操作。這個問題通常會影響所有的Web應用程序,並不是與JSF相關的。

衆所周知的修復方法是POST-Redirect-GET (PRG) pattern。基本上,您需要在處理操作後立即將POST請求重定向到GET請求,以便通過HTTP GET請求傳遞結果頁面。刷新此HTTP GET請求不會再執行初始HTTP POST請求。

然而,這種模式有一個警告:因爲它涉及一個全新的請求,所有請求範圍的bean在新的請求中被垃圾回收和更新。因此,如果您希望將數據保留在新請求中,則需要將它們作爲GET參數傳遞或將其存儲在會話範圍中。通常只需在bean的構造函數中重新加載數據就足夠了。但是,既然你提到只使用會話作用域的bean(但這不是最佳實踐,但這不在話下),這不應該成爲你的重大關注點。

開啓在JSF PRG是比較容易的,只是下面的條目添加到相關<navigation-case>

<redirect /> 

或者如果你喜歡以編程方式啓動它,然後進行bean的操作方法使用的ExternalContext#redirect()

public void submit(ActionEvent event) { 
    // ... 
    FacesContext.getCurrentInstance().getExternalContext().redirect(someURL); 
} 
+0

感謝您的回覆BalusC - 但如果我只是切換到另一portlet頁面並回到我的JSF的Portlet下,仍保持在會話bean對象後,再過於執行的操作。如果我不完全錯誤,這不應該發生或我錯了嗎? – onigunn 2010-04-21 21:40:41

+0

注意:我在這裏只使用會話範圍的bean,因爲它很適合我的小portlet,它只顯示一點點數據。那麼我在說複數,它是唯一一個帶有一個支持bean的JSF頁面。 – onigunn 2010-04-21 21:42:56

+0

你實施了''嗎? – BalusC 2010-04-21 21:44:15