我的处境如下:
TEST_PAGE
上的
设想情况:
用户单击一个链接以导航到具有会话作用域的(TEST_PAGE)
。
在搜索时,backing抛出异常,因为有许多null值。原因是当他们按下“搜索”时,页面处于RESTORE_VIEW阶段。
我试着禁用页面上的缓存,以迫使用户刷新“后退”按钮上的页面,但是由于许多用户抱怨“为什么我不能使用后退按钮,我以前可以这样做!”由于他们认为应用程序在“确认表单重新提交”页面chrome/IE/Firefox显示上崩溃,所以经理们想让我寻找替代方案。
我的问题:
可以检测到当前的Phase_ID of RESTORE_VIEW,而不需要在此阶段进行任何处理以避免异常,但仅凭这一点就可以为用户提供部分页面视图。在这个场景中,是否可以将页面放在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来强制重新加载页面,但我无法做到这一点!有什么建议吗?
发布于 2012-06-08 01:35:32
禁用动态页面上的浏览器缓存是可行的方法。
至于在此之后出现的新问题,这很可能是由于网页应用程序设计不佳所致。重新设计您的网页应用程序,使用GET而不是POST进行普通的页面对页导航(即只使用<h:link>或<h:outputLink>而不是<h:commandLink>)。实现POST请求的possible模式,它需要将响应发送到不同的页面,或者将它们更改为返回到相同的页面,并在可能的情况下通过ajax有条件地显示结果。检查某些表单是否最好是获取表单(例如,像Google这样的搜索表单)。重新考虑这个bean是否真的需要是会话作用域的bean,通常只对登录用户和它的首选项使用会话范围,而不是对请求或查看作用域的数据。
另请参阅:
https://stackoverflow.com/questions/10941664
复制相似问题