2011-07-06 27 views
2

我的web应用程序有两个搜索页面 - search1.jsf和search2.jsf - 共享相同的bean,然后调用结果页面 - result.jsf。JSF 2 - 存在哪些方法可以找回调用页面?

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

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

“搜索”豆然后处理搜索并转发到使用

target = "result?faces-redirect=true"; 

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

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

选项I看到迄今有:

  • 通过链条到结果页面传递主叫方的页面名称,使用<f:param>或行动=“#{search.commit(name_of_calling_page)}

  • 把所有的搜索参数“的形式在一个JSF页面,并有条件地切换内容

还是有它返回的名称JSF功能调用JSF页面?

回答

3

您正在重定向到结果页面,这表明您使用会话作用域bean来保存结果(请求/视图的作用域根本无法在重定向中生存)。忽略这是一种很差/奇怪的方法,您可以将搜索类型存储在该bean中?

无论如何,最简单和最干净的是使用一个单一的主视图与单个主视图中的主视图中使用<ui:include>范围的bean和有条件地显示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。

相关问题