我正在从事用 JSF 开发的项目。每当我们刷新 JSF 页面时,就会重新执行最后一个操作事件。例如,当我提交表单以删除列表的条目并刷新结果页面时,列表中同一位置的另一个条目也会被删除。这是如何引起的以及如何解决?
我在 faces-config.xml 中尝试过,但这并不能解决我的问题,
为了更清楚地了解我面临的问题是,我使用 commandLink 从数据表中删除一项资源,我正在使用 actionlistener 属性,该属性调用我的 backingbean 中的一种方法,所以问题是当我刷新发生页面操作事件和方法时执行后会从表中删除另一个资源。提前致谢
这些症状表明该页面是通过 POST 请求请求的,并且您忽略了网络浏览器关于刷新请求时将重新发送数据的警告。刷新 POST 请求当然会导致它被重新执行。这不是 JSF 特有的问题。
常见的解决方案是在执行 POST 请求后发送重定向到 GET 请求。这样客户端最终将在浏览器视图中收到 GET 请求。刷新此内容将仅重新执行 GET 请求,该请求不会(不应该)修改任何内容(除非您在与视图关联的请求作用域 bean 的构造函数中执行此操作)。这也称为POST-重定向-GET http://en.wikipedia.org/wiki/Post/Redirect/Get图案。
使用 JSF 2.0,您只需添加以下内容即可实现此目的faces-redirect=true
bean 操作结果的参数。
public String submit() {
// ...
return "viewid?faces-redirect=true";
}
如果你还在用老式的<navigation-case>
s in faces-config.xml
,那么添加即可达到相同的效果<redirect/>
到此案。
唯一的缺点是请求作用域的 bean 会以这种方式被垃圾化(重定向基本上指示网络浏览器创建一个全新的请求),因此您无法在请求作用域中传递数据以便在重定向的页面中重新显示它。例如,显示成功消息。在 JSF 2.0 中,您可以使用 flash 作用域来实现此目的,或者只是让 POST 通过<f:ajax>
提交而不是正常的提交。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)