1.SpringMVC介绍
SpringMVC是一种基于Spring实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,使用了MVC的架构模式思想,为简化日常开发,提供了很大便利
2.SpringMvc架构
架构流程
1.用户发送请求到前端控制器DispatcherServlet
2.DispatcherServlet收到请求掉用HandlerMapping处理器映射器。
3.处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4.DispatcherServlet通过HandlerAdapter处理器适配器掉用处理器。
5.执行处理器(Controller也叫后端控制器)
6.Controller执行完成返回ModelAndView
7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体的View
10.DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)
11.DispatcherServlet响应用户
组件说明:
DispatcherServlet前端控制器
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请 求,dispatcherServlet的存在降低了组件之间的耦合性。
DispathcerServlet作为springmvc的*调度器存在,DispatcherServlet创建时会默认从DispatcherServlet.properties文件加载 springmvc所用的各各组件,如果在springmvc.xml中配置了组件则以springmvc.xml中配置的为准,DispatcherServlet的存在降低了 springmvc各各组件之间的耦合度
HandlerMapping处理器映射器
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方 式,实现接口方式,注解方式等。
HandlerMapping 负责根据request请求找到对应的Handler处理器及Interceptor拦截器,将它们封装在HandlerExecutionChain 对象中 给前端控制器返回。
BeanNameUrlHandlerMapping:BeanNameUrl处理器映射器,根据请求的url与spring容器中定义的bean的name进行匹配,从而从 spring容器中找到bean实例。
SimpleUrlHandlerMapping:simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增强版本,它可以将url和处理器bean的id 进行统一映射配置。
Handler处理器
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。
HandlerAdapter处理器设配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
HandlerAdapter会根据适配器接口对后端控制器进行包装(适配),包装后即可对处理器进行执行,通过扩展处理器适配器可以执行 多种类型的处理器,这里使用了适配器设计模式。
SimpleControllerHandlerAdapter:SimpleControllerHandlerAdapter简单控制器处理器适配器,所有实现了 org.springframework.web.servlet.mvc.Controller接口的Bean通过此适配器进行适配、执行。
HttpRequestHandlerAdapter:HttpRequestHandlerAdapter,http请求处理器适配器,所有实现了 org.springframework.web.HttpRequestHandler接口的Bean通过此适配器进行适配、执行。
View Resolver视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View 视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、 freemarkerView、pdfView等。
注解映射器和适配器
RequestMappingHandlerMapping
注解式处理器映射器,对类中标记@ResquestMapping的方法进行映射,根据ResquestMapping定义的url匹配ResquestMapping标记 的方法,匹配成功返回HandlerMethod对象给前端控制器,HandlerMethod对象中封装url对应的方法Method。
从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映 射。
@RequestMapping定义请求url到处理器功能方法的映射。
RequestMappingHandlerAdapter
注解式处理器适配器,对标记@ResquestMapping的方法进行适配。
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适 配。
<mvc:annotation-driven>
springmvc使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter,可用在 springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
3.springmvc处理流程源码分析
1.用户发送请求到DispatcherServlet前端控制器
2.DispatcherServlet掉用HandlerMapping(处理器映射器)根据url查找Handler
3.DispatcherServlet掉用HandlerAdapter(处理器适配器)对HandlerMapping找到Handler进行包装、执行。HandlerAdapter执行Handler完成 后,返回了一个ModleAndView(Springmvc封装对象)。
DispatherServlet找一个合适的适配器
适配器执行Hanlder
4.DispatherServlet拿着ModelAndView掉用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个view(很多不同视图类型的 view)
视图解析
5.DispatherServlet进行视图渲染,将Model中数据放到request域,在页面展示
将model数据放在request域:
4.SpringMVC常用的注解
1.RequestMapping
URL路径映射,通过RequestMapping注解可以定义不同的处理器映射器规则,属性value的值是数组,可以将多个url映射到同一个方 法。属性method可以限定请求方法,将该注解写到controller类上可以窄化请求映射。
2.@ModelAttribute和@SessionAttributes
该控制器的所有方法在调用前,先执行此@ModelAttribute方法,可用于注解和方法参数中,可以把这个@ModelAttribute特性,应用 在BaseController当中,所有的控制器继承BaseController,即可实现在调用Controller时,先执行@ModelAttribute方法。
@ SessionAttributes 即将值放到session作用域中,写在类上面。
3.@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出URI模板中的变量作为参数。
4.@ReauestParam
主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter(“name”),它有三个常用参数:defaultValue =“0”, required = false,value =“isApp”; defaultValue表示设置默认值,required铜过布尔设置是否是必须要传入的参数,值值表示接受的传入的 参数类型。
5.@ResquestBody
该注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到内容转换为json、xml等格式的数 据并绑定到controller方法的参数上。
6.@ResponseBody
该注解用户将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等通过Response响 应的客户端。
使用该注解需要在xml配置文件中配置json转换器。
--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
</list>
</property>
</bean>
如果使用<mvc:annotation-driven/>则不用定义上边的内容。
5.Springmvc参数绑定
默认支持的参数绑定
处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上。
HttpServletRequest:通过request获取对象请求信息。
HttpServletResponse:通过response处理响应信息。
HttpSession:通过session对象得到session中存放的对象。
Model/ModelMap:ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据。
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>
6.SpringMVC数据回显
简单类型
对于简单数据类型使用Model将出入的参数在放到request域中实现显示。
pojo类型
SpringMvc默认支持pojo数据回显,springmvc自动将形参中的pojo重新放回request域中,request的key为pojo的类名(首字母小写),相当于调用model.addAttribute方 法。如果key不是pojo的类名(首字母小写),可以使用@ModelAttribute完成数据回显。
7.异常处理器
springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理器。
异常处理器思路
系统中异常包括两类:预期异常和运行时异常RuntimeException,前端通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发 生。系统的dao、service、controller、出现通过Throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。
1.自定义异常类
2.自定义异常处理器
3.错误页面
4.异常处理器配置
8.Springmvc中文件上传
1.配置虚拟目录
在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加:<Context docBase="F:\develop\upload\temp" path="/pic" reloadable="false"/>
http://localhost:8080/pic即可访问F:\develop\upload\temp下的图片。
2.配置解析器
3.controller
4.页面
form添加enctype="multipart/form-data":
file的name与controller形参一致
9.RESTful支持
添加DispatcherServlet的rest配置
10.静态资源访问
如果在DispatcherServlet中设置url-pattern为/则必须对静态资源进行访问处理。springmvc的<mvc:resources mapping="" location="">实现对静态资源进行映射访问。
11.拦截器
定义:springmvc中的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。
定义拦截器:实现HandlerInterceptor接口
拦截器配置
针对某种mapping配置拦截器
针对所有mapping配置全局拦截器