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

我如何在JSF 2.0中调用EL中的参数/variables/参数的直接方法或方法?

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

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

或者用参数调用一个动作方法:

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

这似乎不适用于我的环境。 它似乎不喜欢括号。

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

在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等)不是一种select,并且您正在使用EL 2.1 / Java EE 5(Tomcat 6,Glassfish 2,JBoss AS 4等),那么你最好的select是安装JBoss EL 。 JBoss EL是符合EL 2.1的实现,它支持与EL 2.2相同的function。 安装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> 

您的特殊情况的另一种select是使用JSTL的fn:length

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

另一种方法是将getter添加到返回List#size()的bean中,或者在某些特定情况下使用自定义的EL函数 。


请注意,在EL中调用具有参数的方法不是JSF 2.0的特定function。 这是一个EL 2.2的特定function。 EL 2.2是Java EE 6的一部分,JSF 2.0也是其中的一部分。 所以它看起来像一个JSF 2.0的特定function,但它不是。 JSF 2.0向后兼容Servlet 2.5 / EL 2.1,它缺less这个function。 另一方面,JSF 1.x与Servlet 3.0 / EL 2.2是兼容的,所以也可以在JSF 1.x中使用这个特性,然后在Servlet 2.5 / EL 2.1上使用JBoss EL。

回答Arend非常好,除了关于为Mojarrainput上下文参数的部分:添加到web.xml实际上在JBoss 7上打破它。尝试使用JBoss EL而不input任何东西到web.xml。

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>