SpringMvc 初体验之常用的组件与配置 (四)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMvc 初体验之常用的组件与配置 (四)相关的知识,希望对你有一定的参考价值。
参考技术A 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情SpringMvc 除了常用的Controller 控制器以外,还有很多组件是需要我们了解的。
拦截器可以处理在请求前后的业务逻辑,类似 Servlet 的Filter。实现上,一般是继承 HandlerInterceptorAdapter 类 或者 实现 HandlerInterceptor 即可实现自定义的拦截器。
然后通过在实现 WebMvcConfigurer 的实现类中重写 addInterceptors 方法,将自定义的拦截器bean注册到SpringMvc的拦截器链中。
通过使用注解@ControllerAdvice 可以将对于控制器的全局配置都放在一个位置里,注解了@Controller 的类的方法可使用@ExceptionHandler、@InitBinder、@ModelAttritbute 注解到方法上,这对所有注解了@RequestMapping 的控制器内的方法有效。
常用于处理全局异常的配置。
juejin.cn/post/703414…
SpringMvc有着文件上传解析的接口, MultipartResolver ,里面定义了判断请求是否为文件上传且解析Http请求为文件类型。 默认有两个实现: CommonsMultipartResolver 和 StandardServletMultipartResolver 。具体可在 MultipartResolver 接口中查看注释。
这里以 CommonsMultipartResolver 实现来写一个demo。
CommonsMultipartResolver 实现依赖于commons-fileupload包,需要额外引入
这里用了CommonsMultipartResolver实现
原理可在前端控制器 DispatcherServlet 中查看控制流程。简单来说就是会先判断是否存在 multipartResolver 的bean,然后判断该请求是否为文件上传,如果是的话,将文件解析为参数。然后就是SpringMvc的请求流程,如先找到HandlerAdpter、执行各拦截器的方法等。最后会清除用于文件上传的资源,例如用于存储上传文件的存储。(貌似是存储在硬盘的某个临时文件中的)
HttpMessageConverter 是用来处理request和reponse里的数据的。Spring内部有大量的HttpMessageConverter实现类,在WebMvcConfigurationSupport#addDefaultHttpMessageConverters中可以看到。常用来解决请求时参数对方法参数的转换等。
假设场景是解析特定字符串为某个对象,如参数的格式是x-y这样的格式,而在接口方法中需要转换为DemoObj(x,y)这样的实例对象,那么就需要自定义转换器类实现了。
这里用了Java配置,且用了extendMessageConverters方法新增消息转换器。 注册转换器还有个方法:configureMessageConverters,该方法会覆盖掉SpringMvc默认注册的多个HttpMessageConverter。
Convertor 是SpringMvc 提供给我们使用的类型转换器接口,通过自定义的类型转换器就可实现在请求之前对参数进行类型转换;
假设需要自定义请求的格式,需要将特殊的String字符串解析成Java Bean,那么就可以利用自定义类型转换器做请求参数的解析并转化为bean。
实现 Formatter 接口,重写parse 和 print 方法。
Formatter 只能将String 转换为另一种Java类型。
JavaBean的格式是这样的。
当使用 localhost:8080/student/converter?sid=122&name=zhangsan&age=34&createTime=2021-11-07 访问接口时,即可将String 的日期转换为LocalDate的格式,同时注入Student的对象中。
Resolver 解析器,除开常见的视图解析器( InternalResourceViewResolver ) 以外,参数解析器 以及 返回值解析器也是SpringMvc 常用的组件。
请求参数解析器,包含以下两个方法:
注:在常用的HandlerAdapter: RequestMappingHandlerAdapter#getDefaultArgumentResolvers 方法中可以看到很多默认的参数解析器。
@Login,方法注解,注解在方法上表明需要进行登录拦截
@LoginUser,参数注解,用于解析请求注入到方法参数
自定义权限(token)拦截器,拦截方法上注解了 @Login的方法,解析请求头的数据,放入到请求属性中,用于后面的参数解析注入;
注解了 @LoginUser 的 User对象,将从请求头中自动注入当前登录态的用户信息。
返回值解析处理器
在Controller方法中加上@ResponseBody可以将返回值解析为Json 格式,而这即是实现了 HandlerMethodReturnValueHandler 接口的。
实现类在 RequestResponseBodyMethodProcessor
SpringMvc的测试需要Spring的上下文,以及Servlet相关的一些模拟对象,如MockMvc、MockHttpServletRequest、MockHttpServletResponse、MockHttpSession等。
以上是关于SpringMvc 初体验之常用的组件与配置 (四)的主要内容,如果未能解决你的问题,请参考以下文章