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

时间:2010-07-19 19:18:34

标签: jsf methods arguments parameter-passing el

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

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

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

或者使用参数调用action方法:

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

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

  

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

2 个答案:

答案 0 :(得分:54)

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。

答案 1 :(得分:1)

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>