我们有一个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。