地基简识Spring MVC 组件

Spring MVC 是一个基于 MVC 设计模式的框架,其核心组件协同工作以处理 HTTP 请求并生成响应。以下是各组件的详细说明及其协作流程:


一、​核心组件

DispatcherServlet(前端控制器)​

  • 作用:接收所有请求并协调其他组件处理。
  • 流程:作为中央调度器,将请求分发给合适的处理器,并管理视图渲染和异常处理。

HandlerMapping(处理器映射器)​

  • 作用:根据请求的 URL 和配置,确定处理请求的 Controller 及其方法。
  • 示例@RequestMapping 注解将 URL 映射到具体方法。

HandlerAdapter(处理器适配器)​

  • 作用:调用具体的处理器方法,处理参数绑定、数据转换和返回值处理。
  • 示例 :适配 @Controller 注解的类或 Controller 接口的实现。

ViewResolver(视图解析器)​

  • 作用 :将逻辑视图名(如 "home")解析为物理视图(如 JSP、Thymeleaf 模板)。
  • 配置示例 :添加前缀 /WEB-INF/views/ 和后缀 .jsp

ModelAndView

  • 作用:封装模型数据(业务结果)和视图信息(渲染目标)。
  • 使用:Controller 方法返回该对象,传递数据到视图层。

HandlerExceptionResolver(异常解析器)​

  • 作用:统一处理请求处理过程中的异常,返回自定义错误视图或状态码。
  • 工具 :结合 @ControllerAdvice 实现全局异常处理。

MultipartResolver(文件上传解析器)​

  • 作用 :解析 multipart/form-data 请求,处理文件上传。
  • 示例CommonsMultipartResolver 处理文件流。

LocaleResolver & ThemeResolver(区域与主题解析器)​

  • 作用:支持国际化(i18n)和主题切换,根据请求确定用户区域或主题。

参数解析器与消息转换器

  • Parameter Resolvers :处理 @RequestParam@PathVariable 等参数绑定。
  • HttpMessageConverter :转换请求/响应体数据(如 JSON ↔ Java 对象),支持 @RequestBody@ResponseBody

二、​请求处理流程

请求接收

  1. DispatcherServlet 接收 HTTP 请求。

处理器匹配

  1. HandlerMapping 根据 URL 找到对应的 Controller 方法。

方法执行

  1. HandlerAdapter 调用目标方法,处理参数绑定(如解析路径变量、请求体等),执行业务逻辑。

返回处理结果

  1. 方法返回 ModelAndView 或通过 @ResponseBody 返回数据。若返回视图名,由 ViewResolver 解析为具体视图。

视图渲染

  1. 视图技术(如 JSP、Thymeleaf)使用模型数据渲染页面,生成响应内容。

异常处理

  1. 若过程中抛出异常,HandlerExceptionResolver 捕获并处理,返回错误页面或 JSON 错误信息。

响应返回

  1. DispatcherServlet 将最终响应发送给客户端。

三、​配置示例

java 复制代码
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    // 配置视图解析器
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    // 启用JSON转换
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new MappingJackson2HttpMessageConverter());
    }

    // 文件上传支持
    @Bean
    public MultipartResolver multipartResolver() {
        return new CommonsMultipartResolver();
    }
}

四、​总结

Spring MVC 的组件化设计实现了职责分离,提升了灵活性和扩展性。开发者可通过配置或注解定制各组件(如替换视图技术、增加消息转换器等),适应不同项目需求。理解组件协作流程有助于调试和优化应用,例如自定义异常处理或优化参数绑定逻辑。

(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)

相关推荐
lkbhua莱克瓦2421 分钟前
Java基础——集合进阶用到的数据结构知识点1
java·数据结构·笔记·github
音符犹如代码1 小时前
Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题
java·开发语言·面试·list
代码or搬砖1 小时前
Docker 部署 Java 项目实践
java·docker·容器
又是忙碌的一天1 小时前
抽象类和接口
java·开发语言
August_._2 小时前
【MySQL】SQL语法详细总结
java·数据库·后端·sql·mysql·oracle
Dxxyyyy2 小时前
零基础学JAVA--Day26(枚举类)
java·开发语言
黑屋里的马2 小时前
java的设计模式之桥接模式(Bridge)
java·算法·桥接模式
升鲜宝供应链及收银系统源代码服务2 小时前
升鲜宝生鲜配送供应链管理系统---PMS--商品品牌多语言存储与 Redis 缓存同步实现
java·开发语言·数据库·redis·缓存·开源·供应链系统
知兀2 小时前
【Spring/SpringBoot】<dependencyManagement> + import 导入能继承父maven项目的所有依赖,类似parent
spring boot·spring·maven
练习时长一年2 小时前
Spring AoP的切点匹配
java·开发语言