简介
SpringMVC的web.xml文件的简单介绍
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
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>practice-manager-web</display-name>
首页(默认展示的首页):
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
-->
<!--配置 DispatcherServlet(即配置servlet,可配置多个servlet,但一般不这么做)-->
<servlet>
<!--DispatcherServlet的名字,要与下面的<servlet-name>的名字相同(<servlet-mapping>) -->
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数,即让容器找到springMVC的配置文件,可以不配置contextConfigLocation
使用默认的的配置文件为: /WEB-INF/<servlet-name>-servlet.xml,因为使用了默认,肯定也有默认路径,
新建的文件也要放在 /WEB-INF/文件夹下!!
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 优先启动此servlet(必须是整数,
小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
当值相同时,容器就会自己选择顺序来加载。整数值越小越优先,
即启动的时候就加载DispatcherServlet,且优先级为1)
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>/example/*</url-pattern>
</servlet-mapping>
<!-- 以上配置的意思是:
所有路径以 /example 开头的请求都会被名字为 example 的 DispatcherServlet 处理。
流程:
路径以/example 开头的请求被拦截,然后根据<servlet-name>找到其配置的servlet,
获取配置文件,并初始化(<init-param> )
-->
<!-- spring核心(加载spring的配置文件) <context-param>和<init-param>下面有补充
listener标签中的类获取<context-param>中配置的文件信息。-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置过滤器 -->
<!-- 设置字符编码方式-->
<filter>
<filter-name>setcharacter</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>setcharacter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
init-param标签 和 context-param的区别:
(1)application范围内的参数,存放在servletcontext中,
(2)servlet范围内的参数,只能在servlet的init()方法中取得。
DispatcherServlet 的处理流程:
配置好 DispatcherServlet 以后,开始有请求会经过这个 DispatcherServlet 。此时, DispatcherServlet 会依照以下的次序对请求进行处理:
(1)首先,搜索应用的 上下文对象 WebApplicationContext 并把它作为一个属性(attribute)绑定到该请求上,以便控制器和其他组件能够使用它。属性的键名默认为 DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE;
(2)将地区(locale)解析器绑定到请求上,以便 其他组件在处理请求(渲染视图、准备数据等)时可以获取区域相关的信息。如果你的应用不需要解析区域相关的信息,忽略它即可。
(3)将主题(theme)解析器绑定到请求上,以便其他组件(比如视图等)能够了解要渲染哪个主题文件。同样,如果你不需要使用主题相关的特性,忽略它即可;
(4) 如果你配置了multipart文件处理器,那么框架将查找该文件是不是multipart(分为多个部分连续上传)的。若是,则将该请求包装成一个MultipartHttpServletRequest 对象,以便处理链中的其他组件对它做进一步的处理。关于Spring对multipart文件传输处理的支持,读者可以参考21.10 Spring的multipart(文件上传)支持一小节;
(5)为该请求查找一个合适的处理器。如果可以找到对应的处理器,则与该处理器关联的整条执行链(前处理器、后处理器、控制器等)都会被执行,以完成相应模型的准备或视图的渲染;
(6)如果处理器返回的是一个模型(model),那么框架将渲染相应的视图。若没有返回任何模型(可能是因为前后的处理器出于某些原因拦截了请求等,比如,安全问题),则框架不会渲染任何视图,此时认为对请求的处理可能已经由处理链完成了。
filter和Interceptor的区别
- Filter是基于函数回调的,而Interceptor则是基于Java反射的。
- Filter依赖于Servlet容器,而Interceptor不依赖于Servlet容器。
- Filter对几乎所有的请求起作用,而Interceptor只能对action请求起作用。
- Interceptor可以访问Action的上下文,值栈里的对象,而Filter不能。
- 在action的生命周期里,Interceptor可以被多次调用,而Filter只能在容器初始化时调用一次。