dispatcherservlet负责把请求分发到各个控制器,另外它还提供了一些另外一些web开发功能。Springmvc与ioc容器无缝集成,所以Spring提供的任何特性它都支持。
下图是servlet工作流程
image.png
1. 配置dispatcherservlet
dispatcherservlet其实就是个servlet,需要在web.xml中声明,并且把需要处理的请求,映射到URL上。
<!-- springMVC的配置 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-mvc/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
上面代码配置了所有的URL的请求都将交由SpringMVC处理。
2. 配置其他的bean
dispatcherservlet在初始化的过程中会寻找配置的路径下的servlet-context.xml(如果没有配置路径,默认寻找web-inf路径下的[servlet-name]-servlet.xml)并初始化xml文件中的bean。
如果不配置任何bean,dispatcherservlet也会持有一个webapplicationcontext对象。
需要配置工作的bean列表如下:
bean | 作用 |
---|---|
handlermapping | 处理器映射。根据某些规则将进入容器的请求映射到具体的处理器以及处理拦截器上 |
handleradapter | 处理适配器。拿到请求对应的处理器后,适配器将负责调用处理器。可能就是找具体方法的意思 |
HandlerExceptionResolver | 处理器异常解析器。 |
ViewResolver | 视图解析器。他负责将一个代表逻辑视图名的字符串映射到 视图view上 |
LocaleResolver & LocaleContextResolver | 地区解析器 和 地区上下文解析器。它们负责解析客户端所在的地区信息甚至时区信息,为国际化的视图定制提供了支持。 |
ThemeResolver | 主题解析器。它负责解析你web应用中可用的主题,比如,提供一些个性化定制的布局等。 |
MultipartResolver | 解析multi-part的传输请求,比如支持通过HTML表单进行的文件上传等。 |
FlashMapManager | FlashMap管理器。它能够存储并取回两次请求之间的FlashMap对象。后者可用于在请求之间传递数据,通常是在请求重定向的情境下使用 |
3. 这些bean的工作顺序
- 首先将webapplicationcontext将一个属性绑定到请求上
- 将地区(locale)解析器绑定到请求上
- 将主题(theme)解析器绑定到请求上
- 处理multipart文件处理器
- 为该请求查找一个合适的处理器
- 如果处理器返回的是一个模型(model),那么框架将渲染相应的视图。若没有返回任何模型(可能是因为前后的处理器出于某些原因拦截了请求等,比如,安全问题),则框架不会渲染任何视图,此时认为对请求的处理可能已经由处理链完成了
4. dispatcherservlet的定制
可自定义三个属性,通过init-param属性
- contextClass 定义实现WebApplicationContext的类,默认为XmlWebApplicationContext对象
- contextConfigLocation 配置文件的路径,可以配置多个路径,拿逗号隔开
- namespace WebApplicationContext的命名空间。默认是[servlet-name]-servlet