web上有许多提示,提示web.xml
、<web-app version="xxx">
中的版本必须与相应应用程序使用(和预期)的当前API匹配。例如:
- Java web应用程序-是什么决定了我的Servlet API版本?它是否在web.xml中指定
- 网络应用程序的版本究竟是什么?它会影响什么
- org.apache.jasper.JasperException:如果没有指定默认名称空间,则函数测试必须与前缀一起使用
- 我如何检查服务器使用的EL版本
- webapp版本2.4至2.5内存不足
但我没能证明。这个version
在编译JSP时有任何作用吗?
背景
我一直在Tomcat 6.0.45中调试[...] JasperException: somewhere.jsp(69,10) The function concat must be used with a prefix when a default namespace is not specified
。
经过一番研究,我发现somewhere.jsp
调用了一个带有参数的bean方法,这是EL 2.2+中只支持的方法(例如参见EL 2.1和2.2之间的差异)。到目前为止,一切都很好:Tomcat 6.0.45是一个servlet 2.5容器,只支持EL 2.1。
但我随后在Tomcat 8.0.32(Servlet 3.1,EL 3.0)上安装了相同的应用程序,使用相同的web.xml
,故障不会显示,这让我很惊讶,因为在web.xml
中,我有version="2.4"
。
我还尝试通过只更改这个version
属性来调整用于编译和运行JSP的Servletneneneba API版本,但没有成功,所以我很困惑。
web.xml中指定的版本仅确定用于解析web.xml文件的规则。容器的行为总是由它实现的规范的版本决定的。
例如,您不能通过在web.xml中指定version="2.5"
来禁用注释扫描(在Servlet 3.0/Tomcat 7中引入)。有关此要求的示例,请参阅Servlet 3.0 Servlet规范的1.6.2节。