web.xml配置和spring加载机制

1.背景介绍

每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗?

web.xml文件是用来初始化web应用的配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。

这是网上面高票的答案,对web.xml的功能叙述的很简洁、明了,但是总感觉差了点什么

换一个思路,其实可以拿web.xml和maven的pom.xml相对比来理解;

maven的pom文件是我们比较熟悉的:

pom文件的主要功能 项目构建,版本控制,库依赖,插件配置,我们想在大概用到的功能就这么四个

但这些功能是怎么形成:

因为在项目管理中,项目的开发、测试、文档生成、报表和部署,都具有一些共同的特征,这些特征就可以认为是软件开发过程中的一些最佳实践,当这些最佳实践成为共识,开发的协作必然会更加高效。

那么Maven要做的就是把这些最佳实践固化成一个通用的项目管理方法。尽管对于不同的项目,开发中各个阶段会有所不同,但是确实可以找到一条普遍适用的路径,Maven将这条路径以非常清晰的方式结合各种实践模式提供给开发者。

web.xml虽然和pom.xml的功能不同,但他们的理念是相通的,即把我们web项目中最佳实践固化成一个通用的管理方法,web.xml主要配置,也就是我们web项目开发过程中的需要的东西。

一般在我们的web应用中有几个web.xml?

一般来说我们的web应用中会存在一个web容器自带的web.xml,当我们在项目中没有配置的时候,会默认使用

2.知识剖析  web.xml配置元素详解

schema

每个xml文件都有定义它书写规则的Schema文件,也就是说javaEE的定义web.xml所对应的xml Schema文件中定义了多少种标签元素,web.xml中就可以出现它所定义的标签元素,也就具备哪些特定的功能。web.xml的模式文件是由Sun 公司定义的,每个web.xml文件的根元素为<web-app>中,必须标明这个web.xml使用的是哪个模式文件

context-param
web应用即ServletContext对象(jsp的隐式对象application) 
<url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,*.jsp,*.js和*.html等)

上下文参数,我们可以把它称为整个web应用的全局变量,在配置是时候我们经常被listener初始化的时候调用,实际上全局变量可以被整个web应用中组件调用

listener

Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。 

除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

Filter

Filter就像一个一个哨卡,用户的请求需要经过Filter,并且可以有多个过滤器,在项目中我们实现javax.servlet.Filter的接口,对请求进行处理

Servlet配置.

session-config>会话超时配置(单位为分钟)

mime-mappingMIME类型配置,请求的特殊文件类型

error-page配置错误页面

error-code 404通过错误码来配置error-page

exception-type java.lang.NullException通过异常的类型配置error-page

各元素加载顺序与它们在 web.xml 文件中的先后顺序有关吗?

节点元素的加载顺序只和Tomcat的初始化流程有关context-param -> listener -> filter -> servlet

对于某类配置节而言,与它们出现的顺序是有关的,比如监听器

spring加载流程

ServletContext,是一个全局的储存信息的空间,服务器启动之后,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个。所以,为了节省空间,提高效率,ServletContext中,要放必须的、重要的、所有用户需要共享的线程又是安全的一些信息。

以Tomcat作为Servlet容器为例,下面是具体的步骤:

 1.Tomcat 启动时需要从web.xml中读取启动参数,在web.xml中我们需要对ContextLoaderListener进行配置,对于在web应用启动入口是在ContextLoaderListener中的初始化部分;从Spring MVC上看,实际上在web容器中维护了一系列的IOC容器,其中在ContextLoader中载入的IOC容器作为根上下文而存在于 ServletContext中。

 2.完成对ContextLoaderListener的初始化以后,Tomcat开始初始化DispatchServlet。DispatcherServlet会建立自己的ApplicationContext

 3. 然后就是DispatchServlet中对Spring MVC的配置过程,首先对配置文件中的定义元素进行配置 - 请注意这个时候我们的WebApplicationContext已经建立起来了,也意味着DispatcherServlet有自己的定义资源,可以需要从web.xml中读取bean的配置信息,通常我们会使用单独的xml文件来配置MVC中各个要素定义,这里和web容器相关的加载过程实际上已经完成了。

3.常见问题

web.xml中url-pattern中/和/*的区别

<url-pattern>/</url-pattern>  会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url

猜你喜欢

转载自blog.csdn.net/qiaobao2018/article/details/80378683
今日推荐