我们所创建的web项目,通常都有一个web.xml的配置文件,这个文件并不是必须存在的。
web中我们需要加载对数据库的支持(提供数据)和servlet的支持(请求返回响应信息),也是web不可缺少的一部分。
web的执行:
当web项目启动时,会去读取web.xml的文件。
首先读取<context-param>节点,他是用来转换键值对的。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
然后,容器会创建一个servletContext(servlet的上下文),然后web项目会共享整个上下文。
再解释一下上下文的意思:servlet的上下文是一个全局的存储信息的空间,服务器启动的时候创建,服务器关闭就释放。从个人理解,当context-param获取到web项目需要的内容信息后,放入servletContext这个全局存储空间,分享到web的整个项目,供用户使用时web项目提取相应的信息。那为什么要用servletContext呢?例如,当用户提取数据库信息时,我们把信息存入session,每次用户访问都要去访问数据库,效率很慢,所以放入servletContext,直接在上下文中提取信息就行。
其次是listener, filter,他们的初始化会用到servletContext(servlet上下文)中的信息。
<!-- 用来实例化spring容器的监听器 listener -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
filter过滤器,可以阻止url请求,过滤url请求,当请求符合要求时才会批准请求,进行响应。
用户在访问某个目标资源之前,对访问的请求和响应进行拦截,做一些处理,然后再调用目标程序,这样做的好处是可以对一些公共的操作进行抽象,就拿设置字符集来说,如果不使用这种方式,我们每个页面都要写设置字符集的语句。不但麻烦而且维护困难,但是如果使用filter的话,只需要添加一个类,在 xml中配置一下,如果不想使用了,将配置文件中的内容去除即可。
<!-- 对于某类配置节而言,与它们出现的顺序是有关的 -->
<!-- filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。
web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,
filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的 -->
<filter>
<filter-name>SpringEncodingFilter</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>SpringEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后是servlet
servlet只有在web.xml中配置了,程序才能加载并执行servlet代码
<servlet>
<servlet-name>mybatis</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mybatis-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
注意:load-on-startup:标记容器是否在启动的时候就加载这个servlet。
当值为0或者大于0时,表示容器在应用启动时就加载这个servlet;
当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载。
正数的值越小,启动该servlet的优先级越高。
小结:web.xml的执行顺序
context-param –> listener –> filter –> servlet