SpringMVC架构
- 用户发送请求至前端控制器DispatcherServlet,前端控制器收到请求后调用HandlerMapping处理器映射器。
- HandlerMapping把请求映射为HandlerExecutionChain对象,包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器,一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器。
- 执行处理器(Controller,后端控制器),返回执行结果,封装在ModelAndView中。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器,ViewResolver将把逻辑视图名解析为具体View,通过这种策略模式,容易更换其它视图技术。
- ViewReslover解析后返回具体View。
- DispatcherServlet对View进行渲染视图(即将对象模型的数据填充至视图中)。此处的Model实际是一个Map数据结构,因此容易支持其它视图技术。
- DispatcherServlet将结果响应给用户。
中央控制器
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,主要负责职责的分派。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定配置文件位置,默认/WEB-INF/*-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 指定Spring Web MVC处理的请求,例如设置 *.do 或 *.action 等 -->
<!-- 设置 / 使用Restful风格,需要在springmvc.xml中排除静态资源处理 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherServlet默认配置在DispatcherServlet.properties中,当Spring配置文件中未指定配置时使用默认策略。
DispatcherServlet主要用于职责调度工作,本身主要用于控制流程,主要职责如下:
- 文件上传解析,若请求类型是multipart,则通过MultipartResolver进行文件上传解析;
- 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,包括一个处理器、多个HandlerInterceptor拦截器);
- 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
- 通过ViewResolver解析逻辑视图名到具体视图实现;
- 本地化解析;
- 渲染具体视图;
- 若执行过程中遇到异常将交给HandlerExceptionResolver解析。
<url-pattern>/</url-pattern>
仅替换servlet容器的默认内置servlet,用于处理所有与其他注册的servlet不匹配的请求,即静态资源的访问交给该servlet处理,而jsp交给servlet容器内置的JSP servlet处理。
<url-pattern>/*</url-pattern>
覆盖其它所有servlet,包括servlet容器提供的所有servlet,如缺省servlet和JSP servlet。所有请求均在该servlet拦截处理。不推荐使用该方式。
配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 注解式处理器映射器与注解式处理器适配器 -->
<mvc:annotation-driven/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>
<!-- 包扫描 -->
<context:component-scan base-package="controller包名"/>
<!-- 排除静态资源处理,将静态资源处理交给服务器自动解决 -->
<mvc:default-servlet-handler/>
</beans>
web.xml
<!-- Spring配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 启动Spring容器监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 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:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 字符集过滤器 -->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
网友评论