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

Moh*_*eef 8 jsf-2

我正在研究JSF开发的项目.每当我们刷新JSF页面时,都会重新执行最后一个动作事件.例如,当我提交表单以删除列表的条目并刷新结果页面时,也会删除同一位置的列表中的另一个条目.这是怎么造成的,我该如何解决?

我已经尝试过faces-config.xml,但这并没有解决我的问题,

为了更清楚我面临的问题是我是commandLink从datatable中删除一个资源,我使用actionlistener属性调用我的backbean中的一个方法,所以问题是什么时候我刷新页面操作事件发生和方法执行从表中删除另一个资源.提前致谢

Bal*_*usC 19

症状表明该页面是POST请求请求的,并且您忽略了Webbrowser的警告,即刷新请求时将重新发送数据.刷新POST请求当然会导致重新执行.这不是JSF特定的问题.

通常的解决方案是在执行POST请求后将重定向发送到GET请求.这样客户端最终会在浏览器视图中获得GET请求.刷新它将只重新执行GET请求,该请求不会(不应该)修改任何内容(除非您在与视图关联的请求范围bean的构造函数中执行此操作).这也称为POST-Redirect-GET模式.

使用JSF 2.0,您只需faces-redirect=true在bean操作的结果中添加参数即可实现此目的.

public String submit() {
    // ...

    return "viewid?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

如果你还在使用老式的<navigation-case>以s faces-config.xml,那么同样的效果可以通过增加实现<redirect/>的情况.

唯一的缺点是请求范围bean以这种方式存在(重定向基本上指示webbrowser创建一个全新的请求),因此您无法在请求范围中传递数据,以便在重定向页面中重新显示它.例如,显示成功消息.在JSF 2.0中,您可以改为使用flash范围,或者通过<f:ajax>提交而不是正常提交​​来进行POST .

  • @Alan:这个特殊的(PRG模式)是一般的Web开发知识和对HTTP和webbrowsers如何工作的理解.至于支持的特殊动作参数,另一个是`includeViewParams = true`.这包括当前视图的所有声明的`<f:viewParam>`作为结果目标的请求参数.我是从阅读博客/文档/资源中学到的.它也在Java EE 6教程中提到过.它应该在一本不错的JSF 2.0书中提到,如[JSF 2.0:完整参考](http://jsfcompref.com/)和[Core JSF](http://horstmann.com/corejsf/). (4认同)