深入Tomcat之 通过配置server.xml可以实现的功能

深入Tomcat之 通过配置server.xml可以实现的功能


本章主要从以下几个问题入手解决

  1. 修改tomcat默认端号

  2. 配置虚拟目录
    2.1 拓展热加载 和热部署

  3. 多域名登陆解决
    3.1 拓展 windos本地临时域名配置

  4. 配置虚拟主机


问题一 修改端口

实际用户在浏览器中访问网网站,只需要域名或ip就可实现访问,并未输入端口号,我们只需要把tomcat默认的端口8080,该为http默认端口80,便可实现。

<Connector port="80" useBodyEncodingForURI="true" protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443"  />    

但要特别注意,在eclipse中,tomcat中Overview界面也可对port修改,且从这修改后的结果会写到Server.xml文件中;

深入Tomcat之 通过配置server.xml可以实现的功能
有种情况特殊,注意下,当你修改xml中的port号,比如从8080改为80,而此时你又通过Overview界面修改了了其它东西,在运行tomcat时,会触发系统按照overview中的信息去配置tomcat,但Overview界面中的port还是8080,这时又给你xml文件改成8080了。

哎,每个坑都是用泪添满的啊,这个坑让在里面潜伏了一个下午

问题二 配置虚拟目录

试想一下,我们有很多个项目,而且项目内存较大,把这些项目都放在webapps ,可能会造成这个文件过大,(好像很有道理,但我自己目前没感觉到会造成多大的问题),总之,基于这样的考量,我们就可以在一个host标签下,配置多个Context标签。

host标签主要有4个属性,

①appBase指定把什么文件夹作为作为项目的默认的文件,基本上多为webapps

(在有些版本eclipse建的动态web项目,叫 webContent ,虽然tomcat中配置了appBase为webapps,但好像也不影响使用 )
eclipse Phtoton版本如下

深入Tomcat之 通过配置server.xml可以实现的功能

②autoDeploy 设置 为ture 表示自动部署 ,也称为热部署

热部署 : 当项目发生变动的时候,在运行的情况下重新部署项目,这个就是常说的热部署,从Tomcat 6开始热部署不再会丢失session了。 这里注意一下,有时候会发现保存了以后,正在运行的项目并没有发生变化,这是因为build workspace并没有完成,这时只要重新保存一下就可以了,用eclipse的保存后留意一下右下角的building workspace是否100%了。

但是修改xml配置文件,是一定要重启tomcat的;
同时,也要注意添加新的类,或者变动方法标签,热加载是否有效(笔者在写博文当下暂未有结论);
如果想要实现高效的热部署,可以借肋外部插件 JRebel (笔者当下暂未试过)

可参考博文 2017年最新JRebel+Eclipse热部署教程

③name 可以理解就是填写域名的地方

④unpackWARs 设置为ture 表示如果是war包,是否自动解压

Context标签主要属性

① doBase 是项目的本机的物理路径,是项目真实的路径

② path 是项目在浏览器中的访问路径,是虚拟的路径

但要注意,相同name属性相同的host标签下,有多个context标签时,它们的path不能相同,不然都长的一样,怎么去识别呢
我们也可以设置path="/",表示我们在浏览器中不需要输入路径,就可以查看服务器下的文件 比如 localhost:8080/hello.html 中间就省略了项目访问路径,但这种也只适用于读取一些静态的文件

③reloadable 设置为true就是经常说的热加载

热加载: 当项目发生改动的时候,会重新编译修改的类。也就是常说的热加载。注意,热加载的特征内存不会清空,sessin不会丢失,但容易造成内存溢出,或者找不到方法(这是因为重新编译的过程);这就是为什么开启热加载后修改了java代码,一保存项目就报错的原因了。

<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
 <!--Host标签可以设置多个,方便多域名配置-->

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
  <!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
 <Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true"/> 
 
  <Context docBase="F:cd\cs" path="/cs" reloadable="true"/> 

</Host>   

但是同时,要实现动态Web的效果,自定义的文件夹应该有WEB-INF,和它里面的web.xml,文件(下图中未能展示出WEB-INF中的xml文件)

深入Tomcat之 通过配置server.xml可以实现的功能

问题三 :多域名访问

我们想通过多个域名来访问同一个资源,是通过修改标签name属性实现 ,而且标签可以有多个;

<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
 <!--Host标签可以设置多个,方便多域名配置-->
  
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
  <!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
 <Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/> 
	   
</Host>


<Host appBase="webapps" autoDeploy="true" name="www.ol51.com" unpackWARs="true">
 <!--Host标签可以设置多个,方便多域名配置-->
  
 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
  
 <Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/> 
	   
</Host>   

上面的是俩个标签,分别设置了俩个域名,www.51ol.com www.ol51.com

但俩个标签中的标签相同

特别说明: 这个域名一个要真实存在;且一定要解析到你的IP才能用。

当然,也有一个办法,可以配置临时域名

在Windwos环境下,

1)、打开到 C:\Windows\System32\drivers\etc 下,找到 hosts 文件
2)、在 hosts 文件下配置临时域名

在文件中新起一行,输入

127.0.0.1 www.51ol.com   

127.0.0.1 www.51ol.com  

就可以在本地用“假”的域名访问了

问题四 :配置虚拟主机

配置虚拟主机其实就是我们想在只开启一台tomcat,让多个域名可以访问同访问不同资源(不同网站);

和配置多域名登陆基本思路相同,通过填加多个host标签来实现,不同的是:

多域名访问是不同host标签的有相同的name属性(相同域名),访问同一资源(就是contxt标签 docBase属性相同);
而虚拟主机的需求是不同host标签有不同的name属性(不同域名),访问不同资源(就是contxt标签 docBase属性不相同);

Code

<Host appBase="webapps" autoDeploy="true" name="www.51ol.com" unpackWARs="true">
 <!--Host标签可以设置多个,方便多域名配置-->

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>
  <!--docBase为项目真实路径 path表示项目通过浏览器访问路径,-->
 <Context docBase="E:\tomcat\apache-tomcat-8.0.45\wtpwebapps\tt" path="/tt" reloadable="true" source="org.eclipse.jst.jee.server:tt"/> 

</Host>


<Host appBase="webapps" autoDeploy="true" name="www.ol51.com" unpackWARs="true">
 <!--Host标签可以设置多个,方便多域名配置-->

 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log" suffix=".txt"/>

 <Context docBase="F:cd\cs" path="/cs" reloadable="true"/>   

</Host>  

End!


深入Tomcat之 通过配置server.xml可以实现的功能