1、启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点。

2、紧急着,容创建一个ServletContext(servlet上下文),这个web项目的所有部分都将共享这个上下文。

3、容器将<context-param>转换为键值对,并交给servletContext。

4、容器创建<listener>中的类实例,创建监听器。

二  Load-on-startup

Load-on-startup 元素在web应用启动的时候指定了servlet被加载的顺序,它的值必须是一个整数。如果它的值是一个负整数或是这个元素不存在,那么容器会在该servlet被调用的时候,加载这个servlet 。如果值是正整数或零,容器在配置的时候就加载并初始化这个servlet,容器必须保证值小的先被加载。如果值相等,容器可以自动选择先加载谁。

在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:

标记容器是否在启动的时候就加载这个servlet。

当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;

当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。

正数的值越小,启动该servlet的优先级越高。

三  加载顺序

首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关。即不会因为 filter 写在 listener 的前面而会先加载 filter。最终得出的结论是:ServletContext -> listener -> filter -> servlet

同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet

对于某类配置节而言,与它们出现的顺序是有关的。以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的一个配置节是 filter-mapping,这里一定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节而言,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。

servlet 同 filter 类似,此处不再赘述。

由此,可以看出,web.xml 的加载顺序是:ServletContext -> context-param -> listener -> filter -> servlet ,而同个类型之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

四  web.xml文件详解 

我将自己知道的web.xml的元素整理了一下:

web.xml首先是肯定要包含它的schema.

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
    version="2.4">

</web-app>

其它的元素都放在<web-app></web-app>之中。

<discription></discription> 是对站台的描述
<display-name></display-name> 定义站台的名称
<distributable/> 是指定该站台是否可分布式处理

<context-param></context-param> 用来设定web站台的环境参数,它包含两个子元素:
    <param-name></param-name> 用来指定参数的名称
    <param-value></param-value> 用来设定参数值

比如:
<context-param>
    <param-name>my_param</param-name>
    <param-value>hello</param-value>
</context-param>

在此设定的参数,可以在servlet中用 getServletContext().getInitParameter("my_param") 来取得

<filter></filter> 是用来声明filter的相关设定,它包含以下子元素:
    <filter-name></filter-name> 这当然就是指定filter的名字
    <filter-class></filter-class> 这是用来定义filter的类的名称
    <init-param></init-param> 用来定义参数,它有两个子元素:
        <param-name></param-name> 用来指定参数的名称
        <param-value></param-value> 用来设定参数值

比如:
<filter>
        <filter-name>setCharacterEncoding</filter-name>
        <filter-class>com.myTest.setCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GB2312</param-value>
        </init-param>
</filter>

与<filter></filter>同时使用的是<filter-mapping></filter-mapping> 用来定义filter所对应的URL,它有两个子元素:
    <filter-name></filter-name> 指定filter的名字
    <url-pattern></url-pattern> 指定filter所对应的URL

比如:
<filter-mapping>
        <filter-name>setCharacterEncoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

<listener></listener> 用来设定Listener接口,它的主要子元素为
    <listener-class></listener-class> 定义Listener的类名称

比如:
<listener>
    <listener-class>com.myTest.ContextListener</listener-class> 
</listener>

<servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:
    <servlet-name></servlet-name> 指定servlet的名称
    <servlet-class></servlet-class> 指定servlet的类名称

    <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径
    <init-param></init-param> 用来定义参数,和前面的<init-param>差不多

同样,与<servlet></servlet>一起使用的是<servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素:
    <servlet-name></servlet-name> 指定servlet的名称
    <url-pattern></url-pattern> 指定servlet所对应的URL

比如:
<servlet>
        <servlet-name>ShoppingServlet</servlet-name>
        <servlet-class>com.myTest.ShoppingServlet</servlet-class>
</servlet>
    
<servlet-mapping>
        <servlet-name>ShoppingServlet</servlet-name>
        <url-pattern>/shop/ShoppingServlet</url-pattern>
</servlet-mapping>

<welcome-file-list></welcom-file-list> 用来定义首页的列单,包含一个子元素:

<welcome-file></welcome-file> 指定首页的文件名称

比如:
<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
</welcom-file-list>

<error-page></error-page> 用来处理错误代码或异常的页面,有三个子元素:
    <error-code></error-code> 指定错误代码
    <exception-type></exception-type> 指定一个Java异常类型
    <location></location> 指定在web站台内的相关资源路径

比如:
<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>

五 相应元素配置

1、Web应用图标:指出IDE和GUI工具用来表示Web应用的大图标和小图标       
<icon>       
<small-icon>/images/app_small.gif</small-icon>       
<large-icon>/images/app_large.gif</large-icon>       
</icon>       
2、Web 应用名称:提供GUI工具可能会用来标记这个特定的Web应用的一个名称       
<display-name>Tomcat Example</display-name>       
3、Web 应用描述: 给出于此相关的说明性文本       
<disciption>Tomcat Example servlets and JSP pages.</disciption>       
4、上下文参数:声明应用范围内的初始化参数。       
<context-param>       
       <param-name>ContextParameter</para-name>       
       <param-value>test</param-value>       
       <description>It is a test parameter.</description>       
</context-param>       
在servlet里面可以通过getServletContext().getInitParameter("context/param")得到

5、过滤器配置:将一个名字与一个实现javaxs.servlet.Filter接口的类相关联。       
<filter>       
               <filter-name>setCharacterEncoding</filter-name>       
               <filter-class>com.myTest.setCharacterEncodingFilt er</filter-class>       
               <init-param>       
                       <param-name>encoding</param-name>       
                       <param-value>GB2312</param-value>       
               </init-param>       
</filter>       
<filter-mapping>       
               <filter-name>setCharacterEncoding</filter-name>       
               <url-pattern>/*</url-pattern>       
</filter-mapping>       
6、监听器配置       
<listener>       
           <listerner-class>listener.SessionListener</listener-class>       
</listener>       
7、Servlet配置       
     基本配置       
     <servlet>       
           <servlet-name>snoop</servlet-name>       
           <servlet-class>SnoopServlet</servlet-class>       
     </servlet>       
     <servlet-mapping>       
           <servlet-name>snoop</servlet-name>       
           <url-pattern>/snoop</url-pattern>       
     </servlet-mapping>       
     高级配置       
     <servlet>       
           <servlet-name>snoop</servlet-name>       
           <servlet-class>SnoopServlet</servlet-class>       
           <init-param>       
                 <param-name>foo</param-name>       
                 <param-value>bar</param-value>       
           </init-param>       
           <run-as>       
                 <description>Security role for anonymous access</description>       
                 <role-name>tomcat</role-name>       
           </run-as>       
     </servlet>       
     <servlet-mapping>       
           <servlet-name>snoop</servlet-name>       
           <url-pattern>/snoop</url-pattern>       
     </servlet-mapping>       
     元素说明       
         <servlet></servlet> 用来声明一个servlet的数据,主要有以下子元素:       
         <servlet-name></servlet-name> 指定servlet的名称       
         <servlet-class></servlet-class> 指定servlet的类名称       
         <jsp-file></jsp-file> 指定web站台中的某个JSP网页的完整路径       
         <init-param></init-param> 用来定义参数,可有多个init-param。在servlet类中通过getInitParamenter(String name)方法访问初始化参数       
         <load-on-startup></load-on-startup>指定当Web应用启动时,装载Servlet的次序。       
                                                                 当值为正数或零时:Servlet容器先加载数值小的servlet,再依次加载其他数值大的servlet.       
                                                                 当值为负或未定义:Servlet容器将在Web客户首次访问这个servlet时加载它       
         <servlet-mapping></servlet-mapping> 用来定义servlet所对应的URL,包含两个子元素       
             <servlet-name></servlet-name> 指定servlet的名称       
             <url-pattern></url-pattern> 指定servlet所对应的URL       
8、会话超时配置(单位为分钟)       
     <session-config>       
           <session-timeout>120</session-timeout>       
     </session-config>       
9、MIME类型配置       
     <mime-mapping>       
           <extension>htm</extension>       
           <mime-type>text/html</mime-type>       
     </mime-mapping>       
10、指定欢迎文件页配置       
     <welcome-file-list>       
           <welcome-file>index.jsp</welcome-file>       
           <welcome-file>index.html</welcome-file>       
           <welcome-file>index.htm</welcome-file>       
     </welcome-file-list>       
11、配置错误页面       
一、 通过错误码来配置error-page       
     <error-page>       
           <error-code>404</error-code>       
           <location>/NotFound.jsp</location>       
     </error-page>       
上面配置了当系统发生404错误时,跳转到错误处理页面NotFound.jsp。       
二、通过异常的类型配置error-page       
     <error-page>       
             <exception-type>java.lang.NullException</exception-type>       
             <location>/error.jsp</location>       
     </error-page>       
上面配置了当系统发生java.lang.NullException(即空指针异常)时,跳转到错误处理页面error.jsp

其他说明:

web.xml 文件中一般包括 servlet, spring, filter, listenr的配置。那么他们是按照一个什么顺序加载呢?

加载顺序会影响对spring bean 的调用。

比如filter 需要用到 bean ,但是加载顺序是 先加载filter 后加载spring,则filter中初始化操作中的bean为null;

首先可以肯定 加载顺序与他们在web.xml 文件中的先后顺序无关。

web.xml 中 listener 和 serverlet 的加载顺序为 先 listener 后serverlet

最终得出结果:先 listener >> filter >> servlet >>  spring

所以,如果过滤器中要使用到 bean,可以将spring 的加载 改成 Listener的方式

<listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

搞定!

服务器启动时Webapp的web.xml中配置的加载顺序相关推荐

  1. 在配置文件web.xml中配置Struts2的启动信息

    在配置文件web.xml中配置Struts2的启动信息: <?xml version="1.0" encoding="UTF-8"?> <we ...

  2. Web.xml中配置监听器Listener导致Tomcat无法启动

    Web.xml中配置监听器Listener导致Tomcat无法启动 1.在pom.xml里导入 org.springframework spring-web 5.0.5.RELEASE 版本看你个人的 ...

  3. 深入理解web.xml中配置/和/*的区别

    在用SpringMVC进行web开发的时候,如果将DispathcerServlet对外访问的虚拟路径配置成/时,需要在Spring的配置文件中配置<mvc:default-servlet-ha ...

  4. SpringMVC在web.xml中配置DispatcherServlet拦截了静态资源访问

    如图 在web.xml中配置DispatcherServlet时对于url-pattern的配置方式有以下几种情况: 1.配置为: *.do 或者是 *.action 时,拦截以.do或者.actio ...

  5. 在web.xml中配置过滤器

    在web.xml中配置过滤器 <filter> <filter-name>loginFilter</filter-name>//过滤器名称 <filter-c ...

  6. web.xml中配置web监听器

    web.xml中配置web监听器 在web.xml配置监听器,格式如下: <listener><listener-class>类全名</listener-class> ...

  7. springboot项目启动时提示错误: 找不到或无法加载主类

    问题: springboot项目启动时提示错误: 找不到或无法加载主类 解决方法:

  8. 如何正确控制springboot中bean的加载顺序总结

    1.为什么需要控制加载顺序 springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题.在此基础上,又提供了spi机制,用spring.factories可以完成一个小组件的自动装配功 ...

  9. Java 类中各成分加载顺序和内存中的存放位置

    一.什么时候会加载类? 使用到类中的内容时加载:有三种情况 1.创建对象:new StaticCode(); 2.使用类中的静态成员:StaticCode.num=9; StaticCode.show ...

最新文章

  1. WPF之复杂形状控件
  2. 5.6m元多项式的表示
  3. lua urlencode urldecode URL编码
  4. idea+selenium代码_你试过使用selenium爬虫抓取数据吗
  5. 内存涨价成为必然!三星SK海力士美光削减28%内存资本开支
  6. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
  7. 链接时出现LNK2001错误的解决方法
  8. 01.vue的简单实例
  9. OpenCV案例(三): 玉米颗粒计数
  10. Android java时间戳转年月日时分秒
  11. 【react】 redux 公共状态管理---数据的渲染,数据的修改,再把修改的数据渲染到当前组件...
  12. dotween曲线运动 unity_Unity3D DOTween动画插件详解
  13. ceph的 cache tier实现分析
  14. 【预测模型】预测某地区未来 10-20 年按年龄划分的人口结构(PDE模型)
  15. 一款备受九零后喜爱的独特界面,VC++屏幕保镖(锁屏程序)附源码
  16. 解决 Chrome 浏览器跨域加载本地文件的问题
  17. 1383: 手机短号 (多实例)
  18. five86-2靶机渗透攻略
  19. 阿里腾讯都到百度去挖AI大牛,百度对此却不care,为何?
  20. Python基础项目:学生信息管理系统

热门文章

  1. 前端学习(2157):webpack-dev-server搭建本地服务
  2. 前端学习(2134):前端模块化雏形和common.js
  3. 前端学习(2122):项目演示
  4. 前端学习(1912)vue之电商管理系统电商系统之调用api完成删除操作
  5. 前端学习(1166):扩展运算符02
  6. 59 javabean的创建
  7. 实例10:python
  8. Qt C++ 命名空间namespaces讲解
  9. php金额类,PHP类-人民币金额转大写
  10. mysql5.7 新建远程用户_Centos7中 mysql5.7 用户 创建 、授权、远程登录