2012-02-08 69 views
4

c:ifc:choose之外,有沒有更好的方法可以在幾個組件中實現1組件的條件渲染。像JSF頁面的開關盒一樣?JSF頁面的開關盒替代方案

+1

相關:http://stackoverflow.com/questions/4870462/conditionally-displaying-html-elements/4870557#4870557 – BalusC 2012-02-08 12:18:20

+0

@BalusC:你可以澄清,如果它是更好地使用'rendered'屬性比使用'c:if'? – 2012-02-08 18:49:45

+0

我想因爲我會爲多個組件提供多個「渲染」屬性,所以我可能會更好地使用一組'if''否則',這樣如果我的第一個條件比我更有可能是真實的保存進一步的條件檢查 – 2012-02-08 19:14:04

回答

5

此規範的JSF方法使用rendered屬性。下面是一些例子:

<h:someComponent rendered="#{bean.booleanValue}" /> 
<h:someComponent rendered="#{bean.intValue gt 10}" /> 
<h:someComponent rendered="#{bean.objectValue eq null}" /> 
<h:someComponent rendered="#{bean.stringValue ne 'someValue'}" /> 
<h:someComponent rendered="#{not empty bean.collectionValue}" /> 
<h:someComponent rendered="#{not bean.booleanValue and bean.intValue ne 0}" /> 
<h:someComponent rendered="#{bean.enumValue eq 'ONE' or bean.enumValue eq 'TWO'}" /> 

與JSTL標記不同的是,視圖在屬性rendered評估渲染時間,而JSTL標籤期間視圖生成時執行。另請參見JSTL in JSF2 Facelets... makes sense?

因此,如果評估條件所需的變量的範圍比視圖範圍(即請求範圍)更窄,則應該使用rendered屬性。例如,在ajax請求上重新呈現一組組件時。雖然JSTL標籤可能在這種情況下工作同樣好,但它們可能被「過早」評估(即在調用操作之前,這可能會改變條件),並且它們也會破壞視圖範圍。另見@ViewScoped breaks in tag handlers

如果評估條件所需的變量具有更寬的範圍,例如,會話範圍內或應用程序範圍內或在某些模板客戶端中進行了硬編碼,則JSTL標記效率更高,因爲它們將在視圖構建時間內進行評估,而不是在視圖渲染時間內每次進行評估。另請參見How to make a grid of JSF composite component?

1

您可以使用rendered屬性:

<h:commandButton rendered="#{value == 'value1'}"/> 
<h:commandButton rendered="#{value == 'value2'}"/> 

它並不像真正的情況下運營商那麼清晰,但它是在普通的JSF。

+0

你能澄清,如果它比使用'c:if'好怎麼辦? – 2012-02-08 12:30:23

+0

@user不知道。您不需要導入jstl命名空間:) – 2012-02-08 16:38:29

+0

Hans Bergsten和Core JavaServer Faces提供的書籍JavaServer Faces都提到使用c:if是低效但不是如何?無論如何,如果你可以用標準的JSF標籤來實現它們,爲什麼要使用它們。 – Ravi 2012-02-08 17:45:41