基于tomcat配置文件server.xml详解

2019-10-18 16:18:39刘景俊

关于context name,它是从context path推断出来的,不仅如此,其余几个属性如context basefile name也是由此推断出来的。规则如下:

•如果path不为空,则context name等于context path,basefile name取path中去除前缀"/"后的路径,且所有"/"替换为"#"。

•如果path为空,则context name也为空,而basefile为ROOT(注意是大写)。

例如:

context path  context name  basefile name   deploy examples
-----------------------------------------------------------------
/foo      /foo      foo        foo.xml,foo.war,foo
/foo/bar    /foo/bar    foo#bar      foo#bar.xml,foo#bar.war,foo#bar
Empty String  Empty String  ROOT       ROOT.xml,ROOT.war,ROOT

配置context时,强烈建议不要定义在server.xml中,因为定义conf/server.xml中时,只能通过重启tomcat来重载生效,也就是说无法自动部署应用程序了。虽说官方如此推荐,但大多数人出于习惯和方便,还是会直接写在server.xml中,这并没有什么问题,无非是重启一下而已。

可以考虑定义在/META-INF/context.xml中,如果此时设置了copyXML属性,在部署时会将此context.xml复制到$CATALINA_BASE/conf/enginename/hostname/下,并重命名为"basefile name.xml"。也可以直接定义在$CATALINA_BASE/conf/enginename/hostname/下的.xml文件中,该路径的xml优先级高于/META-INF/context.xml。

还可以定义默认的context.xml文件,包括两种:(1)定义在$CATALINA_BASE/conf/context.xml中,该默认context对所有webapp都生效;(2)定义在$CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default中,该默认context只对该虚拟主机中的所有webapp生效。

定义方式大致如下:

<Host name="www.a.com" appBase="webapps"
      unpackWARs="true" autoDeploy="true">
   <Context path="" docBase="ROOT"/>
   <Context path="/bbs" docBase="web/bbs" reloadable="true"/>
</Host>

其中第一个context的path为空字符串,表示它是默认的context。当浏览器中输入www.a.com时,由于无法匹配第二个context,所以被默认即第一个context处理,当浏览器中输入www.a.com/bbs时,将被第二个context处理,它将执行web/bbs所对应的webapp,并返回相关内容。

在context容器中可以定义非常多的属性,详细内容见官方手册,以下是常见的几个属性:

•className:实现host容器的类,该类必须实现org.apache.catalina.Context接口。不给定该属性时将采用默认的标准类org.apache.catalina.core.StandardContext。

•cookies:默认为true,表示启用cookie来标识session。

•docBase:即DocumentRoot,是该webapp的context root,即归档WAR文件所在目录或非归档内容所在目录。可以是绝对路径,也可以是相对于该webapp appBase的相对路径。

•path:定义webapp path。注意,当path=""时,表示默认的context;另外只有在server.xml中才需要定义该属性,其他所有情况下都不能定义该属性,因为会根据docBase和context的xml文件名推断出path。