2011-07-06 28 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。

相關問題