tomcat配置文件we.xml解析

tomcat配置文件we.xml解析

一、示例

?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">  
<!-- 属性说明  
    port:指定一个端口,这个端口负责监听关闭Tomcat的请求  
    shutdown:向以上端口发送的关闭服务器的命令字符串  
-->  
  <Listener className="org.apache.catalina.core.AprLifecycleListener" />  
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />  
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />  
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>  
  
  <GlobalNamingResources>  
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>  
  
    <Resource name="UserDatabase" auth="Container"  
              type="org.apache.catalina.UserDatabase"  
       description="User database that can be updated and saved"  
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"  
          pathname="conf/tomcat-users.xml" />   
  </GlobalNamingResources>  
  
<!-- 
    每个Service元素只能有一个Engine元素.元素处理在同一个<Service>中所有<Connector>元素接收到的客户请求 
-->  
  <Service name="Catalina">  
<!--   
    name:Service服务器的名称  
-->  
  
    <!--  
        Connector元素:  
            由Connector接口定义.<Connector>元素代表与客户程序实际交互的组件,它负责接收客户请求,以及向客户返回响应结果.  
    -->  
    <Connector port="80" maxHttpHeaderSize="8192"  
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  
               enableLookups="false" redirectPort="8443" acceptCount="100"  
               connectionTimeout="20000" disableUploadTimeout="true" />  
    <!-- 属性说明  
        port:服务器连接器的端口号,该连接器将在指定端口侦听来自客户端的请求。  
        enableLookups:如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名;  
                      若为false则不进行DNS查询,而是返回其ip地址。  
        redirectPort:服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号。  
        acceptCount:当所有可以使用的处理请求的线程都被用光时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,而返回Connection refused错误。  
        connectionTimeout:等待超时的时间数(以毫秒为单位)。  
        maxThreads:设定在监听端口的线程的最大数目,这个值也决定了服务器可以同时响应客户请求的最大数目.默认值为200。  
        protocol:必须设定为AJP/1.3协议。  
        address:如果服务器有两个以上IP地址,该属性可以设定端口监听的IP地址,默认情况下,端口会监听服务器上所有IP地址。  
        minProcessors:服务器启动时创建的处理请求的线程数,每个请求由一个线程负责。  
        maxProcessors:最多可以创建的处理请求的线程数。  
        minSpareThreads:最小备用线程 。  
        maxSpareThreads:最大备用线程。  
        debug:日志等级。  
        disableUploadTimeout:禁用上传超时,主要用于大数据上传时。  
    -->  
  
    <Connector port="8009"   
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />  
    <!-- 负责和其他HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时就需要用到这个连接器。 -->  
      
    <Engine name="Catalina" defaultHost="localhost">  
    <!-- 属性说明  
        name:对应$CATALINA_HOME/config/Catalina中的Catalina   
        defaultHost:对应<Host>元素中的name属性,也就是和$CATALINA_HOME/config/Catalina/localhost中的localhost  
            缺省的处理请求的虚拟主机名,它至少与其中的一个Host元素的name属性值是一样的  
        debug:日志等级  
    -->  
  
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"  
             resourceName="UserDatabase"/>  
    <!--  
        由Host接口定义.一个Engine元素可以包含多个<Host>元素.  
        每个<Host>的元素定义了一个虚拟主机.它包含了一个或多个Web应用.  
    -->  
    <Host name="localhost" appBase="webapps"  
       unpackWARs="true" autoDeploy="true"  
       xmlValidation="false" xmlNamespaceAware="false">  
        <!-- 属性说明  
            name:在此例中一直被强调为$CATALINA_HOME/config/Catalina/localhost中的localhost虚拟主机名  
            debug:是日志的调试等级   
            appBase:默认的应用路径,也就是把应用放在一个目录下,并在autoDeploy为true的情况下,可自动部署应用此路径相对于$CATALINA_HOME/ (web applications的基本目录)  
            unpackWARs:设置为true,在Web应用为*.war是,解压此WAR文件.   
                       如果为true,则tomcat会自动将WAR文件解压;否则不解压,直接从WAR文件中运行应用程序.  
            autoDeploy:默认为true,表示如果有新的WEB应用放入appBase 并且Tomcat在运行的情况下,自动载入应用   
        -->  
      
        <Context path="/demm" docBase="E:\\projects\\demm\\WebRoot" debug="0" reloadable="true" >   
            </Context>  
        <!-- 属性说明  
            path:访问的URI,如:http://localhost/是我的应用的根目录,访问此应用将用:http://localhost/demm进行操作,此元素必须,  
                 表示此web application的URL的前缀,用来匹配一个Context。请求的URL形式为http://localhost:8080/path/*  
            docBase:WEB应用的目录,此目录必须符合Java WEB应用的规范,web application的文件存放路径或者是WAR文件存放路径。  
            debug:日志等级   
            reloadable:是否在程序有改动时重新载入,设置成true会影响性能,但可自动载入修改后的文件,  
                如果为true,则Tomcat将支持热部署,会自动检测web application的/WEB-INF/lib和/WEB-INF/classes目录的变化,  
                自动装载新的JSP和Servlet,我们可以在不重启Tomcat的情况下改变web application 。 
        -->  
        <!-- 可以在这个地方部署项目 -->
        <!-- context在host下。一个context表示一个web应用。相当于和web应用文件夹的映射 -->    
        <Context docBase="F:\TomCat\apache-tomcat-9.0.12\wtpwebapps\day11_03_PageContext" path="/day11_03_PageContext" reloadable="true" source="org.eclipse.jst.jee.server:day11_03_PageContext"/>
        <Context docBase="F:\TomCat\apache-tomcat-9.0.12\wtpwebapps\day11_04_el" path="/day11_04_el" reloadable="true" source="org.eclipse.jst.jee.server:day11_04_el"/>
        <Context docBase="F:\TomCat\apache-tomcat-9.0.12\wtpwebapps\day07_03_myApp1" 
                    path="/day07_03_myApp1" reloadable="true" source="org.eclipse.jst.jee.server:day07_03_myApp1"/>
      </Host>  
    </Engine>  
  </Service>  
</Server> 

二、web.xml解析

2.1、web.xml中servlet配置及其含义

一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。
web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。
每个xml文件都有定义它书写规则的Schema文件,也就是说javaEE的定义web.xml所对应的xml Schema文件中定义了多少种标签元素,web.xml中就可以出现它所定义的标签元素,也就具备哪些特定的功能。web.xml的模式文件是由Sun 公司定义的,每个web.xml文件的根元素为<web-app>中,必须标明这个web.xml使用的是哪个模式文件。如:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
</web-app> 

下面列出web.xml我们常用的一些标签元素及其功能:
1、指定欢迎页面:

<welcome-file-list> 
  <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>index1.jsp</welcome-file> 
  </welcome-file-list> 
PS:指定了2个欢迎页面,显示时按顺序从第一个找起,如果第一个存在,就显示第一个,后面的不起作用。如果第一个不存在,就找第二个,以此类推。

2、命名与定制URL。我们可以为Servlet和JSP文件命名并定制URL,其中定制URL是依赖命名的,命名必须在定制URL前。下面拿serlet来举例:

(1)、为Servlet命名: 
<servlet> 
    <servlet-name>servlet1</servlet-name> 
    <servlet-class>org.whatisjava.TestServlet</servlet-class> 
</servlet> 
(2)、为Servlet定制URL、 
<servlet-mapping> 
    <servlet-name>servlet1</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

3、定制初始化参数:可以定制servlet、JSP、Context的初始化参数,然后可以再servlet、JSP、Context中获取这些参数值。

<servlet> 
    <servlet-name>servlet1</servlet-name> 
    <servlet-class>org.whatisjava.TestServlet</servlet-class> 
    <init-param> 
          <param-name>userName</param-name> 
          <param-value>Daniel</param-value> 
    </init-param> 
    <init-param> 
          <param-name>E-mail</param-name> 
          <param-value>125485762@qq.com</param-value> 
    </init-param> 
</servlet> 
经过上面的配置,在servlet中能够调用getServletConfig().getInitParameter("param1")获得参数名对应的值。 

4、指定错误处理页面,可以通过“异常类型”或“错误码”来指定错误处理页面。

<error-page> 
    <error-code>404</error-code> 
    <location>/error404.jsp</location> 
</error-page> 
----------------------------- 
<error-page> 
    <exception-type>java.lang.Exception<exception-type> 
    <location>/exception.jsp<location> 
</error-page> 

5、设置过滤器:比如设置一个编码过滤器,过滤所有资源

<filter> 
    <filter-name>XXXCharaSetFilter</filter-name> 
    <filter-class>net.test.CharSetFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>XXXCharaSetFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

6、设置监听器:

<listener> 
    <listener-class>net.test.XXXLisenet</listener-class> 
</listener> 

7、设置会话(Session)过期时间,其中时间以分钟为单位,假如设置60分钟超时:

<session-config> 
<session-timeout>60</session-timeout> 
</session-config>

Servlet配置及含义:

<!-- 配置一个servlet -->
<!-- servlet的配置 -->
<servlet>
    <!-- servlet的内部名称,自定义。尽量有意义 -->
    <servlet-name>ServletDemo</servlet-name>
    <!-- servlet的类全名: 包名+简单类名 -->
    <servlet-class>lm.practice.ServletDemo</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>ServletDemo</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/servlet</url-pattern>
</servlet-mapping>

这两个一个是配置Servlet,一个是配置其映射信息,其中中的<servlet-name>可以随意指定,但要有一定的意义,一般取为类的名称,例如我的类名为ServletDemo,这里取名为ServletDemo,下面的<servlet-class>是类的全路径,package+calssname,一定要是全路径!
<servlet-Mapping>是映射信息,它也有一个<servlet-name>,里面的名字是对应的Servlet名,也就是我们上面配置的Servlet名字,这里是ServletDemo,下面的是映射路径,也就是访问Servlet的名称,这里也是以方便和有意义为前提的,是我们在访问Servlet在浏览器地址栏后面输入的那个信息,例如我的映射路径命名为/servlet,在地址栏中输入http://localhost/20170323/servlet。
注意:这里的映射路径一定不是丢掉/,否则就会出错了,一定要写成/servlet,不能是servlet。
这里说一下在配置映射路径的时候,有以下两种:

url-pattern  浏览器输入  
精确匹配   /servlet http://localhost:8080/day10/servlet
模糊匹配   /*       http://localhost:8080/20170323/任意路径
           /lm/*    http://localhost:8080/20170323/lm/任意路径
           *.后缀名 *.do *.action *.html(伪静态)   http://localhost:8080/20170323/任意路径.do

下面是项目中web.xml文件中springmvc的Servlet配置信息:

<!-- Spring MVC servlet -->
<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
    <url-pattern>/</url-pattern>
</servlet-mapping>
 

  <servlet>
    <servlet-name>jobDispatcherServlet</servlet-name>
    <servlet-class>com.suning.framework.uts.client.core.JobDispatcherServlet</servlet-class>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>jobDispatcherServlet</servlet-name>
    <url-pattern>/jobDispatcher</url-pattern>
</servlet-mapping>

<session-config>
   <session-timeout>30</session-timeout>
</session-config>

【注意】:
1)url-pattern要么以 / 开头,要么以开头。 绝对不能漏掉斜杠!
2)不能同时使用两种模糊匹配,例如 /lm/
.do是非法路径。
3)当有输入的URL有多个servlet同时被匹配的情况下:
(1)精确匹配优先。(长的最像优先被匹配)
(2)以后缀名结尾的模糊匹配先级最低!!!

2.2、一个web项目web.xml的配置中<context-param>配置作用

1、启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener><context-param></context-param>
2、紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文。
3、容器将<context-param></context-param>转化为键值对,并交给ServletContext。
4、容器创建<listener></listener>中的类实例,即创建监听。
5、在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
6、得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早。换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
7、举例.你可能想在项目启动之前就打开数据库。那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接。
8、这个监听是自己写的一个类,除了初始化方法,它还有销毁方法。用于关闭应用前释放资源。比如说数据库连接的关闭。

<!-- 加载spring的配置文件 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/action-servlet.xml,/WEB-
INF/jason-servlet.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
又如: --->自定义context-param,且自定义listener来获取这些信息
<context-param>
    <param-name>urlrewrite</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>cluster</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>servletmapping</param-name>
    <param-value>*.bbscs</param-value>
</context-param>
<context-param>
    <param-name>poststoragemode</param-name>
    <param-value>1</param-value>
</context-param>
<listener>
    <listener-class>com.laoer.bbscs.web.servlet.SysListener</listener-class>
</listener>

监听器:

public class SysListener extends HttpServlet implements ServletContextListener {
private static final Log logger = LogFactory.getLog(SysListener.class);
public void contextDestroyed(ServletContextEvent sce) {
   //用于在容器关闭时,操作
}
//用于在容器开启时,操作
public void contextInitialized(ServletContextEvent sce) {
   String rootpath = sce.getServletContext().getRealPath("/");
   System.out.println("-------------rootPath:"+rootpath);
   if (rootpath != null) {
    rootpath = rootpath.replaceAll("\\\\", "/");
   } else {
    rootpath = "/";
   }
   if (!rootpath.endsWith("/")) {
    rootpath = rootpath + "/";
   }
   Constant.ROOTPATH = rootpath;
   logger.info("Application Run Path:" + rootpath);
   String urlrewrtie = sce.getServletContext().getInitParameter("urlrewrite");
   boolean burlrewrtie = false;
   if (urlrewrtie != null) {
    burlrewrtie = Boolean.parseBoolean(urlrewrtie);
   }
   Constant.USE_URL_REWRITE = burlrewrtie;
   logger.info("Use Urlrewrite:" + burlrewrtie);
   其它略之....
   }
}
/*最终输出
   -------------rootPath:D:\tomcat_bbs\webapps\BBSCS_8_0_3\
   2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
Application Run Path:D:/tomcat_bbs/webapps/BBSCS_8_0_3/
   2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
Use Urlrewrite:true
   2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
Use Cluster:false
   2009-06-09 21:51:46,526 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
SERVLET MAPPING:*.bbscs
   2009-06-09 21:51:46,573 [com.laoer.bbscs.web.servlet.SysListener]-[INFO]
Post Storage Mode:1
   */

2.3、context-param和init-param区别

web.xml里面可以定义两种参数:
(1)application范围内的参数,存放在servletcontext中,在web.xml中配置如下:

<context-param>
    <param-name>context/param</param-name>
    <param-value>avalible during application</param-value>
</context-param>

(2)servlet范围内的参数,只能在servlet的init()方法中取得,在web.xml中配置如下:

<servlet>
    <servlet-name>MainServlet</servlet-name>
    <servlet-class>com.wes.controller.MainServlet</servlet-class>
    <init-param>
       <param-name>param1</param-name>
       <param-value>avalible in servlet init()</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
</servlet>

在servlet中可以通过代码分别取用:

package com.wes.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
public class MainServlet extends HttpServlet ...{
    public MainServlet() ...{
        super();
     }
    public void init() throws ServletException ...{
         System.out.println("下面的两个参数param1是在servlet中存放的");
         System.out.println(this.getInitParameter("param1"));
         System.out.println("下面的参数是存放在servletcontext中的");
        System.out.println(getServletContext().getInitParameter("context/param"));
      }
}

第一种参数在servlet里面可以通过以下方式得到。

getServletContext().getInitParameter("context/param")

第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得。

评论

暂无

添加新评论