【问题标题】:JSF 2 - which ways exist to find back to the calling page?JSF 2 - 有哪些方法可以返回调用页面?
【发布时间】:2011-07-06 10:17:06
【问题描述】:

我的 Web 应用程序有两个搜索页面 - search1.jsf 和 search2.jsf - 它们共享同一个 bean,而后者又调用结果页面 - result.jsf。

所以两个搜索页面都有一个命令按钮

 <h:commandButton value="Commit" action="#{search.commit}" />

“搜索”bean 然后处理搜索并使用

转发到结果页面
target = "result?faces-redirect=true";

现在 result.jsf 不知道使用了哪个搜索页面。如何传递调用页面,以便被调用页面能够将链接呈现回调用页面?

使用浏览器后退按钮(或 Javascript 代码)返回历史记录的缺点是用户在浏览结果后只会返回结果中的一页,而不是“向上”搜索参数形式。

目前我看到的选项是:

  • 使用 &lt;f:param&gt; 或 action="#{search.commit(name_of_calling_page)}

  • 将调用者页面名称通过链传递到结果页面
  • 将所有“搜索参数”表单放在一个JSF页面中,并有条件地切换内容

或者是否有返回调用 JSF 页面名称的 JSF 函数?

【问题讨论】:

    标签: java jsf-2 navigation


    【解决方案1】:

    您正在重定向到结果页面,这表明您正在使用会话范围的 bean 来保存结果(范围内的请求/视图根本无法在重定向中存活)。忽略这是一种糟糕/奇怪的方法这一事实,您也可以将搜索类型也存储在该 bean 中吗?

    无论如何,最简单和最干净的方法是使用带有单个主视图范围 bean 的单个主视图,并在主视图中使用 &lt;ui:include&gt; 有条件地显示 search1.xhtmlsearch2.xhtmlresults.xhtml

    search.xhtml

    <ui:fragment rendered="#{empty search.results}">
        <ui:include src="/WEB-INF/search#{search.type}.xhtml" />
    </ui:fragment>
    <ui:fragment rendered="#{not empty search.results}">
        <ui:include src="/WEB-INF/results.xhtml" />
    </ui:fragment>
    

    只要您在操作方法中返回 voidnull,相同的视图范围 bean 将在每个后续(且非重定向!)请求中保留。如果您打算将其设置为 GET 而不是 POST(以便它可以书签和后退按钮导航,例如 Google),那么您实际上应该更改表单和视图参数以使其成为 GET 而不是 POST。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2012-12-28
      • 2011-09-29
      • 2012-01-27
      相关资源
      最近更新 更多