处理后退按钮和生成的Phase_ID

时间:2012-06-08 00:24:51

标签: jsf jsf-2

我遇到以下情况:

  1. JSF(MyFaces 2.1.7和RichFaces 3.3.3)
  2. 会话Scoped Bean TEST_PAGE
  3. 将使用BACK按钮结束的用户
  4. 服务器上的状态保存
  5. 场景:

    • 用户单击链接以导航到包含Session Scoped bean(TEST_PAGE)
    • 的页面
    • 用户点击其他链接
    • 用户按下brwoser的按钮,将它们放回TEST_PAGE
    • 用户尝试在此页面中搜索

    在搜索时,支持bean会抛出异常,因为有许多null个值。原因是,当他们按下“搜索”时,页面处于RESTORE_VIEW阶段。

    我尝试在页面上禁用缓存,强制用户刷新后退页面上的页面,但是许多用户抱怨“为什么我不能使用后退按钮,我之前可以做到!”由于他们认为应用程序在“确认表单重新提交”页面chrome / IE / Firefox show中崩溃,导致帮助台门票,因此管理人员希望我寻找替代方案。

    我的问题:

    可以检测RESTORE_VIEW的当前Phase_ID,而不是在此阶段进行任何处理以避免异常,但仅此一点,只需重新调整即可为用户提供部分页面视图。是否可以在此方案中将页面放在RENDER_RESPONSE中然后进行处理?这应刷新页面。

    问题第2部分

    由于推荐(或普通/好的)practive是禁用动态页面上的缓存,我已经这样做了,并且必须重新教育顽固的用户。

    但是我有以下问题。

    当按下禁用缓存页面上的“返回”按钮时,浏览器会显示“确认表单重新提交”(chrome),用户可以按Refresh / F5Enter键。

    如果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用于强制重新加载页面,但我无法让它工作!有什么建议?

1 个答案:

答案 0 :(得分:5)

在动态页面上禁用浏览器缓存是可行的方法。

对于此后引发的新问题,这可能是由于webapp设计不佳造成的。重新设计您的webapp以使用GET而不是POST来进行普通的页面到页面导航(即仅使用<h:link><h:outputLink>而不是<h:commandLink>)。为POST请求实现POST-Redirect-GET模式,需要将响应发送到不同的页面,或者更改它们以返回到同一页面并有条件地显示结果(如果可能的话,由ajax)。检查某些表单是否不能更好地成为GET表单(例如,Google等搜索表单)。如果那个bean 确实需要是一个会话作用域,那么你通常只使用会话范围用于登录用户及其首选项,而不是请求或视图范围数据。

另见: