我遇到以下情况:
场景:
在搜索时,支持bean会抛出异常,因为有许多null
个值。原因是,当他们按下“搜索”时,页面处于RESTORE_VIEW
阶段。
我尝试在页面上禁用缓存,强制用户刷新后退页面上的页面,但是许多用户抱怨“为什么我不能使用后退按钮,我之前可以做到!”由于他们认为应用程序在“确认表单重新提交”页面chrome / IE / Firefox show中崩溃,导致帮助台门票,因此管理人员希望我寻找替代方案。
我的问题:
可以检测RESTORE_VIEW的当前Phase_ID,而不是在此阶段进行任何处理以避免异常,但仅此一点,只需重新调整即可为用户提供部分页面视图。是否可以在此方案中将页面放在RENDER_RESPONSE
中然后进行处理?这应刷新页面。
由于推荐(或普通/好的)practive是禁用动态页面上的缓存,我已经这样做了,并且必须重新教育顽固的用户。
但是我有以下问题。
当按下禁用缓存页面上的“返回”按钮时,浏览器会显示“确认表单重新提交”(chrome),用户可以按Refresh / F5
或Enter
键。
如果Refresh/ F5
是操作,那么我检测RESTORE_VIEW
阶段并避免在该阶段中进行任何处理并让处理在RENDER_RESPONSE
阶段完成,一切正常。但是,如果按下Enter
,则PhaseID位于RENDER_RESPONSE(6)
中,但是几个下拉控件的值为空,这会导致页面失败。所以我进行检查以检测这些情况并显示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
用于强制重新加载页面,但我无法让它工作!有什么建议?
答案 0 :(得分:5)
在动态页面上禁用浏览器缓存是可行的方法。
对于此后引发的新问题,这可能是由于webapp设计不佳造成的。重新设计您的webapp以使用GET而不是POST来进行普通的页面到页面导航(即仅使用<h:link>
或<h:outputLink>
而不是<h:commandLink>
)。为POST请求实现POST-Redirect-GET模式,需要将响应发送到不同的页面,或者更改它们以返回到同一页面并有条件地显示结果(如果可能的话,由ajax)。检查某些表单是否不能更好地成为GET表单(例如,Google等搜索表单)。如果那个bean 确实需要是一个会话作用域,那么你通常只使用会话范围用于登录用户及其首选项,而不是请求或视图范围数据。