我的 Web 应用程序有两个搜索页面 - search1.jsf 和 search2.jsf - 它们共享同一个 bean,后者又调用结果页面 - result.jsf。
所以两个搜索页面都有一个commandButton
<h:commandButton value="Commit" action="#{search.commit}" />
“搜索”bean 然后使用
处理搜索并转发到结果页面target = "result?faces-redirect=true";
现在 result.jsf 不知道使用了哪个搜索页面。如何传递调用页面,以便被调用页面能够呈现返回调用页面的链接?
使用浏览器后退按钮(或 Javascript 代码)返回历史记录的缺点是,用户在浏览结果后,只会返回结果中的一页,而不是“向上”搜索参数形式。
目前我看到的选项是:
使用
<f:param>
通过链将调用者页面名称传递到结果页面或 action="#{search.commit(name_of_calling_page)}将所有“搜索参数”表单放在一个 JSF 页面中并有条件地切换内容
或者是否有返回调用 JSF 页面名称的 JSF 函数?
最佳答案
您正在重定向到结果页面,这表明您正在使用 session 范围内的 bean 来保存结果(范围内的请求/ View 根本无法在重定向后继续存在)。忽略这是一种糟糕/奇怪的方法这一事实,您也可以将搜索类型也存储在该 bean 中吗?
无论如何,最简单和最干净的方法是使用单个主视图和单个主视图作用域 bean 并有条件地显示 search1.xhtml
, search2.xhtml
和 results.xhtml
使用 <ui:include>
在主视图中。
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>
只要你回void
或 null
在操作方法中,相同的 View 范围 bean 将保留在每个后续(和非重定向!)请求中。如果您打算使其成为 GET 而不是 POST(这样它就可以添加书签和后退按钮导航,例如 Google),那么您实际上应该更改表单和 View 参数,使其成为 GET 而不是 POST。
关于java - JSF 2 - 存在哪些方法可以返回到调用页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594801/