Jsf 2 如何避免在刷新页面时重新执行上次表单提交操作?
我正在从事用JSF开发的项目。每当我们刷新JSF页面时,就会重新执行最后一个操作事件。例如,当我提交表单以删除列表中的一个条目并刷新结果页面时,同一位置的列表中的另一个条目也会被删除。这是如何造成的,我如何解决 我在faces-config.xml中进行了尝试,但这并不能解决我的问题Jsf 2 如何避免在刷新页面时重新执行上次表单提交操作?,jsf-2,Jsf 2,我正在从事用JSF开发的项目。每当我们刷新JSF页面时,就会重新执行最后一个操作事件。例如,当我提交表单以删除列表中的一个条目并刷新结果页面时,同一位置的列表中的另一个条目也会被删除。这是如何造成的,我如何解决 我在faces-config.xml中进行了尝试,但这并不能解决我的问题 为了更清楚地了解我所面临的问题,我使用commandLink从datatable中删除一个资源,我使用actionlistener属性调用backingbean中的一个方法,所以问题是当我刷新页面操作事件时,执行从
为了更清楚地了解我所面临的问题,我使用commandLink从datatable中删除一个资源,我使用actionlistener属性调用backingbean中的一个方法,所以问题是当我刷新页面操作事件时,执行从表中删除另一个资源的方法。提前感谢症状表明页面是由POST请求请求的,并且您忽略了webbrowser的警告,即刷新请求时将重新发送数据。刷新POST请求当然会导致它被重新执行。这不是JSF特有的问题 常见的解决方案是在执行POST请求后向GET请求发送重定向。这样,客户端将在浏览器视图中得到GET请求。刷新它只会重新执行GET请求,而GET请求不会(不应该)修改任何内容(除非您在与视图关联的请求范围bean的构造函数中执行此操作)。这也称为模式 使用JSF2.0,您可以通过简单地将
faces redirect=true
参数添加到bean操作的结果中来实现这一点
public String submit() {
// ...
return "viewid?faces-redirect=true";
}
如果您仍然在faces config.xml
中使用老式的
s,则可以通过将
添加到案例中来实现相同的效果
唯一的缺点是请求范围内的bean以这种方式被破坏(重定向基本上指示webbrowser创建一个全新的请求),因此您无法在请求范围内传递数据以便在重定向页面中重新显示它。例如,显示成功消息。在JSF2.0中,您可以使用flash scope来实现这一点,或者通过
submit而不是普通的submit来发布帖子。每次我看到这样的答案时,我都觉得“手册”中有很大一部分我本应该读但没有读过@BalusC您是否碰巧有一个链接,指向应用于action方法返回值的所有规则?这是我第一次听说faces重定向参数。还有哪些其他参数是可能的?我怀疑有什么有用的东西我不知道。@Alan:这个特殊的模式(PRG模式)是关于HTTP和WebBrowser如何工作的一般web开发知识和理解。至于支持的特殊操作参数,另一个是includeViewParams=true
。这包括当前视图的所有声明的
,作为结果目标的请求参数。我是从阅读博客/文档/资源中学到的。JavaEE6教程中也提到了它。在一本像样的JSF2.0书中也应该提到它,比如和。@BalusC我也有同样的问题,只是我有一个数据表,可以在其中对行执行CRUD。刷新页面时,将再次提交最后一个操作。我如何解决它?我没有提交按钮?正如回答的那样,使用PRG或ajax。你能详细说明一下吗?如何将ajax绑定到重新加载?