在 EL 中调用直接方法或带参数/变量/参数的方法

Posted

技术标签:

【中文标题】在 EL 中调用直接方法或带参数/变量/参数的方法【英文标题】:Invoke direct methods or methods with arguments / variables / parameters in EL 【发布时间】:2011-03-18 02:06:51 【问题描述】:

如何在 JSF 2.0 中调用直接方法或在 EL 中使用参数/变量/参数的方法?

例如在EL中获取列表大小:

<h:outputText value="#bean.list.size()" />

或者使用参数调用动作方法:

<h:commandButton value="edit" action="#bean.edit(item)" />

这在我的环境中似乎不起作用。它似乎不喜欢括号。

javax.el.E​​LException:解析错误:#bean.list.size() com.sun.el.parser.ParseException:遇到“(”

【问题讨论】:

重复? ***.com/questions/206161 【参考方案1】:

在EL 2.2 from Java EE 6 之前的标准 EL 中,您不能直接调用像#bean.method() 这样的方法,也不能调用像 #bean.method(arg1, arg2) 这样的带参数的方法。

如果不能升级到符合 EL 2.2 / Java EE 6 的容器(Tomcat 7、Glassfish 3、JBoss AS 6 等),并且您当前使用的是 EL 2.1 / Java EE 5(Tomcat 6、Glassfish 2 、JBoss AS 4 等),那么您最好的选择是安装JBoss EL。 JBoss EL 是符合 EL 2.1 的实现,它支持与 EL 2.2 相同的功能。安装 JBoss EL 只需将 jboss-el.jar 放入 /WEB-INF/lib 并将以下内容添加到 web.xml,假设您使用的是 Mojarra:

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>

或者,当您使用 MyFaces 时:

<context-param>     
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>

您的特殊情况的替代方法是使用 JSTL 的 fn:length:

<h:outputText value="#fn:length(bean.list)" />

另一种选择是向 bean 添加一个 getter,它返回 List#size() 或在某些特定情况下返回 custom EL function。


因此请注意,在 EL 中使用参数调用方法不是 JSF 2.0 特有的功能。这是 EL 2.2 特有的功能。 EL 2.2 是 Java EE 6 的一部分,JSF 2.0 也是其中的一部分。所以它看起来是 JSF 2.0 的特定特性,但实际上并非如此。 JSF 2.0 向后兼容缺少此功能的 Servlet 2.5 / EL 2.1。另一方面,JSF 1.x 与 Servlet 3.0 / EL 2.2 向前兼容,因此也可以在 JSF 1.x 中使用此功能,同时在 Servlet 2.5 / EL 2.1 上使用 JBoss EL。

【讨论】:

它是否用于带有ajax请求的ui:repeate的值方法?参考:***.com/questions/12884049/…【参考方案2】:

BalusC 的回答是正确的,但是,当你使用 maven 时,你应该像这样排除 el-api 1.0 传递依赖:

<dependency>
    <groupId>org.jboss.seam</groupId>
    <artifactId>jboss-el</artifactId>
    <version>2.0.0.GA</version>
    <!-- exclude el-api 1.0 transitive dependency -->
    <exclusions>
        <exclusion>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

【讨论】:

以上是关于在 EL 中调用直接方法或带参数/变量/参数的方法的主要内容,如果未能解决你的问题,请参考以下文章

php想要调用js类里中某一个方法的一个参数值怎么调用

使用变量调用 jest.spyOn “方法名称”参数

java中静态变量和静态方法的优缺点

jmeter_parameter不同传入方法

变量和方法调用过程中会出现的参数传递

java 对象的this使用 java方法中参数传递特性 方法的递归