Spring 核心技术解析【纯干货版】- XVI:Spring 网络模块 Spring-WebMvc 模块精讲

1、Spring WebMvc 模块介绍

1.1、Spring WebMvc 模块概述

Spring WebMvc 是 Spring Framework 的核心模块之一,专门用于构建基于 MVC(Model-View-Controller)设计模式的 Web 应用程序。作为 Spring 对 Servlet API 的封装实现,它通过清晰的职责划分和高效的请求处理机制,简化了传统同步 Web 应用及 REST API 的开发流程。

该模块的核心特性包括:

  • 注解驱动开发:通过 @Controller@RestController@RequestMapping 等注解实现请求路由与处理。
  • 视图解析与渲染:支持 JSP、Thymeleaf、FreeMarker 等多种视图技术。
  • 数据绑定与校验:自动封装请求参数到对象,集成 Hibernate Validator 等校验框架。
  • 拦截器与过滤器:通过 HandlerInterceptor 实现预处理和后处理逻辑。
  • 异常统一处理:支持全局异常处理机制(@ControllerAdvice)和自定义错误页面。
  • RESTful 支持:通过 @RequestBody@ResponseBody 实现 JSON/XML 数据交互。

Spring WebMvc 遵循 "约定优于配置" 原则,既能通过 XML 配置实现传统开发模式,也可借助 Spring Boot 实现零配置快速启动,广泛应用于企业级 Web 应用开发。

1.2、Spring WebMvc 模块依赖

Spring WebMvc 的底层实现依赖于以下 Spring 核心模块:

模块 作用
Spring Core 提供 IOC 容器、资源加载、类型转换等基础功能,是框架的基石。
Spring Beans 管理 Bean 的生命周期、依赖注入(DI),支持 @Autowired 等注解。
Spring Context 扩展 Core 模块,提供国际化、事件传播、AOP 集成等企业级特性。
Spring AOP 支持面向切面编程,实现事务管理、日志记录等横切关注点。
Spring Web 提供基础的 Web 功能(如 Multipart 文件上传),是 WebMvc 的前置依赖。
Spring Expression (SpEL) 支持运行时表达式解析,用于动态绑定请求参数、条件路由等场景。

:在 Maven/Gradle 项目中,直接引入 spring-webmvc 依赖会自动关联上述模块。此外,实际开发中常需集成 spring-jdbc(数据库访问)、spring-security(安全控制)等扩展模块。

1.3、Spring WebMvc 模块作用

核心作用:

  1. 请求处理流水线基于 DispatcherServlet 的前端控制器模式,将 HTTP 请求分发给对应的 Controller,处理流程包括:

    • 路由匹配(HandlerMapping
    • 参数绑定(DataBinder
    • 业务逻辑执行(Controller
    • 视图渲染(ViewResolver
    • 异常处理(HandlerExceptionResolver
  2. 分层架构支持: Model:通过 POJO 或 Model 对象封装业务数据。View:解耦视图技术,支持模板引擎或静态页面。Controller:集中处理用户请求,协调业务逻辑与数据呈现。

  3. 扩展性与兼容性 :可集成第三方组件(如 Spring Security、Swagger)。兼容 Servlet 3.0+ 规范,支持异步请求处理(DeferredResult/Callable)。

1.4、Spring WebMvc 核心组件说明

Spring WebMvc 下述组件的协同工作,Spring WebMvc 实现了高度可定制化的 Web 开发框架,兼顾灵活性与开发效率:

  • DispatcherServlet:中央调度器,协调各组件完成请求处理生命周期。
  • HandlerMapping:根据 URL 匹配对应的 Controller 方法。
  • HandlerAdapter :适配不同处理器类型(如 @Controller、Servlet)。
  • ViewResolver:将逻辑视图名解析为具体视图实现(如 JSP 页面)。
  • MultipartResolver:处理文件上传请求。
  • LocaleResolver:支持国际化与本地化。

2、关于 MVC 模式

MVC(Model-View-Controller) 是一种 软件架构模式,用于分离应用的业务逻辑、数据管理和用户界面,提高代码的可维护性和可扩展性。

MVC 的三个部分:

  • Model(模型)------ 负责数据和业务逻辑:负责存储、处理和管理数据(如数据库操作)。不直接与视图交互,而是通过控制器提供数据。例子:在 Spring MVC 中,@Service@Repository 处理业务逻辑和数据库访问。
  • View(视图)------ 负责展示数据:负责向用户显示数据,通常是 HTML、JSP、Thymeleaf、React/Vue 等前端技术。不能直接操作 Model,而是通过 Controller 访问数据。例子:在 Spring MVC,JSP、Thymeleaf 或者 JSON 数据可以作为视图。
  • Controller(控制器)------ 负责处理请求:接收用户请求,调用 Model 处理业务逻辑,并返回数据给 View。控制器负责 路由、参数解析、返回数据。例子:在 Spring MVC,@Controller@RestController 处理 HTTP 请求。

MVC 的工作流程:

  1. 用户在浏览器输入 http://localhost:8080/users,请求被 Controller 接收。
  2. Controller 调用 Model 处理业务逻辑(如查询数据库)。
  3. Model 返回数据给 Controller,然后 Controller 将数据传递给 View。
  4. View 生成 HTML 页面,并返回给用户。

MVC 的优点:

  • 低耦合:Model、View、Controller 彼此独立,可以单独修改某一部分,而不会影响其他部分。
  • 可维护性强:业务逻辑和 UI 分离,代码更容易管理和扩展。
  • 适用于多种视图层:一个后端可以支持多个前端(如 Web、移动端)。

3、Spring MVC 案例:使用 Spring Web 进行 RESTful API 调用

3.1、项目结构
css 复制代码
spring-mvc-demo/
├── src/main/java/com/example/controller/UserController.java
├── src/main/java/com/example/model/User.java
├── src/main/java/com/example/service/UserService.java
├── src/main/java/com/example/config/WebConfig.java
├── src/main/webapp/WEB-INF/views/
│   ├── users.jsp
│   ├── user.jsp
├── src/main/webapp/WEB-INF/web.xml
├── pom.xml

12345678910
3.2、配置 web.xml

Spring MVC 需要在 web.xml 中配置 DispatcherServlet 作为前端控制器: src/main/webapp/WEB-INF/web.xml

xml 复制代码
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         version="3.0">

    <!-- 配置 Spring MVC 的前端控制器 -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring-mvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- 配置字符编码 -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

123456789101112131415161718192021222324252627282930313233343536373839
3.3、配置 Spring MVC

src/main/webapp/WEB-INF/spring-mvc-config.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!-- 启用 Spring MVC 注解 -->
    <mvc:annotation-driven/>

    <!-- 组件扫描 -->
    <context:component-scan base-package="com.example"/>

    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

1234567891011121314151617181920212223242526
3.4、创建模型 (Model)

src/main/java/com/example/model/User.java

typescript 复制代码
package com.example.model;

public class User {
    private Long id;
    private String name;
    private String email;

    public User() {}

    public User(Long id, String name, String email) {
        this.id = id;
        this.name = name;
        this.email = email;
    }

    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getEmail() { return email; }
    public void setEmail(String email) { this.email = email; }
}

123456789101112131415161718192021222324
3.5、创建服务层 (Service)

src/main/java/com/example/service/UserService.java

java 复制代码
package com.example.service;

import com.example.model.User;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

@Service
public class UserService {
    private final List<User> users = new ArrayList<>();

    public UserService() {
        users.add(new User(1L, "张三", "[email protected]"));
        users.add(new User(2L, "李四", "[email protected]"));
    }

    public List<User> getAllUsers() {
        return users;
    }

    public Optional<User> getUserById(Long id) {
        return users.stream().filter(user -> user.getId().equals(id)).findFirst();
    }

    public void addUser(User user) {
        users.add(user);
    }
}

123456789101112131415161718192021222324252627282930
3.6、创建控制器 (Controller)

src/main/java/com/example/controller/UserController.java

kotlin 复制代码
package com.example.controller;

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Controller
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public String getAllUsers(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "users";
    }

    @GetMapping("/{id}")
    public String getUserById(@PathVariable Long id, Model model) {
        userService.getUserById(id).ifPresent(user -> model.addAttribute("user", user));
        return "user";
    }

    @PostMapping
    public String addUser(@ModelAttribute User user) {
        userService.addUser(user);
        return "redirect:/users";
    }
}

1234567891011121314151617181920212223242526272829303132333435363738
3.7、创建视图 (JSP)

src/main/webapp/WEB-INF/views/users.jsp

javascript 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
</head>
<body>
    <h2>用户列表</h2>
    <ul>
        <c:forEach var="user" items="${users}">
            <li><a href="users/${user.id}">${user.name}</a></li>
        </c:forEach>
    </ul>
</body>
</html>

1234567891011121314

src/main/webapp/WEB-INF/views/user.jsp

javascript 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户详情</title>
</head>
<body>
    <h2>用户详情</h2>
    <p>姓名: ${user.name}</p>
    <p>邮箱: ${user.email}</p>
    <a href="/users">返回列表</a>
</body>
</html>

123456789101112
3.8、 运行项目

使用 Tomcat 部署,或者在 IDE 中运行:

arduino 复制代码
mvn tomcat7:run

1
AI写代码

然后访问:

  • http://localhost:8080/users 获取所有用户
  • http://localhost:8080/users/1 获取特定用户信息

X、后记

Spring WebMvc 模块是构建现代 Web 应用的重要基石,它提供了清晰的架构分层,使开发者能够专注于业务逻辑,而无需过多关注底层的请求处理细节。通过 DispatcherServlet 这一核心组件,Spring WebMvc 实现了从请求到视图渲染的完整流程,并结合 Spring 的强大生态系统,提供了丰富的扩展能力。

本篇文章从基础概念到实际应用,系统地介绍了 Spring WebMvc 的核心功能,希望能为你的 Web 开发提供实用的指导。在实际开发中,建议结合 Spring Boot 进行整合,以实现更快速的配置和开发。如果你对 Web 开发有更深入的需求,可以进一步探索 Spring Security、Spring Cloud 等相关技术,不断提升自身的技术能力。

愿你的开发之旅更加高效顺畅!

相关推荐
bing_1581 小时前
Spring MVC 中Model, ModelMap, ModelAndView 之间有什么关系和区别?
java·spring·mvc
ABdolphin2 小时前
Spring-博客系统项目
数据库·sql·spring
sco52823 小时前
SpringBoot 自动装配原理 & 自定义一个 starter
java·spring boot·后端
海风极客4 小时前
《Go小技巧&易错点100例》第三十三篇
开发语言·后端·golang
养军博客4 小时前
Spring boot 简单开发接口
java·spring boot·后端
Android 小码峰啊4 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
Rubypyrrha5 小时前
Spring MVC常见注解详解
java·spring·mvc
计算机学姐6 小时前
基于SpringBoot的在线教育管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
Minyy116 小时前
“爱生活”小项目问题总结
java·数据库·spring boot·spring·maven·intellij-idea
有梦想的攻城狮7 小时前
spring中的@Value注解详解
java·后端·spring·value注解