深入探究Spring MVC

发布于:2025-04-06 ⋅ 阅读:(58) ⋅ 点赞:(0)

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后,请求处理前、处理后,整个请求完成后。

表 过滤器与拦截器对比


网站公告

今日签到

点亮在社区的每一天
去签到