SpringMVC 主要组件说明

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC 主要组件说明相关的知识,希望对你有一定的参考价值。

参考技术A

1、前端控制器 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 主要组件说明的主要内容,如果未能解决你的问题,请参考以下文章

springmvc通过xml启动组件扫描

SpringMvc 初体验之常用的组件与配置 (四)

log4j怎么在springmvc中使用

springMVC

springMVC

springMVC