以后可以在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}"
/>
有什么想法吗?谢谢!
答案 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();
]
}