是的,重新加載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);
}
感謝您的回覆BalusC - 但如果我只是切換到另一portlet頁面並回到我的JSF的Portlet下,仍保持在會話bean對象後,再過於執行的操作。如果我不完全錯誤,這不應該發生或我錯了嗎? – onigunn 2010-04-21 21:40:41
注意:我在這裏只使用會話範圍的bean,因爲它很適合我的小portlet,它只顯示一點點數據。那麼我在說複數,它是唯一一個帶有一個支持bean的JSF頁面。 – onigunn 2010-04-21 21:42:56
你實施了' '嗎? –
BalusC
2010-04-21 21:44:15