news 2026/4/15 17:56:24

SpringMVC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringMVC

1. SpringMVC 架构概述

SpringMVC 是 Spring 框架的一个重要组成部分,是一个基于请求驱动的框架,用于处理 Web 请求。SpringMVC 基于前端控制器模式,所有的请求都通过DispatcherServlet进行分发。

1.1 前端控制器模式
  • 前端控制器(DispatcherServlet):负责接收所有 HTTP 请求并将它们委派给具体的处理器。
  • 处理器映射器(HandlerMapping):根据请求的 URL 定位到相应的处理器(Controller)。
  • 处理器适配器(HandlerAdapter):用于将请求适配为 Controller 的方法调用。
  • 视图解析器(ViewResolver):将返回的逻辑视图名称解析为具体的视图。

2. DispatcherServlet:请求的中央控制器

DispatcherServlet是 SpringMVC 的核心,负责请求的分发。它会协调所有组件,如 HandlerMapping、HandlerAdapter 和 ViewResolver。

2.1 初始化和请求分发
  • 当用户发起请求时,DispatcherServlet会拦截请求,并使用HandlerMapping来查找对应的处理器。
  • 找到处理器后,DispatcherServlet使用HandlerAdapter来执行该处理器。
关键源码
  • DispatcherServlet负责处理 HTTP 请求并将它们转交给HandlerMapping
  • HandlerExecutionChain表示一个请求和其处理器之间的关系,HandlerAdapter用于执行具体的处理。
2.2 生命周期
  • 初始化时:DispatcherServlet 会读取web.xml或 Spring 配置文件中的配置,加载应用上下文。
  • 处理请求时:DispatcherServlet 会通过 AOP 拦截器链(HandlerInterceptor)对请求进行处理。

3. HandlerMapping:请求与处理器的映射

HandlerMapping是 SpringMVC 中用于根据请求 URL 查找相应处理器的组件。SpringMVC 提供了多种HandlerMapping实现,最常用的是RequestMappingHandlerMapping

3.1 请求映射的核心方法
关键源码
  • RequestMappingHandlerMapping是 SpringMVC 中最常用的HandlerMapping实现,它会根据请求的 URL 匹配到具体的处理器方法。

4. HandlerAdapter:请求与处理器方法的适配

HandlerAdapter是用于处理器方法适配的接口,它将请求和响应传递给相应的控制器方法。SpringMVC 通过不同的HandlerAdapter实现来适配不同类型的处理器。

4.1 适配器的核心方法
关键源码
  • RequestMappingHandlerAdapter负责将 HTTP 请求适配到实际的控制器方法。它通过反射调用控制器的方法,并将结果封装为ModelAndView

5. Controller:处理器和视图的结合

Controller是 SpringMVC 中用于处理请求的核心组件。SpringMVC 提供了多种方式来创建 Controller,例如通过实现Controller接口或者使用@Controller注解标注类。

5.1 Controller 方法的执行
关键源码
  • 在 SpringMVC 中,@RequestMapping注解用于将 HTTP 请求映射到控制器方法。
  • handleRequest方法会在匹配到/hello请求时执行,并返回视图名helloView
5.2 数据的传递与绑定

SpringMVC 支持模型(Model)的传递。返回的视图可以通过ModelAndView或者@ModelAttribute将数据传递到视图层。

关键源码
  • ModelAndView用于将控制器返回的模型数据和视图名称传递给视图解析器。

6. ViewResolver:视图的解析

ViewResolver是 SpringMVC 中用于解析视图名的接口。它的实现会根据返回的逻辑视图名解析出具体的视图对象,例如 JSP、Thymeleaf 等。

6.1 视图解析的实现
关键源码

java复制

public class InternalResourceViewResolver implements ViewResolver { private String prefix = "/WEB-INF/views/"; private String suffix = ".jsp"; @Override public View resolveViewName(String viewName, Locale locale) throws Exception { return new InternalResourceView(prefix + viewName + suffix); } }
  • InternalResourceViewResolver会将逻辑视图名(如helloView)解析成一个具体的视图对象(如/WEB-INF/views/helloView.jsp)。

7. SpringMVC 中的拦截器:HandlerInterceptor

SpringMVC 提供了HandlerInterceptor机制,在请求处理前后进行拦截操作。可以用于权限校验、日志记录等。

7.1 拦截器的核心方法
关键源码

java复制

public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre-handle logic"); return true; // 继续执行请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post-handle logic"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After completion logic"); } }
  • preHandle:在请求处理之前执行。
  • postHandle:在请求处理后但在视图渲染前执行。
  • afterCompletion:在请求完成后执行。

总结

SpringMVC 是一个基于前端控制器模式的 Web 框架,通过DispatcherServletHandlerMappingHandlerAdapterViewResolver等组件协同工作,实现了请求的接收、分发、处理和视图渲染。Controller是请求处理的核心,而HandlerInterceptor提供了强大的拦截机制,可用于日志记录、权限校验等。通过灵活配置这些组件,SpringMVC 可以满足复杂的 Web 开发需求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 18:20:26

极简部署,稳定通信:耐达讯自动化Profibus光纤链路模块赋能物流自动化喷码效率提升

在物流自动化领域,高速分拣与智能仓储对末端标识环节的实时性、可靠性要求极高。喷码器作为实现货物信息绑定与追溯的关键设备,其通信稳定性直接关系到分拣准确率与整体节拍。传统电缆通信在复杂物流场景下面临长距离衰减与强电磁干扰的双重挑战&#xf…

作者头像 李华
网站建设 2026/4/15 23:22:10

Python 常用的内置模块

文章目录1. 文件和目录操作os - 操作系统接口pathlib - 面向对象的路径操作(Python 3.4)2. 系统相关sys - 系统相关参数和函数3. 日期和时间datetime - 日期和时间处理time - 时间访问和转换4. 数学运算math - 数学函数random - 生成随机数5. 数据序列化…

作者头像 李华
网站建设 2026/4/15 10:02:15

同事写了一条 SQL,把 MyBatis 都干翻了。。

前言继上次线上CPU出现了报警,这次服务又开始整活了,风平浪静了没几天,看生产日志服务的运行的时候,频繁的出现OutOfMemoryError,就是我们俗称的OOM,这可还行!频繁的OOM直接会造成服务处于一个不…

作者头像 李华
网站建设 2026/3/30 23:05:24

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南

在数字时代铸造你的“意义货币”:个人价值资产化的3步实践指南 引言:当你的技能成为“硬通货” 在杭州的创意市集上,有位手作匠人从不使用收款二维码。她的顾客用“故事交换”购买作品——讲述一个关于传承的故事,就能带走一件蓝染…

作者头像 李华
网站建设 2026/4/12 2:41:45

性能测试能不能做好,要看你有没有性能测试思维

获取性能需求 01 用户数信息 1、调查系统当前和未来使用的用户数 系统用户数 本系统目前注册的用户数,注册用户数并不代表他会每天并且无时无刻的使用着。 在线用户数 同时在线对系统进行操作的用户数量(相当于混合场景) 并发用户数 …

作者头像 李华
网站建设 2026/4/12 8:37:04

【Java基础|Java +Socket +Swing聊天室】

Java Socket 聊天室 - 零基础手把手教程 GitHub地址:https://github.com/RONGX563647/NewChatRoom 本教程面向零基础学习者,从最基础的概念开始,一步步带你完成一个完整的聊天室项目。 目录 准备工作基础知识第一阶段:创建项目第…

作者头像 李华