部署解包的Web应用程序目录
将Web应用程序部署到Tomcat中的方法之一,是将其部署为没有封装到WAR文件中的 Web应用程序内容的目录。如果将Web应用程序部署为末封装的WAR文件、且一点也不想将其封装为WAR文件,一旦已经组织好了Web应用程序的内容,那么就可以直接进行 部署了,如图3-2所示。
在第一次部署Web应用程序为webapp目录时,配置Tomcat以实现组织和启动Web应用程 序的方法有两种:
server.xml Context部署 在server.xml文件中增加一个Context元素并重启Tomcat。
Context XML片段文件部署 在Tomcat的CATALINA_HOME/conf/[EngineName]/[HostName]目录树中增加一个新的context XML片段文件,或者创建为Web应用程序的文件 (该文件与Web应用程序根目录相关),然后重启Tomcat。
server.xml Context 部署
可以编辑conf/server.xml文件并配置Tomcat以辨认、启动和管理Web应用程序。对每个新 增的Web应用程序,这是笔者推荐配置Tomcat的方法。
要使用这一方法部署未打包的webapp目录,必须在应用程序的中増加一个 Context元素,并将webapp的Context嵌套在Host碎器元素中。
编辑server.xml文件并检索Host元素。默认如下所示:
<Host name="localhost" appBase="webapps" unpackMARs ="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> ... </Host>
通常,因为默认主机名为localhost,而且任何对本机的请求都由Tomcat的网络服务器提 供,所以在默认Host中增加Context的工作方式都将寻址到默认主机上。
在Host内部增加Contact的内容如下所示:
<Host nane="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" xmlValxdation=11 false" xmlNamespaceAware="false"> <Context docBase="my-webapp" path="/my-webapp"/> </Host>
保存server.xml,并重启Tomcat。在Tomcat启动后,它会在CATALINA_HOME/webapps/my-webapp路径下査找Web应用程序对应的目录。如果Tomcat在读路径下找到了Web应用程序,那么Tomcat就会尝试部署它,并把它"安装"到Web服务器URI为/my-webdpp的路径下。如果Tomcat在部署和启动时没有遇到错误,那就能用浏览器http://localhost:8080/my-webapp进行访问了。
另外,如果您想把这个特殊的Web应用程序映射为服务器的root URI("/"),如通过访问http://localhost:8080能看到您的应用程序,则需要执行一拽特殊的步骤:
1.停止 Tomcat。
2.确定不存在CATALINA_HOME/conf/[EngineName]/[Hostname]/ROOT.xml配置文件,如果存在,只要删除就可以了。
3.编辑server.xml文件,并使<Host>和<Context>看起来如下所示:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="false" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="my-webapp" path=""/> </host>
注意在Context元素上path="",这让Tomcat把您的Web应用程序映射为root URI路径,在这种情况下,没有其他程序被映射为root URI路径,而且您的Web应用程序已经被显示映射为root URI路径。请再次确定autoDeploy被设置为false,否则,您的Web应用程序将被部署两次(一次在root URI上被server.xml文件显式配置的路径所部署,另一次在/my-webwpp URI路控下被自动部署)。您还不能给docBase设置值,该参数包含了appBase 值的初始值。例如,如果appBase="deploy",不要选择docBase值,如等于"deployment-webapp"。如果这样处理,将导致部署出错。
重启Tomcat,一旦完成启动,请浏览http://localhost:8080,您会看到自己的Web应用程序。
Context XML片段文件部署
Context条目也能以context XML片段文件的方式呈现。Content XML片段文件并不是完整的server.xml文件,而只是适合于Web应用程序的Context元素及任何子元素,就像server.xml中配置的那样,除了在Context元素驻留于context XML片断文件中的时候无法 指定路径属性之外。
Context XML片段文件可以驻留在CATALINA_HOME/conf/[EngineName]/[HostName]/目录树中,也可以驻留在Web应用程序的录中。当context XML片段文件中的Context元素被配置为驻留于CATALINA_HOME/conf/[EngineName]/[HostName]/目录树 中时,Tomcat读取该context XML片段文件的文件名,并将该文件名用作Web应用程序的 Web服务器URI路径,就像路径属性被设置为该文件名一样(减去".xml"扩展)。例如,如果context XML片段文件被命名为my-webapp.xml,在Tomcat部署和启动该Web应用程序时,它将可通过URL http://liocalhost:8080/my-webapp进行访问。
Server.xml文件中没有列出该示例,而是通过存储于CATALINA_HOME/conf/catalina/localhost/admin.xml的context XML元素显式配置而得到:
<!-- Tomcat管理Web应用程序的Context配置文件。 $Id: tomcat_implement_3_2_deployWebApp.html,v 1.1 2015/10/21 09:57:16 wnq Exp $ --> <Context docBase="${catalina.home}/server/webapps/admin" privileged="true" antiResourceLocking="false" antiJARLocking="false"> <!——出子明显的安全防护因素考虑,取消下列Valve的注释,以限制访问localhost上的Admin应 用程序。您可以在这里增加用逗号分割的主机列表(甚至是常规的表达式)。 <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1"/> --> </Context>
如果视图通过context XML片段文件配置Tomcat的根Web应用程序(这样的应用程序可以通过URL http://localhost:8080进行访问),那么您还需要掌握一个特殊的规则。根URI应该以"/"或“”(空的context路径)表示,这不会映射到文件名,而Tomcat把它当作一个特例。如果通过CATALINA_HOME/conf/[EngineName]/[HostName]/中的context XML片段文件实现部署,则Tomcat会把该context映射为根URI。如果使用META-INF/context.xml在根URI上部署Web应用程序,则需要将Web应用程序目录命名为"ROOT”。
作为另一个例子,在本地文件系统的/opt/my-webapp路径下,如果想部属驻留的叫做my-webapp的Web应用程序目录,连同配置访问该Web应用程序部分网页的身份认证,那么可以使用下列context XML片段文件:
<!-- 用Context XML片段文件部署my-webapp。 --> <Context docBase="/opt/rty-webapp"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Context>
以"my-webapp.xml"命名该context XML片段文件,并把它放在CATALINA_HOME/conf/Catalina/localhost/目录中,重启Tomcat,而且Tomcat应能找到该文件,而您的Web应用程序应得到了部署。
注意在这些例子中,笔者提供了Context XML配置元素,您可以指定context的XML片段文件中所需的所有Context值。在前面的例子中,笔者还给您展示了一个Realm配置, 以使用Tomcat的UserDatabaseRealm鉴别存储于文件中的用户和角色。这一示例示范了在context XML片段文件的Context元素中嵌套相同的配置元素是完全可行的,就像要配置Tomcat的server.xml文件中的Context一样。
如果您希望把context XML片段文件放在Web应用程序本身中,那么需将它放在路径 META-INF/context.xml中。不可更改这一文件名,因为Tomcat只会寻找具有这样的文件名的context XML片段文件。这样处理的不利之处在于无法在META-INF/context.xml中设置Context的路径属性,同时还不能更改文件名,所以您将不具备改变URI路径 为Tomcat映射Web应用程序路径的方法,而该文件名就是Web应用程序的解包目录。如果您可以接受这一处理方式,那么使用这一配置文件的好处在于它驻留于Web应用程序中。而且不是必须安装的独立文件。因为Tomcat要读取和使用文件,所以请一定不要设置主机上的deployXML="false"。默认情况下,deployXML被设置为true,因此,如果您没有显示设置它,则Tomcat将使用context.xml文件中存在的值。
在决定使用这一部署方法之前,记住Tomcat开发者选择提供context XML片段文件这一特性的初衷之一在于可以用区别于server.xml的配置文件配置Web应用程序,从而不需如 此频繁地修改server.xml。这样处理的宗旨在于将Web应用程序配置模块与Tomcat配置文件的其他部分分开。但是,通常Web应用程序需耍更多的配置,而不仅是Context元紊 及该元素包含的内容。 Web应用程序通常还需要定制Connector配置、定制Host配置(至少是经常发生变化的一些部署属性,但有时还需要改变Host名,大概需要改变Engine的 默认主机名)、定制GlobalNamingResources配置等。这些内容都超出了Context元素的范围,而且不能在context XML片段文件中进行设定。这意味着您还不得不修改server. xml,以配置公共Web应用程序指定的项目,因此,Web应用程序的配置信息通常不能彻底与jerver.xml中的其余Tomcat配置参数分开。