JSF 2 - 如何找回到调用页面的方式?

3
我的网络应用有两个搜索页面 - search1.jsf 和 search2.jsf - 它们共享同一个bean,该bean又调用了一个结果页面 - result.jsf。
因此,这两个搜索页面都有一个命令按钮。
 <h:commandButton value="Commit" action="#{search.commit}" />

"search" bean 然后处理搜索,并使用相关的 HTML 标记将结果页面转发。
target = "result?faces-redirect=true";

现在的result.jsf不知道使用了哪个搜索页面。我该如何传递调用页面,以便被调用的页面能够呈现一个链接回到调用页面?
使用浏览器后退按钮(或JavaScript代码)返回历史记录的缺点是,用户在浏览结果后只能回到结果中的一页,而不能返回到搜索参数表单。
我目前看到的选项有:
- 通过链路将调用者页面名称传递给结果页面,使用或action="#{search.commit(name_of_calling_page)}" - 将所有“搜索参数”表单放在一个JSF页面中,并有条件地切换内容
或者,是否有一个JSF函数可以返回调用JSF页面的名称?
1个回答

3

您正在重定向到结果页面,这表明您正在使用会话范围的bean来保存结果(请求/视图范围不会在重定向后保留)。虽然这是一种不好/奇怪的方法,但您也可以将搜索类型存储在该bean中。

无论如何,最简单和最清晰的方法是使用单个主视图和单个主视图范围的bean,并使用<ui:include>在主视图中有条件地显示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。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接