我们有一个Web应用程序,现在需要从jsp文件中调用方法。
我们以前使用过Tomcat6,因此我们采取了以下步骤


迁移到Tomcat 7
在web.xml中声明Servlet版本3
在我们的servlet.xml中公开bean


现在,通过{$bean.object}使用getter和setter访问对象可以正常工作,但是通过{$bean.method}进行方法调用会引发以下错误

org.apache.jasper.JasperException: /WEB-INF/jsp/home.jspx (line: 15, column: 52) "${bean.method()}" contains invalid expression(s): de.odysseus.el.tree.TreeBuilderException: Error parsing '${bean.method()}': syntax error at position 29, encountered '(', expected '}'


我读到其他有类似问题的人(例如here)。

尽管该项目依赖于大量的外部库,但/WEB-INF/lib文件夹中都没有任何特定于servlet容器的模块。

我的问题是:


如何确定某个库是否特定于旧版本的Tomcat?
此错误还有其他可能的来源吗?

最佳答案

基于错误中列出的类,Web应用程序对JUEL具有依赖性。

您正在使用的表达式包括方法调用。在EL 2.2(JavaEE 6)中添加了方法调用。 JUEL声称支持EL 2.2,因此您似乎已将旧版本的JUEL与您的Web应用程序捆绑在一起。

一种解决方案是更新该依赖性。

第二种解决方案是完全删除JUEL。 Tomcat 7包含一个EL 2.2实现,并且EL发现机制意味着无论使用EL的什么都应该在无法找到JUEL的情况下找到Tomcat的实现。

最后,我要指出,EL在EL 3.0(JavaEE 7)中已取得重大进展,并且没有明显迹象表明JUEL实现EL 3.0,而在Tomcat 8和其他容器中已经有EL 3.0实现了一段时间。我建议向JUEL开发人员询问有关EL 3.0的计划,并根据他们的回答仔细考虑继续使用JUEL。

09-12 23:51