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