核心架构的具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、 DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
1、 前端控制器DispatcherServlet;
2、 HandlerMapping
3、 HandlerAdapter
4、 ViewResolver
5、 处理器/页面控制器
6、 视图
配置DispatcherServlet
DispatcherServlet是SpringMVC的核心,将下面Servlet的注册信息登记在web.xml中。
初始化 DispatcherServlet 时,该框架在 web 应用程序WEB-INF 目录中寻找一个名为[servlet-名称]-servlet.xml的文件,并在那里定义相关的Beans,重写在全局中定义的任何Beans,像上面的web.xml中的代码,对应的是dispatcher-servlet.xml;当然也可以使用<init-param>元素,手动指定配置文件的路径; load-on-startup:表示启动容器时初始化该Servlet; url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。
- <servlet>
- <servlet-name>Dispatcher</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <description>加载/WEB-INF/spring-mvc/目录下的所有XML作为Spring MVC的配置文件</description>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/spring-mvc/*.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>Dispatcher</servlet-name>
- <url-pattern>"/"/"*.do"/"*.html"</url-pattern>
- </servlet-mapping>
[servlet-名称]-servlet.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:mvc=
"http://www.springframework.org/schema/mvc"
xmlns:p=
"http://www.springframework.org/schema/p"
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-3.0.xsd
http:
//www.springframework.org/schema/context
http:
//www.springframework.org/schema/context/spring-context-3.0.xsd
http:
//www.springframework.org/schema/aop
http:
//www.springframework.org/schema/aop/spring-aop-3.0.xsd
http:
//www.springframework.org/schema/tx
http:
//www.springframework.org/schema/tx/spring-tx-3.0.xsd
http:
//www.springframework.org/schema/mvc
http:
//www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http:
//www.springframework.org/schema/context
http:
//www.springframework.org/schema/context/spring-context-3.0.xsd">
<!--
使Spring支持自动检测组件,如注解的Controller
<context:component-scan base-package=
"com.minx.crm.web.controller"
/>
<context:annotation-config />
<!-- 把标记了@Controller注解的类转换为bean -->
<context:component-scan base-package="test.controller" />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
-->
<bean id=
"viewResolver"
class
=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix=
"/WEB-INF/jsp/"
p:suffix=
".jsp"
/>
</beans>
InternalResourceViewResolver在ModelAndView返回的视图名前加上prefix属性配置的前缀,再在最后加上suffix属性配置的后缀。由于HelloController返回的ModelAndView中视图名为welcome,所以InternalResourceViewResolver将在/WEB-INF/jsp/welcome.jsp处查找视图。
1、BeanNameUrlHandlerMapping
这是Dispatcher Servlet的默认的HandlerMapping,所以在应用上下文配置文件中简单地用“Url样式”来定义一个控制器Bean的名字,就可以告诉Dispatcher Servlet什么样式的请求应该由哪个控制器去处理,而不用显式地定义一个HandlerMapping。(私下说一句,这样做虽然简单,但这样用URL样式定义出来的ControllerBean,其名字显得古怪,因为这个名字同时也是Controller Bean的实例名)
例:若控制器ListCoursesController的URL样式是“listCourses.go”,则
<bean name="/listCourses.go"
class="com.w3cs.vlar.ListCoursesController">
<property name="couseService">
<ref bean="courceService"/>
</property>
</bean>
当然,也可以在定义这个控制器Bean之前,显式地声明你所用的HandlerMapping,显式定义如下:
<bean id="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
2、SimpleUrlHandlerMapping
这种方式不同于BeanNameUrlHandlerMapping,SimpleUrlHandlerMapping不需定义Controller Bean的名字,而是直接把URL映射到控制器。
由于SimpleUrlHandlerMapping不是Dispatcher Servlet默认的HandlerMapping,所以这个HandlerMapping必须得显式定义。
下面定义了一个ID为“SimpleUrl”的HandlerMapping Bean:
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/listCourses.go">listCoursesController</prop>
<prop key="/login.go">loginController</prop>
</props>
</property>
</bean>
3.默认HandlerMapping
默认执行Class名称 如:这里有一个CoursesController 那么/courses 就会调用这个Controller 多方法的为/courses/方法名
配置一个视图解析器将控制器与JSP结合起来。
将解析器的配置片段加到上面的test-servlet.xml中。
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
InternalResourceViewResolver在ModelAndView返回的视图名前加上prefix属性配置的前缀,再在最后加上suffix属性配置的后缀。由于HelloController返回的ModelAndView中视图名为welcome,所以InternalResourceViewResolver将在/WEB-INF/jsp/welcome.jsp处查找视图。
(1) url和动作(后端控制器)的映射。
springMVC里有个映射处理器(HandlerMapping)的概念。它实际上是一个处理器映射Bean,用来将一个控制器指定到一个URL上。Spring提供了三种有用的HandlerMapping的实现:
—— BeanNameUrlHandlerMapping
根据控制器的名字将控制器映射到URL
—— SimpleUrlHandlerMapping
用上下文配置文件中定义的属性集合将控制器映射到URL
—— CommonsPathMapHandlerMapping
使用控制器代码中的元数据将控制器映射到URL
(2) 逻辑视图名和视图对象的映射。
springMVC里还有个视图解析器(ViewResolver)的概念。它决定了ModelAndView对象的逻辑视图名如何解析成一个用于将结果渲染给用户的视图Bean..Spring有四种ViewResolver实现:
—— InternalResourceViewResolver
将逻辑视图名解析成一个用模板文件(如JSP和Velocity模板)渲染的视图对象
—— BeanNameViewResolver
将逻辑视图名解析成一个DispatcherServlet应用上下文中的视图Bean
—— ResourceBundleViewResolver
将逻辑视图名解析成一个ResourceBundler中的视图对象
—— XmlViewResolver
从一个XML文件中解析视图Bean,这个文件是从DispatcherServlet应用上下文中分离出来的。
Annotation注释
@Controller:
用于标识是处理器类;
@RequestMapping:
请求到处理器功能方法的映射规则;
@RequestParam:
请求参数到处理器功能处理方法的方法参数上的绑定;
@ModelAttribute:
请求参数到命令对象的绑定;
@SessionAttributes:
用于声明session级别存储的属性,放置在处理器类上,通常列出模型属性(如@ModelAttribute)对应的名称,则这些属性会透明的保存到session中;
@InitBinder:
自定义数据绑定注册支持,用于将请求参数转换到命令对象属性的对应类型;
RESTful架构风格支持(通过@PathVariable注解和一些其他特性支持),且又引入了更多的注解支持:
@CookieValue:
cookie数据到处理器功能处理方法的方法参数上的绑定;
@RequestHeader:
请求头(header)数据到处理器功能处理方法的方法参数上的绑定;
@RequestBody:
请求的body体的绑定(通过HttpMessageConverter进行类型转换);
@ResponseBody:
处理器功能处理方法的返回值作为响应体(通过HttpMessageConverter进行类型转换);
@ResponseStatus:
定义处理器功能处理方法/异常处理器返回的状态码和原因;
@ExceptionHandler:
注解式声明异常处理器;
@PathVariable:
请求URI中的模板变量部分到处理器功能处理方法的方法参数上的绑定,从而支持RESTful架构风格的URI;
POST中文乱码解决方案
spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题,具体配置如下:
- <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>
以后我们项目及所有页面的编码均为UTF-8。