第3章JSP开发平台的建立:Tomcat
自从J S P发布以后,推出了各式各样的J S P引擎。作为世界上用得最多的We b服务器软件—
A p a c h e的Apache Group也在进行J S P的实用研究。最初的软件产品是在A p a c h e的Java Servlet引擎
即A p a c h e J S e r v的基础上实现的G N U J S P,一直到G N U J S P 1 . 0,基本上实现了JSP 1.0标准。另外
还出现了一个被称为G S P的产品,是作为G N U体系的一个服务器端的S c r i p t语言实现的。
G N U J S P基本上是一个A p a c h e J S e r v的附属,它主要是利用S e r v l e t将J S P源文件翻译为一个S e r v l e t
的J a v a语言源文件,然后经J a v a编译器编译后作为S e r v l e t执行,这样做的好处前面已经说明了。
在完成G N U J S P 1 . 0的开发以后,开发组的成员开始考虑在S U N的J S W D K基础上开发一个可
以直接提供We b服务的J S P服务器,当然同时也支持S e r v l e t。这样,J a k a r t a - To m c a t就诞生了。
作为一个开放源代码的软件, J a k a r t a - To m c a t有着自己独特的优势:
首先,它容易得到。事实上,任何人都可以从互联网上自由地这个软件。无论从
h t t p : / / j a k a r t a . A p a c h e . o rg还是从其他网站。
其次,对于开发人员,特别是J a v a开发人员,To m c a t提供了全部的源代码,包括S e r v l e t引擎、
J S P引擎、H T T P服务器. . . . . .,无论是对哪一方面感兴趣的程序员,都可以从这些由世界顶尖的程
序员书写的代码中获得收益。
最后,由于源代码的开放及世界上许多程序员的卓有成效的工作, To m c a t已经可以和大部
分的主流服务器一起工作,而且是以相当高的效率一起工作。如:以模块的形式被载入A p a c h e,
以I S A P I的形式被载入I I S或P W S,以N S A P I的形式被载入Netscape Enterprise Server. . . . . .。
接下来,读者可以看到:
• 如何安装To m c a t,让它发挥作用。
• 如何让To m c a t和A p a c h e、I I S等一起工作。
• 如何配置To m c a t,让它符合自己的要求。
下面,先来建立一个试验用的J S P页面,读者可以先将以下的代码存为H e l l o Wo r l d . j s p。
<HTML>
<HEAD>
<TITLE>JSP测试页面---HelloWorld!</TITLE>
</HEAD>
<BODY>
<%
out.println("<h1>Hello World!<br>世界,你好!</h1>");
%>
</BODY>
</HTML>
3.1 To m c a t的安装和直接使用
在A p a c h e的j a k a r t a项目的主页上,可以看到有To m c a t的超连接,在这里可以找到各种版本
的区域,包括当前的发布( R e l e a s e)版本、开发中的各种版本,其中又分为Wi n 3 2版本和
L i n u x版本,其实对于完全由J a v a写成的To m c a t,Wi n 3 2版本和L i n u x版本没有多大区别,比如
L i n u x版本,在S o l a r i s下也没有问题。这里,主要以Wi n 3 2版本作为示例。
注意:在安装使用To m c a t之前,先安装J D K,最好是S u n的J D K 1 . 2 . 2或J D K 1 . 3。
首先,j a k a r t a - t o m c a t . z i p包,解压缩到一个目录下,如:“c : \ t o m c a t”。这时,会得到如
下的目录结构:
t o m c a t
- - - j a k a r t a - t o m c a t
| - - - b i n To m c a t执行脚本目录
| - - - c o n f To m c a t配置文件
| - - - d o c To m c a t文档
| - - - l i b To m c a t运行需要的库文件( J A R S)
| - - - l o g s To m c a t执行时的L O G文件
| - - - s r c To m c a t的源代码
| - - - w e b a p p s To m c a t的主要We b发布目录
| - - - w o r k To m c a t的工作目录,
To m c a t将翻译J S P文件到的J a v a文件和c l a s s文件放在这里
在B i n目录下,有一个名为s t a r t u p . b a t的脚本文件,执行这个脚本文件,就可以启动To m c a t服
务器,不过,在启动服务器之前,还需要进行一些设置。
首先,设置环境变量。
Wi n 9 x在a u t o e x e c . b a t里用set 语句来设定环境变量,如: set T O M C AT_HOME = c:\tomcat。
在w i n n t / w i n 2 0 0 0里可以选择“我的电脑”,右键点出菜单,选择属性,弹出对话框“系统特
性”,选择“高级”选项页,然后点按钮“环境变量”,可以编辑系统的环境变量。
• TO M C AT _ H O M E值:c:\tomcat (用TO M C AT _ H O M E指示t o m c a t根目录。
• JAVA _ H O M E值:c : \ j a v a \ j d k (用J AVA _ H O M E指示j d k 1 . 3安装目录)。
• CLASSPAT H值:c : \ j a v a \ j d k \ l i b \ t o o l s . j a r。
实际上,对于C L A S S PAT H也可以直接打开t o m c a t . b a t文件,在中间可以找到好几行s e t
C L A S S PAT H . . . . . .,将自己希望加入的库文件加入到其中即可。
另外,对于J D K 1 . 3,在中文系统上安装之后,系统注册表会有问题,请用r e g e d i t打开注册
表查j a v a s o f t,位置为hkey_local_machine -> software -> javasoft -> ,找到“ Java 运行时环境”
把它导出到文件t e m p . r e g . . . .,然后用n o t e p a d编辑它,把“ Java 运行时环境”替换成“ J a v a
Runtime Environment”,然后导入。
同样,最好也把j a v a s o f t注册表项中的“Java 插件”另外复制一份为“ Java Plug-in”。
接下来就可以执行TO M C AT _ H O M E\ b i n \ s t a r t u p . b a t,测试一下To m c a t是否运行正常。
运行We b浏览器,如Netscape Navigator 或Internet Explorer 。在浏览器的地址栏中键入:
h t t p : / / 1 2 7 . 0 . 0 . 1 : 8 0 8 0。如果看到To m c a t的信息,那么就说明To m c a t已经安装成功了。然后测试
To m c a t的J S P引擎是否正常工作,即将前面建立的H e l l o Wo r l d . j s p文件拷贝到TO M C AT _ H O M E\ w
78第一部分JSP 入门
e b a p p s \ e x a m p l e s \ j s p目录下,然后在浏览器的地址栏中键入: h t t p : / / 1 2 7 . 0 . 0 . 1 : 8 0 8 0 / e x a m p l e s / j s p /
H e l l o Wo r l d . j s p,这时候应该可以看到如图3 - 1所示的画面:
图3 - 1
在启动To m c a t的过程中,可能会遇到一些问题,这里就常见问题进行一些说明。
1) 启动To m c a t失败。出现这种情况时,可能有两种现象:
第一种:执行s t a r t u p . b a t以后没有Ja v a窗口出现。
第二种:有Ja v a窗口出现,但是接着自行退出。
对于第一种情况,很可能是TO M C AT _ H O M E环境变量设置有问题,打开s t a r t u p . b a t文件,
观察脚本的写法,一般可以发现问题。
对于第二种情况,可能是当前系统中已经有一个服务器占用了8 0 8 0端口,这时需要把原先
的服务器关闭,或者利用后面讲的To m c a t的配置方法修改To m c a t的服务端口。也可能是由于
C L A S S PAT H设置有误,这时需要检查C L A S S PAT H是否设置正确。
2) 启动To m c a t成功,可以看到首页,但是不能执行J S P脚本。
这种情况一般是由于C L A S S PAT H设置有误或J AVA _ H O M E设置有误,经过试验发现,当使
用Wi n d o w s自带的j a v a . e x e(c : \ w i n n t \ s y s t e m 3 2或c : \ w i n d o w s \ s y s t e m)时可能会出现这种问题。
3.2 To m c a t和A p a c h e的配合
作为A p a c h e的一个子项目j a k a r t a - t o m c a t当然要对A p a c h e提供强有力的支持,在的
第3章J S P开发平台的建立:To m c a t79
To m c a t压缩包解开后,在TO M C A G T _ H O M E\ c o n f目录下有一个t o m c a t - A p a c h e . c o n f文件,这个
文件并不是To m c a t自己的配置文件,而是提供给A p a c h e用来使To m c a t能够和A p a c h e一起工作的。
实际上,这个文件是在To m c a t的运行过程中自动生成的。
但是,光有这个文件还不能使A p a c h e和To m c a t一起工作,还需要一个A p a c h e的动态载入库
文件A p a c h e M o d u l e J S e r v. d l l,这个文件也可以在网站h t t p : / / j a k a r t a . A p a c h e . o rg得到,需要说明的
是,对于L i n u x版本的t o m c a t,需要的是m o d _ j s e r v. s o文件,w s 5 0为后缀的文件是L i n u x下的动态
连链库文件。
首先,要得到Apache HTTP服务器。A p a c h e是一个免费而且提供源代码的H T T P服务器,由
于A p a c h e强大的性能和用户可以利用源代码构造自己的H T T P服务器的特性,A p a c h e及其衍生出
来的产品已经成为世界上应用最多的H T T P服务器,甚至连著名的I B M公司为We b s p h e r e应用服
务器提供的IBM HTTP Server也是由A p a c h e改造而来的。
在h t t p : / / j a k a r t a . A p a c h e . o rg可以得到A p a c h e服务器的最新版本,本书写作的时候,最新的发
行版已经到了A p a c h e 1 . 3 . 1 2,而A p a c h e 2 . 0 a 6也已经提供用于测试了。
Wi n d o w s下的A p a c h e版本是一个安装文件,可以轻松地安装在计算机上。而如果在L i n u x下
使用A p a c h e,那么最好使用源代码包自己进行编译,需要注意的是,编译时需使用选项e n a b l e -
m o d u l e = s o。
双击A p a c h e _ 1 _ 3 _ 1 2 _ Wi n 3 2 . e x e文件进行安装,缺省安装目录为C:\Program Files\Apache
G r o u p \ A p a c h e,可以修改为自己喜欢的目录。
如果需要修改A p a c h e服务器工作的端口号以及H T M L发布目录或者其他A p a c h e的参数,那
么可以修改A p a c h e安装目录\ c o n f \ h t t p d . c o n f,一般可以修改H T M L发布目录为自己喜欢的目录。
至于端口号,当计算机上还运行有其他We b服务器时可以修改之,一般Wi n d o w s 9 x的机器上如果
装有P W S就需要修改,而Wi n d o w s N T和Windows 2000的机器上如果装有I I S,也需要修改。对于
没有连接到网络的机器,有时需要设置一下S e r v e r N a m e。A p a c h e服务器的具体配置请见相关书
籍,这里就不讲了。
另外最好将A p a c h e作为一个服务安装在运行Wi n d o w s N T和Windows 2000的电脑上。这只需
要执行开始→程序→ Apache Web Server→Install Apache as a service即可。
打开浏览器,在地址栏中键入h t t p : / / 1 2 7 . 0 . 0 . 1 : A p a c h e运行的端口号,如果能够见到A p a c h e的
欢迎页面,或者是一大堆文件让你选择,就可以认为A p a c h e服务器已经开始工作了。
Apache HTTP 服务器配置成功以后,就可以着手让To m c a t和A p a c h e一起工作。首先,将得
到的A p a c h e M o d u l e J S e r v. d l l文件拷贝到A p a c h e安装目录下的m o d u l e s子目录下, L i n u x的用户将
m o d _ j s e r v. s o文件拷贝到A p a c h e安装目录的l i b e x e c目录下,然后将A p a c h e安装目录下的
h t t p d . c o n f文件用文本编辑器打开,在最后面加入下面的指令:
INCLUDE To m c a t _ H o m e \ c o n f \ t o m c a t . c o n f —对于Wi n d o w s用户。
或INCLUDE To m c a t _ H o m e / c o n f / t o m c a t . c o n f —对于L i n u用户。
上面的To m c a t _ H o m e指的是To m c a t的安装目录。
最后,在h t t p d . c o n f文件中加上一行: LoadModule jserv_module modules/ApacheModuleJServ.
d l l。
80第一部分JSP 入门
对于L i n u x下的用户,一般不需要手动加上LoadModule jserv_module libexec/mod_jserv. s o这
一行,t o m c a t - A p a c h e . c o n f文件已经缺省加上了,如果没加,自行加上即可。
一切就绪以后,重新启动A p a c h e服务器和To m c a t,在浏览器的地址栏中键入: h t t p : / /
1 2 7 . 0 . 0 . 1 : A p a c h e运行的端口号/ e x a m p l e s / j s p /,如果能够看到To m c a t的J S P示例列表,就说明
To m c a t已经和A p a c h e一起工作了。
3.3 To m c a t和I I S的配合
Wi n d o w s平台下最常用的We b服务器无疑是I I S(包括P W S),对于I I S,To m c a t也提供了配合
工作的方法,使用这种方法,可以为本来不具有Java Servlet和J S P功能的I I S增加处理J S P和J a v a
S e r v l e t的功能。
为了使To m c a t和I I S一起工作,首先要得到i s a p i _ r e d i r e c t . d l l,这是一个I I S的插件( P l u g - i n),
可以从h t t p : / / j a k a r t a . A p a c h e . o rg /直接编译好的版本,也可以自己使用Visual C++编译得到。
得到以后,放到一个自己喜欢的目录,例如c:\tomcat\Jakarta-tomcat\bin\iis\i386\ 目录下。
另外,在使I I S和To m c a t配合的过程中,还需要用到另外两个To m c a t的配置文件,一个是
w o r k e r s . p r o p e r t i e s,这个文件定义了To m c a t的工作进程使用的主机和端口。在To m c a t的c o n f目录中
有一个示范性的w o r k e r s . p r o p e r t i e s文件。另一个是u r i w o r k e r m a p . p r o p e r t i e s,这个文件是映射U R L
目录和To m c a t工作进程的。同样,在To m c a t的c o n f目录中有一个示范性的u r i w o r k e r m a p . p r o p e r t i e s
文件。
首先,配置i s a p i _ r e d i r e c t . d l l。
1) 在系统注册表中建立一个新的键值: H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E \ A p a c h e
Software Foundation\Jakarta Isapi Redirector\1.0。
2) 添加一个名为e x t e n s i o n _ u r i的字符串值为/ j a k a r t a / i s a p i _ r e d i r e c t . d l l。
3) 添加一个名为l o g _ f i l e的字符串值为c : \ t o m c a t \ J a k a r t a - t o m c a t \ l o g s \ i s a p i . l o g。
4) 添加一个名为l o g _ l e v e l的字符串值为d e b u g、i n f o r m、e r r o r、e m e rg中的一个。
5) 添加一个名为w o r k e r _ f i l e的字符串值为
6) c:\tomcat\jakarta-tomcat\conf\workers.properties。
7) 添加一个名为w o r k e r _ m o u n t _ f i l e的字符串值为
8) c:\tomcat\jakarta-tomcat\conf\ uriworkermap.properties。
然后,打开I I S的管理控制台,在需要使用To m c a t提供附加的J S P和Java Servlet服务的We b站点
中添加一个虚拟目录。注意,一定要使用“ j a k a r t a”作为虚拟目录的名称,这个虚拟目录的实际
物理位置应当是包含i s a p i _ r e d i r e c t . d l l文件的目录,这里假设为c : \ t o m c a t \ J a k a r t a - t o m c a t \ b i n \ i i s \ i 3 8 6。
在设定虚拟目录时注意要设此虚拟目录为可执行。如果是在P W S中,一样处理。
接着,在I I S的控制台中为此We b站点添加一个I S A P I过滤器(在此We b站点上点击鼠标右键,
选择属性)。名称随意,但过滤器要设定为i s a p i _ r e d i r e c t . d l l这个文件。如果使用的是P W S就比较
麻烦了。需要使用注册表编辑器,在键H K E Y _ L O C A L _ M A C H I N E \ S y s t e m \ C u r r e n t C o n t r o l S e t \ S e
r v i c e s \ W 3 S V C \ P a r a m e t e r s中,有一个名为Filter Dlls的键值,在这个键值中添加i s a p i _ r e d i r e c t . d l l,
注意要包含完整的路径。
第3章J S P开发平台的建立:To m c a t81
最后,重新启动I I S或P W S,最好是能够重新启动计算机。
启动To m c a t以后,打开浏览器,在地址栏中键入h t t p : / / 1 2 7 . 0 . 0 . 1 / e x a m p l e s /,如果能够看到
j s p和s e r v l e t两个目录,就说明利用i s a p i _ r e d i r e c t . d l l所作的重定向已经成功,可以执行一下j s p目
录下的例子做试验。
3.4 To m c a t的配置和常见问题
To m c a t为用户提供了一系列的配置文件来帮助用户配置自己的To m c a t,和Apache HTTP不
同,To m c a t的配置文件主要是基于X M L的;如s e r v e r. x m l、w e b . x m l . . . . . .,只有w o r k e r s . p r o p e r t i e s
和u r i w o r k e r m a p . p r o p e r t i e s等少数几个文件是传统的配置文件。本节将详细讨论To m c a t的主要配
置文件以及如何利用这些配置文件解决常见问题。
3.4.1 To m c a t的主配置文件:s e r v e r. x m l
观察s e r v e r. x m l,可以发现其中有如表0一些元素。
表3 - 1
元素描述
S e r v e r 是S e r v e r元素是s e r v e r. x m l文件的最高级别的元素, S e r v e r元素描述一
个To m c a t服务器,一般来说用户不用关心这个元素。一个S e r v e r元素
是一般会包括L o g g e r和C o n t e x t M a n a g e r两个元素
L o g g e r 是L o g g e r元素定义了一个日志对象,一个日志对象包含有如下属性:
是1) name 。表示这个日志对象的名称。
是2) path。表示这个日志对象包含的日志内容要输出到哪一个日志文件。
是3) v e r b o s i t y L e v e l。表示这个日志文件记录的日志的级别。
是一般来说, L o g g e r对象是对Java Servlet、J S P和To m c a t运行期事件
的记录
C o n t e x t M a n a g e r 是C o n t e x t M a n a g e r定义了一组C o n t e x t I n t e r c e p t o r s(C o n t e x t M a n a g e的
事件监听器) , RequestInterceptors(C o n t e x t M a n a g e的事件监听器),
C o n t e x t s(We b应用程序的上下文目录)和它们的C o n n e c t o r s(连接
器)的结构和配置。
是C o n t e x t M a n a g e r包含如下一些属性:
是1) debug。记录日志记录调试信息的等级。
是2) home。w e b a p p s /、c o n f /、l o g s /和所有C o n t e x t的根目录信息。这
个属性的作用是从一个不同于TO M C AT _ H O M E的目录启动To m c a t。
3) workDir。To m c a t工作目录。
ContextInterceptor 和R e q u e s t I n t e r c e p t o r 是两者都是监听C o n t e x t M a n a g e r的特定事件的拦截器。C o n t e x t I n t e r c e p t o r
监听To m c a t的启动和结束事件信息。而R e q u e s t I n t e r c e p t o r监听用户对服
务器发出的请求信息。一般用户无需关心这些拦截器,对于开发人员,
需要了解这就是全局性的操作得以实现的方法
C o n n e c t o r 是C o n n e c t o r(连接器)对象描述了一个到用户的连接,不管是直接
由To m c a t到用户的浏览器还是通过一个We b服务器。To m c a t的工作进
程和由不同的用户建立的连接传来的读/写信息和请求/答复信息都是
由连接器对象管理的。对连接器对象的配置中应当包含管理类、
T C P / I P端口等内容
82第一部分JSP 入门
(续)
元素描述
C o n t e x t 是每一个C o n t e x t都描述了一个To m c a t的We b应用程序的目录。这个
对象包含以下属性:
是1) docBase。这是C o n t e x t的目录。可以是绝对目录也可以是基于
C o n t e x t M a n a g e的根目录的相对目录。
是2) path。这是C o n t e x t在We b服务时的虚拟目录位置和目录名。
是3) debug。日志记录的调试信息记录等级。
是4) reloadable。这是为了方便S e r v l e t的开发人员而设置的,当这个
属性开关打开的时候,To m c a t将检查S e r v l e t是否被更新而决定是否自
动重新载入它
1. 加入自己的日志文件
添加L o g g e r对象就可以加入自己的日志文件,添加工作相当简单,只需要将作为示例的
L o g g e r对象复制一份,然后修改一下前面介绍的几个属性就可以了。在设定了L o g g e r以后,就
可以在自己的S e r v l e t中使用S e r v l e t C o n t e x t . l o g ( )方法来建立自己的日志文件。
2. 设定新的J S P目录
设立新的J S P工作目录是比较简单的,只需要添加一个C o n t e x t对象就可以了。如,要在
c : \ j s p目录下开发J S P项目,并且让用户可以使用/ m y b o o k /虚拟目录访问,则:
<Context path="/mybook" docBase="c:\jsp" debug="0" reloadable="true" >
</Context>
一般来说,这样就可以直接执行J S P文件了,如果进一步想要在这下面建立We b应用程序,
那么还需要进一步的配置,具体方法在后面论述。
3.4.2 Wi n d o w s下代码保护的问题
在Wi n d o w s下使用To m c a t时有一个问题需要注意,可以做一个试验,启动To m c a t后,在浏
览器的地址栏中键入: http://127.0.0.1:8080/examples/jsp/ HelloWo r l d . J S P(注意后缀要大写)。
就会发现奇怪的现象,浏览器的窗口中什么都没有,查看H T M L源文件就会发现,这个J S P文件
的源代码被To m c a t完全输出到了浏览器!如果是这样,岂不是服务器端的任何源代码都会被暴
露在互联网上。
实际上,解决方法很简单,把各种后缀的组合全部写到To m c a t _ H o m e \ c o n f \ w e b . x m l里就可
以了,这样t o m c a t会将不同后缀名的j s p分开对待,就不会泄露代码了。
<servlet-mapping>
<servlet-name>
jsp
</servlet-name>
<url-pattern>
*.jsp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
第3章J S P开发平台的建立:To m c a t83
<servlet-name>
Jsp
</servlet-name>
<url-pattern>
*.Jsp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JSp
</servlet-name>
<url-pattern>
*.JSp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JsP
</servlet-name>
<url-pattern>
*.JsP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JSP
</servlet-name>
<url-pattern>
*.JSP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
jSp
</servlet-name>
<url-pattern>
*.jSp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
jSP
</servlet-name>
<url-pattern>
*.jSP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
84第一部分JSP 入门
<servlet-name>
jsP
</servlet-name>
<url-pattern>
*.jsP
</url-pattern>
</servlet-mapping>
3.4.3 Apache、I I S和To m c a t协作时工作目录的添加
1. Apache
由于J a k a r t a - To m c a t项目是A p a c h e的一个子项目,所以向To m c a t - A p a c h e协作的We b服务器添
加工作目录时只需要修改To m c a t - A p a c h e . c o n f文件就可以了。也许读者会觉得奇怪, To m c a t -
A p a c h e . c o n f文件不是在To m c a t启动时自动生成的吗?的确如此,但是To m c a t自动生成的To m c a t -
A p a c h e . c o n f文件仅仅是To m c a t提供的一个缺省配置文件而已,如果需要,可以修改,然后存放
在另外的目录中,或是更名,再在h t t p d . c o n f文件中将这个新的文件包含进来就可以了。
为什么To m c a t不自动修改To m c a t - A p a c h e . c o n f文件以适应工作目录添加的需要呢? To m c a t的
确修改了To m c a t - A p a c h e . c o n f文件,但是修改的结果显然是不正确的。如,前面在s e r v e r. x m l中
添加了工作目录/ m y b o o k - - > c : \ j s p后,To m c a t修改To m c a t - A p a c h e . c o n f文件,添加了这么几行:
Alias /mybook C:\tomcat\jakarta-tomcat\webapps\mybook
<Directory "C:\tomcat\jakarta-tomcat\webapps\mybook">
Options Indexes FollowSymLinks
</Directory>
ApJServMount /mybook/servlet /mybook
<Location /mybook/Web-INF/ >
AllowOverride Non
deny from all
</Location>
这显然是有问题的,尽管虚拟目录是/ m y b o o k,但是实际的目录并不是C : \ t o m c a t \ j a k a r t a -
t o m c a t \ w e b a p p s \ m y b o o k。查看To m c a t的源代码C : \ t o m c a t \ j a k a r t a - t o m c a t \ s r c \ o rg \ A p a c h e \ t o m c a t \ t a s k A p a c h e C o n f i g . j a v a文件可以发现,To m c a t在生成To m c a t - A p a c h e . c o n f文件的时候,简单地在虚拟
目录前面加上原先To m c a t的缺省w e b a p p目录作为新的工作目录:
pw.println("Alias " + path + " " +
FileUtil.patch(tomcatHome + "/webapps" + path));
pw.println("<Directory \"" +
FileUtil.patch(tomcatHome + "/webapps" + path) +
"\">");
pw.println(" Options Indexes FollowSymLinks");
pw.println("</Directory>");
那么如何解决这个问题呢?修改To m c a t的源代码也可以,不过,对于一般的用户,如前所
述直接修改To m c a t - A p a c h e . c o n f文件更现实一些。修改的方法举例如下:
Alias /mybook C:\jsp
第3章J S P开发平台的建立:To m c a t85
<Directory "C:\jsp">
Options Indexes FollowSymLinks
</Directory>
ApJServMount /mybook/servlet /mybook
<Location /mybook/Web-INF/ >
AllowOverride None
deny from all
</Location>
也就是简单地将原先错误的实际目录C : \ t o m c a t \ j a k a r t a - t o m c a t \ w e b a p p s \ m y b o o k修改为c : \ j s p
就可以了。
修改完文件后,一定要存为另一个文件并修改h t t p d . c o n f文件将这个文件包含进来,否则,
重新启动To m c a t后,这个正确的To m c a t - A p a c h e . c o n f文件会被To m c a t重新生成的To m c a t -
A p a c h e . c o n f文件覆盖掉。最后,重启A p a c h e和To m c a t就可以了。
2. IIS
与A p a c h e和To m c a t几乎无缝的配合不一样, I I S和To m c a t的配合多少有些复杂,需要向
ISAPI Redirect添加新的内容。不过还好, To m c a t的u n i w o r k e r m a p . c o n f文件将这个过程简单化
了。
需要做的事情共分两步:
1) 向To m c a t中添加一个工作目录。前面已经讲述了如何实现,这里依然使用/ m y b o o k - -
> c : \ j s p这个例子。
2) 向ISAPI Redirect添加工作目录。使用文本编辑器打开文件u n i w o r k e r m a p . c o n f,添加一
行:
/mybook/*=ajp12
然后重新启动I I S和To m c a t就可以了。
3.4.4 设定To m c a t作为Wi n d o w s的服务而启动
手工启动To m c a t显然不是一个合适的使用To m c a t作为We b服务的方法,在L i n u x下可以通过
修改启动脚本自动启动To m c a t,在Wi n d o w s下则可以设定To m c a t作为Wi n d o w s的服务而启动。
To m c a t作为Windows NT/2000的一个服务是需要借助工具的
1) 工具,这里作为例子的是gservany ----将N T下的一般应用程序作为服务运行的工具。
网址为h t t p : / / w w w. a d v o k . c o m / g s e r v a n y. h t m l。将z i p文件解压缩,将g s e r v a n y. e x e放入
w i n n t \ s y s t e m 3 2目录下,(以防以后被误删)。
2) 在N T的C o m m a n d(命令行模式)下输入: gservany -i tomcat “C : \ j a k a r t a - t o m c a t \ b i n”
“s t a r t u p . b a t”“C : \ j a k a r t a - t o m c a t \ b i n” “s h u t d o w n . b a t”。
3) 启动s e r v i c e管理器,会看到tomcat service被装上,加些注释说明这个s e r v i c e实际干什么,
再修改启动类型为“自动”。然后再启动它。
这样,就成功地将To m c a t作为S e r v i c e安装在N T下了。
其实,将N T下的应用程序作为服务安装在N T中的工具还有很多,任何一种都应该可以将
86第一部分JSP 入门
To m c a t加入到N T的服务中。
3.4.5 在To m c a t中建立新的We b应用程序
J S P主要是为建立We b网站而开发的技术,这种技术由We b应用程序的一整套We b文件(j s p,
s e r v l e t,h t m l,j p g,g i f,c l a s s . . . . . .)所组成。To m c a t为We b应用程序的建立提供了一系列的帮助,
下面分步骤描述。
1. 应用程序的目录和结构
按照To m c a t的规范,从/ e x a m p l e例子目录来看, To m c a t的We b应用程序应该由如表3 - 2所示
目录组成的。
表3 - 2
*.html, *.jsp, etc. 这这里可以有许多目录,由用户的网站结构而定,实现的功能应该是网站的界面,也就
是用户主要的可见部分。除了H T M L文件、J S P文件外,还有j s(J a v a S c r i p t)文件和c s s
(样式表)文件以及其他多媒体文件等等
We b - I N F / w e b . x m l 这这是一个We b应用程序的描述文件。这个文件是一个X M L文件,描述了S e r v l e t和这个
We b应用程序的其他组件信息,此外还包括一些初始化信息和安全约束等等
We b - I N F / c l a s s e s / 这这个目录及其下的子目录应该包括这个We b应用程序的所有S e r v l e t文件,以及没有被
压缩打入J A R包的其他c l a s s文件和相关资源。注意,在这个目录下的J a v a类应该按照其所
属的包组织目录
We b - I N F / l i b / 这这个目录下包含了所有压缩到J A R文件中的类文件和相关文件。比如:第三方提供的
J a v a库文件、J D B C驱动程序等等. . . . . .
2. web.xml文件
w e b . x m l文件包含了描述整个We b应用程序的信息。下面以一个w e b . x m l文件为例,讲解里
面的各个对象。
web.xml:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<!-
Web应用程序的主要描述
-->
<display-name>My Web Application</display-name>
<description>
在这里加入Web应用程序的描述信息
</description>
<!-
下面定义了Web应用程序的初始化参数,
在JSP或Servlet文件中使用下面的语句
来得到初始化参数
String value =
getServletContext().getInitParameter("name");
这里可以定义任意多的初始化参数
-->
第3章J S P开发平台的建立:To m c a t87
<context-param>
<param-name>webmaster</param-name>
<param-value>myaddress@mycompany.com</param-value>
<description>
这里包含了初始化参数的描述
</description>
</context-param>
<!-
下面的定义描述了组成这个Web应用程序的
Servlet,还包含初始化参数。在Tomcat中,也
可以将放在Web-INF/classes中的Servlet直接以
servlet/Servlet名访问,但是一般来说,不推荐这
样使用。而且这样的使用方法还会导致Servlet的
相关资源组织的复杂性。所以一般来说推荐将所
有的Servlet在这里定义出来。初始化参数可以在
Servlet中一这种语句的到:
String value =
getServletConfig().getInitParameter("name");
-->
<servlet>
<servlet-name>controller</servlet-name>
<description>
这里加入这个Servlet的描述
</description>
<servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>
<init-param>
<param-name>listOrders</paramName>
<param-value>com.mycompany.myactions.ListOrdersAction</param-value>
</init-param>
<init-param>
<param-name>saveCustomer</paramName>
<param-value>com.mycompany.myactions.SaveCustomerAction</param-value>
</init-param>
<!-
服务器启动后这个Servlet加载的时间
-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet>
<servlet-name>graph</servlet-name>
<description>
这个Servlet的描述
</description>
</servlet>
<!-
Servlet映射对应了一个特殊的URI请求
到一个特殊的Servlet的关系
-->
88第一部分JSP 入门
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>graph</servlet-name>
<url-pattern>/graph</url-pattern>
</servlet-mapping>
<!-
设定缺省的Session过期时间
-->
<session-config>
<session-timeout>30</session-timeout> <!-- 30 minutes -->
</session-config>
</web-app>
3. 将应用程序打包为WA R文件
WA R文件是包装We b应用程序的一种方法,使用WA R文件,既方便了管理各种相关文件,
又减小了整个应用程序的体积。
下面先来看一看将We b应用程序打包为WA R文件的语法:
packager -webArchive[-classpath servletorjspbean/classes [ -
classFiles package/MyClass1.class: package/MyClass2.class ] ]
<content-root> [-contentFiles login.jsp:index.html:images/me.gif]
web.xml myWebApp.war
下面是一个简单的应用示例,将m y We b P a g e . x m l的配置和m y We b P a g e D i r /下的文件打入包
m y We b P a g e . w a r中:
packager -webArchive myWebPageDir myWebPage.xml myWebPage.war
使用-contentFiles 标志可以添加个别的目录文件
packager -webArchive myWebPageDir -contentFiles Hello.jsp
myWebPage.xml myWebPage.war
packager -webArchive myWebPageDir -contentFiles Hello.jsp:Hello.html
myWebPage.xml myWebPage.war
假定S e r v l e t文件在c l a s s e s / p a c k a g e / S e r v l e t 1 . c l a s s,指定S e r v l e t和J S P文件:
packager -webArchive -classpath classes myWebPageDir -contentFiles
Hello.jsp myWebPage.xml myWebPage.war.
下面示例如何仅仅包含package/Servlet1.class 和packageB/Servlet.class 两个文件到WA R文
件中:
packager -webArchive -classpath classes -classFiles package/
Servlet1.class:packageB/Servlet.class myWebPageDir -contentFiles
Hello.jsp myWebPage.xml myWebPage.war
最后,需要说明的是,每个. w a r文件前面的. x m l文件就是前面讲过的w e b . x m l文件。生成的
WA R文件可以直接放在包含We b应用程序的目录下使用。
第3章J S P开发平台的建立:To m c a t89