2011-06-22 33 views
45

是否可以在EL表達式中定義變量並重新使用該變量?在JSF中定義和重新使用EL變量頁面

例如:

<h:inputText 
    value="#{myBean.data.something.very.long}" 
    rendered="#{myBean.data.something.very.long.showing}" 
/> 

我心目中什麼是一樣的東西:

<!-- 
    somehow define a variable here like : 
    myVar = #{myBean.data.something.very.long} 
--> 
<h:inputText 
    value="#{myVar}" 
    rendered="#{myVar.showing}" 
/> 

任何想法?謝謝 !

回答

85

可以使用<c:set>此:

<c:set var="myVar" value="#{myBean.data.something.very.long}" scope="request" /> 

這EL表達式將被計算一次,並存儲在請求範圍。請注意,這僅適用於view build time期間可用的值。如果不是的話,那麼你需要刪除scope attribtue,使之成爲一個真正的「別名」:

<c:set var="myVar" value="#{myBean.data.something.very.long}" /> 

注意因此,這緩存請求範圍的評估值!每次都會重新評估。

+1

哇,謝謝!我以爲ui:param只提供一個變量用於模板,它使用了ui:composition。這是否意味着我製作的每個jsf頁面都是一個facelet,即使我不使用ui:構圖? – bertie

+0

@BalusC,你是不是要緩存這個值是什麼意思? –

+6

@Msaleh:每次你調用'#{myVar}'時,'#{myBean.data.something.very.long}'將被重新評估。在集合中不會評估一次。因此它僅僅是一個「別名」。 – BalusC

18

與MVC中的任何視圖一樣,該頁面應儘可能簡單,爲如果您想要快捷方式,請將快捷方式放入控制器@ManagedBean@Named bean)。

控制器:

@Named 
public MyBean 
{ 
    public Data getData() 
    { 
     return data; 
    } 

    public Foo getFooShortcut() 
    { 
     return data.getSomething().getVery().getLong(); 
    ] 
} 

檢視:

<h:inputText 
    value="#{myBean.fooShortcut}" 
    rendered="#{myBean.fooShortcut.showing}" 
/> 
+0

完美的解決方案,從支持bean中獲取我的元數據對象。謝謝! – nettie