【Web】了解Web.xml的配置

 

          web.xml是web项目启动时首先被容器读取的配置文件,根据其中的配置创建实例并完成参数初始化等以保证项目能够正确启动运行.web.xml中配置的项目主要有这么几种,我对各个元素的作用了解如下:

 

上下文参数:

 

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/config/applicationContext-*.xml</param-value>
  </context-param>

 

         这一元素用来声明应用范围(整个web项目)内的上下文初始化参数.参数名称是唯一的,就是固定不变的.在web.xml中通过contextConfigLocation配置spring,contextConfigLocation参数定义了要装入的 Spring配置文件.如果缺省这种配置,默认加载/WEB-INF/applicationContext.xml文件,如果有多个,param-value里可以有多个配置文件名称,并以逗号分隔.

 

 

监听器:

<listener>
    <listener-class>com.tgb.itoo.MyListener</listener-class>
  </listener>

         listener元素用来注册一个监听器类,listener-class指定监听类.

servlet API的版本2.3增加了对事件监听程序的支持,事件监听程序在建立、修改和删除会话或servlet环境时得到通知.监听类继承ServletContextListener,在监听的类中有一个contextInitialized(ServletContextEventevent)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation")来得到context-param 设定的值.在这个类中还必须有一个contextDestroyed(ServletContextEventevent) 销毁方法.用于关闭应用前释放资源,比如说数据库连接的关闭.

 

过滤器

<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-mapping>    
        <filter-name>setCharacterEncoding</filter-name>    
        <url-pattern>/*</url-pattern>    

</filter-mapping>  

        将一个名字与一个实现javax.servlet.Filter接口的类相关联. <filter-mapping>标签声明了与该filter相应的匹配规则,一个<url-pattern>定义了一个匹配规则。当浏览器发起一个URL请求后,该请求发送servlet容器,容器会先将URL减去当前应用上下文路径作为filter的映射URL,比如url是http://10.10.11.1/myapp/goods/detail.html,其应用上下文是myapp,容器会将http://10.10.11.1/myapp去掉,剩下的/goods/detail.html部分拿来做filter的映射匹配。一个URL请求会匹配多个filter,多个filter只是处理顺序不同,这个顺序跟<filter-mapping>在web.xml中定义的顺序相同。

servlet配置:

<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/spring-mvc.xml,classpath:config/applicationContext-common.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>


      该元素指定了servlet的名称和servlet的类名称.同filter一样,<servlet-mapping>标签声明了与该servlet相应的匹配规则,每个<urp-pattern>代表了一个匹配规则。这个映射匹配过程有优先顺序,精确路径 > 最长路径 > 扩展名。不同的是,一个URL请求与一个servlet匹配成功后,不会再去匹配剩下的其他servlet了。匹配顺序举例如下:

例1:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,不会去管servletB。

例2:比如servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。 

例3: 比如servletA的url-pattern:*.action ,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test.action,这个时候容器就会优先进行路径匹配,而不是去匹配扩展名,这样就去调用servletB。

参考https://blog.csdn.net/dream_mushuang/article/details/73743723

Web服务器与Web应用属于两个范畴,要使我们的web应用在Web服务器上发布和运行,需要标准的中间接口,Servlet就是其中之一,所以这样的Web服务器也叫做Servlet容器.我们看到<servlet>中有<param-name>contextConfigLocation</param-name>的配置,而上面<context-param>中也有<param-name>contextConfigLocation</param-name>,虽然名称相同,但应用范围不同,分别是ServletConfig和ServletContext.具体差异之后的博客中会给出解释。

 

web.xml是如何被读取的以及容器读取配置文件过程中都进行了哪些操作,简单分析如下:

  1. 在启动Web项目时,容器(如Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>
  2. 接着容器会创建一个ServletContext,整个WEB项目都能使用这个上下文
  3. 容器将读到的<context-param>转化为键值对,并交给ServletContext
  4. 容器创建<listener></listener>中的类实例,即创建监听
  5. 在监听的类中有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中可以通过event.getServletContext().getInitParameter("contextConfigLocation") 来得到context-param 设定的值,还有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源
  6. 得到这个context-param的值之后,我们就可以做一些操作了.这时WEB项目还没有完全启动完成.

本文的重点在于明白以上各元素的基本配置,以及它们的加载顺序,即跟在web.xml文件中配置的先后无关,其顺序为context-param ->listener -> filter -> servlet。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值