文档章节

试用 Tomcat7.x 与 Tomcat6.x 的明显不同 + Context 填写方法 + 默

Airship
 Airship
发布于 2015/01/15 01:46
字数 1610
阅读 45
收藏 0

今天开始在单位推广 Tomcat7 ,竟然碰到了好多问题。到现在才刚刚解决的差不多。在此介绍一下。

Tomcat6下边程序运行极其正常换了 Tomcat7 忽然不能用的都来看看了~


---------- ---------- ---------- ---------- ----------


第一个问题是关于数据库驱动程序加载。受数据库驱动异常困扰的同胞们,Tomcat7 下边因为 Tomcat 限定了类加载执行时静态代码的执行,需要在生成对象的时候才能够真正执行,所以在 Tomcat6 以前大家熟悉的数据库驱动程序加载方式:

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_1 height=16 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Class<?> cls = com.mysql.jdbc.Driver.class;  

或者

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_2 height=16 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. Class.forName("com.mysql.jdbc.Driver");  

都已经不能用了。在使用 DriverManager 生成的数据库连接的时候,会出现“No suitable driver found for jdbc”这个异常。


现在正确的数据库驱动程序加载方式,要求生成数据库驱动类的对象。推荐

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_3 height=16 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. com.mysql.jdbc.Driver.class.newInstance();  

这种方式不用处理异常,而且生成的无用对象会最短时间被垃圾回收。

当然了,也可以用一个引用类型变量把此对象接出来,但没有什么实际用途吧……

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_4 height=16 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. java.sql.Driver driver = com.mysql.jdbc.Driver.class.newInstance();  

其中 java.sql.Driver 是各个数据库管理系统提供的驱动程序类的接口,属于 JDBC 规范,适合用 import java.sql.Driver; 进行缩写。


---------- ---------- ---------- ---------- ----------


第二个问题,是线程启动的问题。因为 Tomcat7 或者 -server 方式运行的爪哇虚拟机(JVM)的一些我尚未掌握的保护机制,所以当一个线程经历空循环时,就会被架空。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_5 height=16 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. while(flag) { }  

于是通过 flag 作为线程控制变量的控制方法,就没办法继续使用了。这个时候,要时常跳过这个人工卡死的线程,以便其能够总在执行而不会真的陷入僵死。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_6 height=16 name=ZeroClipboardMovie_6 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=6&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. while(flag) { Thread.yield(); }  


---------- ---------- ---------- ---------- ----------


Tomcat7 的配置文件中,Context 配置,debug 属性被取消了,如果依然使用,会报出一个警告。

同时 unpackWAR 属性的默认值,在 Tomcat6 时是 true ,意味着默认状态将会解压 .war 然后再执行;而 Tomcat7 变成了默认 false ,不展开。


---------- ---------- ---------- ---------- ----------


另外还有一个并不是 Tomcat7 新有的特点。之前 conf/Catalina/localhost 下边会自动建立 ROOT.xml ,现在不会了。然后之前此目录下的配置文件,会以其中 path 属性指明的路径为“应用路径”;现在则会以 XML 文件的名字作为应用路径。如果大家想制作一个不需要填写应用路径就可以访问的应用,请记得一定要自己建立一个 ROOT.xml ,区分大小写,然后在其中编写 <Context> 片段。

[html]  view plain copy
<EMBED id=ZeroClipboardMovie_7 height=16 name=ZeroClipboardMovie_7 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=16 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=7&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. <Context  
  2.         crossContext="true"  
  3.         privileged="true"  
  4.         path=""  
  5.         docBase="/usr/local/example.war"  
  6.         reloadable="false"  
  7.         unpackWAR="true"  
  8.         cachingAllowed="true"  
  9.         cacheMaxSize="1024"  
  10.     ></Context>  

这个例子比较全。其中

crossContext="true" ,是允许应用通过 ServletContext.getContext() 去拿到一个通往别的应用 request dispatcher 。当然了,这种方法无法跨越现在 Tomcat 支持的虚拟主机界限。也就是说,能够穿透访问的,必须是和当前应用在一个 <Host> 之中的应用。

privileged="true" 意味着 Tomcat 自身的应用,比如· Tomcat Manager ,可以被当前这个应用访问。根据官方文档的解释,这个机理是改变应用的类加载器为 Server class loader 。我想,这种改变,会令应用程序发现 Tomcat 本身的类,都能够从应用自己的类加载器上寻找到。从而实现对 Tomcat 自身应用程序方法的调用。

path 和 docBase 不用多说,都要指定这二个属性的。其中 docBase 可以是目录也可以是结构完整的 .war 文件。

reloadable="true" 意味着 Tomcat 将提供对应用类路径( /WEB-INF/classes/ 和 /WEB-INF/lib/ )的监测。当这里边有内容改变并且其类已经被爪哇虚拟机(JVM)加载的时候,Tomcat 可以自行重新加载此类。不过此功能对 Tomcat 的稳定服务影响不小,调试环境可以使用,生产环境还是算了吧——当然,这只是我的个人建议。

unpackWAR 就如字面意思,unpackWAR="true" 意味着 Tomcat 会保存 .war 包的解压结果,然后直接对解压结果进行运行。我个人认为,考虑到爪哇虚拟机的类加载机制,每个类都仅加载一回,但是页面内容却没有类似的有效缓存,所以 .war 还是解压执行的比较好。而且日志也将造成 unpackWAR="false" 形同灾难。

cachingAllowed="true" 意味着开启了 Tomcat7 的静态缓存功能。静态文件包括 JavaScript 程序、图片声音等允许网络访问的文件以及 HTML 页面。

cacheMaxSize 是静态缓存功能缓冲区大小的设定。单位是 MB ,也就是 1024KB 。例子中设为 1024 ,意味着 1GB 。

本文转载自:http://blog.csdn.net/goodboylllll/article/details/38706657

Airship
粉丝 49
博文 1096
码字总数 22567
作品 0
南京
高级程序员
私信 提问
ContextLoaderListener ClassNotFoundException

在初学使用maven构建javaWeb的项目的时候,启动tomcat加载时,总是提示如下错误,辛苦一番终于找到解决办法。严重: Error configuring application listener of class org.springframework.w...

欧阳飘
2018/08/30
9
0
StandardContext分析-tomcat6.x源码阅读

2013-10-06 StandardContext 是什么 是org.apache.catalina.Context的标准实现,继承自ContainerBase基容器,具备容器的功能,在tomcat结构层次图中位于Host内部,包含ServletWrapper容器,它...

douglaswei
2013/10/20
347
0
StandardWrapperValve分析-tomcat6.x源码阅读

2013-11-10 StandardWrapperValve是StandardWrapper容器的BasicValve,tomcat使用容器的BasicValve来控制处理请求,StandardWrapperValve的作用是负责为请求选择Wrapper,调用Servlet处理请求...

douglaswei
2013/11/19
87
0
记录Tomcat7.x热部署配置过程

热部署是指在你对项目代码(不论是JSP、JAVA类,甚至是配置文件)进行了修改时,在不重启WEB服务器前提下能让修改生效。 网上找了不少资料都是通过修改server.xml进行配置的,但奇怪的是我一...

五大三粗
2015/11/16
1K
0
ApplicationFilterFactory与ApplicationFilterChain-tomcat6.x源码阅读

2013-11-11 ApplicationFilterFactory和ApplicationFilterChain都是跟Filter相关的类,前者根据注册在Wrapper的Filter,经过筛选成产后者,后者是多个Filter集合的管理类。 ApplicationFilterF...

douglaswei
2013/11/19
95
0

没有更多内容

加载失败,请刷新页面

加载更多

02.日志系统:一条SQL更新语句是如何执行的?

我们还是从一个表的一条更新语句说起,我们创建下面一张表: create table T(ID int primary key, c int); 如果要将ID=2这一行c的值加1,SQL可以这么写: update T set c=c+1 where ID=2; 前...

scgaopan
今天
9
0
【五分钟系列】掌握vscode调试技巧

调试前端js 准备一个前端项目 index.html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1......

aoping
今天
8
0
PhotoShop 高级应用:USM锐化/S锐化/防抖

、 高反差锐化+混合模式:叠加模式 【将更多的边缘细节添加到图像中】

东方墨天
今天
9
0
Python数据可视化之matplotlib

常用模块导入 import numpy as npimport matplotlibimport matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom mpl_toolkits.mplot3d i......

松鼠大帝
昨天
7
0
我用Bash编写了一个扫雷游戏

我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。 我在...

老孟的Linux私房菜
昨天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部