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

Invoke direct methods or methods with arguments / variables / parameters in EL

提问人:DD. 提问时间:7/20/2010 最后编辑:BalusCDD. 更新时间:10/15/2015 访问量:29855

问:

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

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

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

或者调用带有参数的操作方法:

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

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

javax.el.ELException:解析错误:#{bean.list.size()}
com.sun.el.parser.ParseException:遇到“(”

JSF 方法 参数传递 EL

评论

0赞 Matthew J Morrison 7/20/2010
重复?stackoverflow.com/questions/206161

答:

55赞 BalusC 7/20/2010 #1

Java EE 6 的 EL 2.2 之前的标准 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 放入并添加以下内容即可,假设您使用的是 Mojarra:/WEB-INF/libweb.xml

<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,该 bean 返回或在某些特定情况下返回自定义 EL 函数List#size()


请注意,在 EL 中使用参数调用方法并不是 JSF 2.0 特有的功能。这是 EL 2.2 的特定功能。EL 2.2 是 Java EE 6 的一部分,JSF 2.0 也是 Java EE 6 的一部分。所以它看起来像是 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。

评论

0赞 Zaw Than oo 10/15/2012
它是否用于ajax请求的值方法?参考 : stackoverflow.com/questions/12884049/...ui:repeate
1赞 Hrotkó Gábor 2/6/2015 #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>