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

发布于 2024-09-10 05:13:31 字数 428 浏览 6 评论 0原文

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

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

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

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

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

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

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

How can I in JSF 2.0 invoke direct methods or methods with arguments / variables / parameters in EL?

For example, getting the list size in EL:

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

Or invoking an action method with arguments:

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

This does not seem to work in my environment. It doesn't seem to like parentheses.

javax.el.ELException: Error Parsing: #{bean.list.size()}
com.sun.el.parser.ParseException: Encountered "("

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟沫凡尘 2024-09-17 05:13:31

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 位于 /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() 或在某些特定情况下返回 自定义 EL 函数


因此请注意,在 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。

In standard EL prior to EL 2.2 from Java EE 6 you cannot directly invoke methods like
#{bean.method()} nor invoke methods with arguments like #{bean.method(arg1, arg2).

If upgrading to a EL 2.2 / Java EE 6 compliant container (Tomcat 7, Glassfish 3, JBoss AS 6, etc) is not an option and you're currently using EL 2.1 / Java EE 5 (Tomcat 6, Glassfish 2, JBoss AS 4, etc), then your best bet is to install JBoss EL. JBoss EL is an EL 2.1 compliant implementation which supports the same features as EL 2.2. Installing JBoss EL is a matter of putting the jboss-el.jar in /WEB-INF/lib and adding the following to the web.xml, assuming that you're using Mojarra:

<context-param>     
    <param-name>com.sun.faces.expressionFactory</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>

Or, when you're using MyFaces:

<context-param>     
    <param-name>org.apache.myfaces.EXPRESSION_FACTORY</param-name>
    <param-value>org.jboss.el.ExpressionFactoryImpl</param-value>   
</context-param>

An alternative for your particular case is to use JSTL's fn:length:

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

Another alternative is to add a getter to the bean which returns List#size() or in some specific cases a custom EL function.


Please note thus that invoking methods with arguments in EL is not a JSF 2.0 specific feature. It's an EL 2.2 specific feature. EL 2.2 is part of Java EE 6, which JSF 2.0 is also part of. So it look like a JSF 2.0 specific feature, but it isn't. JSF 2.0 is backwards compatible with Servlet 2.5 / EL 2.1 which lacks this feature. On the other hand, JSF 1.x is forwards compatible with Servlet 3.0 / EL 2.2, so it would also be possible to use this feature in JSF 1.x then, also using JBoss EL on Servlet 2.5 / EL 2.1.

独自←快乐 2024-09-17 05:13:31

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>

BalusC's answer is correct, however, when you use maven, you should exclude el-api 1.0 transitive dependency like this:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文