蛋疼了2天,连大周末都没过好。因为我的一个项目线下开发的好好的,到了线上失效了!没错!失效了。问题是解决了,那么我这里就分析下如何解决问题的过程吧。
1先看下报错信息吧。很明显,JSP中没有解析出el表达式。然后导致jspinclude找不到页面resource
2 先再线下复现此问题,代码是一份,配置是一份,难道是web容器的问题?果然,线上用的是tomcat7.0.52,线下是7.0.28(7.0.47也是OK的)
3 接下来我就开始各种替换pom中的依赖jar包,去掉了和el冲突的jpbm的juel,升级了jstl的jar包到1.2
这里注意下,jstl1.2的版本可以单独使用,如果是jstl1.1.2版本的话还需要和taglib一起使用
同时也试过吧jstl这些包改成provide的scope,这里注意下,改成provide的scope的表示jar包会依赖容器中的版本,也就不会有jar包冲突
4 还是不行,于是开始对tomcat中的lib下手了。。。解决方案很粗暴,把以前的7.0.28的lib下的jar包都移到7.0.54的lib下。
结果可想而知。。。tomcat都起不起来的。。。
这里要注意下,tomcat中有两个lib是和el有关的,分别是jsp-api.jar和servlet-api.jar,顺手把2个jar包解开了
这里主要注意下版本号
这里可以看到这个版本中的tomcat下servlet的版本是3.0,jsp的版本是2.2,于是有点思路了,是不是新版本的lib中的jar包版本比较新?
查看servert的文档看在默认情况下,Servlet 2.3 / JSP 1.2是不支持EL表达式的,而Servlet 2.4 / JSP 2.0支持。 servlets 2.4这个版本的isELIgnored默认设置为false。
所以使用web.xml里用web-app_2_4.xsd声明的时候在JSP页面不用特意声明。这里要注意下,servlet2.4的版本是默认支持el的,但是2.5的就不支持了
所以2.5的话要支持el的话有2种解决方案
一是在每个jsp中都加入
<%@ page isELIgnored="false"%>
二或者是webxml中加入
<jsp-config> <jsp-property-group> <url-pattern>*.jsp</url-pattern> <el-ignored>false</el-ignored> </jsp-property-group> </jsp-config>
表示让jsp支持el表达式,我多半就是因为当前servlet和jsp不支持el
于是修改webxml的配置
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_4.xsd">
加入这样的根节点,重启。问题解决
总结一下,webapp这个节点是sun定义的用来标示使用哪个schemal的。而tomat中的lib表示当前tomcat最高支持的jsp和el的版本。
5 这里貌似还没有解释webxml和tomcat不同版本有什么关系,那就看下diff文件吧
原先的xsd用的是3.0的版本,webapp的version用的是2.4,而且还有个id的字段。
这是谁写的。。。我保证不打你。。。
新版本的tomcat验证比较严格,自然起不来。
最后附下,jsp,servlet和tomcat规范的关系
JSR 53: JavaTM Servlet 2.3 and JavaServer PagesTM 1.2
JSR 154: JavaTM Servlet 2.4
JSR 154: JavaTM Servlet 2.5(Maintenance Release 2)
JSR 315: JavaTM Servlet 3.0(This JSR will be an update to the existing Servlet 2.5 specification. )
JSR 152: JavaServer PagesTM 2.0
JSR 245: JavaServerTM Pages 2.1
JSR 127: JavaServerTM Faces
JSR 252: JavaServerTM Faces 1.2
JSR 314: JavaServerTM Faces 2.0
http://tomcat.apache.org/whichversion.html