1、常用主要组件
-
DispatcherServlet:前端控制器。
-
Controller:处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理。
-
HandlerMapping :请求映射到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器对象)
-
View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的View,进行这种策略模式,很容易更换其他视图技术;如InternalResourceViewResolver将逻辑视图名映射为JSP视图
-
LocalResolver:本地化、国际化。
-
MultipartResolver:文件上传解析器。
-
<mvc: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 注解定义的方法。