0

我处于以下情况:

  1. JSF(MyFaces 2.1.7 和 RichFaces 3.3.3)
  2. 一个会话作用域 Bean TEST_PAGE
  3. 使用 BACK 按钮的用户没有尽头
  4. 服务器上的状态保存

设想:

  • 用户单击链接以导航到具有 Session Scoped bean (TEST_PAGE) 的页面
  • 用户点击另一个链接
  • 用户按下浏览器的后退按钮,将它们放回 TEST_PAGE
  • 用户尝试在此页面中搜索

在搜索时,支持 bean 会抛出异常,因为有很多null值。原因是当他们按下“搜索”时,页面处于RESTORE_VIEW同步状态。

我尝试在页面上禁用缓存,以强制用户在返回按钮上刷新页面,但是由于许多用户抱怨“为什么我不能使用返回按钮,我以前可以这样做!”而引起强烈反对。并导致帮助台票,因为他们认为应用程序在“确认表单重新提交”页面 chrome/IE/Firefox 显示上崩溃,因此经理希望我寻找替代方案。

我的问题:

可以检测 RESTORE_VIEW 的当前 Phase_ID 并且在此阶段不进行任何处理以避免异常,但仅此一项且仅重新调整即可为用户提供部分页面视图。是否可以在这种情况下将页面放入RENDER_RESPONSE然后进行处理?这应该刷新页面。

问题第 2 部分

由于建议(或常见/好的)实践是禁用动态页面上的缓存,我已经这样做了,并且必须重新教育顽固的用户。

但是我有以下问题。

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

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

4

1 回答 1

5

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

至于这之后引起的新问题,这很可能是由于webapp设计不佳造成的。重新设计您的 web 应用程序以使用 GET 而不是 POST 进行普通的页面到页面导航(即仅使用<h:link><h:outputLink>代替<h:commandLink>)。为需要将响应发送到不同页面的 POST 请求实现 POST-Redirect-GET 模式,或者将它们更改为返回到同一页面并有条件地显示结果,如果可能的话,通过 ajax。检查某些表单是否最好是 GET 表单(例如,像 Google 这样的搜索表单)。重新考虑是否该 bean真的需要成为会话范围的,您通常只将会话范围用于登录用户及其首选项,而不用于请求或查看范围数据。

也可以看看:

于 2012-06-08T01:35:32.413 回答