Spring MVC 教程

Spring MVC 核心原理

Spring MVC 是基于 Servlet API 构建的 Web 框架,采用前端控制器模式 (Front Controller Pattern),核心组件是 DispatcherServlet,负责协调各组件处理请求。

请求处理流程

  1. DispatcherServlet 接收请求

    用户请求首先到达 DispatcherServlet(核心控制器),它是整个流程的入口点,负责请求的分发和响应处理。

  2. HandlerMapping 解析请求
    HandlerMapping 根据请求的 URL 路径,找到对应的处理器(Controller 中的方法),并生成一个处理器执行链(HandlerExecutionChain),可能包含拦截器(Interceptor)。

  3. HandlerAdapter 执行处理器
    HandlerAdapter 负责调用具体的处理器方法(如 @RequestMapping 注解的方法),处理请求参数绑定、方法调用等逻辑。

  4. Controller 处理业务逻辑

    控制器方法执行业务逻辑,返回一个 ModelAndView 对象(包含模型数据和视图名称)或直接返回数据(如 @ResponseBody 注解的方法)。

  5. ViewResolver 解析视图

    如果返回的是视图名称,ViewResolver 将视图名称解析为具体的视图对象(如 JSP、Thymeleaf 模板等)。

  6. View 渲染响应

    视图对象根据模型数据渲染最终的响应内容(HTML、JSON 等),并通过 DispatcherServlet 返回给客户端。

关键组件说明

  • DispatcherServlet

    前端控制器,统一处理所有请求,协调其他组件工作。

  • HandlerMapping

    映射请求到处理器,支持注解(如 @RequestMapping)和配置文件方式。

  • HandlerAdapter

    适配不同处理器(如 Controller 接口、注解方式等),调用处理器方法。

  • ViewResolver

    视图解析器,将逻辑视图名解析为实际视图(如 /WEB-INF/views/home.jsp)。

  • HandlerInterceptor

    拦截器,可以在请求处理前后执行自定义逻辑(如权限检查、日志记录)。

注解驱动开发

Spring MVC 支持基于注解的配置,简化开发:

  • @Controller:标记类为控制器。
  • @RequestMapping:映射请求路径到方法。
  • @RequestParam:绑定请求参数到方法参数。
  • @ResponseBody:直接返回数据(如 JSON/XML)。
  • @RestController:组合 @Controller 和 @ResponseBody。

示例代码片段

复制代码
@Controller
@RequestMapping("/user")
public class UserController {
    @GetMapping("/info")
    public String getUserInfo(Model model) {
        model.addAttribute("name", "Spring MVC");
        return "userInfo"; // 视图名称
    }

    @PostMapping("/save")
    @ResponseBody
    public ResponseEntity<String> saveUser(@RequestBody User user) {
        // 处理业务逻辑
        return ResponseEntity.ok("Success");
    }
}

扩展机制

  • 数据绑定与验证

    支持通过 @InitBinder 自定义数据绑定,结合 @Valid 实现参数校验。

  • 异常处理

    通过 @ControllerAdvice 和 @ExceptionHandler 全局处理异常。

  • 静态资源处理

    通过 <mvc:resources> 或 WebMvcConfigurer 配置静态资源路径。

Spring MVC 的设计强调模块化和灵活性,开发者可以通过配置或扩展组件适应不同需求。

相关推荐
上火的金鱼妹20 小时前
关于多进程sse连接通知的实战
javascript·状态模式·sse
阿俊-全栈开发20 小时前
LikeShop 小程序商城首页可配置弹窗的设计与实现(Java + uni-app)
小程序·状态模式·likeshop·likeshop开源商城
lingyubb1 天前
配音工具怎么选?从 TTS 合成链路看 6 个可量化参数
状态模式
平头哥技术团队3 天前
从预订问到退房:一间山野民宿的数字人「旅程地图」——Theme07_Homestay.vue 端到端拆解
状态模式·数字人
未来之窗软件服务4 天前
web网络请求竞态问题与取消方案-东方仙盟
前端·状态模式·仙盟创梦ide·东方仙盟·网络取消
一级新生5 天前
多智能体协作:常用协作模式详解
人工智能·状态模式·agent·多智能体·智能体
喜欢打篮球的普通人7 天前
LLVM 前端与优化层:Clang 如何把 C 代码变成 IR
c语言·前端·状态模式
m0_敲代码的彭于晏1687 天前
Vercel 前端部署与全栈开发实战指南
前端·状态模式
星恒随风8 天前
Linux线程同步与互斥(二):从日志系统与线程池设计,到线程安全单例、可重入函数和死锁原理
linux·运维·状态模式
学Linux的语莫9 天前
python中类的常见写法
开发语言·python·状态模式