SpringMVC

一 引言

Spring MVC是Sping框架中的一个重要内容,是一个典型的MVC框架,轻量级框架,提供控制器,解决原来MVC控制器中的问题。地位和功能等同于Struts2。或者说就是用来替换Struts2的。

SpringMVC的好处和功能:

  • 和Sping的集合非常简单
  • 获取client数据
  • 调用业务类方法,实现功能
  • 根据结果进行跳转

SpingMVC和Struts2的区别

  • SpringMVC是轻量级的MVC框架,Struts2中重量级(SQLSessionFactory)
  • SpringMVC的运行为单例,Struts2为多例
  • SpingMVC没有值栈的概念,Struts2使用值栈传数据,占内存
  • SpingMVC没有自动解决乱码,Struts2自动解决了post方式utf-8乱码
  • 接受参数方式不同
  • 跳转方式不同
  • 传递数据方式方便
  • 与Spring整合方便

二 SpringMVC的工作流程

SpringMVC是Spring中的模块,实现了MVC设计模式的web框架

因为SpringMVC是替换Struts控制器的,所以需要在web.xml中替换Struts2的核心过滤器。

web.xml进行配置如下:

<!-- mvc前端控制器-->
<servlet>
	<servlet-name>mvc</servlet-name>
    <servlet-class>xxxxx.DispatcherServlet</servlet-class>
    <init-param>
    	<param-name>contextConfigLocation</param-name>
        <param-value>classpath:/spring.mvc</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>mvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<!-- SpringMVC没有解决post乱码,需要手动配置编码过滤器解决-->
<filter>
	<filter-name>endcoding</filter-name>
    <filter-class>xxx.CharacterEncodingFilter</filter-class>
    <init-param>
    	<param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
	<filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
  1. 首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet)
  2. 前端控制器根据用户的url,请求处理器映射器(RequestMappingHandlerMapping)查找匹配该url的handler,并返回一个执行链
  3. 前端控制器再请求处理器适配器调,调用相应的handler进行处理并返回给前端控制器一个ModelAndView ,前端控制器在视图解析器 中对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。
  4. DispatcherServlet作为SpringMVC的前端控制器,复制接收用户的请求并根据用户的请求返回相应的视图给用户。

Springmvc.xml配置SpringMVC的核心:请求处理器和视图解析器

<!-- 注解包扫描 -->
<context:component-scan base-package="xxxx.contorller" use-default-filters="false">
	<context:include-filter type="annotation" expression="xxxx.Contorller"/>
</context:component-scan>
<!-- 请求处理器 把下面映射器和适配器二合一 可替换下面两个  -->
<mvc:annocation-driven/>
<!-- 请求处理器--映射器 -->
<bean class="xxxx.RequestMappingHandlerMapping"/>
<!-- 请求处理器--适配器-->
<bean class="xxxx.RequestMappingHandlerAdapter"/>
<!-- 视图解析器-->
<bean class="xxx.InternalResourceViewResolver">
	<property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
</bean>
<!-- 静态资源 -->
<mvc:default-servlet-handler/>

1、用户发送请求至前端控制器DispatcherServlet 
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。 
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 
4、DispatcherServlet调用HandlerAdapter处理器适配器 
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。 
6、Controller执行完成返回ModelAndView 
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器 
9、ViewReslover解析后返回具体View 
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。 
11、DispatcherServlet响应用户

三 Spring MVC 跳转

SpringMVC跳转分为从controller到jsp,和controller 到controller

从controller跳转到jsp时,默认跳转方式为forward

return "redirect:/xxxx/xxx.jsp"
return "forward:/xxx/xx.jsp"

从controller跳转到controller

return "redirect:/xxxx/xxx.do"
return "forward:/xxx/xx.do"

当使用forword或者redirect关键字时,视图解析器的路径将不会起作用,需要写出完整的路径

四 接收参数

SpringMVC收集参数,既是使用Controller方法的参数列表来收参,因为Controller为单例模式,所以不能使用Struts2以实例变量进行手机参数,所以使用参数列表(局部变量)来收集参数。

  • 零散参数:方法的参数名必须和表单元素名/请求参数名一致;
  • 对象方式:表单参数名或请求参数名是对象的属性名(调用对象的set方法)
  • 数组、集合方式:复选框之类的参数

SpringMVC中的默认日期格式为:yyyy/MM/dd ;为了格式化日期可以在参数或者实体类的属性上:@DateTimeFormat(pattern=”yyyy-MM-dd”)

五 传递参数

SpringMVC没有值栈的概念,所以不能用OGNL表达式,可使用JSTL(Jsp standard tag library).传递数据的范围分为:request和session

request范围:HttpServletRequest、Model、ModelMap

model.addAttribute("key","value");modelMap.addAttribute("key","value")

session范围:HttpSession

六 文件上传下载

七 拦截器

将控制器中的冗余代码(通用功能)提取出来,放在拦截器里完成(在请求到达action程序之前或者响应离开框架之前执行),等价于servlet里的过滤器。
拦截器是双向拦截(拦截request , 拦截response),只会拦截action请求,不会拦截jsp

<!-- 在SpringMVC.xml 中配置拦截器-->
<mvc:interceptors>
	<mvc:interceptor>
	      <!-- 拦截-->
              <mvc:mapping path="/per/**" />
              <!-- 不拦截-->
	      <mvc:exclude-mapping path="/head/*" />
	      <bean class="com.mvc.inter.LoginInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>

八 全局异常拦截

九 JSON处理