代码之家  ›  专栏  ›  技术社区  ›  DD.

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

  •  24
  • DD.  · 技术社区  · 14 年前

    我如何在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:遇到“(”

    2 回复  |  直到 9 年前
        1
  •  54
  •   Community CDub    7 年前

    在标准EL中 EL 2.2 from Java EE 6 不能直接调用类似的方法
    #{bean.method()} 也不能用类似这样的参数调用方法 #{bean.method(arg1, arg2) .

    如果升级到EL 2.2/JAVA EE 6兼容的容器(Tomcat 7、GalasFISH 3、JBASS 6等)不是一个选项,而您当前使用的是EL 2.1 /JavaEE 5(Tomcat 6,GalasFISH 2,JBASS 4),那么您最好安装 JBoss EL . JBossEL是一个符合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>
    

    或者,当你使用我的脸时:

    <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是JavaEE 6的一部分,JSF 2也是JSF 2的一部分。所以它 看起来像 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。

        2
  •  1
  •   Hrotkó Gábor    10 年前

    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>