第1章 Tomcat的安装与配置
Tomcat可以运行Servlet和JSP,是一个小型的轻量级应用服务器,它性能稳定、扩展性好、源码开放,是开发中小型Web应用系统的首选。本章首先介绍Tomcat服务器特点、层次结构、应用处理流程及发展史,然后讲述Tomcat的安装、设置和测试,接着介绍Tomcat目录结构、常用配置平台、控制和管理程序等,最后设计一个不需数据库支持的简单聊天室。
1.1 Tomcat简介
Tomcat是Sun的JSWDK(Java Server Web Development Kit)中的Servlet容器,属于Apache软件基金会(ApacheSoftware Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司和个人共同开发而成。Tomcat既是一个开放源码、免费支持JSP和Servlet技术的容器,同时又是一个Web服务器软件,受到了Sun公司的大力推荐和支持。因此,Servlet和JSP的最新规范都可以在Tomcat的新版本中得到实现。
与传统桌面应用程序不同,Tomcat中的应用程序是一个WAR(Web Archive)文件,它是许多文件构成的一个压缩包,包中的文件按照一定目录结构来组织,不同目录中的文件也具有不同的功能。部署应用程序时,只需要把WAR文件放到Tomcat的webapp目录下,Tomcat会自动检测和解压该文件。JSP文件第一次执行时,要先由Tomcat将其转化为Servlet文件,然后编译,所以速度会慢一些,但后继执行时速度会很快。
Tomcat既是一个Servlet容器,又是一个独立运行的服务器,像IIS、Apache等Web服务器一样,具有处理HTML页面的功能。但它处理静态HTML文件的能力并不是太强,所以一般都是把它当作JSP/Servlet引擎,通过适配器(Adapter)与其他Web服务器软件(如Apache)配合使用。此外,Tomcat还可与其他一些软件集成起来实现更多功能,例如,与JBoss集成起来开发EJB、与OpenJMS集成起来开发JMS应用、与Cocoon(Apache的另外一个项目)集成起来开发基于XML的应用等。
Tomcat是一个小型的轻量级应用服务器,运行时占用系统资源小、扩展性好、支持负载平衡与邮件服务等开发应用系统中的常用功能,并且不断改进和完善。Tomcat适用于中小型系统和并发访问用户不太多的场合,是开发和调试JSP程序的首选。先进的技术、稳定的性能、源码开放和免费获取的机制,使得Tomcat深受Java爱好者的喜爱并得到了许多软件开发商的认可,成为目前相当流行的Web应用服务器。
1.1.1 Servlet简述
谈起Tomcat,就不能不说Servlet,如果没有Servlet的应用需求,就没有Tomcat的产生。Servlet(小服务程序)是一个与协议无关的、跨平台的Web组件,它基于Java技术开发,由Servlet容器所管理。和运行在客户端浏览器中的Applet(小应用程序)相似,Servlet运行在服务器端,可以动态地扩展服务器的功能,并采用“请求—响应”模式提供Web服务。Servlet的主要功能是交互式地浏览和修改数据,生成动态Web内容。
Servlet是平台独立的Java类,即按照Servlet规范编写的Java类,所以具有Java语言的所有优点,如良好的可移植性及安全性等。Servlet被编译为平台中立的字节码,可以被动态地加载到支持Java技术的Web服务器中运行,就如同Applet对客户端一样,区别在于Servlet运行并不需要图形用户界面。
Java Servlet具有如下优点:
(1)Servlet可以和其他资源(数据库、文件、Applet和Java应用程序等)交互,把生成的响应内容返回给客户端。如果需要,还可以保存“请求—响应”过程中的信息。
(2)服务器采用Servlet可以完全授权对本地资源的访问,Servlet自身也会控制外部 用户的访问数量及访问性质。
(3)Servlet可以从本地硬盘,或者通过网络从远端硬盘来激活。
(4)通过Servlet Tag技术,可以在HTML页面中动态调用Servlet。
(5)Servlet可以是其他服务的客户端程序。
(6)通过链接技术,一个Servlet可以调用另一个或一系列Servlet来成为它的客户端。
(7)Servlet API与协议无关。
1.1.2 Tomcat与Servlet之间的关系
当初在Apache开发时还未出现Servlet的概念,所以Apache不能内置支持Servlet。实际上,除了Apache,其他许多Web服务器软件都不能直接支持Servlet。为了支持Servlet,通常要单独开发程序,这种程序一般称为服务器小程序容器(ServletContainer),有时也叫做服务器小程序引擎(Servlet Engine)。它是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应,它在Servlet的生命周期内包容和管理Servlet,是一个实时运行的外壳程序。运行时由Web服务器软件处理一般请求,并把Servlet调用传递给“容器”来处理。Tomcat就是满足这种需要的JSP/Servlet引擎,是Sun公司的JSP/Servlet的官方实现。
按照工作模式的不同,Servlet容器可以分为以下3类:
1.独立运行的Servlet容器
在这种模式下,Servlet容器作为构成Web服务器的一部分而存在。当使用基于Java的Web服务器时,就属于这种情况。这种方式是Tomcat的默认模式,然而大多数Web服务器并不是基于Java的,所以就产生了下面的两种其他类型。
2.内置的Servlet容器
Servlet容器由Web服务器插件和Java容器两部分组成。采用这种方式时,Web服务器插件需要在某个Web服务器内部地址空间中打开一个JVM(Java虚拟机),在此JVM上加载Java容器并运行Servlet。如果客户端调用Servlet,Web服务器插件首先获得此请求的控制并将它传递(使用JNI技术)给Java容器,然后Java容器把此请求交给Servlet来处理。这种方式运行速度较快,并且能够提供良好的性能,适用于单进程、多线程服务器,但是在伸缩性方面存在不足。
3.外置的Servlet容器
采用这种方式时,Servlet容器运行在Web服务器外部地址空间。先由Web服务器插件在某个Web服务器外部地址空间打开一个JVM(Java虚拟机),然后加载Java容器来运行Servlet。Web服务器插件和JVM之间使用IPC(进程间通信)机制(通常是TCP/IPSockets)。如果客户端调用Servlet,Web服务器插件首先获得此请求的控制并将它传递(使用IPCs技术)给Java容器,然后Java容器把此请求交给Servlet来处理。这种方式对客户端请求的处理速度不如内置Servlet那样快,但是在其他方面(如可伸缩性、稳定性等)具有优势。
Tomcat属于Servlet容器,其工作模式也分为上述3种,所以Tomcat既可被用作独立运行的Servlet引擎(便于开发和调试),又可作为一个需要增强功能的Web服务器(如当前的Apache、IIS和Netscape服务器)插件。在配置Tomcat之前,就需要确定采用哪种工作模式,工作模式(1)比较简单,直接安装Tomcat即可,工作模式(2)和(3)有些复杂,除了安装Tomcat、Web服务器之外,还需要安装连接两者的中间连接件。
【专家提示】在本书中,如果没有特殊说明,Tomcat运行都采用独立运行的Servlet容器 方式。
Java Servlet API是Servlet容器和Servlet之间的接口,它定义了Servlet的各种方法,还定义了Servlet容器传送给Servlet的对象类,其中最重要的是请求对象ServletRequest和响应对象ServletResponse。这两个对象都是由Servlet容器在客户端调用Servlet时产生的,Servlet容器把客户请求信息封装在ServletRequest对象中,然后把这两个对象都传送给要调用的Servlet,Servlet处理完后把响应结果写入ServletResponse,然后由Servlet容器把响应结果发送到客户端。Tomcat服务器接收客户端请求并作出响应的完整过程如图1-1所示。
图1-1 Tomcat服务器响应客户请求过程
其中,①处表示Web服务器接收到客户端发出的HTTP请求后,转发给Servlet容器,同时把控制返回Servlet容器;②处表示Servlet容器把响应对象ServletResponse中的处理结果转发给Web服务器,通知Web服务器以HTTP响应的方式把结果发送到客户端,同时把控制返回Web服务器。
1.1.3 Tomcat层次结构
Tomcat服务器由一系列可配置组件构成,其中核心组件是Catalina Servlet容器,它是其他所有Tomcat组件的顶层容器。Tomcat各组件之间存在的层次关系如图1-2所示。
图1-2 Tomcat层次关系
【专家提示】Tomcat的组件可以在<TOMCAT_HOME>\conf\server.xml文件中进行配置,每个Tomcat组件在server.xml文件中对应一种配置元素。
在XML文件的代码中,这些组件之间关系如下所示:
<Server>
<Service>
<Connector/>
<Engine>
<Host>
<Context>
</Context>
</Host>
</Engine>
</Service>
</Server>
上述各组件将Tomcat分成若干层(Server层、Service层、Engine层、Host层、Context层),各层通过数据管道PipeLine交互,如图1-3所示。
上述各层对应组件及其在Tomcat服务器中的作用如下:
(1)Server层
对应Server组件,逻辑上表示整个Tomcat,即整个Catalina Servlet容器。它处于Tomcat顶层,可以包含一个或多个Service层。Tomcat提供了该层接口的一个默认实现,所以通常不需要用户自己去实现。
图1-3 Tomcat的层次结构
(2)Service层
对应Service组件,是包含在Server层中的一个逻辑功能层。它包含一个Engine层,以及一个或多个连接器(Connector)。Service组件将一个或多个Connector组件绑定到Engine层上,Connector组件侦听端口,获得用户请求,并将请求交给Engine层处理,同时把处理结果发给用户,从而实现一个特定的实际功能。Tomcat提供了Service接口的默认实现,所以通常也不需要用户定制。
(3)Engine层
对应Engine组件,该层是请求分发处理层,可以连接多个Connector。它从Connector接收请求后,解析出可以完成用户请求的URL,根据该URL可以把请求匹配到正确的Host上,当Host处理完用户请求后,Engine层把结果返回给适合的连接器,再由连接器传输给用户。该层的接口一般不需要用户来定制,特殊情况下,用户可以通过实现该接口来提供自定义的引擎。
(4)Host层
对应Host组件,该层表示一个虚拟主机,一个Engine层可以包含多个Host层,每个Host层可以包含一个或多个Context层,对应不同的Web应用。因为Tomcat给出的Host接口的实现(类StandardHost)提供了重要的附加功能,所以用户通常不需要定制Host。
(5)Context层
对应Context组件,该层代表某个虚拟主机上的实际目录或一个WAR,即单个Web应用程序,它运行在特定的虚拟主机中,使用最为频繁。一个Host层包含多个Context层,每一个Context都有唯一的路径,Host层接到请求后,根据用户请求的URL,将请求定位到Context层。
1.1.4 Java Web应用处理
充当Java Web的容器是Tomcat服务器最主要的功能。JavaWeb在Sun的Java Servlet规范中定义如下:Java Web应用由一组Servlet、HTML页、类,以及其他可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Web应用容器中运行。
由此定义可知,在Java Web应用中可以包含Servlet、JSP、类、静态文档和配置信息等。每个Web应用都对应唯一的Context,Servlet容器为每个运行的Java Web应用创建唯一的ServletContext对象,该对象被同一个Web应用中的所有组件所共享。
假设有3个Web应用,分别为HelloWorld、Counter和TableList,它们对应的主页URL分别如下:
HelloWorld:http://localhost1:8080/HelloWorld/index.html
Counter:http://localhost1:80/Counter/index.jsp
TableList:http://localhost2:8086/TableList/index.jsp
3个用户分别访问上述3个地址,则Tomcat服务器各个组件响应用户请求的过程如 图1-4所示,其中每个Context容器对应唯一的Java Web应用。
图1-4 Tomcat服务器各组件响应用户请求过程
1.1.5 Tomcat发展
随着Sun公司发布的Servlet/JSP规范不断完善和升级,Tomcat的版本也逐步更新。Tomcat版本和Servlet/JSP规范之间的对应关系如表1-1所示。
表1-1 Tomcat版本和Servlet/JSP规范
Tomcat版本 | Servlet/JSP规范 |
6.0.14 | 2.5/2.1 |
5.5.x | 2.4/2.0 |
4.1.27 | 2.3/1/2 |
其中,Tomcat目前的最新版本是Tomcat 6.0.14,它支持最新的J2SE标准、执行效率高、使用方便、发展前景良好,所以本书围绕Tomcat6.0.14展开讲述。
1.2 Tomcat的安装
本节将介绍Tomcat工作环境的安装、基本的启动与停止方法、JDK的安装与JVM性能调整、二进制版本的Tomcat安装以及从源代码安装Tomcat,最后讲解如何启动、停止和自动启动Tomcat,并进行安装的测试。
1.2.1 安装准备
在安装Tomcat之前必须先安装JDK。JDK的全称是Java Development Kit,是Sun公司免费提供的Java语言的软件开发工具包,其中包含Java虚拟机(JVM)。编写好的Java源程序经过编译可形成Java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了Java的跨平台性。
在平台兼容性方面,JDK作为解释字节码文件并据此调用操作系统API实现对应功能的Java虚拟机,与操作系统类型和平台位数密切相关,因此存在不同类型的版本,而Tomcat也具有上述特征,所以需要预先下载JDK和Tomcat,这两个软件的版本和下载地址如下:
JDK选择Sun官方网站提供的JDK-6U1,下载网址为https://sdlc5e.sun.com/ECom/EComActionServlet;jsessionid=6C6B460AC2EF83F7FF253E51D5B5BA1C。
用户访问上述网址需要注册,注册后就可以根据自己的计算机平台配置选择合适版本。
如果使用32位Windows系统,那么选择下载:
Windows OfflineInstallation (build 06),Multi-language
jdk-6u2-windows-i586-p.exe
如果使用32位Linux系统,那么选择下载:
Linux RPM inself-extracting file (build 05)
jdk-6u2-linux-i586-rpm.bin
如果使用64位Windows系统,那么选择下载:
Windows x64executable (build 05)
jdk-6u2-windows-amd64.exe
如果使用64位Linux系统,那么选择下载:
Linux x64 RPM inself-extracting file (build 05)
jdk-6u2-linux-amd64-rpm.bin
Tomcat选择apache- tomcat 6.0.14,下载网址为http://tomcat.apache.org/download-60.cgi。
在如图1-5所示的下载页面中,BinaryDistributions(二进制发行版)下方有若干组下载项,每组下载项有两个不同的版本对应不同的操作系统,其中zip是Windows平台下运行版本,tar.gz是Linux平台下运行版本。其中Core组和AdministrationWeb Application组必须下载,这两组分别对应Tomcat核心安装包和控制平台包,其他组内容可以根据需要来决定是否下载。
图1-5 Tomcat下载页面
本书内容都基于32位Windows系统,所以JDK选择jdk-6u1-windows-i586-p.exe,Tomcat选择apache- tomcat 6.0.14.zip和apache- tomcat 6.0.14-admin.zip。
对于Windows操作系统,tomcat 6.0.14提供了两种安装文件,一个文件为apache-tomcat 6.0.14.exe,另一个文件为apache-tomcat 6.0.14.zip。apache-tomcat 6.0.14.exe是可运行的安装程序,读者只需要双击这个文件,即可开始安装Tomcat。在安装过程中,安装程序会自动搜寻JDK和JRE的位置,并把Tomcat服务加入到Windows操作系统的服务中,同时在“开始”→“程序”菜单中加入Tomcat服务器管理菜单。apache-tomcat 6.0.14.zip是一个压缩包,只需要把它解压到本地硬盘即可,这种方式既适合Windows系统下的安装,也适用于其他操作系统,例如Linux系统,所以下面主要介绍apache-tomcat 6.0.14.zip的安装与Tomcat运行环境的设置。
1.2.2 JDK安装及设置
(1)双击jdk-6u1-windows-i586-p.exe,弹出如图1-6所示界面。单击“接受”按钮进入下一步。
图1-6 执行安装程序
(2)选择安装内容及路径,如图1-7所示。
其中,中间列表是要安装的可选功能,单击每个可选功能左边的按钮,将弹出下拉菜单,其选项内容包括“此功能将安装在本地硬盘驱动器上”、“此功能及所有子功能将安装在本地硬盘驱动器上”、“现在不安装此功能”和“此功能将不可用”,系统默认均为第一个选项。
(3)安装JRE,如图1-8所示。
图1-7 选择安装内容及路径 图1-8 设置JRE安装内容及路径
【专家提示】系统默认安装路径是C:\Program Files\Java\jdk1.6.0_02\,若想安装到其他路 径,可单击右边的“更改(A)…”按钮,选择其他安装路径。建议将JDK安装在C盘根目录下,即JDK的安装目录是C:\ jdk1.6.0_02\。
设置好安装内容及路径后,单击“下一步(N)”按钮,即在选择的安装路径下开始安装所选的内容。
JRE是Java Runtime Environment的缩写,是Java运行环境,即Java平台。和第二步界面相似,中间列表是要安装的可选功能,系统默认的都是第一个选项。下面是系统安装路径,默认是C:\Program Files\Java\jre1.6.0_02\,若想安装到其他路径,可单击右边的按钮,选择其他安装路径,JRE按照默认路径安装即可。
设置好安装内容及路径后,单击“下一步(N)”按钮,即可在选择的安装路径下安装所选的内容。安装完毕后弹出如图1-9所示界面,提示JDK安装完成。
图1-9 安装完成
安装完成后可以发现系统存在两套JRE,一套位于<JDK安装目录>\jre目录下(即C:\jdk1.6.0_02\jre),另一套位于C:\Program Files\Java\jre1.6.0_02目录下,后面这套比前面那套少了Server端的JVM,把前面那套Server端的JVM复制过来后两者效果一样。其实,在上述步骤中的第二步,已经安装了JDK和JRE(第一套),第三步安装的是第二套JRE。
安装两套JRE的原因是:JDK是基于DOS界面的Java程序集成开发环境,而JRE是Java程序运行的必备平台,即所谓的JVM。安装两套JRE,就是在机器上安装了两个JVM,它们都可以运行Java程序。Java应用程序可以分为两种,一种是JDK目录中的应用程序,另一种是根据各种应用需要开发的一般Java程序。它们执行时分别使用不同的JRE,可以减少搜索时间,利用JRE并行运行的特点来提高程序执行速度,所以C:\jdk1.6.0_02\jre下的JRE运行JDK目录中的应用程序,而C:\ProgramFiles\Java\jre1.6.0_02下的JRE运行一般Java应用程序。
安装完成后需要重新启动计算机,然后设置环境变量,步骤如下:
(1)右击“我的电脑”,在弹出的快捷菜单中选择“属性”命令,打开“系统属性”对话框,选择“高级”选项卡,单击“环境变量”按钮,打开“环境变量”对话框,如图1-10所示。
(2)单击“系统变量”选项区域中的“新建”按钮,打开“新建系统变量”对话框,变量名设置为JAVA_HOME,变量值设置为C:\jdk1.6.0_02,如图1-11所示,此变量值为JDK安装目录所在位置。
图1-10 “环境变量”对话框 图1-11 “新建系统变量”对话框
(3)再新建一个系统变量,变量名设置为classpath,变量值设置为;C:\jdk1.6.0_02\lib; C:\jdk1.6.0_02\lib\tools.jar,此变量值表示搜索Java类的路径,该路径中包含一些Jar归档文件或者相应的目录,Java程序执行时往往会从classpath中选择并添加自己需要的类路径。设置时需要注意,变量值最前面的“.”表示当前路径,不可以省略,不同值之间用“;”隔开。
(4)选中“系统变量”面板中的Path变量,然后单击“编辑”按钮,在弹出的“编辑系统变量”对话框中,在变量值的最后添加;C:\jdk1.6.0_02\bin,此变量设置一些常用目录,该目录中的文件在任何地方都可以直接访问,从而免去了在不同目录间反复切换的麻烦。
【专家提示】为了检验环境变量设置是否成功,可以采用下面的方法:选择“开始”→“运行”命令,输入cmd,进入DOS界面,然后在其中运行java和javac这两个命令,如果输出对应的帮助信息,则表明环境变量已经设置成功。
1.2.3 Tomcat安装及设置
把Tomcat压缩文件apache-tomcat-6.0.14.zip中的内容解压缩到C:\apache-tomcat-6.0.14下,然后按照1.2.2节中增加系统变量的方法增加系统变量。
变量名:TOMCAT_HOME;变量值:C:\apache-tomcat-6.0.14。然后修改系统变量classpath,添加%TOMCAT_HOME%\common\lib\servlet-api.jar;同时修改系统变量path,添加%TOMCAT_ HOME%\bin。
1.2.4 测试Tomcat
要测试Tomcat服务器是否安装成功,首先要启动Tomcat服务器。在Tomcat安装目录C:\apache-tomcat-6.0.14下面有一个bin目录,里面有两个文件:startup.bat和shutdown.bat,分别控制Tomcat的启动和关闭。由于在1.2.3节中已经把该目录加入到系统变量Path中,所以在命令行中直接输入对应的文件名即可实现Tomcat的启动和关闭,而不需要切换目录。在命令行中输入startup.bat,即可启动Tomcat,如图1-12所示。
图1-12 启动Tomcat
然后在浏览器地址栏中输入http://localhost:8080,按Enter键访问。如果出现如图1-13所示界面,则说明Tomcat安装成功。
图1-13 Tomcat默认主页
该界面是Tomcat服务器默认主页,对应文件是Tomcat安装目录下的webapps\ROOT\ index.jsp。该页面包含很多有用信息,对初学者大有益处,左边由上至下分为5个链接块,内容分别是系统管理(Administration)、Tomcat文档(Documentation)、Tomcat在线服务(Tomcat Online)、代码事例(Examples)和其他内容(Miscellaneous)。页面正文中提供两个Tomcat服务邮箱方便用户咨询,其中的users@tomcat.apache.org解答用户在Tomcat配置和使用中遇到的问题,dev@tomcat.apache.org解答用户在利用Tomcat进行Web开发中遇到的问题。
下面测试一般JSP页面是否可以在Tomcat下正常运行。
编写一个测试页面csaitest.jsp,内容如下:
<Html>
<Head>
<Title> JSP Test Page </Title>
</Head>
<Body>
<CENTER>
<P><h2>Current Time is <%= newjava.util.Date() %></h2></P>
<P><% out.println("<h1>Welcometo JSP World!</h1>"); %></P>
</CENTER>
</Body>
</Html>
把该文件放置在Tomcat安装目录下的webapps\ROOT文件夹中,然后在浏览器地址 栏中输入http://localhost:8080/csaitest.jsp,按Enter键访问。正常情况下应该出现如图1-14所示界面。
图1-14 测试页面
在浏览器地址栏中输入的8080表示端口号,端口(port)是计算机与外界通信交流的出口。硬件领域的端口又称接口,如USB端口等。软件领域的端口一般指网络中面向连接服务和无连接服务的通信协议端口,包括一些数据结构和I/O(基本输入/输出)缓冲区。
8080端口一般用于WWW代理服务,可以实现网页浏览。在访问某个网站或使用代理服务器时,经常加上“:8080”端口号,所以除了Tomcat,其他应用程序有时也会占用8080端口,如Oracle、JBoss等,这就会造成端口冲突问题,如图1-15所示。而且8080端口可以被各种病毒程序所利用和攻击,所以在某些情况下需要修改Tomcat的默认8080端口。下面以把Tomcat的8080端口改成8000端口为例讲解如何修改Tomcat默认端口号。Tomcat安装目录下的conf子目录存放Tomcat服务器的各种配置文件,其中的server.xml是一个标准的XML文档,在其中可以修改Tomcat默认端口号。利用任一文本编辑工具打开server.xml,将8080端口改为8000端口。对于初学者而言,由于不熟悉该文档结构,寻找修改端口号的位置有些困难。可以利用文本编辑工具的查找功能寻找8080字符串,找到后把该字符串改成8000即可。
图1-15 8080端口冲突
在Tomcat安装目录下有一个bin目录,里面的文件与Tomcat的启动与关闭有关。用记事本打开文件startup.bat和shutdown.bat,发现它们执行的是同一目录下的脚本catalina.bat,只不过是对应的参数不同。catalina.bat是控制Tomcat运行的重要脚本,允许采用命令行参数输入形式,使用方式为catalina 参数。不同参数实现的功能如表1-2所示。
表1-2 catalina.bat执行参数列表
命令行参数 | 功 能 解 释 |
Debug | 在调试模式下启动Tomcat服务器 |
debug -security | 在带安全管理的调试模式下启动Tomcat服务器 |
jpda start | 在jpda调试模式下启动Tomcat服务器 |
Run | 在当前DOS窗口启动Tomcat服务器 |
run -security | 在带安全管理的当前DOS窗口启动Tomcat服务器 |
Start | 在新的DOS窗口启动Tomcat服务器 |
start -security | 在带安全管理的新的DOS窗口启动Tomcat服务器 |
Stop | 关闭Tomcat服务器 |
Version | 显示Tomcat系统配置信息 |
其中系统默认参数是start,即在新窗口中启动Tomcat服务器。命令行参数加入-security表示在安全管理模式下运行,否则表示在一般模式下运行。两种模式不同之处在于采用的安全策略文件不同,一般模式下采用的安全策略文件是JDK安装目录\jre\lib\security子目录中的java.policy,而在安全管理模式下采用的安全策略文件是Tomcat安全目录\conf子目录中的catalina.policy。很明显,安全管理模式的安全程度要高于一般模式。命令行参数中的jpda指的是Java平台调试构架,是一组API集合,包括接口和协议,可以对运行中的Java应用程序进行全方位调试。
1.3 Tomcat的配置
运行Tomcat之后,需要对Tomcat进行个性化的设置。本节将介绍包括虚拟机、站点参数和用户验证等方面的Tomcat配置。
1.3.1 Tomcat目录结构
在配置Tomcat之前,首先要了解Tomcat的目录结构。Tomcat安装后目录层次结构如图1-16所示。
图1-16 Tomcat安装目录
不同目录的用途如表1-3所示。
表1-3 Tomcat目录结构及用途
目 录 | 用 途 |
\bin | 存放启动和关闭Tomcat的脚本文件 |
\common\lib | 存放Tomcat服务器及所有Web应用都可访问的JAR文件 |
\conf | 存放Tomcat服务器的各种配置文件,包括server.xml、web.xml、catalina.policy等 |
\logs | 存放Tomcat的日志文件 |
\server\lib | 存放Tomcat服务器可以访问的JAR文件 |
\server\webapps | 存放Tomcat自带的两个Web应用:admin和manager,用来管理Tomcat的Web服务 |
\shared\lib | 存放所有Web应用都可以访问的JAR文件 |
\temp | 存放Tomcat运行时的临时文件 |
\webapps | Web应用的发布目录,把Web应用文件放入该目录下就可以通过Tomcat服务器来访问 |
\work | 存放JSP经过Tomcat编译后生成的Servlet |
由表1-3可知,在\common\lib、\server\lib和\shared\lib目录下都可以存放JAR文件,但是有所区别:在\common\lib目录下的JAR文件可以被Tomcat服务器和所有Web应用访问;在\server\lib目录下的JAR文件只可以被Tomcat服务器访问;在\shared\lib目录下的JAR文件可以被所有的Web应用访问,但不能被Tomcat服务器访问。
1.3.2 Tomcat常用配置文件
在Tomcat目录中,比较重要的配置文件有\conf下的tomcat-users.xml、server.xml以及\webapps中应用程序目录下的web.xml。Tomcat采用基于角色的访问控制模型管理用户对系统的使用,安全性比较高,其角色和对应用户都保存在tomcat-users.xml中。Tomcat服务器是由一些可配置的组件构成,在server.xml文件中可以对这些组件进行配置,每个Tomcat组件和server.xml文件是一一对应的。web.xml是按照Servlet规范定义的Web应用发布描述符文件,是完全独立于Tomcat容器的Web应用配置文件。
下面是一个tomcat-users.xml文件的内容:
<?xmlversion='1.0' encoding='utf-8'?>
<tomcat-users>
<rolerolename="tomcat"/>
<rolerolename="role1"/>
<userusername="tomcat" password="tomcat"roles="tomcat"/>
<userusername="both" password="tomcat" roles="tomcat,role1"/>
<userusername="role1" password="tomcat"roles="role1"/>
</tomcat-users>
其中,文件开头声明了XML的版本和编码方式,<tomcat-users>和</tomcat-users>之间描述了系统中的角色和用户。其中<rolerolename="tomcat"/>表示建立了一个名字叫tomcat的角色;<userusername="tomcat" password="tomcat"roles="tomcat"/>表示建立了一个用户,名字为tomcat,密码为tomcat,拥有角色tomcat所拥有的权限。一个用户可以拥有多个角色的权限,<userusername="both" password="tomcat" roles="tomcat,role1"/>表明用户both拥有角色tomcat和role1两者的权限。该文件具有扩充性,用户可以增加角色和用户。
1.3.3 Tomcat管理程序
实际使用中,需要配置Tomcat服务器以及Web应用,这是通过结合手工编辑XML文件和平台配置实现的,主要分为两部分:控制配置和管理配置。控制配置可以配置Tomcat服务器以及Web应用;管理配置可以在不重启Tomcat服务器的情况下,方便地发布、启动、停止或卸载Web应用。
在Tomcat 6以前的版本中,分别通过控制平台和管理平台对Tomcat实施控制配置和管理配置,这两个平台都可以通过在浏览器地址栏中输入URL的方式进行登录。但由于Tomcat6.0.14没有提供控制平台包,所以要通过修改conf子目录下的server.xml来进行控制配置,管理配置可以通过Tomcat自带的管理平台来实现,该平台位于Tomcat安装目录\server\webapps\manager下。
1.3.4 Tomcat的控制配置
在Tomcat 6.0.14中,进行控制配置的主要途径是修改conf子目录下的文件server.xml,主要配置内容包括3部分:Service、Resource和User Definition。
其中Service配置内容和1.1.3节中的内容相同,主要是通过配置文件server.xml中的<Server>元素、<Service>元素、<Connector>元素、<Engine>元素、<Host>元素和<Context>元素来添加、删除或修改相应的组件,从而对Web应用实施全方位的管理。
Resource用于配置Tomcat中的各种资源,主要包括以下4种:Data Source(数据源)、Mail Session(邮件会话)、Environment Entry(环境入口)和User Database(用户数据库)。
1.3.5 Tomcat的管理配置
在浏览器地址栏中输入http://localhost:8080/manager/html,或者在图1-13中单击左上方Administration下的Tomcat Manager,均可进入Tomcat管理平台的登录界面,如图1-17所示。
图1-17 管理平台登录界面
默认情况下,Tomcat并没提供具有管理权限的账号,所以需要添加具有这种权限的账号。角色manager具有这种权限,但在系统用户控制文件tomcat-users.xml中并没有设置这两种角色和对应的用户,所以需要添加这种角色和用户,方法是打开tomcat-users.xml文件,添加如下内容:
<role rolename="manager"/>
<user username="manager" password="manager"roles="manager"/>
上述代码先创建角色manager,然后创建对应的用户manager,tomcat-users.xml文件修改后,必须重启Tomcat服务器,文件修改才能生效。
在图1-17中,输入用户名manager和密码manager,单击“确定”按钮即可进入Tomcat管理平台,如图1-18和图1-19所示。
图1-18 Tomcat管理平台1
图1-19 Tomcat管理平台2
Tomcat管理平台自上而下分为以下5部分:
(1)Message
消息栏,表示Tomcat管理平台情况,其值为OK时表示正常工作。
(2)Manager
下面有4个链接选项,分别是ListApplications(Web应用管理列表)、HTML Manager Help(如何管理基于HTML的Web应用的帮助信息)、Manager Help(如何管理其他Web应用的帮助信息)和ServerStatus(Tomcat服务器状态),系统默认链接是第一个。
(3)Application
管理Tomcat服务器中的所有Web应用,每个Web应用都有5个属性,下面分别介绍其含义。
q Path:该Web应用的URL入口。
q Display Name:标记此Web应用的一个名称,供GUI工具使用,对应于web.xml中的display-name属性。
q Running:此Web应用是否处于运行状态。
q Sessions:连接需要的Session数目。
q Commands:分为上下两行,上面一行提供若干命令列表,用于Tomcat服务器处于运行状态时管理这些Web应用,这些命令的功能如表1-4所示。
表1-4 应用管理命令
命 令 | 功 能 |
Start | 启动Web应用 |
Stop | 停止Web应用 |
Reload | 停止Web应用,重新加载Web应用各种组件,然后重新启动Web应用 |
Undeploy | 卸载Web应用,并且删除\webapps目录下对应的文件 |
(4)Deploy
用来发布Web应用,有下述两种方式。
第一种方式是在Deploy directory or WAR file located on server下填写该Web应用的相关信息,如Web应用的URL入口、XML配置文件对应路径、WAR文件或者该Web应用相对于\webapps目录的文件路径,然后单击按钮,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式只能发布位于\webapps目录下的Web应用。
第二种方式是在WAR file to deploy下单击按钮,在弹出的文件对话框中选择需要发布的WAR文件,然后单击按钮,即可发布该Web应用,发布后在Application列表中即可看到该Web应用的信息。这种方式可以发布位于任意目录下的Web应用。
其中,第二种方式实际上是把需要发布的WAR文件自动复制到\webapps目录下,所以上述两种方式发布的Web应用都可以通过在浏览器地址栏中输入http://localhost:8080/Web进行访问。
(5)ServerInformation
显示Tomcat服务器的信息,如Tomcat版本号、JVM版本号、JVM发行商、操作系统名称和版本等信息。
1.4 第一个Web应用
聊天室是常用的Web应用,在本节中将结合上述内容来设计一个无须数据库支持的简单聊天室。
1.4.1 需求分析
本聊天室面向普通大众,满足沟通、交流的基本需求,所以功能上应该少而精,而不要多而杂。由于没有数据库存储信息,所以不需保存用户名和密码,用户用昵称即可登录。聊天室采用多用户并发操作机制,聊天内容具有共享性,在公共聊天板上可以看到每个用户的聊天内容,由于没有数据库,所以不存储聊天内容。
基于上述分析,本聊天室具有以下功能。
q 用户登录:进入聊天室的第一个步骤,用户输入昵称(可任意设定)即可进入聊 天室。
q 显示聊天内容:在公共聊天板上分别显示不同用户的聊天内容。
q 输入聊天内容:用户在输入框输入并发出自己的聊天内容。
整个操作流程图如图1-20所示。
图1-20 聊天室流程图
1.4.2 软件架构
本聊天室采用典型的MVC架构进行设计。
q M—模型层:处理用户登录事件,发送、显示用户聊天内容。
q V—视图层:用户登录,输入聊天信息,显示聊天内容。
q C—控制层:初始欢迎页面设置,页面转向,不同事件处理方法,页面内容部署。
1.4.3 文件清单
本聊天室的主要功能是输入并显示聊天信息,具体文件如表1-5所示。
表1-5 文件清单
文 件 名 | 实 现 功 能 |
web.xml | 配置发布信息,设置应用启动时的欢迎界面 |
index.jsp | 欢迎界面,同时转到聊天室登录界面 |
login.html | 登录聊天室 |
class_method.jsp | 处理3种不同事件(登录、发送和输出聊天内容) |
main.html | 聊天室主界面 |
inputMsg.jsp | 输入用户聊天内容 |
showMsg.html | 显示用户聊天内容 |
目录结构如图1-21所示。
图1-21 聊天室目录结构
1.4.4 文件详述
1.web.xml
主要功能是设置聊天室启动时的欢迎界面,在web.xml中,可以使用<welcome-file-list>和<welcome-file>标签指示服务器在收到引用一个目录名而不是文件名的URL时,使用哪个文件作为默认的欢迎界面。本应用中采用index.jsp作为欢迎界面,代码如下:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
2.index.jsp
本页面采用response中的SendRedirect方法转到指定的页面,代码如下:
response.sendRedirect("login.html");
3.login.html
聊天室登录界面,如图1-22所示。
图1-22 登录聊天室
本界面采用HTML中的form标签提交用户输入的聊天室昵称,采用文件class_method. jsp中login参数触发的方法予以处理,关键代码如下:
<formname="form1"method="post"action="class_method.jsp?action=login"><!--采用传递参数的方法执行不同的Web应用-->
<table>
<tr>
<td>
请输入您的昵称:
</td>
</tr>
<tr>
<td>
<input name="user" type="text"id="user"><!--文本框-->
</td>
<td>
<input type="submit" name="Submit" value="进入开心聊天室"><!--提交按钮-->
</td>
</tr>
</table>
</form>
4.class_method.jsp
本页面首先获取前面文件传送回来的参数,对不同的参数进行不同的处理。
如果参数是login,则获取用户昵称并存放在Session之中,然后形成欢迎字符串,并转向聊天室主页面。
如果参数是sendMsg,并且用户聊天输入框中的内容不为空,则把原来公共聊天板上的信息和用户聊天输入框中的内容联结在一起,形成新的公共聊天板内容并输出,然后继续转向用户输入页面。
如果参数是showMsg,则在公共聊天板上显示用户输入的信息。关键代码如下:
String action =request.getParameter("action");/*获取前面文件传送回来的参数*/
/*对不同参数进行不同的处理*/
if(action.equals("login")){/*进入聊天室*/
user=request.getParameter("user");
msg="欢迎"+user+"光临开心聊天室!";
session.setAttribute("user",user);
response.sendRedirect("main.html");/*转向聊天室主页面*/
}
if(action.equals("sendMsg")){/*发送用户在聊天室输入的信息*/
if((String)request.getParameter("msg")!="")/*如果用户输入数据不为空*/
/*通过连接形成新的输出字符串*
/msg=(String)msg+"<br>"+session.getAttribute("user")+":"+(String)request. getParameter("msg");
response.sendRedirect("inputMsg.jsp");/*转向用户输入页面*/
}
if(action.equals("showMsg")){/*显示用户在聊天室输入的信息*/
out.println("loadContent.innerHTML=\""+msg+"\";");/*转向聊天室信息输出页面*/
}
5.main.html
聊天室主界面如图1-23所示。
该界面采用两行一列的框架进行部署,其中框架第一行显示聊天室输出信息,框架第二行是用户聊天输入框。当浏览器不支持框架时显示空白页面。关键代码如下:
<!--采用框架模式部署聊天室-->
<framesetrows="*,80"cols="*"frameborder="yes"border="2"framespacing="2">
<frame src="showMsg.html"name="mainFrame">/*第一个框架,显示聊天室输出信息-->
<frame src="inputMsg.jsp"name="bottomFrame" scrolling="NO" noresize><!--第二个框架,便于用户输入信息-->
</frameset>
<noframes><body><!--当浏览器不支持框架时显示空白-->
</body></noframes>
图1-23 聊天室主界面
6.inputMsg.jsp
该文件是main.html文件中框架的一部分,用户可以输入聊天内容。和login.html相似,也是采用HTML中的form标签提交用户输入的聊天室昵称,采用文件class_method.jsp中sendMsg参数触发的方法予以处理,关键代码如下:
<formaction="class_method.jsp?action=sendMsg" method="post"name="form1">
<!--用户输入聊天信息-->
<%=session.getAttribute("user")%>:
<input name="msg" type="text"id="msg" size="60">
<input type="submit" name="Submit" value="发言">
</form>
7.showMsg.html
该文件是main.html文件中框架的一部分,可以在公共聊天板中显示聊天内容。
该页面采用无刷新技术显示聊天内容,建立一个JS函数GetData(url),该函数每隔2000毫秒递归调用自己,等效于反复显示用户输入的聊天内容,并且把该函数设定为页面装载时发生的事件,所以一旦装载该页面,就可以不断重复地显示所有聊天内容,和刷新技术实现的效果相似。显示区采用span标签标识,可以通过改变其innerHTML属性实现显示内容动态改变。
/*显示聊天内容*/
function GetData(url)
{
addr="class_method.jsp?action=showMsg";/*递归调用页面*/
try
{
DataLoad.src = addr;
}
catch(e)/*异常处理*/
{
return false;
}
{
timeoutid = setTimeout("GetData()",2000);/*自己递归调用自己,时差是2000毫秒,等效于反复显示内容*/
}
}
</script>
<scriptid="DataLoad"language="JavaScript"type="text/javascript"defer></script>
</head>
<body onLoad="javascript:GetData();"><!--页面装载时调用的JS事件-->
<span id=loadContent>请稍候片刻,数据即可载入……</span>
<!--span标签可以动态改变其中的内容-->
</body>
1.4.5 发布聊天室
(1)把目录复制到<TOMCAT_HOME>/webapps目录下。
(2)启动Tomcat服务器,然后在IE浏览器地址栏中输入http://localhost:8080/MiniChat,即可启动聊天室。
1.5 小 结
Tomcat是一个JSP/Servlet容器,具有3种工作模式,Java Servlet API是它和Servlet之间的接口,定义了传送给Servlet的对象类,其中最主要的是请求对象ServletRequest和响应对象ServletResponse。
Tomcat各组件将Tomcat分为5层,即Server层、Service层、Engine层、Host层和Context层,处于顶层的是Catalina Servlet容器,它是组件的核心,各层之间通过数据管道PipeLine交互。
安装Tomcat前需先安装JDK,两者要根据机器情况到官方网站选择下载,安装后要设置环境变量,并且要测试Tomcat是否安装成功。
配制Tomcat时,既可通过修改配置文件来完成,也可登录Tomcat的控制和管理平台来完成,两者彼此等效。相比较而言,后者不易修改出错,而且容易掌握。
Tomcat笔记(1)
Tomcat启动分析
heavyz, 2003-03-22
1 -Tomcat Server的组成部分
1.1 - Server
A Server elementrepresents the entire Catalina servlet container. (Singleton)
1.2 - Service
A Service elementrepresents the combination of one or more Connector components that share asingle Engine
Service是这样一个集合:它由一个或者多个Connector组成,以及一个Engine,负责处理所有Connector所获得的客户请求
1.3 - Connector
一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户
TOMCAT有两个典型的Connector,一个直接侦听来自browser的http请求,一个侦听来自其它WebServer的请求
Coyote Http/1.1 Connector 在端口8080处侦听来自客户browser的http请求
Coyote JK2 Connector 在端口8009处侦听来自其它WebServer(Apache)的servlet/jsp代理请求
1.4 - Engine
The Engine elementrepresents the entire request processing machinery associated with a particularService
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmissionback to the client
Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名
当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理
Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理
1.5 - Host
代表一个VirtualHost,虚拟主机,每个虚拟主机和某个网络域名Domain Name相匹配
每个虚拟主机下都可以部署(deploy)一个或者多个WebApp,每个Web App对应于一个Context,有一个Context path
当Host获得一个请求时,将把该请求匹配到某个Context上,然后把该请求交给该Context来处理
匹配的方法是“最长匹配”,所以一个path==""的Context将成为该Host的默认Context
所有无法和其它Context的路径名匹配的请求都将最终和该默认Context匹配
1.6 - Context
一个Context对应于一个Web Application,一个Web Application由一个或者多个Servlet组成
Context在创建的时候将根据配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml载入Servlet类
当Context获得请求时,将在自己的映射表(mappingtable)中寻找相匹配的Servlet类
如果找到,则执行该类,获得请求的回应,并返回
2 -Tomcat Server的结构图
3 - 配置文件$CATALINA_HOME/conf/server.xml的说明
该文件描述了如何启动TomcatServer
<!----------------------------------------------------------------------------------------------->
<!-- 启动Server
在端口8005处等待关闭命令
如果接受到"SHUTDOWN"字符串则关闭服务器
-->
<Server port="8005" shutdown="SHUTDOWN"debug="0">
<!-- Listener ???
目前没有看到这里
-->
<ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener"debug="0"/>
<ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"debug="0"/>
<!-- Global JNDIresources ???
目前没有看到这里,先略去
-->
<GlobalNamingResources>
... ... ... ...
</GlobalNamingResources>
<!-- Tomcat的Standalone Service
Service是一组Connector的集合
它们共用一个Engine来处理所有Connector收到的请求
-->
<Servicename="Tomcat-Standalone">
<!-- Coyote HTTP/1.1Connector
className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
port : 在端口号8080处侦听来自客户browser的HTTP1.1请求
minProcessors : 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
maxProcessors : 当现有的线程不够服务客户请求时,若线程总数不足75个,则创建新线程来处理请求
acceptCount : 当现有线程已经达到最大数75时,为客户请求排队
当队列中请求数超过100时,后来的请求返回Connection refused错误
redirectport : 当客户请求是https时,把该请求转发到端口8443去
其它属性略
-->
<ConnectorclassName="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080"
minProcessors="5" maxProcessors="75"acceptCount="100"
enableLookups="true"
redirectPort="8443"
debug="0"
connectionTimeout="20000"
useURIValidationHack="false"
disableUploadTimeout="true" />
<!-- Engine用来处理Connector收到的Http请求
它将匹配请求和自己的虚拟主机,并把请求转交给对应的Host来处理
默认虚拟主机是localhost
-->
<Enginename="Standalone" defaultHost="localhost"debug="0">
<!-- 日志类,目前没有看到,略去先 -->
<LoggerclassName="org.apache.catalina.logger.FileLogger" .../>
<!-- Realm,目前没有看到,略去先 -->
<RealmclassName="org.apache.catalina.realm.UserDatabaseRealm" .../>
<!-- 虚拟主机localhost
appBase : 该虚拟主机的根目录是webapps/
它将匹配请求和自己的Context的路径,并把请求转交给对应的Context来处理
-->
<Hostname="localhost" debug="0" appBase="webapps"unpackWARs="true" autoDeploy="true">
<!-- 日志类,目前没有看到,略去先 -->
<LoggerclassName="org.apache.catalina.logger.FileLogger" .../>
<!-- Context,对应于一个Web App
path : 该Context的路径名是"",故该Context是该Host的默认Context
docBase : 该Context的根目录是webapps/mycontext/
-->
<Context path=""docBase="mycontext" debug="0"/>
<!-- 另外一个Context,路径名是/wsota -->
<Contextpath="/wsota" docBase="wsotaProject"debug="0"/>
</Host>
</Engine>
</Service>
</Server>
<!----------------------------------------------------------------------------------------------->
4 -Context的部署配置文件web.xml的说明
一个Context对应于一个Web App,每个Web App是由一个或者多个servlet组成的
当一个Web App被初始化的时候,它将用自己的ClassLoader对象载入“部署配置文件web.xml”中定义的每个servlet类
它首先载入在$CATALINA_HOME/conf/web.xml中部署的servlet类
然后载入在自己的Web App根目录下的WEB-INF/web.xml中部署的servlet类
web.xml文件有两部分:servlet类定义和servlet映射定义
每个被载入的servlet类都有一个名字,且被填入该Context的映射表(mapping table)中,和某种URL PATTERN对应
当该Context获得请求时,将查询mapping table,找到被请求的servlet,并执行以获得请求回应
分析一下所有的Context共享的web.xml文件,在其中定义的servlet被所有的Web App载入
<!----------------------------------------------------------------------------------------------->
<web-app>
<!-- 概述:
该文件是所有的WEB APP共用的部署配置文件,
每当一个WEB APP被DEPLOY,该文件都将先被处理,然后才是WEB APP自己的/WEB-INF/web.xml
-->
<!-- +-------------------------+ -->
<!-- | servlet类定义部分 | -->
<!-- +-------------------------+ -->
<!-- DefaultServlet
当用户的HTTP请求无法匹配任何一个servlet的时候,该servlet被执行
URL PATTERN MAPPING :/
-->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- InvokerServlet
处理一个WEB APP中的匿名servlet
当一个servlet被编写并编译放入/WEB-INF/classes/中,却没有在/WEB-INF/web.xml中定义的时候
该servlet被调用,把匿名servlet映射成/servlet/ClassName的形式
URL PATTERN MAPPING :/servlet/*
-->
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- JspServlet
当请求的是一个JSP页面的时候(*.jsp)该servlet被调用
它是一个JSP编译器,将请求的JSP页面编译成为servlet再执行
URL PATTERN MAPPING :*.jsp
-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>logVerbosityLevel</param-name>
<param-value>WARNING</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<!-- +---------------------------+ -->
<!-- | servlet映射定义部分 | -->
<!-- +---------------------------+ -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
<!-- +------------------------+ -->
<!-- | 其它部分,略去先 | -->
<!-- +------------------------+ -->
... ... ... ...
</web-app>
<!----------------------------------------------------------------------------------------------->
5 -Tomcat Server处理一个http请求的过程
假设来自客户的请求为:
http://localhost:8080/wsota/wsota_index.jsp
1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2) Connector把该请求交给它所在的Service的Engine来处理,并等待来自Engine的回应
3) Engine获得请求localhost/wsota/wsota_index.jsp,匹配它所拥有的所有虚拟主机Host
4) Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5) localhost Host获得请求/wsota/wsota_index.jsp,匹配它所拥有的所有Context
6) Host匹配到路径为/wsota的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7) path="/wsota"的Context获得请求/wsota_index.jsp,在它的mapping table中寻找对应的servlet
8) Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9) 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10)Context把执行完了之后的HttpServletResponse对象返回给Host
11)Host把HttpServletResponse对象返回给Engine
12)Engine把HttpServletResponse对象返回给Connector
13)Connector把HttpServletResponse对象返回给客户browser