Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 如何避免在刷新页面时重新执行上次表单提交操作?_Jsf 2 - Fatal编程技术网

Jsf 2 如何避免在刷新页面时重新执行上次表单提交操作?

Jsf 2 如何避免在刷新页面时重新执行上次表单提交操作?,jsf-2,Jsf 2,我正在从事用JSF开发的项目。每当我们刷新JSF页面时,就会重新执行最后一个操作事件。例如,当我提交表单以删除列表中的一个条目并刷新结果页面时,同一位置的列表中的另一个条目也会被删除。这是如何造成的,我如何解决 我在faces-config.xml中进行了尝试,但这并不能解决我的问题 为了更清楚地了解我所面临的问题,我使用commandLink从datatable中删除一个资源,我使用actionlistener属性调用backingbean中的一个方法,所以问题是当我刷新页面操作事件时,执行从

我正在从事用JSF开发的项目。每当我们刷新JSF页面时,就会重新执行最后一个操作事件。例如,当我提交表单以删除列表中的一个条目并刷新结果页面时,同一位置的列表中的另一个条目也会被删除。这是如何造成的,我如何解决

我在faces-config.xml中进行了尝试,但这并不能解决我的问题


为了更清楚地了解我所面临的问题,我使用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绑定到重新加载?