我处于以下情况:
- JSF(MyFaces 2.1.7 和 RichFaces 3.3.3)
- 一个会话作用域 Bean TEST_PAGE
- 使用 BACK 按钮的用户没有尽头
- 服务器上的状态保存
设想:
- 用户单击链接以导航到具有 Session Scoped bean (TEST_PAGE) 的页面
- 用户点击另一个链接
- 用户按下浏览器的后退按钮,将它们放回 TEST_PAGE
- 用户尝试在此页面中搜索
在搜索时,支持 bean 会抛出异常,因为有很多null
值。原因是当他们按下“搜索”时,页面处于RESTORE_VIEW
同步状态。
我尝试在页面上禁用缓存,以强制用户在返回按钮上刷新页面,但是由于许多用户抱怨“为什么我不能使用返回按钮,我以前可以这样做!”而引起强烈反对。并导致帮助台票,因为他们认为应用程序在“确认表单重新提交”页面 chrome/IE/Firefox 显示上崩溃,因此经理希望我寻找替代方案。
我的问题:
可以检测 RESTORE_VIEW 的当前 Phase_ID 并且在此阶段不进行任何处理以避免异常,但仅此一项且仅重新调整即可为用户提供部分页面视图。是否可以在这种情况下将页面放入RENDER_RESPONSE
然后进行处理?这应该刷新页面。
问题第 2 部分
由于建议(或常见/好的)实践是禁用动态页面上的缓存,我已经这样做了,并且必须重新教育顽固的用户。
但是我有以下问题。
在禁用缓存的页面上按返回按钮时,浏览器会显示“确认表单重新提交”(chrome),用户可以在其中按下Refresh / F5
或Enter
键。
如果Refresh/ F5
是该动作,那么在我检测RESTORE_VIEW
阶段并避免在该阶段进行任何处理并让处理分阶段完成的情况下,一切都很好RENDER_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>
我在网上看到faces-redirect=true
了用于强制重新加载页面的代码片段,但我无法让它工作!有什么建议么?