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

在现代 Web 开发中,高效、稳定、可扩展的框架至关重要。Spring WebMvc 作为 Spring Framework 的核心模块之一,为开发人员提供了强大的 MVC 体系支持,使得 Web 应用的构建更加便捷和规范。无论是传统的 JSP 视图渲染,还是基于 RESTful 的 API 设计,Spring WebMvc 都能提供完善的解决方案。

本篇文章将深入解析 Spring WebMvc 模块的核心概念、依赖关系、组件架构及其应用场景,并通过一个完整的示例,帮助读者理解如何使用 Spring WebMvc 构建高效的 Web 应用。希望通过本篇内容,让你能更加熟练地掌握 Spring MVC 及其实践应用。


文章目录

      • [1、Spring WebMvc 模块介绍](#1、Spring WebMvc 模块介绍)
        • [1.1、Spring WebMvc 模块概述](#1.1、Spring WebMvc 模块概述)
        • [1.2、Spring WebMvc 模块依赖](#1.2、Spring WebMvc 模块依赖)
        • [1.3、Spring WebMvc 模块作用](#1.3、Spring WebMvc 模块作用)
        • [1.4、Spring WebMvc 核心组件说明](#1.4、Spring WebMvc 核心组件说明)
      • [2、关于 MVC 模式](#2、关于 MVC 模式)
      • [3、Spring MVC 案例:使用 Spring Web 进行 RESTful API 调用](#3、Spring MVC 案例:使用 Spring Web 进行 RESTful API 调用)
      • X、后记

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、项目结构
复制代码
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
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>
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>
3.4、创建模型 (Model)

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

java 复制代码
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; }
}
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);
    }
}
3.6、创建控制器 (Controller)

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

java 复制代码
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";
    }
}
3.7、创建视图 (JSP)

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

jsp 复制代码
<%@ 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>

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

jsp 复制代码
<%@ 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>
3.8、 运行项目

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

bash 复制代码
mvn tomcat7:run

然后访问:

  • 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 等相关技术,不断提升自身的技术能力。

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

相关推荐
橘猫云计算机设计4 分钟前
基于springboot微信小程序的旅游攻略系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·微信小程序·毕业设计·旅游
落榜程序员5 分钟前
Java 基础-30-单例设计模式:懒汉式与饿汉式
java·开发语言
顾林海5 分钟前
深度解析ArrayList工作原理
android·java·面试
雷渊7 分钟前
spring-IoC容器启动流程源码分析
java·后端·面试
用户33154891110712 分钟前
一招搞定Java线程池炸弹,系统吞吐量暴增10倍!
java·后端
卡戎-caryon16 分钟前
【Linux网络与网络编程】03.UDP Socket编程
linux·服务器·网络·笔记·单例模式·udp·网络通信
正经摸鱼16 分钟前
classpath与classpath*实现逻辑
后端·spring
努力的搬砖人.16 分钟前
maven如何使用
java·后端·面试·maven
风象南20 分钟前
SpringBoot中6种跨域请求解决方案
java·spring boot·后端
vivo互联网技术22 分钟前
活动中台系统慢 SQL 治理实践
java·数据库·后端