Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入浅出Spring MVC

深入浅出Spring MVC

作者头像
方丈的寺院
发布于 2020-06-03 06:43:19
发布于 2020-06-03 06:43:19
67400
代码可运行
举报
文章被收录于专栏:方丈的寺院方丈的寺院
运行总次数:0
代码可运行

摘要

本文旨在详细分析SpringMVC工作原理以及作为开发者如何基于SpringMVC做扩展。因为SpringMVC分析的文章比较多,所以本文重点讲解如何利用SpringMVC的扩展点实现我们的需求。

什么是Spring MVC

SpringMVC的作用是什么呢?需要解决什么问题呢?

下图是一个客户端与服务端的交互

在之前的详解http报文(2)-web容器是如何解析http报文的一文中我也提到过。这次再更细致的分析一遍。一个请求如何从客户端发到服务端,再从服务端返回内容。干的这件事在web中叫请求动态内容,区别于静态内容。在java语言中,为了解决这件事定义了一个规范就是servlet。具体的实现由各大厂商自己定义。

大体部分分为两部分一块是建立连接、一块是传输内容。所以servlet规范包括两大部分,,一部分是servlet接口,定义处理请求的规范。一部分是servlet容器的,去管理加载servlet实例。

轻量级的servlet容器有tomcat/jetty/undertow,servlet框架有SpringMVC/Struts/Webx这些,本篇重点讲解SpringMVC

SpringMVC工作流程

Spring MVC 顾名思义就是处理Controll-Model-View的。

  1. DispatchServlet 是入口,doDispatch方法开始处理请求
  2. 首先经过controll,controll包含两部分,一部分是url处理映射,将url与具体的处理bean映射起来。也就是HandleMapping,另一部分是具体的Handle,因为需要不同的handle,所以定义了HandleAdapter.
  3. Model比较简单,主要就是ModelView对象,
  4. View 包含两部分,一部分是ViewName的解析,另一部分是ViewName的对应的模板引擎,来渲染出最终的模板引擎。

常见扩展点

基于以上,Spring MVC 提供了不同层面的扩展,方便开发者实现定制化的功能,而不需要底层代码的修改

一. Filter

Filter其实不算是SpringMVC,是servlet的,这时候请求还没有到 DispatchServlet。Filter允许对请求和响应做一些统一的定制化处理,比如你限流、日志、trace。

实现 javax.servlet.Filter接口即可

二. Controll - HandleMapping,HandlerAdapter

HandleMapping属于Controll层面,我们可以编写任意的HandlerMapping实现类,然后定义策略来决定一个web请求到HandlerExecutionChain对象的生成。

继承 RequestMappingHandlerMapping 类即可。这个具体案例可以看下fredal的博客-使用基于 SpringMVC 的透明 RPC 开发微服务

简要来说,他的rpc通信协议是基于http的。所以rpc调用就是基于服务端还是原来的restful api。写法给普通的前端去掉无异,然后包一层rpc client。方便客户端调用。但是这样太麻烦了,对于不需要暴露给前端的API,单纯是服务间的rpc调用。再走一遍servlet-SpringMVC没必要。

所以他基于 RequestMappingHandlerMapping做了一个改造。不再基于SpringMVC,而是自己定义了一套rpc的范式,然后转换为springmvc。

三. Controll - Interceptor

Interceptor属于Controll层面,我们可以自定义各种拦截器,在一个请求被真正处理之前、请求被处理但还没输出到响应中、请求已经被输出到响应中之后这三个时间点去做任何我们想要做的事情。广泛应用于Log,Session,鉴权等场景。

实现 HandlerInterceptor接口即可

四. View - HandlerMethodArgumentResolver

解析方法参数的,可以很方便的扩展http请求参数。实现 HandlerMethodArgumentResolver接口即可

比如需要从http header中处理设备信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Componentpublic class DeviceResolver implements HandlerMethodArgumentResolver {    @Override    public boolean supportsParameter(final MethodParameter methodParameter) {        return methodParameter.getParameterType().equals(DeviceInfo.class);    }
    @Override    public Object resolveArgument(final MethodParameter methodParameter,            final ModelAndViewContainer modelAndViewContainer,            final NativeWebRequest nativeWebRequest,            final WebDataBinderFactory webDataBinderFactory) throws Exception {        HttpServletRequest request =                (HttpServletRequest)  nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        // 从head头中获取设备信息        String id = request.getHeader("x-device-id");        if (id != null) {            DeviceInfo deviceInfo = new DeviceInfo();            deviceInfo.setId("id");            return deviceInfo;        }        return null;    }}

五. View - Converter

类型转换器,主要和序列化相关,参数绑定时springmvc会对将前端传来的参数通过某种规则转化成方法定义的参数的类型,默认实现的有 StringHttpMessageConverterByteArrayHttpMessageConverter等等,默认的不能满足需求时我们可自己定义此接口来实现自己的类型的转换。

继承 AbstractHttpMessageConverter 即可。

六. View- HandlerExceptionResolver

异常处理,通常需要定义的全局异常。

@ControllerAdvice 注解即可 在一次和前端的相互甩锅的问题记录中有总结过这种

七. 修改requestbody 内容

当我们需要对 RequestBody的内容进行统一处理时,因为 HandlerMethodArgumentResolver只能处理特定类型的,做不到这点要求。

实现 RequestBodyAdvice 接口即可。比如我需要处理requestbody中的内容,将emoji。

代码见github

总结

这篇文章主要是系统的概括了SpringMVC的工作原理和各种扩展机制,属于高度概括,细节不足。具体的每个扩展点的实现、坑、应用场景需要在之后的文章继续阐述。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 方丈的寺院 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringBoot自定义注解实现Token校验
来自:blog.csdn.net/qq_33556185/article/details/105420205
良月柒
2021/03/09
5340
HandlerMethodArgumentResolver(三):基于HttpMessageConverter消息转换器的参数处理器【享学Spring MVC】
通过 前面两篇文章 的介绍,相信你对HandlerMethodArgumentResolver了解已经很深刻了。但是你或许和我一样还有一种感觉,似乎还缺点什么: 我们使用非常频繁的@RequestBody是怎么封装请求体的呢???这块使用非常广泛的地方却还木有讲解到,因为它的处理方式和前面的不太一样,因此单摘出来到本文进行详细描述。
YourBatman
2019/09/03
1.5K0
HandlerMethodArgumentResolver(三):基于HttpMessageConverter消息转换器的参数处理器【享学Spring MVC】
SpringMvc源码之解析参数HandlerMethodArgumentResolver
HandlerMethodArgumentResolver是什么?它是springmvc提供的入参解析器,像平常应用的注解@RequestParam @PathVariable @ModelAttribute ...等等修饰在@RequestMapping下的参数上都可以用HandlerMethodArgumentResolver来解析。
简单的程序员
2020/04/18
9430
HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】
上文 介绍了Spring MVC用于处理入参的处理器:HandlerMethodReturnValueHandler它的作用,以及介绍了最为常用的两个参数处理器子类:PathVariableMethodArgumentResolver和RequestParamMethodArgumentResolver。由于该体系的重要以及庞大,本文将接着继续讲解~
YourBatman
2019/09/03
1.7K0
HandlerMethodArgumentResolver(二):Map参数类型和固定参数类型【享学Spring MVC】
【小家Spring】Spring MVC容器的web九大组件之---HandlerAdapter源码详解---一篇文章带你读懂返回值处理器HandlerMethodReturnValueHandler
Spring MVC处理入参靠的是HandlerMethodArgumentResolver这个接口,解析返回值靠的是HandlerMethodReturnValueHandler这个策略接口。
YourBatman
2019/09/03
1.4K0
【小家Spring】Spring MVC容器的web九大组件之---HandlerAdapter源码详解---一篇文章带你读懂返回值处理器HandlerMethodReturnValueHandler
springboot源码解析之Model和Map参数解析
通过输出可以看到,这里传入的Model对象和Map对象都是BindingAwareModelMap类型,并且指向同一个对象,BindingAwareModelMap既是Model也是Map
九转成圣
2024/04/10
1570
springboot源码解析之Model和Map参数解析
记一次springboot项目自定义HandlerMethodArgumentResolver不生效原因与解法
本文素材的来源自业务部门技术负责人一次代码走查引发的故事,技术负责人在某次走查成员的代码时,发现他们的业务控制层大量充斥着如下的代码
lyb-geek
2022/10/25
1.1K0
记一次springboot项目自定义HandlerMethodArgumentResolver不生效原因与解法
Spring MVC请求处理过程。你这样回答保证通过面试!
SpringMVC请求处理相信大家都很熟悉了,本篇主要是基于SpringMVC处理请求的流程来阅读并调试源码,以及解决几个仅靠流程图无法解释的问题。
程序员白楠楠
2020/12/07
7430
教你如何通过 ArgumentResolver 与 Filter 优化你的 SpringMVC 设计
Spring 提供了一个非常强大的工具来让你能够为若干 controller 封装通用参数的实例化逻辑,这样,你的 controller 就无需去做那些重复的参数实例化工作,从而让你的 controller 变得更为简洁。这个机制就是本文要介绍的 MethodArgumentResolver。
用户3147702
2022/06/27
4850
HandlerMethodArgumentResolver :深入spring mvc参数解析机制
HandlerMethodArgumentResolver 是 Spring MVC 框架中的一个关键组件,用于解析控制器(Controller)方法的参数。在 Spring MVC 中,当一个请求到达时,DispatcherServlet 会负责找到对应的处理器(即控制器中的方法)来处理这个请求。在处理之前,需要解析方法的参数,这就是 HandlerMethodArgumentResolver 的作用
公众号:码到三十五
2024/07/15
8580
HandlerMethodArgumentResolver :深入spring mvc参数解析机制
你真的了解Spring MVC处理请求流程吗?
前言 阅读本文章大概需要8分钟左右。相信会让你对Spring MVC的理解更加深刻,更上一层楼。 SpringMVC图解 粒度很粗的图解 自己画的.png
用户2032165
2018/07/02
2K0
spring 之 spring-mvc
spring-mvc的核心便是DispatcherServlet,所以初始化也是围绕其展开的。类图:
MickyInvQ
2021/10/22
1.1K0
spring 之 spring-mvc
万字长文,深度解析SpringMVC 源码,让你醍醐灌顶!!
本文将通过阅读源码的方式带大家了解 springmvc 处理请求的完整流程,干货满满。
路人甲Java
2021/10/08
2.4K0
参数解析-HandlerMethodArgumentResolver
今天在做项目时遇到了一个有关参数解析 HandlerMethodArgumentResolver 的使用疑惑。因此去 百度学习了一下,现在记录一下。
Blue_007
2023/11/03
2810
参数解析-HandlerMethodArgumentResolver
第三十六章:基于SpringBoot架构重写SpringMVC请求参数装载
在国内企业开发项目中大多数都已经偏向Spring家族式的开发风格,在前几年国内项目都是以Structs2作为Web开发的主导,不过由于近几年发生的事情确实让开发者对它失去了以往的信心。与此同时Spring家族发布了SpringMVC,而且完美的整合Spring来开发企业级大型Web项目。它有着比Structs2更强大的技术支持以及更灵活的自定义配置,接下来我们就看看本章的内容,我们自定义实现SpringMVC参数绑定规则,根据业务定制参数装载实现方式。 本章目标 根据项目定制SpringMVC参数状态并了解
恒宇少年
2018/06/27
1.4K0
spring mvc之HandlerMethodArgumentResolver
因为:1.加重了我们对请求传过来来的值的取值代码,会使控制器中request.getParamater()之类的代码越来越多;2.不利于测试;3.request.getParamater()只能获取string,如果是Long等其他类型的参数还需要强转,使用起来非常不方便。
BUG弄潮儿
2022/06/30
2710
SpringBoot2核心技术-web开发
ServletModelAttributeMethodProcessor 这个参数处理器支持
yuanshuai
2022/08/22
7800
SpringBoot2核心技术-web开发
如何妙用Spring 数据绑定机制
在剖析完 Spring Boot 返回统一数据格式是怎样实现的?文章之后,一直觉得有必要说明一下 Spring's Data Binding Mechanism 「Spring 数据绑定机制」。
用户4172423
2019/12/25
1.2K0
如何妙用Spring 数据绑定机制
Spring自定义参数解析器设计
我们在开发Controller接口时经常会用到此类参数注解,那这些注解的作用是什么?我们真的了解吗?
程序猿川子
2023/05/04
6470
面试题之--SpringMVC 原理
一次为了解决跨域问题,采用了CORS方法。根据官方解释,只需要在响应头里设置 1、Access-Control-Allow-Origin 2、Access-Control-Allow-Methods 3、Access-Control-Allow-Headers 三个值就可以了,于是想到在HandlerInterceptor#preHandle()里去拦截跨域请求(options),然后再根据自定义注解判断请求的controller是否支持跨域请求,再设置对应的响应头。(项目基于spring3.2.x)但是发现请求死活无法进入preHandle里(项目里只有一个自定义的preHandle,不存在提前被别的HandlerInterceptor返回的情况)。于是利用debug大法,发现spring获取拦截器时是根据url和请求类型进行判断的,由于跨域请类型是options,无法获取对于的handler和HandlerInterceptor,导致直接就返回了,没有进入拦截器里。(spring4.x后有个默认的handler支持处理options)。于是把debug过程中学习到的知识,下次排查问题可以更快。
公众号 云舒编程
2024/01/25
1320
面试题之--SpringMVC 原理
推荐阅读
相关推荐
SpringBoot自定义注解实现Token校验
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验