2012-03-22 59 views
2

我試圖動態地呈現基於查詢字符串的存在或不存在查詢字符串的一些組合物/模板的存在下進行。例如:條件呈現JSF H:panelGrid的基於查詢字符串(或沒有查詢字符串在所有)

本地主機:9080/myWonderfulApp/test.xhtml富=酒吧

這工作,A.xhtml在被拉到

本地主機:9080/myWonderfulApp/test.xhtml

這不起作用,B.xhtml沒有得到拉動。

我在與缺少一個查詢字符串部分的問題。當我傳遞?foo = bar時,我可以呈現A.xhtml,但當我沒有查詢字符串時,我似乎無法呈現B.xhtml呈現。我嘗試了一些變化,我最初認爲#{param ['foo']!='bar'會起作用,但我認爲這不起作用,因爲我根本沒有foo查詢參數。我試着檢查,如果參數== null,但也沒有工作。

是否有可能基於NO查詢字符串設置我的呈現屬性?

我不能爲B.xhtml設置另一個查詢字符串,因爲我正在處理一個傳統應用程序,該應用程序獲取2個不同的皮膚,因此改進鏈接的所有舊應用程序不是一個選項。新的應用程序將使用一個查詢字符串,舊的應用程序需要一箇舊的皮膚鏈接到沒有查詢字符串。

<!--This works--> 
<h:panelGrid rendered="#{param['foo'] == 'bar' ? true : false}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<!--This doesn't work--> 
<h:panelGrid rendered="#{param == null ? true : false}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

這似乎並不工作,要麼:

<h:panelGrid rendered="#{empty facesContext.externalContext.requestParameterMap.foo ? true : false}"> 

回答

1

你只需要逆條件:#{param.foo != 'bar'}。那些返回布爾值的條件運算符是不必要的,方程本身已經返回一個布爾值。 #{param}永遠不會是null。當它不包含任何參數時,它返回一個Map<String, String>,這只是(不是null!)。僅當參數名稱包含可能被解釋爲嵌套屬性的句點時,括號符號纔有用,但請求參數名稱不應包含句點。

所以,這應該這樣做:

<h:panelGrid rendered="#{param.foo == 'bar'}"> 
    <ui:composition template="A.xhtml">...</ui:composition> 
</h:panelGrid> 

<h:panelGrid rendered="#{param.foo != 'bar'}"> 
    <ui:composition template="B.xhtml">...</ui:composition> 
</h:panelGrid> 

由於不同的選擇,如果你想使用條件運算符的正確方法,你也可以做

<ui:composition template="#{param.foo == 'bar' ? 'A' : 'B'}.xhtml">...</ui:composition> 
+0

既不似乎工作。在您的版本中,B.xhtml在訪問頁面時沒有加載查詢字符串時會加載A.xhtml。我似乎無法在我的模板中使用EL,它會導致堆棧溢出,崩潰我的編輯器(RAD),並且不會重新啓動。我必須在另一個編輯器中編輯文件(刪除我的模板中的EL),然後RAD將啓動。這也在JSF 1.2中。 – 2012-03-23 16:27:48

+0

我必須承認,這是一種使用''的非常奇怪的方式,但由於我不知道你的功能需求和其他細節,而且我自己從未使用過這種構造,所以我只是忽略了這個奇怪的用法。但畢竟,你是不是故意使用''或者至少''這反過來排除了另一個構成? – BalusC 2012-03-23 16:30:25

+0

順便說一句,它確實沒有渲染作品 - 以及我昨天想要的。
這些輸出true和false並正常工作,但是當我嘗試渲染模板,但它們只是不起作用,我也嘗試使用ui:裝飾,但它給了我重複的ID錯誤 - 它似乎在兩個模板中都有效。 – 2012-03-23 16:32:39