当前位置: 首页 > news >正文

深入探究Spring MVC

Spring MVC 核心是请求驱动模型(请求是起点,处理流程完全围绕请求展开,所有组件的行为由请求驱动)和分层设计。

1 DataBinder

Spring的DataBinder 用于数据绑定、类型转换及验证。使用场景由:1)完成xml配置文件定义bean属性的绑定。2)Web请求参数绑定。

DataBinder 绑定属性的流程如下:

  1. 类型转换,将字符串转换为目标属性的类型。如String ->Data。
  2. 数值绑定,将转换后的值设置到目标对象属性中。
  3. 数据验证,对绑定后的对象属性进行校验。

PropertyEditor

非线程安全,Java 定义的一个接口,用户字符串与对象属性类型的相互转换。

Spring通过每次绑定时创建新的PropertyEditor实例或使用ThreadLocal避免并发冲突。

Converter<S,T>

Spring 3+ 引入,无状态,线程安全。将类型S转换为类型T。

Formatter<T>

将String与类型T互相转换,支持本地化。线程安全

表 类型转换实现接口对比

2 DispatcherServlet

DispatcherServlet 接收所有请求并委托其他组件进行处理。

javax.servlet.ServletContainerInitializer 是Servlet 3.0规范中定义的接口,所有Servlet 3.0容器启动时会调用这个接口的onStartup方法。通过SPI的方式,由第三方负责提供实现类。

Spring MVC实现了上面这个接口,并在onStartup方法中初始化DispatcherServlet。

2.1 分层设计

DispatcherServlet处理请求的流程如下:

1)确定处理器。

组件:HandlerMapping。(如RequestMappingHandlerMapping)。

处理:遍历所有注册的HadlerMapping(控制器方法),找到与当前请求匹配的处理器。

2)执行处理器。

组件:HandlerAdapter。(如RequestMappingHandlerAdapter)

处理:1根据处理器类型调用对应的HandlerAdapter。2 HandlerAdapter完成以下操作:a)参数解析,使用ArgumentResolver解析控制器方法参数(如@RequestParam、@RequestBody)。b)数据绑定与校验。通过DataBinder绑定请求参数到对象,触发@Valid验证。c)调用控制器方法执行实际业务逻辑。d)返回值处理。使用ReturnValueHandler处理结果(如@ResponseBody)。e)异常捕获处理。捕获异常并传递给HandlerExceptionResolver处理。

3)渲染视图/处理响应数据

a) 返回视图。

组件:ViewResolver(如InternalResourceViewResolver)

处理:将逻辑视图解析为具体的View实例(如JSP)。

b)返回数据

组件:HttpMessageConverter(如MappingJackson2HttpMessageConverter)

处理:将返回值(如实体类)转换为JSON/XML格式。

2.2 过滤器与拦截器

过滤器

拦截器

工作级别

Servlet 规范,不依赖Spring。可以拦截任何资源。

Spring MVC特有,只会对控制器的方法进行拦截。

执行时机

在请求到达DispatcherServlet之前及响应返回客户端之前。

在请求进入DispatcherServleth后,请求处理前、处理后,整个请求完成后。

表 过滤器与拦截器对比

相关文章:

  • C++学习day4
  • 基于大数据分析的门户信息推荐系统
  • 《STL 六大组件之容器篇:简单了解 list》
  • 国家天文台携手阿里云,发布国际首个太阳大模型“金乌”
  • 用Python实现TCP代理
  • Java数据类型与数据库类型映射技术文档
  • 基础框架系列分享:一个通用的Excel报表生成管理框架
  • MQTT 服务器(emqx)搭建及使用(一)
  • [图论]拓扑排序
  • 【JavaEE】MyBatis - Plus
  • deepseek v3-0324 化学键线式Canvas编辑器设计
  • 线程池自顶向下
  • 关于 @Autowired 和 @Value 使用 private 字段的警告问题分析与解决方案
  • # C++初阶——内存管理
  • 【mysql】日志:binLog、redoLog和undoLog
  • openwebui和keycloak集成,使用keycloak的用户名和密码登录
  • Ubuntu 安全限制遭突破:攻击者可利用内核漏洞提权
  • 如何使用AI去水印(ChatGPT去除图片水印)
  • Proxmox pct 部署debian
  • Elasticsearch安全加固指南:启用登录认证与SSL加密
  • 日本航空自卫队一架练习机在爱知县坠毁
  • 体坛联播|安切洛蒂执掌巴西男足,字母哥尝试离开雄鹿
  • 摩根士丹利:对冲基金已加码,八成投资者有意近期增配中国
  • 扶桑谈|从石破茂“越菲行”看日本周边外交布局战略新动向
  • 有关部门负责人就《新时代的中国国家安全》白皮书答记者问
  • 基因编辑技术让蜘蛛吐彩丝