springmvc总结


1、常用主要组件

  • DispatcherServlet:前端控制器。

  • Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理。

  • HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象)

  • View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;如InternalResourceViewResolver将逻辑视图名映射为JSP视图

  • LocalResolver:本地化、国际化。

  • MultipartResolver:文件上传解析器。

  • HandlerExceptionResolver:异常处理器。

2、常用注解

  • @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中
  • @RequestMapping:资源映射
  • @RequestParam、@RequestHeader 
  • @CookieValue 注解

3、REST

  浏览器 form 表单只支持 GET 与 POST 请求,而DELETE、PUT 等 method 并不支持,Spring3.0 添加了一个过滤器HiddenHttpMethodFilter,可以将这些请求转换为标准的 http 方法,使得支持 GET、POST、PUT 与 DELETE 请求。

4、处理响应数据

  SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中.

5、视图解析器

  不论控制器返回一个String、ModelAndView、View,都会转换为ModelAndView对象,由视图解析器解析视图,然后,进行页面的跳转。

  Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart等各种表现形式的视图

  由于视图(View)是无状态的,所以他们不会有线程安全的问题。

6、SpringMVC 处理静态资源

  在 SpringMVC 的配置文件中配置 ;配置后,原来的请求又不好使了;需要配置

   将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler,它会对进入 DispatcherServlet 的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由 WEB 应用服务器默认的 Servlet 处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理,一般 WEB 应用服务器默认的 Servlet 的名称都是 default。若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定

7、annotation-driven配置

   会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter 与ExceptionHandlerExceptionResolver 三个bean

  还将提供以下支持:

  •  支持使用 ConversionService 实例对表单参数进行类型转换
  • 支持使用 @NumberFormat annotation、@DateTimeFormat注解完成数据类型的格式化

  • 支持使用 @Valid 注解对 JavaBean 实例进行 JSR 303 验证
  • 支持使用 @RequestBody 和 @ResponseBody 注解

 8、拦截器

  实现HandlerInterceptor接口

  • preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
  • postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet 向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
  • afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。

9、多个拦截方法的执行顺序

  如果SecondHandlerInterceptor 的preHandle返回false,那么下面的实线就是两个拦截器的执行顺序。

  

  结论:如果某一个拦截的preHandle执行完了,那么就一定要执行它的afterCompletion方法用于释放资源(例如FirstHandlerInterceptor),如果一个拦截器的preHandle返回false,那么它的afterCompletion方法不执行。

10、异常处理

  通过 HandlerExceptionResolver 处理程序的异常;DispatcherServlet 默认装配的 HandlerExceptionResolver : 

  ExceptionHandlerExceptionResolver;主要处理 Handler中用 @ExceptionHandler 注解定义的方法。

11、SpringMVC运行流程