JavaWeb项目 Web.xml文件详解(启动顺序)

web.xml作用是用来初始化配置信息的。

比如:Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等

web.xml加载过程(步骤)

当启动一个WEB项目的时候,容器(比如Tomcat等),首先会读取项目web.xml配置文件里的配置,如果这一步骤不出错且完成之后,项目才能正常启动起来

1、在启动Web项目时,容器(如Tomcat)会首先读web.xml配置文件中的两个节点<listener></listener><context-param></context-param>

2、接着容器会创建一个ServletContext(上下文),应用范围内即整个WEB项目都能够使用这个上下文。

3、接着容器会将<context-param>转化为键值对,以<context-param>的name为键,value为值,存入ServletContext。

4、容器根据配置的class类路径创建中的类实例,即创建监听(备注:listener定义的的类型是自定义的类但必须要继承ServletContextListener)。

5、监听器的类中会有一个contextInitialized(servletContextEvent event)初始化的方法,在这个方法中可以通过event.getServletContext().getInitParameter(“context-param的键”)来获得context-param设定的值,得到这个context-param的值之后,你就可以做一些操作了。在这个类中还必须有一个contextDestroyed(ServletContextEvent event)销毁方法,用于关闭资源应用前释放资源。

举例:如果你想在项目启动之前就打开数据库,就可以在<context-param>中设置数据库的连接方式(驱动、url、user、password),在监听类中初始化数据库的连接。这个监听是自己写的一个类,除了初始化方法,它应该还要有销毁方法,用于关闭应用前释放资源。就比如说这个数据库连接的关闭,此时调用contextDestroyed(servletContextEvent event),关闭Web应用时,系统调用Listener的该方法。

6、接着读取<filter></filter>,根据指定的类路径来实例化过滤器。

7、以上都是Web项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的晚。

总结上面的步骤简化为: web.xml文件加载 >> 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-app 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_3_0.xsd"
         version="3.0">
	<display-name>Archetype Created Web Application</display-name>

    <!--字符集过滤器-->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--springMVC-->
    <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>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    <!--Spring容器-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!--指定项目阶段的上下文参数,上下文参数提供web应用程序所需的配置信息。 --->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

    <!--springsecurity-->
    <!--Spring Security过滤器链,注意过滤器名称必须叫springSecurityFilterChain-->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

	<welcome-file-list>
        <welcome-file>index.html</welcome-file>
 	</welcome-file-list>
</web-app>

指定登录页面位置的welcome-file-list元素(关于欢迎页面)访问一个网站时,默认看到的第一个页面就叫欢迎页,一般情况下是由首页来充当欢迎页的。一般情况下,我们会在web.xml中指定欢迎页。但 web.xml并不是一个Web的必要文件,没有web.xml,网站仍然是可以正常工作的。只不过网站的功能复杂起来后,web.xml的确有非常大用处,所以,默认创建的动态web工程在WEB-INF文件夹下面都有一个web.xml文件

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值