SpringMVC执行流程:
客户端发送请求,前端控制器(DispatcherServlet)将请求中的RUI传递给处理器映射器(HandlerMapping,由处理器和拦截器组成),处理器映射器将对应的处理器名字返回给前端控制器.
前端控制器根据处理器映射器返回的控制器名字调用对应的处理器适配器(HandlerAdapter),处理器适配器调用handler()方法,handle方法利用java的反射机制执行Controller的具体方法来获得ModelAndView,Controller将ModelAndView(数据和视图名)返回给处理器适配器,处理器适配器再将其返回给前端控制器.
如果是逻辑视图,则前端控制器会将ModelAndView传递给视图解析器(ViewResolver),视图解析器会根据ModelAndView定位真实视图,并由View将模型渲染到视图中,最终响应请求;
如果是非逻辑视图,则直接由View对视图进行渲染(将模型填充到视图中),最终响应请求.
处理器在要调用控制器之前,需要先获取HTTP发送过来的信息,然后通过消息转换器和格式化器将其转变为控制器的不同类型参数,处理完成后就会进行验证器的验证,最后调用控制器的方法.控制器完成返回结果后,再通过消息转换器将结果进行HTTP转换.
SpringMVC常用注解
@Controller标识为控制器组件.
@RestController相当于@Controller+@ResponseBody
@RequestMapping用于指定请求的映射路径.
@RequestBody用于接收前端传来的JSON格式的数据.默认不允许为空.
@RequestParam用于接收前端传来 不同名称的参数.默认不允许为空
@PathVariable用于接收Rest风格下(Rest风格用URL的形式传递参数)的参数.默认允许为空.
@RequestAttribute用于获取HTTP请求(request)对象中的属性,默认不能为空
@SessionAttribute用于获取HTTP会话(session)对象中的属性,默认不能为空
@CookieValue用于获取Cookie中的信息.默认不能为空
@RequestHeader用于获取HTTP请求头中的信息,默认不能为空
@SessionAttributes用于给HTTP会话(session)对象中设置KV属性.
@ResponseBody用于返回JSON数据.(取消后续的视图渲染过程).
重定向
SpringMVC在返回的字符串带有redirect:的时候,会进行重定向.遇到forward:的时候,会进行请求转发.
如果进行重定向时要传递JSON数据,则会出错,因为HTTP的重定向参数是以字符串传递的.这时候只需要给进行重定向方法加一个RedirectAttribute类型的参数,通过该类的addFlashAttribute方法即可将参数传递.原理是:将数据存入一个只在会话期有效的Session中(重定向完成后就会清除),这样就能传递数据给下一个地址了.
拦截器
配置拦截器,实现接口HandlerInterceptor.
preHandle方法:处理器执行之前调用,返回布尔值,如果为false,则同一个类中的下面两个方法都不执行
postHandle方法:处理器执行之后调用
afterCompletion方法:无论是否发生异常,都会在渲染视图完成后执行的方法.
如果只想实现其中某个方法,可以继承HandlerInterceptorAdapter抽象类(缺省适配器).
验证器
用@Valid标明那个Bean需要启用注解式的验证,Errors类型的对象会接收错误信息,以下为JS303规范给出的注解
@Null必须为空
@NotNull必须不为空
@AssertTrue必须为true
@AssertFalse必须为false
@Min(value)必须大于定于指定值.
@Max(value)必须小于等于指定值
@Size(max,min)必须在指定的范围内
@Past必须是过去的日期
@Future必须是将来的日期
@Pattern(value)必须符合指定的正则表达式.
要自定义验证器规则,可以实现Validator接口.使用@InitBinder注解可以将验证器绑定到控制器中.
JSR303和自定义验证器不能同时使用.
消息转换器
HTTPMessageConverter称为HTTP消息转换器根接口
MappingJackson2HttpMessageConverter称为JSON消息转换器.派生自HTTP消息转换器.
Converter一对一转换器根接口.
GenericConverter数组和集合转换器根接口(一对多).
Formatter格式化器接口.
@DateTimeFormat用于进行日期格式的定义.
@NumberFormat用于数字的格式转换.
为控制器添加通知
@ControllerAdvice作用于类,用以标识全局性的控制器的拦截器,它将被应用于对应的控制器.
@InitBinder是一个允许构建POJO参数的方法,允许在构造控制器参数的时候加入一定的自定义控制.
@ExceptionHandler通过它可以注册一个控制器异常,使用当控制器发生注册异常时,就会跳转到该方法上.
@ModelAttribute用于数据模型的注解,优先于控制器方法运行,用于接收数据保存到数据模型中,或者从数据模型中取出数据.