先说下题目:因为是在我进行处理项目升级时同时遇到了上面的问题,一般都会遇到,所以就一并说了
不罗嗦了,正题:
在本地服务器中提供tomcat6,然后在myeclipse中配置severs tomcat,将本地tomcat6添加
如果你的web页面里面的EL表达式使用了#{}表达式,或者配置了severlet依赖的jstl版本,升级会遇到问题的原因为:tomcat5和tomcat6使用的jsp/severlet规范不同
Tomcat6 JSP2.1 / Servlet2.5 / JSTL2.0
Tomcat5 JSP2.0 / Servlet2.4 / JSTL1.1
Tomcat4 JSP1.2 / Servlet2.3 / JSTL1.0
在JSP2.1以前,JSP编译器并不解析#{}表达式(不是保留的表达式),因为在之前的JSP中,EL表达式是${}来表示的;正因为#{}不是JSP保留的表达式,所以在JSP中,EL表达式采用了#{}表示的;同时,在Struts2中,OGNL(Object-Graph Navigation Language,一种功能强大的表达式语言)也是用#{}表示的;
然而,在JSP2.1规范中,SUN为了统一JSP的EL表达式语法,将#{}作为了JSP的保留的表达式(SUN号称在纯jsp中也能够直接引用JSF的managedBean),也就是说,采用JSP2.1规范的服务器会自动编译#{}表达式,所以EL表达式不能再使用#{}表达式
问题已经知道了,接下来解决之:
1、将web-inf下lib中的jstl外部jar包进行替换:JSTL1.2(jstl-1.2.jar)替换JSTL1.1(standard-1.1.jar和jstl-1.1.jar)
2、web.xml必须指定使用servlet 2.5 和JSP2.1的规范:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
这里注意一下:tomcat版本是可以向下兼容servlet规范和jsp规范的,例如上面的,如果项目中没有用到tomcat6对应的servlet2.5规范和jsp2.1规范,可以还是用servlet2.4和jsp2.0规范(针对xml文件的配置)
3、此步的解决方法有多种:
第一:在web.xml文件中添加
<jsp-property-group>
<deferred-syntax-allowed-as-literal>
true
</deferred-syntax-allowed-as-literal>
</jsp-property-group>
第二:在jsp页面中添加<%@ page contentType="text/html; charset=UTF-8" deferredSyntaxAllowedAsLiteral="true"%>
以上两种方式我都试过了,没起作用,
我采用第三种:将#{。。。。}更改为\#{。。。。}
还有第四种方法:将页面中所用使用的#{}表达式换掉,
ps:当你选择tomcat6时还可能遇到一个问题,那就是控制台
严重: The web application [/codeMarket] registered the JBDC driver[.........] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
如果你报错了上面的这个严重,那么你的tomcat版本一定是在6.0.25之上的
原因:tomcat 6.025以后在sever.xml中引入了内存泄露侦测,对于垃圾回收不能处理的对像,它就会做日志。
解决办法:
1、tomcat版本换为6.0.25之下的
2、在tomcat的server.xml文件中,把
<!-- Prevent memory leaks due to use of particular java/javax APIs-->
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>这个监听给关了,对项目有没有影响,如果没有关闭监听前没有报此类异常,则关闭监听没有影响,如果关闭监听前有相关异常抛出,那么影响就相当于没有痛觉的人,生病了也不知道,网上并没有治本的方法,因为治本的方法是把你的内存泄露问题处理好