Servlet/JSP深入详解:基于Tomcat的Web开发--第三章
本章要点 — 掌握配置任意目录下的Web应用程序 — 掌握以WAR文件的形式发布Web应用程序 — 掌握与Servlet配置相关的元素的使用 Web应用程序的开发分为设计开发与配置部署两个阶段。通过部署,实现了组件与组件之间的松耦合,降低了Web应用程序的维护难度。 本章主要介绍以下几个主题: — 如何配置任意目录下的Web应用程序 — 如何以WAR文件的形式发布Web应用程序 — 与Servlet配置相关的元素的使用 3.1 配置任意目录下的Web应用程序 一个Web容器可以运行多个Web应用程序,每个Web应用程序都有一个唯一的上下文根,上下文根如何部署是和具体的Web容器相关的。对于Tomcat来说,%CATALINA_HOME%\webapps目录下的每一个子目录都是一个独立的Web应用程序,这个子目录的名字就是这个Web应用程序的上下文根。例如,第2章的Web应用程序位于%CATALINA_HOME%\webapps\ch02目录,上下文根就是ch02。 在部署和访问Web应用程序时,通过上下文路径(context path)来区分不同的Web应用程序。上下文路径以斜杠(/)开头,但结束没有斜杠(/)。在默认上下文中,这个路径将是空字符串""。例如:/ch02是第2章的Web应用程序的上下文路径,凡是发往/ch02路径的请求,都会交由这个路径下的Web应用程序的资源来进行响应。 在第2章中,我们将开发的Web应用程序放在了%CATALINA_HOME%\webapps目录下,当Tomcat启动时,会自动加载webapps目录下的Web应用程序,所以在这个目录下的Web应用程序不需要进行其他的配置就可以直接访问了。但是,我们在开发的时候,经常会建立自己的开发目录,在开发阶段完成后,才进入正式的产品部署阶段。如果每当我们完成一个功能,需要测试运行的时候,都要将文件复制到webapps目录下对应的Web应用程序目录中,那未免太烦琐了。我们知道,在Web服务器中可以配置虚拟目录,而虚拟目录所对应的真实目录可以在任何路径下。同样地,在Tomcat中,也有类似的配置,这主要是在XML配置文件中通过<Context>元素的设置来完成的。一个<Context>元素就表示一个Web应用程序,运行在特定的虚拟主机中。 <Context>元素的常用属性如表3-1所示。 表3-1 <Context>元素的常用属性
<Context>元素是<Host>元素的子元素,可以在%CATALINA_HOME%\l文件中设置Context元素。例如,针对第2章的Web应用程序,可以做如下配置: <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/ch02" docBase="ch02" reloadable="true"/> … </Host> 在<Context>元素中使用的属性的含义在表3-1中已经列出了,这里就不再讲述了。 在Tomcat中,我们还可以把<Context>元素放在下列位置的文件中。 ① %CATALINA_HOME%\l文件,在这个文件中设置的信息将被所有的Web应用程序所加载。 ② %CATALINA_HOME%\conf\[enginename]\[hostname]\l.default文件,[enginename]表示的是在l文件中设置的<Engine>元素的name属性的值,[hostname]表示的是在l文件中设置的<Host>元素的name属性的值,关于l文件的详细信息,可以参看附录C。在笔者的机器上,%CATALINA_HOME%\ l文件中<Engine>元素的name属性的值是Catalina,<Host>元素的name属性的值是localhost,你可以在%CATALINA_HOME%\conf目录下依次创建Catalina\localhost目录,然后在localhost目录下新建l.default文件,在这个文件中设置的信息将被属于该虚拟主机的所有Web应用程序所加载。 ③ 可以为一个Web应用程序建立%CATALINA_HOME%\conf\[enginename]\ [hostname]\l文件,在这个XML文件中,<Context>元素的docBase属性通常是Web应用程序目录的绝对路径名,或者是Web应用程序归档文件的绝对路径名。 ④ 在Web应用程序的目录结构中增加l文件。包含META-INF子目录的Web应用程序的目录层次结构如图3-1所示。 在%CATALINA_HOME%\webapps目录下的Web应用程序,如果没有在任何文件中设置<Context>元素,那么Tomcat将为这个Web应用程序自动生成<Context>元素。自动生成的<Context>元素的上下文路径将以斜杠(/)开始,后面紧跟Web应用程序所在目录的名字,如果目录的名字是ROOT,那么上下文路径将是一个空字符串("")。所以在%CATALINA_HOME%\webapps目录下的Web应用程序可以不经配置而直接使用。 在%CATALINA_HOME%\webapps目录下有一个ROOT目录,Tomcat为ROOT目录生成的<Context>元素的上下文路径是空字符串(""),而我们知道,如果一个Web应用程序的上下文路径是空字符串(""),则这个Web应用程序将作为虚拟主机的默认Web应用程序,负责处理所有的没有分配给其他Web应用程序的请求,这也就是为什么我们访问localhost:8080/时,访问的是%CATALINA_ HOME%\webapps\ROOT目录下的资源。 如果我们想将开发的目录直接配置成Web应用程序运行的目录,而不是将这个目录复制到%CATALINA_HOME%\webapps目录下,可以在两处地方进行配置。例如,在笔者的机器上,本章的例子程序所在目录是F:\JSPLesson\ch03,为了可以直接在这个目录下运行Web应用程序,我们编辑%CATALINA_HOME%\l文件,设置<Context>元素,如例3-1所示。 例3-1 在l中设置<Context>元素 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="/ch03"docBase="F:\JSPLesson\ch03"reloadable="true"/> … </Host> 使用docBase属性指定Web应用程序的真实路径。将属性reloadable设置为true,Tomcat在运行时会自动监测Servlet类的改动,如果发现有类被更新,Tomcat服务器将自动重新加载该Web应用程序。这样,在开发时,我们就不需要频繁重启Tomcat了。读者可以将ch03目录按照Web应用程序的目录层次结构建好,然后编写一个简单的输出“Hello World”的Servlet进行测试,步骤和第2章的实例程序的编写步骤是一样的。 此外,我们还可以在%CATALINA_HOME%\conf目录下依次创建Catalina\localhost目录,然后在localhost目录下为ch03这个Web应用程序建立l文件,编辑这个文件,输入如例3-2所示的内容。 例3-2 l <Context path="/ch03" docBase="F:\JSPLesson\ch03" reloadable="true"/> 读者可以用自己编写的Servlet类进行测试,在测试之前,要先把l文件中设置的<Context>元素删除或注释起来。 从Tomcat 5开始,不建议直接在l文件中配置<Context>元素,因为l文件作为Tomcat的主要配置文件,一旦Tomcat启动后,将不会再读取这个文件,因此你无法在Tomcat服务器启动时发布Web应用程序。如果在其他地方配置<Context>元素,那么在Tomcat运行时,也可以发布Web应用程序。 从Tomcat 5.5开始,在%CATALINA_HOME%\conf\[enginename]\ [hostname]\目录下创建XML配置文件来配置Web应用程序,Tomcat将以XML文件的文件名将作为Web应用程序的上下文路径,而不管你在<Context>元素的path属性中指定的上下文路径是什么。例如,文件名是l,<Context>元素的path属性设置为/hello,那么执行localhost:8080/hello/helloworld将提示HTTP 404错误,如果执行localhost:8080/ch03/helloworld将显示正确的输出信息。而Tomcat 5.5之前的版本则是以<Context>元素的path属性的值作为上下文的路径。 由于Tomcat 5.5之后的版本是以XML配置文件的文件名作为Web应用程序的上下文路径的,因此在配置<Context>元素时,可以不使用path属性。 %CATALINA_HOME%\l为运行在同一个Tomcat实例中的所有Web应用程序定义了默认值。当Tomcat加载一个Web应用程序的时候,首先读取这个文件,然后再读取Web应用程序目录下的l文件。 3.2 WAR文件 如果一个Web应用程序的目录和文件非常多,那么将这个Web应用程序部署到另一台机器上,就不是很方便了,我们可以将Web应用程序打包成Web归档(WAR)文件,这个过程和把Java类文件打包成JAR文件的过程类似。利用WAR文件,可以把Servlet类文件和相关的资源集中在一起进行发布。在这个过程中,Web应用程序就不是按照目录层次结构来进行部署了,而是把WAR文件作为部署单元来使用。 一个WAR文件就是一个Web应用程序,建立WAR文件,就是把整个Web应用程序(不包括Web应用程序层次结构的根目录)压缩起来,指定一个.war扩展名。下面我们将第2章的Web应用程序打包成WAR文件,然后发布。WAR文件的创建与JAR文件的创建使用相同的命令。 打开命令提示符,进入%CATALINA_HOME%\webapps\ch02\目录,执行下面的命令: jar -cvf ch02.war * 这个命令将ch02目录下所有的子目录和文件都打包成一个名为ch02.war的归档文件。如果不想包含src目录及其下的Java源文件(在发布时不应该把Java源文件包含到WAR文件中),可以执行下面的命令: jar -cvf ch02.war *.html WEB-INF/ 要查看WAR文件的内容,可以执行下面的命令: jar -tf ch02.war 这个命令将列出WAR文件的内容,或者用WinRAR工具软件查看ch02.war文件的内容,如图3-2所示。 图3-2 使用WinRAR查看ch02.war文件 如果修改了某个Servlet类文件,需要替换WAR文件中的旧文件,可以执行下面的命令: jar -uf ch02.war WEB-INF/classes/org/sunxin/ch02/servlet/LoginServlet. class 当然你也可以利用WinRAR软件来更新压缩包中的文件。 如果我们将ch02.war文件放到%CATALINA_HOME%\webapps目录下,在Tomcat启动时,会自动解压这个WAR文件,按照打包前的目录层次结构生成与WAR文件的文件名同名的目录ch02及下面的子目录和文件。读者可以自己动手做一下实验,先删除在%CATALINA_HOME%\webapps目录下的ch02目录,然后将ch02.war文件复制到%CATALINA_HOME%\webapps目录下,启动Tomcat,你会看到在webapps目录下新产生了一个ch02目录。 当然,我们也可以直接从WAR文件运行Web应用程序,打开%CATALINA_ HOME%\conf\server. xml文件,到<Host>元素的配置处,如下所示: <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> … 将unpackWARs属性的值设置为false,这样,Tomcat将直接运行WAR文件。关于<Host>元素各属性的含义,请参看附录C或Tomcat的文档。 删除Tomcat产生的目录ch02,重新启动Tomcat,查看%CATALINA_HOME%\webapps目录,可以看到这次没有产生ch02目录,打开浏览器,输入以前访问过的URL进行测试。 在建立WAR文件之前,需要建立正确的Web应用程序的目录层次结构。 — 建立WEB-INF子目录,并在该目录下建立classes与lib两个子目录。 — 将Servlet类文件放到WEB-INF\classes目录下,将Web应用程序所使用Java类库文件(即JAR文件)放到WEB-INF\lib目录下。 — 建立l文件,放到WEB-INF目录下。 — 根据Web应用程序的需求,将JSP页面或静态HTML页面放到上下文根路径下或其子目录下。 — 如果有需要,建立META-INF目录,并在该目录下建立l文件。 只有在确保这些工作后都完成后,才开始建立WAR文件。 要注意的是,虽然WAR文件和JAR文件的文件格式是一样的,并且都是使用jar命令来创建,但就其应用来说,WAR文件和JAR文件是有根本区别的。JAR文件的目的是把类和相关的资源封装到压缩的归档文件中,而对于WAR文件来说,一个WAR文件代表了一个Web应用程序,它可以包含Servlet、HTML页面、Java类、图像文件,以及组成Web应用程序的其他资源,而不仅仅是类的归档文件。 我们什么时候应该使用WAR文件呢?在开发阶段不适合使用WAR文件,因为在开发阶段,经常需要添加或删除Web应用程序的内容,更新Servlet类文件,而每一次改动后,重新建立WAR文件将是一件浪费时间的事情。在产品发布阶段,使用WAR文件是比较合适的,因为在这个时候,几乎不需要再做什么改动了。 在开发阶段,我们通常将Servlet源文件放到Web应用程序目录的src子目录下,以便和Web资源文件区分。在建立WAR文件时,只需要将src目录从Web应用程序目录中移走,就可以打包了。 3.3 与Servlet配置相关的元素 3.3.1 <servlet>元素及其子元素 在l文件中,<servlet>元素及其可以包含的子元素如图3-3所示。 图3-3 <servlet>元素及其子元素 图3-3中的*表示可以有零个或多个子元素,?表示可以有零个或一个子元素,除此之外的元素为必备的元素。下面我们对<servlet>元素的各个子元素的含义做一个说明。 Ø <description> 为Servlet指定一个文本描述。 Ø <display-name> 为Servlet指定一个简短的名字,这个名字可以被某些工具所显示。 Ø <icon> 为Servlet指定一个图标。这个图标可以在一些图形界面工具中用于表示该Servlet。 Ø <servlet-name> 指定Servlet的名字,这个名字在同一个Web应用程序中必须是唯一的。这个元素在第2章的例子中已经使用过。 Ø <servlet-class> 指定Servlet类的完整限定名。这个元素在第2章的例子中也已经使用过。 Ø <jsp-file> 指定在Web应用程序中的JSP文件的完整路径,该路径以斜杠(/)开始。如果要对一个JSP文件做URL映射,就会用到这个元素。 Ø <init-param> 定义Servlet的初始化参数。如果使用了<init-param>元素,则必须包含<param-name>和<param-value>元素,可以包含零个或多个<description>元素。 — <description> 为初始化参数提供一个文本描述。 — <param-name> 定义初始化参数的名字。 — <param-value> 定义初始化参数的值。 Ø <load-on-startup> 指定当Web应用程序启动时,Servlet被加载的次序。元素的内容必须是一个整数,如果这个值是一个负数,或者没有设定这个元素,Servlet容器将在客户端首次请求这个Servlet时加载它;如果这个值是正数或0,容器将在Web应用程序部署时加载和初始化这个Servlet,并且先加载数值小的Servlet,后加载数值大的Servlet。如果某个Servlet需要在其他Servlet被加载之前加载,可以在部署描述符中使用这个元素。如果<servlet>元素包含了<jsp-file>元素和<load-on-startup>元素,则JSP文件将被预编译并加载。 Ø <run-as> 指定用于执行组件的角。如果使用了<run-as>元素,可以包含零个或多个<description>元素,必须包含<role-name>元素。 — <description> 指定一个文本描述。 — <role-name> 指定用于执行组件的角名。 Ø <security-role-ref> 声明在组件或部署的组件的代码中的安全角引用。如果使用了<security-role-ref>元素,则必须包含<role-name>元素,可以包含零个或多个<description>元素,零个或一个<role-link>元素。 — <description> 为安全角引用提供一个文本描述。 — <role-name> 指定在代码中使用的安全角的名字。 — <role-link> 指定到一个安全角的引用。 3.3.2 <servlet-mapping>元素及其子元素 <servlet-mapping>元素在Servlet和URL样式之间定义一个映射。它包含了两个子元素<servlet- name>和<url-pattern>,<servlet-name>元素给出的Servlet名字必须是在<servlet>元素中声明过的Servlet的名字。<url-pattern>元素指定对应于Servlet的URL路径,该路径是相对于Web应用程序上下文根的路径。例如: <servlet-mapping> <servlet-name>helloworld</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> Servlet 2.5规范允许<servlet-mapping>的<url-pattern>子元素出现多次,之前的规范只允许一个<servlet-mapping>元素包含一个<url-pattern>子元素。我们看下面的例子: <servlet-mapping> <servlet-name>welcome</servlet-name> <url-pattern>/en/welcome</url-pattern> <url-pattern>/zh/welcome</url-pattern> </servlet-mapping> 在配置了Servlet与URL样式之间的映射后,当Servlet容器接收到一个请求,它首先确定该请求应该由哪一个Web应用程序来响应。这是通过比较请求URI的开始部分与Web应用程序的上下文路径来确定的。映射到Servlet的路径是请求URI减去上下文的路径,Web应用程序的Context对象在去掉请求URI的上下文路径后,将按照下面的路径映射规则的顺序对剩余部分的路径进行处理,并且在到第一个成功的匹配后,不再进行下一个匹配。 — 容器试着对请求的路径和Servlet映射的路径进行精确匹配,如果匹配成功,则调用这个Servlet来处理请求。 — 容器试着匹配最长的路径前缀,以斜杠(/)为路径分隔符,按照路径树逐级递减匹配,选择最长匹配的Servlet来处理请求。 — 如果请求的URL路径最后有扩展名,如.jsp,Servlet容器会试着匹配处理这个扩展名的Servlet。 — 如果按照前面3条规则没有到匹配的Servlet,容器会调用Web应用程序默认的Servlet来对请求进行处理,如果没有定义默认的Servlet,容器将向客户端发送HTTP 404错误信息(请求资源不存在)。 在部署描述符中,可以使用下面的语法来定义映射。 Ø 以/开始并且以 /* 结束的字符串用来映射路径,例如: <url-pattern>/admin/*</url-pattern> 如果没有精确匹配,那么对/admin/路径下的资源的所有请求将由映射了上述URL样式的Servlet来处理。 Ø 以 *. 为前缀的字符串用来映射扩展名,例如: <url-pattern>*.do</url-pattern> 如果没有精确匹配和路径匹配,那么对具有.do扩展名的资源的请求将由映射了上述URL样式的Servlet来处理。 Ø 以一个单独的/指示这个Web应用程序默认的Servlet,例如: <url-pattern>/</url-pattern> 如果对某个请求没有到匹配的Servlet,那么将使用Web应用程序的默认Servlet来处理。 Ø 所有其他的字符被用于精确匹配,例如: <url-pattern>/login</url-pattern> 如果请求/login,那么将由映射了URL样式/login的Servlet来处理。 下面我们看几个请求映射的例子,如表3-2和表3-3所示。 表3-2 Servlet映射
表3-3 实际请求映射的结果
Tomcat在%CATALINA_HOME%\l文件中配置了默认的Servlet,配置代码如下: <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> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> %CATALINA_HOME%\l文件中的配置将被运行在同一个Tomcat实例中的所有Web应用程序所共享。 3.4 一个实例 在上一节我们介绍了,在<servlet>元素中可以使用<init-param>子元素为Servlet定义初始化参数,在本节中,我们通过一个实例来看看初始化参数的应用,顺便再复习一下Servlet的配置。 在本例中,我们将编写一个带表单的HTML页面,表单中提供了一个文本域,让用户输入他的姓名,然后提交给Servlet进行处理。Servlet接收到请求后,首先从l文件中读取预先设置的初始化欢迎信息,然后从提交的表单中取出用户姓名,加上欢迎信息输出到客户端。为了便于同时为中文用户和英文用户服务,我们在l文件中为同一个Servlet设置了不同的名字、初始化参数和URL映射,并为客户端提供了两个HTML页面,一个为中文用户使用,一个为英文用户使用,两个页面分别指定不同的提交URL。实例的开发主要有下列步骤。 Step1:编写welcome_en.html和welcome_zh.html 编写welcome_en.html和welcome_zh.html,将编写好的两个文件放到F:\JSPLesson\ch03目录下。两个文件的代码如例3-3和例3-4所示。 例3-3 welcome_en.html <html> <head> <title>Welcome you!</title> </head> <body> <form action="en/welcome" method="post"> Please input your name:<input type="text" name="user"><p> <input type="submit" value="submit"> </form> </body> </html> 例3-4 welcome_zh.html <html> <head> <title>Welcome you!</title> </head> <body> <form action="zh/welcome" method="post"> 请输入用户名:<input type="text" name="user"><p> <input type="submit" value="提交"> </form> </body> </html> Step2:编写WelcomeServlet类 将编写好的WelcomeServlet.java源文件放到F:\JSPLesson\ch03\src目录下。完整的源代码如例3-5所示。 例3-5 WelcomeServlet.java 1.package org.sunxin.ch03.servlet; 2. 3.import java.io.IOException; 4. import java.io.PrintWriter; 5. import javax.servlet.ServletException; 6.import javax.servlet.http.HttpServlet; 7. import javax.servlet.http.HttpServletRequest; 8. import javax.servlet.http.HttpServletResponse; 9. 10.public class WelcomeYou extends HttpServlet 11.{ 12. public void doGet(HttpServletRequest req, HttpServletResponse resp) 13. throws ServletException,IOException 14. { 15. req.setCharacterEncoding("gb2312"); 16. String Parameter("user"); 17. String welcomeMsg=getInitParameter("msg"); 18. 19. resp.setContentType("text/html;charset=gb2312"); 20. 21. PrintWriter Writer(); 22. 23. out.println("<html><head><title>"); 24. out.println("Welcome Page"); 25. out.println("</title><body>"); 26. out.println(welcomeMsg+", "+user); 27. out.println("</body></head></html>"); 28. out.close(); 29. } 30. 31. public void doPost(HttpServletRequest req, HttpServletResponse resp) 32. throws ServletException,IOException 33. { 34. doGet(req,resp); 35. } 36.} 因为客户端可能会发送中文用户名,所以在代码的第15行,我们设置请求正文使用的字符编码是gb2312。第17行,调用getInitParameter()方法得到初始化参数msg的值,这个方法是通过调用InitParameter()方法来得到初始化参数的。第26行,将初始化欢迎信息和用户姓名组合在一起,发送到客户端。 Step3:编译WelcomeServlet.java 打开命令提示符,进入到F:\JSPLesson\ch03\src目录下,然后执行: javac -d ..\WEB-INF\classes WelcomeServlet.java 在WEB-INF\classes目录下生成org\sunxin\ch03\servlet目录结构,以及在servlet子目录中的WelcomeServlet.class文件。 在进行这一步操作之前,读者应该首先按照Web应用程序要求的目录结构创建WEB-INF目录和classes目录。 Step4:部署WelcomeServlet 在F:\JSPLesson\ch03\WEB-INF目录下新建l文件,添加对本例中的Servlet的配置,完整的内容如例3-6所示。 例3-6 l 1.<?xml version="1.0" encoding="GBK"?> 2. 3.<web-app version="2.5" 4. xmlns="java.sun/xml/ns/javaee" 5. xmlns:xsi="/2001/XMLSchema-instance" 6. xsi:schemaLocation="java.sun/xml/ns/javaee 7. java.sun/xml/ns/javaee/web-app_2_5.xsd"> 8. 9. <servlet> 10. <servlet-name>welcome_en</servlet-name> 11. <servlet-class> 12. org.sunxin.ch03.servlet.WelcomeServle 13. </servlet-class> 14. <init-param> 15. <param-name>msg</param-name> 16. <param-value>welcome you</param-value> 17. </init-param> 18. </servlet> 19. 20. <servlet-mapping> 21. <servlet-name>welcome_en</servlet-name> 22. <url-pattern>/en/welcome</url-pattern> 23. </servlet-mapping> 24. 25. <servlet> 26. <servlet-name>welcome_zh</servlet-name> 27. <servlet-class> 28. org.sunxin.ch03.servlet.WelcomeServle 29. </servlet-class> 30. <init-param> 31. <param-name>msg</param-name> 32. <param-value>欢迎你</param-value> 33. </init-param> 34. </servlet> 35. 36. <servlet-mapping> 37. <servlet-name>welcome_zh</servlet-name> 38. <url-pattern>/zh/welcome</url-pattern> 39. </servlet-mapping> 40. 41.</web-app> 注意在第1行的XML声明中,指定该文档的编码为GBK,因为我们在文档中使用了中文字符。第9~18行,配置WelcomeServlet,指定它的名字为welcome_en,定义了初始化参数,用于提供英文的欢迎信息。第20~23行,定义welcome_en与URL的映射,为welcome_en指定URL:/en/welcome。第25~34行,又一次配置WelcomeServlet,为其指定了另外一个名字welcome_zh,并定义初始化参数,用于提供中文的欢迎信息。第36~39行,定义welcome_zh与URL的映射,为welcome_zh指定URL:/zh/welcome。 Servlet是单实例多线程的,Servlet容器根据l文件中的Servlet配置来实例化Servlet为请求进行服务。通常情况下,一个Servlet类只产生一个实例为所有的客户请求进行服务,但是,如果你在l文件中多次配置了同一个Servlet类,那么每一个配置都将产生一个Servlet实例。换句话说,Servlet容器是根据l文件中Servlet配置的数量来产生Servlet实例,而不管Servlet类是否是同一个。 Step5:配置ch03 Web应用程序 我们直接将开发目录(F:\JSPLesson\ch03)配置为ch03 Web应用程序运行的目录。在%CATALINA_HOME%\conf目录下依次创建Catalina\localhost目录,在localhost目录下新建l文件,内容如例3-7所示。 例3-7 l <Context path="/ch03" docBase="F:\JSPLesson\ch03" reloadable="true"/> Step6:访问WelcomeServlet 分别通过welcome_en.html和welcome_zh.html访问WelcomeServlet。启动Tomcat服务器,打开IE浏览器,首先在地址栏中输入localhost:8080/ch03/welcome_en.html,出现页面后,在文本域中输入用户姓名,单击“submit”按钮,你将看到如图3-4所示的页面。 接着在地址栏中输入localhost:8080/ch03/welcome_zh.html,出现页面后,在文本域中输入用户姓名,单击“提交”按钮,你将看到如图3-5所示的页面。 图3-4 WelcomeServlet显示英文的欢迎信息 图3-5 WelcomeServlet显示中文的欢迎信息 从这个例子中可以看到,在编写Servlet时,将初始化的信息通过部署描述符传递给Servlet,可以提高Web应用程序的可维护性。当需要修改初始化参数时,只要在l文件中做相应的修改就可以了,而Servlet本身不需要做任何的改动。另外,通过在l文件中对Servlet进行配置,可以让同一个Servlet表现出不同的行为,给用户的感觉,就好像访问的是不同的资源。 3.5 小结 本章主要介绍了以下3个部分的内容。 — 如何利用<Context>元素来配置Web应用程序,在Tomcat中,<Context>元素可以放到多个位置的文件中,不同位置的配置文件,所起的作用也是不同的。 — 如何建立WAR文件,利用WAR文件来发布Web应用程序。 — 介绍了<servlet>元素和<servlet-mapping>元素,以及它们的子元素的作用。 最后通过一个实例,向读者演示了Servlet初始化参数的使用,以及在部署描述符中对Servlet进行不同的配置,从而让同一个Servlet表现出不同的行为。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论