【问题标题】:Defining and reusing an EL variable in JSF page在 JSF 页面中定义和重用 EL 变量
【发布时间】:2011-09-20 01:30:24
【问题描述】:

是否可以定义变量并稍后在 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}"
/>

有什么想法吗?谢谢!

【问题讨论】:

    标签: jsf jsf-2 el


    【解决方案1】:

    您可以为此使用&lt;c:set&gt;

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

    然后,此 EL 表达式将被评估一次并存储在请求范围中。请注意,这仅在值在view build time 期间可用时才有效。如果不是这种情况,那么您需要删除 scope 属性,使其成为真正的“别名”:

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

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

    使用&lt;ui:param&gt;。当不用于将参数传递给&lt;ui:composition&gt;&lt;ui:decorate&gt; 中定义的template 时,实际上是在滥用它,那么行为是未指定的,实际上这将是JSF 实现中的一个错误如果可能的话。永远不应该依赖这一点。另见JSTL in JSF2 Facelets... makes sense?

    【讨论】:

    • 哇,谢谢!我认为 ui:param 只提供了一个要在模板中使用的变量,它使用了 ui:composition。这是否意味着我制作的每个 jsf 页面都是一个 facelet,即使我没有使用 ui:composition?
    • @BalusC,不缓存值是什么意思?
    • @Msaleh:每次您致电#{myVar} 时,都会重新评估#{myBean.data.something.very.long}。它不会在集合中只被评估一次。因此,它只是一个“别名”。
    • 好的,它不缓存,但是有什么理由它不应该
    • @user:因为默认情况下,EL 表达式可能会根据您调用它的时间而计算出不同的值。例如。取决于当前阶段、重复组件的迭代状态等。如果您想在请求、视图、会话或应用程序范围内显式设置它,请使用&lt;c:set&gt; 的回答。
    【解决方案2】:

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

    控制器:

    @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}"
    />
    

    【讨论】:

    • 从支持 bean 获取我的 元数据对象的完美解决方案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多