Spring MVC详解
<h2 id="-摘要">📌 摘要</h2><p>Spring MVC 是 Spring Framework 提供的一个模块化 Web 框架,用于构建基于 MVC 架构的 Java Web 应用。它具备良好的解耦性、可扩展性和灵活性,是目前主流的 Java Web 开发框架之一。</p>
<p>本文将系统讲解 Spring MVC 的基本原理、核心组件、请求处理流程、常用注解以及实际开发中的常见配置和技巧,适合初学者快速上手,也适合中高级开发者查漏补缺。</p>
<hr>
<h2 id="-一引言什么是-spring-mvc">🎯 一、引言:什么是 Spring MVC?</h2>
<p>随着前后端分离架构的普及,后端接口的职责越来越清晰。Spring MVC 作为 Spring 生态中负责 Web 层的核心模块,凭借其强大的功能和良好的集成能力,成为众多 Java 开发者的首选。</p>
<h3 id="-spring-mvc-的优势">✅ Spring MVC 的优势:</h3>
<ul>
<li>支持 MVC 分层架构</li>
<li>支持 RESTful 风格接口设计</li>
<li>可灵活整合各种视图技术(如 Thymeleaf、JSP、JSON)</li>
<li>易于测试、松耦合设计</li>
<li>支持国际化、数据绑定、表单验证等功能</li>
</ul>
<hr>
<h2 id="-二spring-mvc-的核心组件">🧱 二、Spring MVC 的核心组件</h2>
<table>
<thead>
<tr>
<th>组件</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DispatcherServlet</code></td>
<td>前端控制器,负责接收所有请求并协调其他组件</td>
</tr>
<tr>
<td><code>HandlerMapping</code></td>
<td>根据请求路径找到对应的 Controller 方法</td>
</tr>
<tr>
<td><code>ViewResolver</code></td>
<td>解析视图名称为具体的视图实现(如 JSP)</td>
</tr>
<tr>
<td><code>ModelAndView</code></td>
<td>封装模型数据和视图信息</td>
</tr>
<tr>
<td><code>Controller</code></td>
<td>处理具体业务逻辑的类或方法</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="-三spring-mvc-请求处理流程详解">🔁 三、Spring MVC 请求处理流程详解</h2>
<ol>
<li>用户发送 HTTP 请求。</li>
<li>请求被 <code>DispatcherServlet</code> 接收。</li>
<li><code>HandlerMapping</code> 查找合适的 Controller。</li>
<li>调用 Controller 方法处理请求,返回 <code>ModelAndView</code>。</li>
<li><code>ViewResolver</code> 解析视图名,渲染模型数据。</li>
<li>返回最终响应给用户(HTML 页面或 JSON 数据)。</li>
</ol>
<p><img src="https://i-blog.csdnimg.cn/direct/8e998a9f60f248abb0a5c272cbd09416.png" alt="在这里插入图片描述" loading="lazy"></p>
<hr>
<h2 id="️-四搭建第一个-spring-mvc-项目基于-spring-boot">🛠️ 四、搭建第一个 Spring MVC 项目(基于 Spring Boot)</h2>
<h3 id="1-创建-maven-工程并引入依赖">1. 创建 Maven 工程并引入依赖</h3>
<pre><code class="language-xml"><dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</code></pre>
<h3 id="2-创建-controller-类">2. 创建 Controller 类</h3>
<pre><code class="language-java">import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring MVC!";
}
}
</code></pre>
<h3 id="3-启动类">3. 启动类</h3>
<pre><code class="language-java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
</code></pre>
<p>启动后访问:<code>http://localhost:8080/api/hello</code>,即可看到输出 <code>"Hello, Spring MVC!"</code></p>
<hr>
<h2 id="-五spring-mvc-核心注解详解">📦 五、Spring MVC 核心注解详解</h2>
<table>
<thead>
<tr>
<th>注解</th>
<th>用途</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>@Controller</code></td>
<td>表示该类是一个控制器,返回值为视图名</td>
</tr>
<tr>
<td><code>@RestController</code></td>
<td>结合 <code>@Controller</code> 和 <code>@ResponseBody</code>,适用于 RESTful 接口</td>
</tr>
<tr>
<td><code>@RequestMapping</code></td>
<td>映射 URL 到类或方法</td>
</tr>
<tr>
<td><code>@GetMapping</code> / <code>@PostMapping</code> 等</td>
<td>更细粒度的请求映射</td>
</tr>
<tr>
<td><code>@PathVariable</code></td>
<td>获取 URL 中的变量</td>
</tr>
<tr>
<td><code>@RequestParam</code></td>
<td>获取请求参数</td>
</tr>
<tr>
<td><code>@RequestBody</code></td>
<td>将请求体反序列化为对象</td>
</tr>
<tr>
<td><code>@ResponseBody</code></td>
<td>将返回值直接写入 HTTP 响应体中</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="-六常见配置与使用场景">📝 六、常见配置与使用场景</h2>
<h3 id="1-视图解析器配置如-thymeleaf">1. 视图解析器配置(如 Thymeleaf)</h3>
<pre><code class="language-java">@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
return resolver;
}
// ...其他配置
}
</code></pre>
<h3 id="2-静态资源放行">2. 静态资源放行</h3>
<pre><code class="language-java">@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
</code></pre>
<h3 id="3-全局异常处理">3. 全局异常处理</h3>
<pre><code class="language-java">@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException() {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误");
}
}
</code></pre>
<h3 id="4-表单验证支持jsr-380">4. 表单验证支持(JSR 380)</h3>
<pre><code class="language-java">@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
return ResponseEntity.badRequest().body(result.getAllErrors());
}
// 处理业务逻辑
return ResponseEntity.ok("创建成功");
}
</code></pre>
<hr>
<h2 id="-七spring-mvc-与-restful-api-实践">📊 七、Spring MVC 与 RESTful API 实践</h2>
<p>Spring MVC 对 RESTful API 的支持非常完善,适合构建前后端分离的应用。</p>
<h3 id="示例用户管理接口">示例:用户管理接口</h3>
<pre><code class="language-java">@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
public UserController(UserService service) {
this.userService = service;
}
@GetMapping("/{id}")
public ResponseEntity<User> getUserById(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.status(HttpStatus.CREATED).body(userService.saveUser(user));
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
</code></pre>
<hr>
<h2 id="️-八性能优化与最佳实践">⚙️ 八、性能优化与最佳实践</h2>
<table>
<thead>
<tr>
<th>优化点</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>使用异步处理</td>
<td><code>@Async</code> 实现非阻塞调用</td>
</tr>
<tr>
<td>缓存静态内容</td>
<td>使用 Spring Cache 或 Redis</td>
</tr>
<tr>
<td>合理使用线程池</td>
<td>配置 <code>TaskExecutor</code> 提升并发能力</td>
</tr>
<tr>
<td>日志记录</td>
<td>使用 MDC 记录 traceId 方便排查问题</td>
</tr>
<tr>
<td>接口文档</td>
<td>使用 Swagger 或 SpringDoc 自动生成 API 文档</td>
</tr>
</tbody>
</table>
<hr>
<h2 id="-九总结">💼 九、总结</h2>
<p>Spring MVC 是构建现代 Java Web 应用的重要工具,无论是传统的 MVC 页面应用还是现代化的 RESTful 接口服务,都能轻松胜任。</p>
<p>掌握 Spring MVC 的核心原理和常用技巧,不仅能提升开发效率,也能帮助你在面试和工作中脱颖而出。</p>
<hr>
<hr>
<ul>
<li>如果你在学习过程中遇到任何疑问,欢迎在评论区留言交流!</li>
<li>👍 如果你觉得这篇文章对你有帮助,别忘了点赞、收藏、转发哦!</li>
</ul><br><br>
来源:https://www.cnblogs.com/sailCoding/p/18939421
頁:
[1]