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

ber*_*tie 56 jsf el jsf-2

是否可以在EL表达式中定义变量并重新使用该变量?

例如 :

<h:inputText 
   value="#{myBean.data.something.very.long}"
   rendered="#{myBean.data.something.very.long.showing}"
/>
Run Code Online (Sandbox Code Playgroud)

我的想法是这样的:

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

有任何想法吗 ?谢谢 !

Bal*_*usC 105

你可以使用<c:set>这个:

<c:set var="myVar" value="#{myBean.data.something.very.long}" scope="request" />
Run Code Online (Sandbox Code Playgroud)

然后,将对此EL表达式进行一次计算并将其存储在请求范围中.请注意,仅当值在视图构建期间可用时,此方法才有效.如果情况并非如此,那么您需要删除scope属性以使其成为真正的"别名":

<c:set var="myVar" value="#{myBean.data.something.very.long}" />
Run Code Online (Sandbox Code Playgroud)

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

千万不要使用<ui:param>.如果不使用以便将参数传递给or中template定义的参数,从而本质上滥用它,那么行为是未指定的,实际上如果可能的话,它将是JSF实现中的一个错误.永远不应该依赖这个.另请参阅JSF2 Facelets中的JSTL ......有意义吗?<ui:composition><ui:decorate>

  • @Msaleh:每次调用`#{myVar}`时,都会重新评估`#{myBean.data.something.very.long}`.在集合期间不会仅评估一次.因此它只是一个"别名". (7认同)
  • 哇谢谢 !我认为ui:param只提供一个在模板中使用的变量,它使用了ui:composition.这是否意味着即使我不使用ui:composition,我制作的每个jsf页面都是facelet? (2认同)
  • @user:因为默认情况下,EL表达式可能会根据您调用它的时刻计算为不同的值.例如,取决于当前阶段,重复组件的迭代状态等.如果要在请求,视图,会话或应用程序范围中显式设置它,请使用"<c:set>"作为回答. (2认同)

Mat*_*all 20

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

控制器:

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

    public Foo getFooShortcut()
    {
        return data.getSomething().getVery().getLong();
    ]
}
Run Code Online (Sandbox Code Playgroud)

视图:

<h:inputText 
   value="#{myBean.fooShortcut}"
   rendered="#{myBean.fooShortcut.showing}"
/>
Run Code Online (Sandbox Code Playgroud)