在JSF页面中定义和重用EL变量

时间:2011-06-22 04:22:19

标签: jsf jsf-2 el

以后可以在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}"
/>

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:100)

您可以使用<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}" />

因此请注意,此不会在请求范围内缓存评估值!它将每次重新评估。

使用<ui:param>。如果不使用以便将参数传递给template<ui:composition>中定义的<ui:decorate>,从而本质上滥用它,则行为未指定,实际上它将是如果可能的话,正在使用JSF实现中的错误。永远不应该依赖这个。另请参阅JSTL in JSF2 Facelets... makes sense?

答案 1 :(得分:20)

与MVC中的任何视图一样,页面应尽可能简单。如果需要快捷方式,请将快捷方式放入控制器({{1} }或@ManagedBean bean)。

控制器:

@Named

查看:

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

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