第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 tC : \ 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>[email protected]</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
作者Blog:http://blog.csdn.net/coolstar/ |