Tomcat教程

在Tomcat中部署Servlet与 JSP Web应用程序

在安装了Tomcat之后,您几乎常常需要部署Web应用程序。本章会展现由servlet、JSP、与其他文件组成的Web应用程序,并讨论几种部署方式。最后再讨论Manager Web应用 程序,因为它可以替您处理一些部署工作。

在Java servlet出现之前,大多数Web应用程序都是以C/C++或Perl编写的。这些应用程 序通常由多个静态HTML网页以及些产生动态网页内容的CGI所构成。这些 CGI脚本的编写过程可能与平台无关,不过这不是必要的(因此也经常不会如此)。同时,因为CGI是跨所有Web服务器品牌与实现的工业标准,所以CGI脚本可以写成独立于Web服务器实现的程序。事实上,某些CGI是这样处理的,而另一些则不是。CGI的最 大问题是其设计本身会让它先天性执行缓慢,并无法扩充。

另一种产生动态网页内容的方式是使用Web服务器模块。例如,Apache http Web服务器可以在启动时执行动态可加载的模块。这些模块会响应预先配置的HTTP请求样式,井 将动态网页内容送至HTTP的客户端/浏览器。多年来,此种产生动态Web应用程序内容 的高性能方法虽然已经享有某些成功的地位,但也有一些不足。虽然Web服务器的模块可以用与平台无关的方式来编写,但是没有针对Web服务器模块的Web服务器独立实现 标准——它们只能针对您编写模块的特定服务器,而且可能无法用于其他的Web服务器实现。

Java将平台独立性引人服务器,而且Sun还想加强此能力,以此作为制定快速且与平台无 关的Web应用程序标准的解决方案的一部分。此解决方案的另一部分就是Java servlet。servlet背后的意义是不启动新进程而使用Java简单但功能强大的多线程以响应请求。 您可以编写Java或基于servlet的Web应用程序,井将其从一个servlet容器搬移至其他的servlet容器中,或从一台计算机搬移到其他讣算机架构上,且不需修改任何代码就可执 行。事实上,在几乎所有的情况下,甚至也不需要重新编译任何的程序代码。

Servlet Web应用程序也被设计成可重新安置的形式。也就是说,您可以编写Web应用程 序,以便将其程序重新映射(remap)至主机上不同的UR1,而无需重新编写应用程序内 部的任何组件,甚至包括动态网页内容在内。例如,Tomcat 6内含一些范例应用程序, 包括examp〗es与<iocsfl默认的配S会将这些应用程序分别映射至时切叫 和拓mca卜办d不过,除广更改Tomcat的奸rverjcm/文件中一些配置设定 行外,在不儒做任何其他改变的情况下,就可以将这些应用程序重新映射至同一主机上不同的URL这对干创建能任意安置并重复用于多个网站(而且甚至潜在地用于同一网站内)的模块部分十分方便。

Tomcat的配置文件总是称Web应用程序为“context”。Tomcat的主配置文件server.xml有 一个叫做Context的XML元素,代表了Web应用程序的配置,对每个显式配置的Web应用 程序,server.xml或分开的context XML片段文件中,应有一个context元素。

Tomcat4 的配置系统以comext XML片段文件的形式提供了一些模块。这些模块是包含了单个Context元素及嵌套于其中的内容的XML配置文件,如果您在CATALINA_HOME目录下发现了这样的文件,那么可以采取在Tomcat的server.xml文件中配置 context的同样方法展开这个context (webapp)。因为在Tomcat重启之前,server.xml发生的任何变化都不可重读,所以这样处理是很有帮助的。但是,管理员没有更好的方法控制在哪台主机上或在哪个Engine (引擎,针对那些有多个配置的Engine而言,可能不 是很多,因为大部分人不需要多于一个的Engine)上展开。

为了提供更好的模块化特性,Tomcat5.0 的展开子系统得到了重写,并减少了deploy/ undeploy/redeploy语言上的问题,而且增加了独立的配置程序。

为了对context XML片段文件增加更好的主范围控制,并在CATALINA_HOME/conf目录中固化Tomcat的配置文件,Tomcat 5.0及更髙版本需要在CATALINA_HOME/conf/[EngineName]/[Hostname]目录树中替代context片段。例如,如果您的Engine叫做 Catalina,且 Host (主机)叫做 www*.example.com,那么您就可以在CATALINA_HOME/conf/Catalina/www.example.com/目录下放置context XML片段。如果您有多个,且每个都有自己的目录,那么请将该Host的文件与其他分开。在 Tomcat 5.0和更高版本中T重新加载context XML片段文件的过程与在Tomcat 4中重载的 过程相同,只是在不同的文件系统位置上而已。这也念味着从Tomcat 5.0到Tomcat 6.0, Tomcat并不设法从webapps/目录中读取context XML片段文件。在Tomcat 和4.1.x 中.系统确实是这样做的,但在5.0.x和更髙版本中,context XML片段文件必须驻留在 CATALINA_HOME/conf/[EngineName]/[Hostname]/目录树中,

到底该使用哪个Web应用程序部署选项,要依您的使用情况而定。您是想在自己的机器 上运行自己的Tomcat实例的开发者,且开发完毕后想重复部署吗?还是说您是在另一台机器上只部署一个Tomcat实例的系统管理员?针对您的使用情况,Tomcat提供多种部署方法,这是一件好亊。

针对Tomcat的部署情况,Manager Web应用程序提供了最灵活 的一组特性。它允许不经重启Tomcat而实现本地和远程部署,并精细地集成了Apache Ant编译工具。笔者建议尽可能不采用“手工”复制WAR文件或使用 Manager实现部署。但是,如果您是一位更髙级的Tomcat使用者,在同一台机器上部署一个Tomcat实例,且正设法消除冗余步骤(仅使用几个关键步骤),那么就不必使用 Manager webapp。您最好把webapp目录的content或WAR文件复制到Tomcat可以自动找到的地方,并部署。

在开发过程中,您最好将context配置为可重载的形式,从而在修改类文件时,Tomcat将 立即注意到这一变化并更新加载类。根据Web应用程序的大小而定,这一操作通常比停止整个Web应用程序,重新部署和重启要快得多。但是,在实际分发的产品中,笔者建议 关闭context重载功能,这样能使Tomcat无需持续检查被监视的资源发生变化而运行更快!

本章重点介绍Web应用程序部署的三种场合:

  • 把解包的webapp目录部署到同一台机器的Tomcat实例中

  • 在同一台机器上将WAR文件部署到Tomcat

  • 通过连接到Manager webapp的TCP网络,把解包的webapp目录或WAR文件部署到 Tomcat实例(本地或远程)中

  • 然后,笔者向您展示如何编写Ant编译文件,并熟练掌提这些主要部署场合的自动编译 方法最后,笔者向您展示如何配置Tomcat从而允许在webapp目录中使用符号链接。

    主机

    为了在Tomcat中部署Web应用程序,必须在主机(Host)下部署它们。一台主机代表了 一个完全限定的域名或IP地址,例如groovywigs.com。常见的Tomcat 配置文件有一个默认主机名localhost。事实上,该Host是默认的Host,也是唯一的Host,意味着进入Tomcat的所有HTTP请求,无论是否在HTTP请求中指定主机名,都将映射到 该Host上,例如,如果在引人的HTTP请求中,Host标题把groovywigs.com定义为该请 求的主机,那么它不是Tomcat知道的唯一Host名(localhost)的映射,因此,Tomcat会 将其替代映射为默认Host,叫做localhost的相同主机名。

    例如,如果您给叫做groovywigs.com的网站创建了一个Web应用程序,该Web 应用程序本身很有可能是该站点的根Web应用程序。虽然至少有一些方法可以部署该 Web应用程序,但娃笔者假设您想将其部署为一个叫做ROOT的解包Web应用程序目录 (所有的Web应用程序的网页驻留在一个最外层目录中)。您可以将它部署为wdapps/ROOT。在这种情况下,主机名是groovywigs.com。

    要将Web应用程序部著到groovywigs.com主目录下,必须给groovywigs.com配置好 Tomcat.这相当简单!只要编辑server.xml文件,并查找到第一个定义<Host> XML元 素,然后在它上面追加新的<Host>元素就可以了,如下所示:

    <Host name="groovywigs.com" appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false"xmlNamespaceAware="false">
    <!-这里要添加groovywigs.com主目录的context元素。-->
    </Host>
    <!——定义默认虚拟中机
    注意:XML架构有效性不能与Xerces 2.2一起使用,
    -->
    <Host name="localhost"  appBase="webapps" 
    unpackWARs="true"       autoDeploy="true" 
    xmlValidation="false"   xmlNamespaceAware="false">

    而且,如果Tomcat主服务器请求groovywigs.com主地址,那么您还应读改变<Engine>的 默认主机名,该参数也在Server.xml中:

    <!——定义容器层的顶层容器-->
    <Engine name="Catalina" defaultHost="groovywigs.com">

    如果groovywigs.com主机仅是Tomcat应答请求的众多主机之一,那么最好保留默认设置,即defaultHost="localhost"。

    在部署Web应用程序之前,最好在server.xml中配置主机和默认主机,从而可以把Web应 用程序部署在合适的主机中。这是笔者推荐增加新主机的方法。

    在Tomcat正运行时,Tomcat还支持无需重启而部署应用程序的方法,也可解除对应用程序的部署,这一过程在业界被著称为“热部署”(hot deployment)。只要您打开了一台或多台Host上叫做的Tomcat特性,您就可以不经重启而把任意数量的Web应用程序部署到Tomcat中,和/或解除对应用程序的部署。在这一部署方法中,Tomcat检查您是否正在给已被热部署的Web应用程序配置Context,如果恰好如此,那么它将使用您提供的Context,如果不是这样,那么Tomcat将为您创建一个默认的Context。通过把Host的autoDeploy设置为等于"true",Tomcat允许您在本地完成这一操作。如果 您希望进行"热部署"那么除了热部署本身外,您大槪不希望Tomcat在启动时部署Web 应用程序,因此您还应该在Host上设置deployOnStartup="false"。如果您不通示地将 deployOnStartup设置为false,那么您的Web应用程序将每次都被部署两次:一次是 “启动”部署,第二次是热部署,如果采用编辑文件的方法设置这些属性, 就需要重启Tomcat,但是,如果使用Host Manager Web应用程序只在内存中设置这些属 性,那么就不必重启Tomcat了,这一内容将在下一节进行详细讨论。然后,只要把Web 应用程序的解包目录或WAR文件复制到Host的appBase目录下,这样,在Tomcat运行的 同时就实现了Web应用程序的部署。

    在将Web应用程序部署到Tomcat中时,可以使用以下两种形式:解包目录或WAR文件。 笔者建议您,在大部分情况下都用解包的webapp目录进行部署,因为如果按这种方式部 署,那么类、JSP、XML等文件都是单个文件,很容易诊断Web应用程序的故障。您能 在服务器上检查单个资源,还可以根据需要在合适的位置移动和/或修改单个资源,且 在大多数情况下都不必重启Web应用程序,还可以独立査看Web应用程序的毎个文件的 修改时间戳。对那些工作于Web应用程序上的人而言,本地shell用户的安全防护是一个 大问题,您最好将Web应用程序部署为一个WAR文件,从而对恶意篡改而言,您只需监 视一个文件就可以。尽管黑客也会修改WAR文件中的文件,但是,如果管理员:正执行 WAR文件的常规求和校验(且求和校验程序也没有被恶意篡改),那么机器的管理员大 概也只能采取这种方法实现监测了。在大部分最常见用途下,用WAR文件进行部署Web 应用程序是没有帮助的。


    Host Manager Web应用程序

    出于某种原因,如果您不想编辑server.xml文件,或者想通过Web浏览器远程增加或配置主机,那么就可以通过Admin Web应用程序(除了Tomcat 6.0.x以外的版本)或Host Manager Web应用程序完成这一任务。这些应用程序提供了Web应用程序的远程热部署 功能,Host Manager Web应用程伴是Tomcat自带的Tomcat专用Web应用程序,在Tomcat 正运行的时候,该程序允许用户动态创建主机。

    请运行http://localhost:8080/host-manager/html以访问 Host Manage想登录该管理器,必须像Admin Web应用程序所需要的那样,在CATALINA_HOME/conf/tomcat-users.xml和/文件中增加一个admin角色。在重启Tomcat时,Host Manager Web应用程序就应处于工作状态了,看起来如图3-1所示。

    图3-1 : Host Manager Web应用程序

关注微信获取最新动态