首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-04-25 00:02
  • 4134
  • 13243
blog.csdn.net

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

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


文章目录

      • 1、Spring WebMvc 模块介绍
        • 1.1、Spring WebMvc 模块概述
        • 1.2、Spring WebMvc 模块依赖
        • 1.3、Spring WebMvc 模块作用
        • 1.4、Spring WebMvc 核心组件说明
      • 2、关于 MVC 模式
      • 3、Spring MVC 案例:使用 Spring Web 进行 RESTful API 调用
        • 3.1、项目结构
        • 3.2、配置 web.xml
        • 3.3、配置 Spring MVC
        • 3.4、创建模型 (Model)
        • 3.5、创建服务层 (Service)
        • 3.6、创建控制器 (Controller)
        • 3.7、创建视图 (JSP)
        • 3.8、 运行项目
      • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
3.2、配置 web.xml

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

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

    
    <servlet>
        <servlet-name>dispatcherservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>/WEB-INF/spring-mvc-config.xmlparam-value>
        init-param>
        <load-on-startup>1load-on-startup>
    servlet>

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

    
    <filter>
        <filter-name>encodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
            <param-name>encodingparam-name>
            <param-value>UTF-8param-value>
        init-param>
        <init-param>
            <param-name>forceEncodingparam-name>
            <param-value>trueparam-value>
        init-param>
    filter>

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

web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
3.3、配置 Spring MVC

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


<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">

    
    <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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
3.4、创建模型 (Model)

src/main/java/com/example/model/User.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; }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
3.5、创建服务层 (Service)

src/main/java/com/example/service/UserService.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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
3.6、创建控制器 (Controller)

src/main/java/com/example/controller/UserController.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";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
3.7、创建视图 (JSP)

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    用户列表


    

用户列表

  • ${user.name}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    用户详情


    

用户详情

姓名: ${user.name}

邮箱: ${user.email}

返回列表
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
3.8、 运行项目

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

mvn tomcat7:run
  • 1

然后访问:

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

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

注:本文转载自blog.csdn.net的栗筝i的文章"https://blog.csdn.net/weixin_45187434/article/details/146913277"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

104
前端
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top