在EL中调用带有参数/variables/参数的直接方法或方法
我如何在JSF 2.0中调用EL中的参数/variables/参数的直接方法或方法?
例如,在EL中获取列表大小:
<h:outputText value="#{bean.list.size()}" />
或者用参数调用一个动作方法:
<h:commandButton value="edit" action="#{bean.edit(item)}" />
这似乎不适用于我的环境。 它似乎不喜欢括号。
javax.el.ELException: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>