1
我需要一種方法來管理DataTable中的命令鏈接ID的創建,問題是,當我用它來刪除記錄並中斷頁面的呈現(通過' ctrl + f5')它將相同的id分配給另一個鏈接按鈕,這會導致刪除包含它的行。通過我的代碼在數據表中更改commandLink Id
我需要一種方法來管理DataTable中的命令鏈接ID的創建,問題是,當我用它來刪除記錄並中斷頁面的呈現(通過' ctrl + f5')它將相同的id分配給另一個鏈接按鈕,這會導致刪除包含它的行。通過我的代碼在數據表中更改commandLink Id
問題的癥結在於,但所要求的解決方案並非正確,並且在JSF —中不容易實現,您需要自制一個自定義命令鏈接渲染器,該渲染器專爲在數據表中的使用而設計並能夠識別具體實體。
正確的解決辦法是發送一個redirect to the same view after POST。
public String delete() {
// ...
return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true"; // Feel free to hardcode the view ID, though.
}
(如果你打算沿着這顯示一些面消息,use the flash scope)
然後刷新瀏覽器將導致只重定向被刷新,而不是POST操作。
另一種方法是通過ajax提交。
<h:commandLink ...>
<f:ajax execute="@form" render="@form" />
</h:commandLink>
然後瀏覽器刷新只會重新執行最後一個同步請求,這將是打開相關頁面的初始GET請求。
這是偉大的,解決了這個問題,但我可能需要很多工作來適應我的代碼,有沒有什麼辦法可以清除請求標頭,或任何攜帶行動信息? – 2013-04-10 10:56:50
不客氣。不,您無法清除已發送的請求。你只能告訴客戶發送一個新的和冪等的請求。這基本上就是重定向所做的迴應。沒有魔力。只需咬緊牙關,在適用的情況下修復當前的應用程序,並從未來Web項目中學到的基本Web開發經驗中獲益。請注意,這個問題不是特定於JSF,而是一般的Web開發。 – BalusC 2013-04-10 10:59:20
好,再次感謝你,你真的幫了我很多 – 2013-04-10 11:15:32