一个诡异的问题之JSP的EL失效了

原创
2014/11/02 20:39
阅读数 211

蛋疼了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


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部