2011-06-22 29 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