在 EL 中调用直接方法或带有参数/变量/参数的方法
如何在 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:遇到“(”
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 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:或者,当您使用 MyFaces 时:
您的特定情况的替代方法是使用 JSTL 的
fn:length
:另一种选择是向 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 theweb.xml
, assuming that you're using Mojarra:Or, when you're using MyFaces:
An alternative for your particular case is to use JSTL's
fn:length
: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.
BalusC的答案是正确的,但是,当您使用maven时,您应该排除 el-api 1.0 传递依赖,如下所示:
BalusC's answer is correct, however, when you use maven, you should exclude el-api 1.0 transitive dependency like this: