一个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配置文件中通过元素的设置来完成的。一个元素就表示一个Web应用程序,运行在特定的虚拟主机中。
元素的常用属性如表3-1所示。
表3-1 元素的常用属性
属 性 | 描 述 |
className | 指定实现了org.apache.catalina.Context接口的类名。如果没有指定类名,将使用标准的实现。标准的实现类是org.apache. catalina.core.StandardContext |
cookies | 指示是否将Cookie应用于Session,默认值是true |
crossContext | 如果设置为true,在应用程序内部调用ServletContext.getContext()将成功返回运行在同一个虚拟主机中的其他Web应用程序的请求调度器。在注重安全的环境中,将该属性设为false,那么getContext()将总是返回null。默认值是false |
docBase | 指定Web应用程序的文档基目录或者WAR文件的路径名。可以指定目录的或WAR文件的绝对路径名,也可以指定相对于Host元素的appBase目录的路径名。该属性是必需的 |
path | 指定Web应用程序的上下文路径。在一个特定的虚拟主机中,所有的上下文路径都必须是唯一的。如果指定一个上下文路径为空字符串(""),则定义了这个虚拟主机的默认Web应用程序,负责处理所有的没有分配给其他Web应用程序的请求 |
reloadable | 如果设置为ture,Tomcat服务器在运行时,会监视WEB-INF/classes和WEB-INF/lib目录下类的改变,如果发现有类被更新,Tomcat服务器将自动重新加载该Web应用程序。这个特性在应用程序的开发阶段非常有用,但是它需要额外的运行时开销,所以在产品发布时不建议使用。该属性的默认值是false |
unpackWAR | 如果为true,Tomcat在运行Web应用程序前将展开所有压缩的Web应用程序。默认值是true |
元素是元素的子元素,可以在%CATALINA_HOME%/conf/server.xml文件中设置Context元素。例如,针对第2章的Web应用程序,可以做如下配置:
unpackWARs="true" autoDeploy="true" |
在元素中使用的属性的含义在表3-1中已经列出了,这里就不再讲述了。
在Tomcat中,我们还可以把元素放在下列位置的文件中。
① %CATALINA_HOME%/conf/context.xml文件,在这个文件中设置的信息将被所有的Web应用程序所加载。
② %CATALINA_HOME%/conf/[enginename]/[hostname]/context.xml.default文件,[enginename]表示的是在server.xml文件中设置的元素的name属性的值,[hostname]表示的是在server.xml文件中设置的元素的name属性的值,关于servet.xml文件的详细信息,可以参看附录C。在笔者的机器上,%CATALINA_HOME%/ conf/server.xml文件中元素的name属性的值是Catalina,元素的name属性的值是localhost,你可以在%CATALINA_HOME%/conf目录下依次创建Catalina/localhost目录,然后在localhost目录下新建context.xml.default文件,在这个文件中设置的信息将被属于该虚拟主机的所有Web应用程序所加载。
③ 可以为一个Web应用程序建立%CATALINA_HOME%/conf/[enginename]/ [hostname]/xxx.xml文件,在这个XML文件中,元素的docBase属性通常是Web应用程序目录的绝对路径名,或者是Web应用程序归档文件的绝对路径名。
④ 在Web应用程序的目录结构中增加META-INF/context.xml文件。包含META-INF子目录的Web应用程序的目录层次结构如图3-1所示。
![]() |
图3-1 包含META-INF子目录的 Web应用程序目录层次结构 |
在%CATALINA_HOME%/webapps目录下的Web应用程序,如果没有在任何文件中设置元素,那么Tomcat将为这个Web应用程序自动生成元素。自动生成的元素的上下文路径将以斜杠(/)开始,后面紧跟Web应用程序所在目录的名字,如果目录的名字是ROOT,那么上下文路径将是一个空字符串("")。所以在%CATALINA_HOME%/webapps目录下的Web应用程序可以不经配置而直接使用。
在%CATALINA_HOME%/webapps目录下有一个ROOT目录,Tomcat为ROOT目录生成的元素的上下文路径是空字符串(""),而我们知道,如果一个Web应用程序的上下文路径是空字符串(""),则这个Web应用程序将作为虚拟主机的默认Web应用程序,负责处理所有的没有分配给其他Web应用程序的请求,这也就是为什么我们访问http://localhost:8080/时,访问的是%CATALINA_ HOME%/webapps/ROOT目录下的资源。
如果我们想将开发的目录直接配置成Web应用程序运行的目录,而不是将这个目录复制到%CATALINA_HOME%/webapps目录下,可以在两处地方进行配置。例如,在笔者的机器上,本章的例子程序所在目录是F:/JSPLesson/ch03,为了可以直接在这个目录下运行Web应用程序,我们编辑%CATALINA_HOME%/conf/server.xml文件,设置元素,如例3-1所示。
例3-1 在server.xml中设置元素
unpackWARs="true" autoDeploy="true"
|
使用docBase属性指定Web应用程序的真实路径。将属性reloadable设置为true,Tomcat在运行时会自动监测Servlet类的改动,如果发现有类被更新,Tomcat服务器将自动重新加载该Web应用程序。这样,在开发时,我们就不需要频繁重启Tomcat了。读者可以将ch03目录按照Web应用程序的目录层次结构建好,然后编写一个简单的输出“Hello World”的Servlet进行测试,步骤和第2章的实例程序的编写步骤是一样的。
此外,我们还可以在%CATALINA_HOME%/conf目录下依次创建Catalina/localhost目录,然后在localhost目录下为ch03这个Web应用程序建立ch03.xml文件,编辑这个文件,输入如例3-2所示的内容。
例3-2 ch03.xml
读者可以用自己编写的Servlet类进行测试,在测试之前,要先把server.xml文件中设置的元素删除或注释起来。
从Tomcat 5开始,不建议直接在server.xml文件中配置元素,因为server.xml文件作为Tomcat的主要配置文件,一旦Tomcat启动后,将不会再读取这个文件,因此你无法在Tomcat服务器启动时发布Web应用程序。如果在其他地方配置元素,那么在Tomcat运行时,也可以发布Web应用程序。
从Tomcat 5.5开始,在%CATALINA_HOME%/conf/[enginename]/ [hostname]/目录下创建XML配置文件来配置Web应用程序,Tomcat将以XML文件的文件名将作为Web应用程序的上下文路径,而不管你在元素的path属性中指定的上下文路径是什么。例如,文件名是ch03.xml,元素的path属性设置为/hello,那么执行http://localhost:8080/hello/helloworld将提示HTTP 404错误,如果执行http://localhost:8080/ch03/helloworld将显示正确的输出信息。而Tomcat 5.5之前的版本则是以元素的path属性的值作为上下文的路径。
由于Tomcat 5.5之后的版本是以XML配置文件的文件名作为Web应用程序的上下文路径的,因此在配置元素时,可以不使用path属性。
%CATALINA_HOME%/conf/web.xml为运行在同一个Tomcat实例中的所有Web应用程序定义了默认值。当Tomcat加载一个Web应用程序的时候,首先读取这个文件,然后再读取Web应用程序目录下的WEB-INF/web.xml文件。