项目从tomcat5升级到tomcat6中、el表达式与jsp版本不兼容问题、the JDBC Driver has been forcibly unregistered)

先说下题目:因为是在我进行处理项目升级时同时遇到了上面的问题,一般都会遇到,所以就一并说了

不罗嗦了,正题:

在本地服务器中提供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"/>这个监听给关了,对项目有没有影响,如果没有关闭监听前没有报此类异常,则关闭监听没有影响,如果关闭监听前有相关异常抛出,那么影响就相当于没有痛觉的人,生病了也不知道,网上并没有治本的方法,因为治本的方法是把你的内存泄露问题处理好


 

你可能感兴趣的:(tomcat,jsp,jdbc,servlet,MyEclipse,application)