[spring]web.xml文件详解

一、概述

  web.xml文件是我们开发Web程序的一项很重要的配置项,里面包含了我们各种各样的配置信息,比如欢迎页面,过滤器,监听器,启动加载级别等等。在服务器启动时,第一步便会加载项目的web.xml文件,然后通过其中的各种配置来启动项目,如果配置项都正确,则项目启动成功。

二、配置文件

接下来我们以配置Spring MVC程序为例,来挨个看下web.xml中各项配置的含义。首先,我们来看一下web.xml文件最外层的web-app标签:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    version="3.1">

这是web.xml的头部声明,xmlns是命名空间的意思,其中的version是应用程序实现Servlet规范的版本,默认情况下,Java EE与Servlet版本对应关系如下:

Java EE Servlet版本
Java EE 8 XML schema Servlet 4.0
Java EE 7 XML schema Servlet 3.1
Java EE 6 XML schema Servlet 3.0
Java EE 5 XML schema Servlet 2.5
Java EE 1.4 XML schema Servlet 2.4

  再往前的版本就太老了,不用关注了。当然我们可以修改默认的version,但修改的时候记得注意对应schema的版本,不要出现兼容问题。
  而xsi:schemaLocation属性前面已经说过,该属性的使用格式为:xsi:schemaLocation="namespaceURI1 schemaURI1 namespaceURI2 schemaURI2 ...",这里是说使用schemaURI1所对应的schema文件,校验命名空间namespaceURI1下的元素是否符合XML语法规范,后面的则是以此类推。

1. icon标签

icon标签,配置的是Web应用图标,指出IDE和GUI工具用来表示Web应用的大图标和小图标文件:

<icon>
     <small-icon>/static/image/small.png</small-icon>
     <large-icon>/static/image/big.png</large-icon>
</icon>
2. description标签

description标签是用于描述该web项目的功能,特性等。

<description>测试Spring MVC的项目</description>
3. display-name标签

该web项目的应用名称。

<display-name>SpringMVC-Test</display-name>
5. context-param标签

context-param标签是web.xml中用于配置应用于整个web项目的​上下文,包含了三个参数。

  • description 描述信息;
  • param-name 设定上下文的参数名称,是唯一的;
  • param-value设定参数名称的值,如果配置多个xml文件,使用逗号分隔,也可以使用如applicationContext-*.xml类似的通配符。

在Spring中配置如下:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

  而在servlet中可以通过如下方式得到:getServletContext().getInitParameter("context/param")。在web.xml中context-param标签并不是必须存在的,如果不存在,则默认是contextConfigLocation,而参数value则默认是/WEB-INF/applicationContext.xml
  而在web.xml中,如果是配置spring,则必须要有listener标签。

6. listener标签

listener标签是为web程序定义的监听器,用来监听各种事件,比如application和session事件,所有的监听器按照相同的方式定义,功能取决于它们各自实现的接口,常用的Web事件接口有如下几个:

  • ServletContextListener:用于监听Web应用的启动和关闭;
  • ServletContextAttributeListener:用于监听ServletContext范围(application)内属性的改变;
  • ServletRequestListener:用于监听用户的请求;
  • ServletRequestAttributeListener:用于监听ServletRequest范围(request)内属性的改变;
  • HttpSessionListener:用于监听用户session的开始和结束;
  • HttpSessionAttributeListener:用于监听HttpSession范围(session)内属性的改变。

配置Listener只要向Web应用注册Listener实现类即可,无序配置参数之类的东西,因为Listener获取的是Web应用ServletContext(application)的配置参数。配置如下:

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

在Spring3.0之前或许还有使用ContextLoaderServlet来配置listener的,不过3.0版本之后已经删除了,目前只有通过ContextLoaderListener的方式来配置。

7. servlet标签

servlet标签配置的即是servlet,用于处理客户端过来的HTTP接口的请求及响应,<servlet>标签和<servlet-mapping>标签配套出现。我们拿Spring MVC的配置来看下:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

使用SpringMVC,首先要配置DispatcherServlet,DispatcherServlet是前置控制器,用于拦截匹配的请求,然后根据我们配置的相应规则,分发到相应的Controller来处理。
servlet标签的属性大致如下:

  1. servlet-name:servlet的名称;
  2. servlet-class:servlet所对应类的名称,我们这里是DispatcherServlet;
  3. init-param:用于初始化传递给servlet的参数,类似于局部化的context-param节点,而访问的话通过ServletConfig对象来完成,方法是getInitParamenter。ServletConfig获取配置参数的方法和ServletContext获取配置参数的方法完全一样,只是ServletConfig是取得当前Servlet的配置参数,而ServletContext是获取整个Web应用的配置参数。
  1. 对于init-param节点下的param-value,其实有多种写法;
     a. 如果不写,使用默认值:/WEB-INF/<servlet-name>-servlet.xml
     b. 配置为:/WEB-INF/classes/dispatcher-servlet.xml
     c. 配置为:classpath*:dispatcher-servlet.xml
     d. 同样,多个值使用逗号进行分割;
  1. load-on-startup:启动顺序配置,也就是web应用程序加载该servlet的顺序,是一个整数。

Web容器加载servlet实例的时机一般分两种情况:

  • 客户端第一次请求到该servlet的时候加载,一般情况下大部分servlet都是这种情况。
  • Web应用程序启动时立即加载servlet实例,也就是load-on-start Servlet

如果该属性的值是正数或者0时,Web容器先加载数值小的,再加载数值大的;如果没有配置该属性,或该属性是负数时,Web容器将会在客户端首次访问到的时候才加载。

  1. servlet-mapping:用于指定servlet的URL的路径,包含两个参数:servlet-name,也就是我们上面配置的servlet的name,url-pattern,该servlet对应的URL;
  1. 上面我们配置了SpringMVC的servlet,但我们的url-pattern处理的是所有的URL,如果我们要过滤掉一些静态文件,比如.jpg.js等,我们就可以再写一个servlet来处理。其实,对静态文件的拦截有好几种方式,改天我们再仔细谈这个问题。
8. session-config标签

session-config,用于会话的超时配置,单位分钟;

<session-config>
    <session-timeout>60</session-timeout>
</session-config>
9. filter标签

filter是过滤器的意思,所谓的过滤,就是对请求未进入servlet之前进行预处理,或在请求结束返回给前端之间进行后处理的过程。filter和servlet有点像,配置都差不多,但也不太一样,根本原因就是servlet的目的是处理请求,而filter的目的是拦截和过滤请求。比如我们来看下编码过滤:

<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>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

比如我们配置了Spring的编码过滤器,可以解决我们项目中可能会出现的乱码问题。

10. welcome-file-list标签

用于指定Web应用程序的欢迎页面:

<welcome-file-list>
    <welcome-file>/welcome.jsp</welcome-file>
</welcome-file-list>
11. error-page标签

用来配置错误情况下的跳转页面,有两种方式,一种是按照错误码来配置,另一种是按照异常类型来配置。
按照错误码来配置跳转页面,当系统发生404错误时,跳转至该页面:

<error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
</error-page>

按照异常类型来配置跳转页面,当系统出现空指针异常时,跳转至该页面:

<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/error/500.html</location>
</error-page>
12. mime-mapping标签

  服务器一般都具有一种让Web网站将文件扩展名与媒体相关联的方法。例如,将会自动给予名为mom.jpg的文件一个image/jpeg的 MIME 类型。但是,假如你的Web应用具有几个不寻常的文件,你希望保证它们在下载或发送给客户端时分配为某种MIME类型。而mime-mapping标签正是用于这种用途,其中extension属性表示扩展名,而mime-type属性则为MIME类型。

<mime-mapping>  
    <extension>pdf</extension>  
    <mime-type>application/pdf</mime-type>  
</mime-mapping>  

比如有的时候我们可能会遇到这种情况,在浏览器下载doc文件,下载完成然后直接打开有时候会是乱码,下载后的文件类型可能不是doc类型。这种情况,我们就可以通过配置mime-mapping标签,将mime类型映射到扩展名,用于规定下载的格式,比如:

<mime-mapping>
    <extension>ppt</extension>
    <mime-type>application/vnd.ms-powerpoint</mime-type>
</mime-mapping>

<mime-mapping>
    <extension>doc</extension>
    <mime-type>application/vnd.ms-word</mime-type>
</mime-mapping>
13. 其他标签

目前常用的标签我们基本上都分析过了,剩下的基本上是不太常用的,等我们用到的时候再学习不迟。

三、加载顺序

web项目在启动的时候,会先加载web.xml的配置文件,来完成项目启动配置项的解析。所以接下来我们来了解下web.xml文件启动的时候的加载顺序。

  1. 容器在解析web.xml时,首先会去读取<context-param>`,提供应用程序上下文信息;
  2. 然后会加载<listener>节点,该节点会用到上下文的信息;
  3. 然后会加载拦截器节点<filter>,如果有多个拦截器,则是按照拦截器配置的顺序来进行调用的;
  4. 然后才会加载对应的<servlet>节点;

也就是说,web.xml中的加载顺序是:context-param -> listener -> filter > servlet;而同类型之间的加载顺序则是根据配置的顺序来进行加载的。所以我们配置的时候,需要注意下同类型标签的配置顺序;

四、web.xml零配置

  其实,Spring到目前的最新版本5.0,而对应servlet的版本也已经到4.0了,功能已经特别强大了。早在许久之前,就支持servlet,listener,servlet等不必配置在web.xml中,并且可以完全做到零配置。因为Spring框架提供了类似WebApplicationInitializer接口来完成web.xml中各项配置的注册等。

  使用注解代替繁杂的XML配置,也遵循了约定优于配置的思想,可以很大程度上提高我们的编程体验。目前很主流的Spring boot框架,基本上都是很少的配置,就可以开发一个完整的Spring MVC程序,等接下来有时间的时候我们再仔细来学习下Spring Boot。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容