跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java Web 开发基础:Spring Web MVC 核心解析

Spring Web MVC 基于 Servlet API 构建,是 Spring 框架处理 Web 请求的核心组件。从 Tomcat 与 Servlet 生命周期入手,对比传统 Servlet 开发与 Spring 架构的差异,详解 @RequestMapping、@RequestBody 等常用注解的使用场景及参数绑定机制,帮助开发者快速掌握 Spring MVC 的基础配置与实战技巧。

链路追踪发布于 2026/4/10更新于 2026/9/1066 浏览
Java Web 开发基础:Spring Web MVC 核心解析

前置知识

Tomcat

Tomcat 是一个开源的轻量级 Web 服务器和 Servlet 容器,实现了 Java Servlet 规范的核心功能。简单来说,它是一个严格遵循 Servlet 规范、可独立运行的 Java Web 服务器。

核心功能:

  • Servlet 容器:支持 Servlet 执行,处理 HTTP 请求与响应。
  • Web 服务器:提供静态资源(如 HTML)访问能力,支持基本 HTTP 服务。

目录结构概览:

  • bin:存放可执行文件(如 startup.bat)。
  • conf:配置文件目录。
  • lib:运行所需的 jar 包。
  • logs:日志文件存储。
  • temp:临时文件(如上传缓存)。
  • webapps:默认应用部署目录。
  • work:服务器工作目录,存放编译后的临时文件。

官方文档参考:Apache Tomcat®

Servlet

定义

Servlet 是运行在服务器端的 Java 程序,遵循标准 API 规范。Tomcat 作为容器提供了让 Servlet 与前端交互的运行时环境。

快速上手

创建项目时,需在 pom.xml 中添加 Servlet 依赖,版本需与 JDK 及 Tomcat 匹配:

<dependencies>
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.1.0</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

接着在 main/webapp/WEB-INF 下创建 web.xml 进行配置:

<!DOCTYPE    
    >

    Archetype Created Web Application

web-app
PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"
<web-app>
<display-name>
</display-name>
</web-app>

IDEA 中建议安装 Smart Tomcat 插件以便更便捷地启动项目。

生命周期

Servlet 的生命周期由 Web 容器管理,包含加载、初始化、处理请求和销毁四个阶段。

  1. 类加载:容器通过类加载器加载 Servlet 类(首次请求或启动时),字节码进入内存但未实例化。
  2. 实例化:确认加载成功后立即执行,容器中每种 Servlet 类仅有一个实例对象。
  3. 初始化:调用 init(ServletConfig config) 方法,仅执行一次,用于读取配置和资源加载。若失败抛出 ServletException,实例不会加入可用队列。
  4. 处理请求:为每个请求创建线程,调用 service() 方法,根据 HTTP 类型分发至 doGet 或 doPost。
  5. 销毁:容器调用 destroy() 方法,标记实例供垃圾回收。

Spring Boot

Servlet 虽为基础,但随着复杂度提升,直接编写显得笨重。Spring 框架通过抽象简化了企业级开发。

我们可以用建造房子来比喻这个过程:

第一阶段:Servlet 时代 - 自己烧砖砌墙

  • 目标:建造能遮风挡雨的 Web 应用。
  • 状态:材料是泥土(Java)和水(JVM)。你需要亲手烧制砖块(编写 Servlet 类),使用泥瓦刀(Servlet API)。
  • 过程:每面墙都要单独烧砖(LoginServlet, UserServlet...),亲自规划位置(web.xml 配置),手动搅拌水泥(解析参数、组装 HTML)。
  • 特点:高度灵活但极其繁琐,代码冗余且难以维护,强依赖外部容器。

第二阶段:Spring 时代 - 预制件与设计图纸

  • 目标:更高效、标准化的构建方式。
  • 创新:引入 IoC 容器(管家),不再手动 new 对象,只需声明依赖(@Autowired),容器自动组装 Bean。
  • 流程:总大门(DispatcherServlet)接收所有请求,调度员呼叫对应房间(Controller 方法)接待。开发者专注业务逻辑,无需关心请求入口。
  • 特点:解耦松耦合,AOP 像装修队统一安装非侵入式功能(日志、事务),效率提升但配置曾一度复杂。

Spring Boot 1.0.0 发布于 2014 年,基于 Spring Framework 4,彻底消除了配置地狱。

  • 约定大于配置:默认配置减少工作量。
  • Start 机制:依赖管理,引入 Starter 即可启用功能模块。
  • 嵌入式容器:内置 Tomcat,无需部署 war 包,直接运行。

Spring Web MVC

概述

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,正式名称源自源模块 spring-webmvc,常被称为 Spring MVC。它源于 MVC 模式(Model-View-Controller),将应用逻辑分为三部分:

  • Model:数据逻辑与业务规则。
  • View:数据展示与界面。
  • Controller:协调 Model 与 View 的交互。

Spring MVC 是 MVC 模式在 Spring 中的具体化与扩展。

常用工具

开发过程中,Postman 用于 API 开发与测试,Fiddler 用于监控分析 HTTP/HTTPS 流量。这些工具能帮助验证接口行为。

RequestMapping

这是最核心的注解之一,用于将 HTTP 请求映射到具体方法。

  • 类级别:提供统一的 URL 前缀。
  • 方法级别:指定该方法处理的 URL。
@RequestMapping("/HelloController")
@RestController
public class HelloController {
    // GET 请求示例,返回 JSON 格式
    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = "application/json")
    public String hello() {
        return "{\"Hello\" : World}";
    }

    // 单个参数接收
    @RequestMapping("/receiveAge1")
    public String receiveAge1(Integer age) {
        return "接收到参数 age:" + age;
    }

    // 数组接收
    @RequestMapping("/receiveArray")
    public String receiveArray(String[] array) {
        return "接收到参数 array:" + Arrays.toString(array);
    }

    // 对象接收,参数名需与属性一致
    @RequestMapping("/receivePerson")
    public String receivePerson(Person person) {
        return "接收到参数 person:" + person;
    }
}

RequestBody

用于将 HTTP 请求体中的 JSON 数据绑定到 Java 对象。

@RequestMapping("/receivePerson")
public String receivePerson(@RequestBody Person person) {
    return "接收到参数 person:" + person;
}

RequestParam

从 HTTP 请求中提取参数或查询字符串,绑定到控制器方法参数。

@RequestMapping("/receiveRename")
public String receiveRename(@RequestParam(value = "name", required = false) String userName) {
    return "接收到参数 name:" + userName;
}

注意:接收多个同名参数时,集合类型需显式添加 @RequestParam 注解。Spring 对数组有原生支持,无需额外注解;但对 List 接口类型,必须配合注解使用,否则可能因无法实例化接口而报错。

@RequestMapping("/receiveList2")
public String receiveList2(@RequestParam(required = false) ArrayList<String> list) {
    return "接收到参数 list:" + list;
}

PathVariable

用于从 URL 路径中提取变量值并绑定到参数。

@RequestMapping("/receivePath/{article}/{blog}")
public String receivePath(
    @PathVariable(value = "article", required = false) Integer title,
    @PathVariable(value = "blog", required = false) String content
) {
    return "接收到参数 article:" + title + " blog:" + content;
}

RequestPart

处理 multipart/form-data 类型数据,常用于文件上传。

@RequestMapping("/receiveFile")
public String receiveFile(
    @RequestPart(value = "file", required = false) MultipartFile imgFile,
    @RequestParam(value = "userName", required = false) String name
) {
    return "用户:" + name + ",接收到文件:" + imgFile.getOriginalFilename();
}

Controller & ResponseBody & RestController

  • @Controller:标记类为 Web 请求处理器,返回视图。
  • @ResponseBody:指示返回值直接写入 HTTP 响应体,而非渲染视图。
  • @RestController:组合注解,等同于 @Controller + @ResponseBody,所有方法默认返回数据(JSON/XML),无需视图渲染。
@RequestMapping("/ControllerResponse")
@Controller
public class ControllerResponse {
    // 返回视图
    @RequestMapping("/HTMLView")
    public String HTMLView() {
        return "/show.html";
    }

    // 返回数据
    @ResponseBody
    @RequestMapping("/HTMLData")
    public String HTMLData() {
        return "/show.html";
    }
}

目录

  1. 前置知识
  2. Tomcat
  3. Servlet
  4. 定义
  5. 快速上手
  6. 生命周期
  7. Spring Boot
  8. Spring Web MVC
  9. 概述
  10. 常用工具
  11. RequestMapping
  12. RequestBody
  13. RequestParam
  14. PathVariable
  15. RequestPart
  16. Controller & ResponseBody & RestController

更多推荐文章

查看全部
  • Windows 10 修改网卡物理地址(MAC)的两种方法
  • Python OCR 文字识别:pytesseract 安装配置与实战
  • AI 生成网站工具测评:bolt.new、lovable.dev 与 Firebase Studio
  • 自然语言处理在教育领域的实战应用
  • 大模型数据标注员岗位深度解析:工作内容与行业现状
  • 基于 Django 框架搭建 Web API 项目
  • 在 Cursor 中配置并使用 MCP 服务实战
  • 基于 XGBoost 算法的糖尿病数据集分类预测模型实践
  • GitHub Copilot CLI 斜杠命令速查表
  • OpenClaw 飞书机器人权限配置与安全指南
  • KoboldAI 安装与配置指南
  • 基于 Python 的餐饮供应链管理系统设计与实现
  • AI 绘画精讲与 AIGC 时代游戏美术设计:从入门到精通
  • Spring Boot 数据仓库与 ETL 工具集成实战
  • 国内网络下 Clawdbot 的部署踩坑与镜像加速
  • HarmonyOS 6.0 PC 端高性能图像展示器开发:ArkUI 适配与跨设备流转
  • 网络安全学习路线与方法详解
  • VSCode GitHub Copilot 安装与使用指南
  • 前端高频面试题:TypeScript 核心考点与实战
  • 大模型服务集中降价:原因、策略与行业影响

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online