SpringMVC 主要组件说明
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 主要组件说明相关的知识,希望对你有一定的参考价值。
参考技术A1、前端控制器 DispatcherServlet(不需要开发,由框架提供【核心】)
DispatcherServlet 是 Spring MVC 的入口函数。接收请求,响应结果,相当于转发器,中央处理器。有了 DispatcherServlet ,可以大大减少其它组件之间的耦合度。
用户请求到达前端控制器,就相当于 mvc 模式中的 c,DispatcherServlet 是整个流程控制的中心,由它调用其它组件来处理用户的请求。
2、处理器映射器 HandlerMapping (不需要开发,由框架提供)
HandlerMapping 负责根据用户请求(URL),找到相应的 Handler 即处理器(Controller),SpringMVC 提供了不同映射器实现的不同映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器 HandlerAdapter (不需要开发,由框架提供)
按照特定规则(HandlerAdapter 要求的规则)去执行 Handler,通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行处理。
4、处理器 Handler (需要工程师开发)
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下,Handler 对具体的用户请求进行处理。由于 Handler 涉及到具体的用户业务请求,所以一般情况下需要工程师根据业务需求来开发 Handler。
5、视图解析器 View Resolver (不需要开发,由框架提供)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(View),View Resolver 负责将处理结果生成 View 视图。首先,根据逻辑视图名解析成物理视图名(即具体的页面地址),再生成 View 视图对象,最后对 View 进行渲染,将处理结果通过页面展示给用户。
Spring MVC 框架提供了很多的 View 视图类型,包括:jstlView、freemarkerView、pdfView 等。 一般情况下,需要通过页面标签或页面模版技术,将模型数据通过页面展示给用户,这需要由工程师根据业务需求开发具体的页面。
6、视图 View (需要工程师开发)
View 是一个接口,实现类才可以支持不同的View类型(jsp、freemarker、pdf...)
总结:处理器 Handler(也就是平常说的 Controller 控制器)以及视图层 View ,都是需要自行开发的。其他的一些组件,如:前端控制器 DispatcherServlet、处理器映射器 HandlerMapping、处理器适配器 HandlerAdapter 等都是由框架提供。
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 主要组件说明的主要内容,如果未能解决你的问题,请参考以下文章