【Java】Spring MVC 核心原理与实战全解析
作为Spring生态中处理Web请求的核心框架,Spring MVC基于MVC(Model-View-Controller)设计模式,为Java Web开发提供了一套简洁、灵活且高效的请求处理方案。它不仅解决了传统Servlet开发中代码冗余、耦合度高的问题,还完美集成了Spring IOC容器,实现了业务逻辑与Web层的解耦。本文将从核心概念、工作原理、实战开发、进阶拓展四个维度,全面拆解Spring MVC,助力开发者从“会用”到“吃透”,轻松应对企业级Web开发场景。
一、直击核心:什么是Spring MVC?
在深入Spring MVC之前,我们先明确MVC设计模式的核心思想——将应用程序划分为三个核心模块:模型(Model)、视图(View)、控制器(Controller),通过职责分离实现代码的模块化与可维护性。
1.1 MVC设计模式核心职责
- **模型(Model):**封装应用程序的核心数据与业务逻辑,对应Spring中的Service、Dao层组件,用于处理数据的查询、存储与校验。
- **视图(View):**负责数据的展示与用户交互,对应JSP、Thymeleaf、Vue等视图技术,接收Model传递的数据并渲染页面。
- **控制器(Controller):**作为请求处理的核心枢纽,负责接收用户请求、协调Model与View,对应Spring MVC中的Controller组件,实现请求参数解析、业务逻辑调用、视图跳转等功能。
1.2 Spring MVC的定义与核心价值
Spring MVC是Spring框架的Web模块,它遵循MVC设计模式,通过一套注解驱动的API简化了Web层的开发,核心价值体现在:
- **低耦合:**通过IOC容器集成,实现Controller、Service、Dao层的依赖注入,降低组件间耦合度。
- **注解驱动:**通过@Controller、@RequestMapping等注解快速定义请求映射,替代传统Servlet的XML配置,开发效率大幅提升。
- **灵活的视图支持:**支持JSP、Thymeleaf、FreeMarker等多种视图技术,也可轻松集成前后端分离架构(返回JSON数据)。
- **强大的功能支持:**内置请求参数绑定、数据校验、拦截器、异常处理等功能,满足企业级开发的复杂需求。
- **无缝集成Spring生态:**可直接复用Spring的事务管理、AOP等功能,无需额外配置。
1.3 Spring MVC的核心组件
Spring MVC通过一系列核心组件协同工作,完成请求的接收、处理与响应,核心组件如下:
| 组件名称 | 核心职责 |
|---|---|
| DispatcherServlet | 前端控制器,是Spring MVC的核心枢纽,负责接收所有请求并分发到对应组件(Handler、ViewResolver等)。 |
| HandlerMapping | 请求映射器,根据请求URL、方法等信息,匹配到对应的Handler(Controller中的方法)。 |
| HandlerAdapter | 处理器适配器,根据Handler的类型(注解式、XML配置式等),调用对应的Handler方法处理请求。 |
| Handler(Controller) | 处理器,即我们编写的Controller类,负责具体的请求处理逻辑(参数解析、业务调用、结果返回)。 |
| ModelAndView | 封装处理结果(Model数据)与视图信息,由Handler返回给DispatcherServlet,用于视图渲染。 |
| ViewResolver | 视图解析器,根据ModelAndView中的视图名称,解析为具体的View对象(如JSP页面、Thymeleaf模板)。 |
| View | 视图组件,负责将Model中的数据渲染到页面,展示给用户。 |
| HandlerInterceptor | 拦截器,用于在请求处理的各个阶段(如Handler执行前、执行后)进行增强处理(如权限校验、日志记录)。 |
二、深入底层:Spring MVC的工作原理
Spring MVC的核心工作流程是“请求从客户端发起,经DispatcherServlet分发,由Handler处理后,通过View渲染响应”的完整链路。理解这一流程,是掌握Spring MVC的关键。
2.1 核心请求处理流程(11步详解)
- 客户端(浏览器/Postman)发送HTTP请求(如GET/POST),请求被Web服务器(Tomcat)接收。
- Web服务器将请求转发给Spring MVC的前端控制器DispatcherServlet(需在web.xml或配置类中配置)。
- DispatcherServlet接收请求后,调用HandlerMapping组件,根据请求URL、请求方法等信息,查找对应的Handler(Controller中的目标方法)。
- HandlerMapping返回HandlerExecutionChain对象(包含Handler和对应的拦截器)给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter组件,根据Handler的类型(注解式、XML配置式),适配并调用对应的Handler方法。
- HandlerAdapter调用Handler方法,执行具体的业务逻辑(如调用Service层方法查询数据)。
- Handler方法执行完成后,返回ModelAndView对象(包含处理后的Model数据和视图名称)给HandlerAdapter,再由HandlerAdapter传递给DispatcherServlet。
- DispatcherServlet调用ViewResolver组件,根据ModelAndView中的视图名称,解析为具体的View对象(如Thymeleaf模板、JSP页面)。
- ViewResolver返回View对象给DispatcherServlet。
- DispatcherServlet调用View对象的render()方法,将Model中的数据渲染到视图中,生成响应页面。
- DispatcherServlet将渲染后的响应结果返回给客户端,完成一次请求处理。
2.2 流程简化示意图(文字描述)
客户端 → Web服务器 → DispatcherServlet(前端控制器) → HandlerMapping(找Handler) → HandlerAdapter(调用Handler) → Controller(处理请求) → ModelAndView → ViewResolver(解析视图) → View(渲染视图) → DispatcherServlet → 客户端
2.3 关键组件的协同关系
从流程中可看出,DispatcherServlet是整个Spring MVC的“中枢”,负责协调所有核心组件:
- 通过HandlerMapping找到“谁来处理请求”(Handler);
- 通过HandlerAdapter完成“如何调用Handler”的适配;
- 通过ViewResolver完成“如何渲染视图”的解析;
- 拦截器则在Handler执行前后、视图渲染前后插入增强逻辑,实现权限控制、日志记录等功能。
三、实战核心:Spring MVC的注解式开发
Spring MVC的主流开发方式是“注解驱动”,无需繁琐的XML配置,通过简单的注解即可完成请求映射、参数绑定、视图跳转等功能。本节将从环境搭建到核心功能实现,完整演示Spring MVC的实战流程。
3.1 开发前置:环境搭建(Maven+Spring 5.x)
首先通过Maven引入核心依赖,需包含Spring MVC核心包、Spring IOC包、Servlet包、视图技术包(以Thymeleaf为例):
<!-- Spring MVC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<!-- Spring IOC核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.20</version>
</dependency>
<!-- Servlet依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Thymeleaf视图依赖(替代JSP) -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.15.RELEASE</version>
</dependency>
3.2 核心配置:JavaConfig方式(替代XML)
Spring 5.x推荐使用JavaConfig方式配置Spring MVC,无需web.xml文件,核心配置分为两步:Spring MVC配置类、Servlet初始化类。
3.2.1 步骤1:Spring MVC核心配置类(WebMvcConfig.java)
该类负责配置视图解析器、静态资源映射、组件扫描等核心功能:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
@Configuration
@EnableWebMvc // 开启Spring MVC注解支持
@ComponentScan("com.example.controller") // 扫描Controller组件
public class WebMvcConfig implements WebMvcConfigurer {
// 1. 配置Thymeleaf模板解析器
@Bean
public ClassLoaderTemplateResolver templateResolver() {
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("templates/"); // 模板文件存放路径(resources/templates)
resolver.setSuffix(".html"); // 模板文件后缀
resolver.setTemplateMode("HTML5");
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
// 2. 配置Spring模板引擎
@Bean
public SpringTemplateEngine templateEngine(ClassLoaderTemplateResolver templateResolver) {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolver(templateResolver);
return engine;
}
// 3. 配置Thymeleaf视图解析器
@Bean
public ThymeleafViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine);
resolver.setCharacterEncoding("UTF-8");
return resolver;
}
// 4. 配置静态资源映射(如CSS、JS、图片)
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 映射/resources/**路径到resources/static目录
registry.addResourceHandler("/resources/**")
.addResourceLocations("classpath:/static/");
}
}
3.2.2 步骤2:Servlet初始化类(DispatcherServletInitializer.java)
该类替代传统的web.xml,用于初始化DispatcherServlet并指定Spring MVC配置类:
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
// 替代web.xml,初始化DispatcherServlet
public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
// 配置Spring IOC的根配置(如Service、Dao层)
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class}; // RootConfig:扫描Service、Dao的配置类
}
// 配置Spring MVC的配置类
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebMvcConfig.class};
}
// 配置DispatcherServlet的映射路径(/表示拦截所有请求,除了JSP)
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
// 根配置类(RootConfig.java):扫描Service、Dao层
@Configuration
@ComponentScan({"com.example.service", "com.example.dao"})
public class RootConfig {
}
3.3 核心功能实现:Controller开发
Controller是Spring MVC处理请求的核心,通过@Controller注解声明,通过@RequestMapping等注解定义请求映射。下面演示最常用的功能:请求映射、参数绑定、视图跳转、返回JSON。
3.3.1 功能1:基础请求映射与视图跳转
通过@RequestMapping注解映射URL,返回视图名称,由视图解析器渲染页面:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/user") // 类级别的请求映射,统一前缀
public class UserController {
// 方法级别的请求映射:GET请求,URL=localhost:8080/user/list
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String userList(Model model) {
// 向Model中添加数据(用于视图渲染)
model.addAttribute("username", "张三");
model.addAttribute("userList", Arrays.asList("张三", "李四", "王五"));
// 返回视图名称:由Thymeleaf解析为templates/userList.html
return "userList";
}
}
对应的Thymeleaf视图(userList.html,存放于resources/templates):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
</head>
<body>
<h1>当前用户:[[${username}]]</h1>
<h3>用户列表:</h3>
<ul>
<li th:each="user : ${userList}" th:text="${user}"></li>
</ul>
</body>
</html>
3.3.2 功能2:请求参数绑定(多种场景)
Spring MVC支持多种参数绑定方式,无需手动解析request参数,直接通过方法参数接收,常见场景如下:
场景1:基本类型参数(String、Integer、Boolean)
// URL:localhost:8080/user/detail?id=1&name=张三
@RequestMapping("/detail")
public String userDetail(Integer id, String name, Model model) {
model.addAttribute("id", id);
model.addAttribute("name", name);
return "userDetail";
}
场景2:实体类参数(复杂参数)
若参数较多,可直接绑定到实体类(参数名需与实体类属性名一致):
// 实体类User
public class User {
private Integer id;
private String name;
private Integer age;
// getter、setter省略
}
// Controller方法:绑定User参数
// URL:localhost:8080/user/save?id=2&name=李四&age=25
@RequestMapping("/save")
public String saveUser(User user, Model model) {
model.addAttribute("user", user);
return "userSaveSuccess";
}
场景3:路径参数(RESTful风格)
通过@PathVariable注解获取URL路径中的参数,适用于RESTful风格接口:
// URL:localhost:8080/user/3(3是用户ID)
@RequestMapping("/{id}")
public String userInfo(@PathVariable("id") Integer id, Model model) {
model.addAttribute("userId", id);
return "userInfo";
}
场景4:请求体参数(JSON格式)
前后端分离架构中,常用JSON格式传递参数,需通过@RequestBody注解绑定:
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
// 接收JSON参数:{"id":4,"name":"王五","age":30}
@RequestMapping(value = "/update", method = RequestMethod.POST)
@ResponseBody // 表示返回JSON数据,而非视图
public String updateUser(@RequestBody User user) {
// 调用Service更新用户
return "更新成功:" + user.getName();
}
3.3.3 功能3:返回JSON数据(前后端分离)
前后端分离架构中,Controller无需返回视图,只需返回JSON数据,通过@ResponseBody注解实现(Spring会自动将返回值转为JSON):
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/api/user")
public class UserApiController {
// 简化注解:@GetMapping = @RequestMapping(method = RequestMethod.GET)
@GetMapping("/list")
@ResponseBody
public List<User> getUserList() {
// 模拟从数据库查询数据
User user1 = new User(1, "张三", 22);
User user2 = new User(2, "李四", 25);
return Arrays.asList(user1, user2);
}
// 也可在类上添加@RestController(= @Controller + @ResponseBody),简化配置
// @RestController
// @RequestMapping("/api/user")
// public class UserApiController { ... }
}
3.4 实战补充:RESTful风格接口设计
RESTful是一种规范的API设计风格,通过HTTP方法(GET/POST/PUT/DELETE)表示资源的操作,Spring MVC完美支持RESTful接口开发:
@RestController
@RequestMapping("/api/users")
public class RestUserController {
// 查询所有用户(GET)
@GetMapping
public List<User> findAll() {
// 业务逻辑
}
// 查询单个用户(GET)
@GetMapping("/{id}")
public User findById(@PathVariable Integer id) {
// 业务逻辑
}
// 新增用户(POST)
@PostMapping
public String add(@RequestBody User user) {
// 业务逻辑
}
// 修改用户(PUT)
@PutMapping("/{id}")
public String update(@PathVariable Integer id, @RequestBody User user) {
// 业务逻辑
}
// 删除用户(DELETE)
@DeleteMapping("/{id}")
public String delete(@PathVariable Integer id) {
// 业务逻辑
}
}
四、进阶拓展:Spring MVC的高级功能
掌握基础开发后,本节将讲解Spring MVC的高级功能,包括拦截器、异常处理、数据校验,这些功能是企业级开发的必备技能。
4.1 高级功能1:拦截器(HandlerInterceptor)
拦截器用于在请求处理的各个阶段进行增强处理,如权限校验、日志记录、性能监控等。Spring MVC通过HandlerInterceptor接口实现拦截器功能。
4.1.1 步骤1:自定义拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 自定义拦截器:权限校验
public class AuthInterceptor implements HandlerInterceptor {
// 1. Handler执行前调用(核心拦截逻辑)
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 示例:校验用户是否登录(从Session获取用户)
Object user = request.getSession().getAttribute("loginUser");
if (user == null) {
// 未登录,重定向到登录页
response.sendRedirect(request.getContextPath() + "/login");
return false; // 返回false,阻止Handler执行
}
return true; // 返回true,放行,继续执行Handler
}
// 2. Handler执行后、视图渲染前调用
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 可修改ModelAndView中的数据或视图
}
// 3. 视图渲染后调用(常用于资源清理)
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 如记录请求处理耗时、清理ThreadLocal资源等
}
}
4.1.2 步骤2:配置拦截器
在WebMvcConfig中注册拦截器,并指定拦截规则:
@Configuration
@EnableWebMvc
@ComponentScan("com.example.controller")
public class WebMvcConfig implements WebMvcConfigurer {
// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 添加自定义拦截器
registry.addInterceptor(new AuthInterceptor())
.addPathPatterns("/user/**") // 拦截/user/**路径的请求
.excludePathPatterns("/user/login"); // 排除登录请求(不拦截)
}
// 其他配置(视图解析器、静态资源)省略
}
4.2 高级功能2:全局异常处理
传统开发中,异常处理需在每个Controller方法中添加try-catch,代码冗余。Spring MVC提供全局异常处理机制,通过@ControllerAdvice注解统一处理所有Controller的异常。
4.2.1 实现全局异常处理器
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
// 全局异常处理器(拦截所有@Controller的异常)
@ControllerAdvice
public class GlobalExceptionHandler {
// 处理特定异常(如空指针异常)
@ExceptionHandler(NullPointerException.class)
public ModelAndView handleNullPointerException(NullPointerException e) {
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", "空指针异常:" + e.getMessage());
mv.setViewName("error"); // 跳转到错误页面
return mv;
}
// 处理通用异常(所有Exception)
@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("errorMsg", "系统异常:" + e.getMessage());
mv.setViewName("error");
return mv;
}
// 前后端分离场景:返回JSON格式的异常信息
@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public String handleIllegalArgumentException(IllegalArgumentException e) {
return "{\"code\":400,\"msg\":\"参数异常:" + e.getMessage() + "\"}";
}
}
4.2.2 错误页面(error.html)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>错误页面</title>
</head>
<body>
<h1>操作失败</h1>
<p th:text="${errorMsg}"></p>
</body>
</html>
4.3 高级功能3:数据校验
用户输入的数据需进行合法性校验(如非空、长度限制、格式校验),Spring MVC集成了JSR-380规范(Validation API),通过注解即可完成数据校验。
4.3.1 步骤1:引入校验依赖
<!-- 数据校验核心依赖 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<!-- Hibernate Validator(校验实现) -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.3.Final</version>
</dependency>
4.3.2 步骤2:在实体类添加校验注解
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class User {
@NotNull(message = "用户ID不能为空")
private Integer id;
@NotBlank(message = "用户名不能为空")
@Size(min = 2, max = 10, message = "用户名长度必须在2-10之间")
private String name;
@NotNull(message = "年龄不能为空")
private Integer age;
@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
private String phone;
// getter、setter省略
}
4.3.3 步骤3:在Controller中开启校验
通过@Validated注解开启数据校验,通过BindingResult接收校验结果:
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/user")
public class UserApiController {
@PostMapping("/add")
public String addUser(@Validated @RequestBody User user, BindingResult bindingResult) {
// 校验失败:返回错误信息
if (bindingResult.hasErrors()) {
StringBuilder errorMsg = new StringBuilder();
bindingResult.getFieldErrors().forEach(error -> {
errorMsg.append(error.getField()).append(":").append(error.getDefaultMessage()).append(";");
});
return errorMsg.toString();
}
// 校验成功:执行新增逻辑
return "新增用户成功:" + user.getName();
}
}
五、常见问题与解决方案
实际开发中,Spring MVC可能遇到请求404、参数绑定失败、JSON转换异常等问题,本节整理了高频问题及解决方案。
5.1 问题1:请求404(页面找不到)
常见原因:
- Controller未被扫描(ComponentScan路径配置错误);
- @RequestMapping注解的URL路径错误(如多写/、少写前缀);
- 静态资源映射配置错误(如CSS、JS文件404);
- 视图文件路径错误(如Thymeleaf模板存放路径不正确)。
解决方案:
- 检查ComponentScan路径是否包含Controller包;
- 核对请求URL与@RequestMapping的路径是否一致;
- 确认静态资源映射配置正确(addResourceHandlers方法);
- 检查视图文件是否存放在配置的模板路径下(如resources/templates)。
5.2 问题2:参数绑定失败(参数为null)
常见原因:
- 请求参数名与方法参数名不一致;
- 实体类参数缺少getter/setter方法;
- JSON参数绑定未加@RequestBody注解;
- 基本类型参数(如int)接收null值(应使用包装类型Integer)。
解决方案:
- 确保请求参数名与方法参数名/实体类属性名一致;
- 实体类必须添加getter/setter方法;
- JSON格式参数必须添加@RequestBody注解;
- 使用包装类型(Integer、Boolean)接收参数,避免基本类型接收null值。
5.3 问题3:JSON转换异常(@RequestBody失效)
常见原因:
- 未引入JSON转换依赖(如jackson-databind);
- 请求头Content-Type未设置为application/json;
- 实体类属性名与JSON参数名不一致。
解决方案:
- 引入jackson依赖:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
-
请求时设置Content-Type: application/json;
-
使用@JsonProperty注解映射不一致的属性名(如JSON参数为user_name,实体类属性为userName):
public class User {
@JsonProperty("user_name")
private String userName;
// getter、setter省略
}
六、总结
Spring MVC作为Java Web开发的主流框架,其核心价值在于通过MVC设计模式实现职责分离,通过注解驱动简化开发,通过丰富的组件支持企业级需求。本文从核心概念、工作原理、实战开发到进阶拓展,全面覆盖了Spring MVC的核心知识点:
- Spring MVC遵循MVC设计模式,核心组件包括DispatcherServlet、HandlerMapping、HandlerAdapter等,协同完成请求处理;
- 核心工作流程是“请求→DispatcherServlet→Handler→ModelAndView→View→响应”,DispatcherServlet是中枢组件;
- 注解式开发是主流,通过@Controller、@RequestMapping、@ResponseBody等注解快速实现请求映射与数据返回;
- 高级功能(拦截器、全局异常处理、数据校验)是企业级开发的必备技能,能大幅提升代码的可维护性与健壮性;
- 常见问题多与配置错误、参数不匹配相关,需重点关注ComponentScan、参数绑定、资源映射等配置。
Spring MVC不仅是独立的Web框架,更是Spring Boot、Spring Cloud等生态技术的基础。深入理解Spring MVC的原理与实践,能帮助开发者快速上手Spring生态的高级技术,构建高效、健壮的企业级Web应用。
更多推荐




所有评论(0)