Jsf 处理后退按钮和生成的阶段ID
我的情况如下:Jsf 处理后退按钮和生成的阶段ID,jsf,jsf-2,Jsf,Jsf 2,我的情况如下: JSF(MyFaces 2.1.7和RichFaces 3.3.3) 会话范围的Bean测试页面 将使用“后退”按钮到终点的用户 服务器上的状态保存 情景: 用户单击链接导航到具有会话范围bean的页面(测试页面) 用户单击另一个链接 用户按下brwoser的“后退”按钮,将其放回测试页面 用户尝试在此页面中搜索 在搜索时,支持bean抛出异常,因为存在许多null值。原因是当他们按下“搜索”时,页面处于RESTORE\u VIEW阶段 我曾尝试禁用页面缓存,强迫用户在“后退
- 用户单击链接导航到具有会话范围bean的页面(测试页面)
- 用户单击另一个链接
- 用户按下brwoser的“后退”按钮,将其放回测试页面
- 用户尝试在此页面中搜索
null
值。原因是当他们按下“搜索”时,页面处于RESTORE\u VIEW
阶段
我曾尝试禁用页面缓存,强迫用户在“后退”按钮上刷新页面,但由于许多用户抱怨“为什么我不能使用后退按钮,我以前可以这么做!”而引起强烈反弹,并导致求助台收到通知单,因为他们认为应用程序在“确认表单重新提交”页面chrome/IE/Firefox上崩溃,因此,经理们希望我寻找替代方案
我的问题是:
可以检测RESTORE_VIEW的当前阶段ID,而不在此阶段进行任何处理以避免异常,但仅通过重新调整即可为用户提供部分页面视图。在这种情况下,是否可以将页面置于RENDER\u RESPONSE
中,然后进行处理?这将刷新页面
问题第2部分
由于建议(或通用/良好)做法是禁用动态页面上的缓存,因此我已经这样做了,并将不得不重新教育顽固的用户
然而,我有以下问题
在禁用缓存的页面上按后退按钮时,浏览器显示“确认表单重新提交”(chrome),用户可以按Refresh/F5
或Enter
键
如果操作是Refresh/F5
,则在检测RESTORE\u VIEW
阶段时一切正常,避免在该阶段进行任何处理,并让处理在RENDER\u RESPONSE
阶段完成。但是,如果按下Enter键,则PhaseID处于RENDER_RESPONSE(6)中,但少数下拉控件的值为null,从而导致页面失败。因此,我通过检查来检测这种情况,并显示一条FaceMessage来告诉用户刷新页面
问题是,我是否可以强制页面刷新,而不是强制用户刷新?此页面的导航案例的格式为:
<navigation-rule>
<navigation-case>
<from-outcome>/app/ord/r1</from-outcome>
<to-view-id>/jsp/ordersHistory.jsp</to-view-id>
</navigation-case>
</navigation-rule>
/app/ord/r1
/jsp/ordersHistory.jsp
我在网上看到过一些代码片段,其中
faces redirect=true
用于强制重新加载页面,但我无法让它工作!有什么建议吗?在动态页面上禁用浏览器缓存是一种方法
至于此后出现的新问题,很可能是由于webapp设计不好造成的。重新设计您的Web应用程序,以使用GET而不是POST进行普通的页到页导航(即仅使用
或
而不是
)。为需要将响应发送到不同页面的POST请求实现POST Redirect GET模式,或者将它们更改为返回到同一页面并有条件地显示结果(如果可能的话,通过ajax)。检查是否有些表单最好是GET表单(例如,像Google这样的搜索表单)。重新考虑一下,如果该bean真的需要是会话范围的bean,那么您通常只将会话范围用于登录用户及其首选项,而不用于请求或查看范围的数据
另见:
或
而不是
)。为需要将响应发送到不同页面的POST请求实现POST Redirect GET模式,或者将它们更改为返回到同一页面并有条件地显示结果(如果可能的话,通过ajax)。检查是否有些表单最好是GET表单(例如,像Google这样的搜索表单)。重新考虑一下,如果该bean真的需要是会话范围的bean,那么您通常只将会话范围用于登录用户及其首选项,而不用于请求或查看范围的数据
另见:
。感谢您的评论。我将禁用动态页面的缓存,否则结果是不可预测的。我更新了问题并添加了相关的第2部分。您可以发表意见吗?请参阅“如何避免在刷新页面时重新执行上次表单提交操作?”链接中的答案。添加一个
。