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

时间:2011-10-21 14:24:22

标签: jsf-2

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

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

为了更清楚我面临的问题是我是commandLink从datatable中删除一个资源,我使用actionlistener属性调用我的backingbean中的一个方法,所以问题是我何时刷新页面操作事件获取已执行,并执行从表中删除其他资源的方法。提前致谢

1 个答案:

答案 0 :(得分: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";
}

如果您仍在<navigation-case>中使用旧式faces-config.xml,则可以通过向案例中添加<redirect/>来实现相同的效果。

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