SpringMVC之国际化&文件上传&拦截器&异常处理
一 国际化
1、国际化概述
- 默认情况下,SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型。
- 当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析(LocalResolver),找到后使用它获取请求所对应的本地化类型信息
- SpringMVC 还允许装配一个动态更改本地化类型的拦截器,这样通过指定一个请求参数就可以控制单个请求的本地化类型。
- SessionLocaleResolver & LocaleChangeInterceptor 工作原理
1 - 本地化解析器和本地化拦截器
(1)AcceptHeaderLocaleResolver:根据 HTTP 请求头的 Accept-Language 参数确定本地化类型,如果没有显式定义本地化解析器, SpringMVC 使用该解析器
(2)CookieLocaleResolver:根据指定的 Cookie 值确定本地化类型
(3) SessionLocaleResolver:根据 Session 中特定的属性确定本地化类型
(4)LocaleChangeInterceptor:从请求参数中获取本次请求对应 的本地化类型
二 文件上传
- 概述
(1)Spring MVC 为文件上传提供了直接的支持,这种支持是通过即插即用的 MultipartResolver 实现的。Spring 用 Jakarta Commons FileUpload 技术实现了一个 MultipartResolver 实现类:CommonsMultipartResovler
(2)Spring MVC 上下文中默认没有装配 MultipartResovler,因此默认情况下不能处理文件的上传工作,如果想使用 Spring 的文件上传功能,需现在上下文中配置 MultipartResolver - 配置 MultipartResolver
(1)defaultEncoding: 必须和用户 JSP 的 pageEncoding 属性一致,以便正确解析表单的内容
(2)为了让 CommonsMultipartResovler 正确工作,必须先将 Jakarta Commons FileUpload 及 Jakarta Commons io 的类包添加到类路径下。
(3)配置情况 - 案例
(1)表单页面
(2)方法
三 使用拦截器
- 自定义拦截器
(1)Spring MVC也可以使用拦截器对请求进行拦截处理,用户可以自定义拦截器来实现特定的功能,自定义的拦截器必须实现HandlerInterceptor接口
① preHandle():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求 request 进行处理。如果程序员决定该拦截器对 请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件 去处理请求,则返回false。
② postHandle():这个方法在业务处理器处理完请求后,DispatcherServlet 向客户端返回响应前被调用,在该方法中对 用户请求request进行处理。
③ afterCompletion():这个方法在 DispatcherServlet 完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。 - 拦截器方法执行顺序
- 配置自定义拦截器
- 流程图
四 异常处理
- 介绍
(1)Spring MVC 通过 HandlerExceptionResolver 处理程序的异常,包括 Handler 映射、数据绑定以及目标方法执行时发生的异常
(2)SpringMVC 提供的 HandlerExceptionResolver 的实现类 - HandlerExceptionResolver
(1)DispatcherServlet 默认装配的 HandlerExceptionResolver :
① 没有使用 mvc:annotation-driven/ 配置
② 使用了mvc:annotation-driven/ 配置 - ExceptionHandlerExceptionResolver
(1)主要处理 Handler 中用 @ExceptionHandler 注解定义的方法
(2)@ExceptionHandler 注解定义的方法优先级问题:例如发生的是NullPointerException,但是声明的异常有 RuntimeException 和 Exception,此时会根据异常的最近 继承关系找到继承深度最浅的那个 @ExceptionHandler 注解方法,即标记了 RuntimeException 的方法
(3)ExceptionHandlerMethodResolver 内部若找不到**@ExceptionHandler** 注解的话,会找 @ControllerAdvice 中的@ExceptionHandler 注解方法 - ResponseStatusExceptionResolver
(1)在异常及异常父类中找到 @ResponseStatus 注解,然后使用这个注解的属性进行处理
(2)定义一个 @ResponseStatus 注解修饰的异常类
(3)若在处理器方法中抛出了HTTP Status 401异常:
ExceptionHandlerExceptionResolver 不解析述异常。由于触发的异常 UnauthorizedException 带有@ResponseStatus 注解。因此会被ResponseStatusExceptionResolver 解析 到。最后响应HttpStatus.UNAUTHORIZED 代码给客户 端。HttpStatus.UNAUTHORIZED 代表响应码401,无权限。 关于其他的响应码请参考 HttpStatus 枚举类型源码 - DefaultHandlerExceptionResolver
(1)对一些特殊的异常进行处理,比如NoSuchRequestHandlingMethodException、HttpRequestMethodNotSupportedException、HttpMediaTypeNotSupportedException、HttpMediaTypeNotAcceptableException 等。 - SimpleMappingExceptionResolver
(1)如果希望对所有异常进行统一处理,可以使用SimpleMappingExceptionResolver,它将异常类名映射为视图名,即发生异常时使用对应的视图报告异常