跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Javajava

Java Web 开发基础:Spring Web MVC 详解

综述由AI生成Spring Web MVC 基于 Servlet 构建,是 Spring 框架中处理 Web 请求的核心模块。文章从 Tomcat 与 Servlet 生命周期入手,对比了传统 Servlet 开发与 Spring Boot 的差异,重点讲解了 RequestMapping、RequestParam、RequestBody 等关键注解的使用场景及参数绑定机制。通过 Controller、ResponseBody 与 RestController 的区别分析,帮助开发者快速掌握 RESTful API 的开发规范与最佳实践。

laoliangsh发布于 2026/3/23更新于 2026/5/34 浏览
Java Web 开发基础:Spring Web MVC 详解

前置准备

Tomcat 环境

Tomcat 是一个开源的轻量级 Web 服务器和 Servlet 容器,实现了 Java EE 规范的核心功能。它不仅是独立的 Java Web 服务器,还负责处理 HTTP 请求与响应。

目录结构方面,bin 存放启动脚本,conf 管理配置文件,lib 放置运行所需的 jar 包,webapps 则是默认的应用部署目录。

Servlet 基础

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

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

  1. 类加载:Web 容器通过类加载器加载 Servlet 类(通常首次请求触发或容器启动时预加载)。
  2. 实例化:确认类加载成功后执行,每种 Servlet 类在容器中通常只有一个实例对象。
  3. 初始化:调用 init(ServletConfig config) 方法,仅调用一次,用于读取配置和资源加载。
  4. 处理请求:为每个请求创建线程,调用 service() 方法,进而根据 HTTP 类型分发到 doGet() 或 doPost()。
  5. 销毁:容器关闭时调用 destroy() 方法,标记实例供垃圾回收。

注意:由于多个请求共享同一个 Servlet 实例,编写业务逻辑时要注意线程安全。

Spring Boot 演进

直接编写 Servlet 就像自己烧砖砌墙,虽然灵活但极其繁琐。Spring 框架引入了 IoC 容器(管家)和依赖注入(预制件),让对象管理更自动化。

Spring Boot 进一步简化了配置,采用'约定大于配置'原则,内置嵌入式 Tomcat,无需打包 war 文件部署到外部容器,直接运行 jar 包即可启动应用。

Spring Web MVC 核心注解

请求映射 (@RequestMapping)

这是 Spring MVC 中最基础的注解,用于将 HTTP 请求映射到具体的方法上。

  • 类级别:提供统一的 URL 前缀。
  • 方法级别:指定该方法处理的 URL 路径及请求方式。
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/method")
public class MethodServlet extends HttpServlet {
    @Override
    protected void   IOException {
        System.out.println();
        resp.setContentType();
        resp.getWriter().write();
    }
}
doPost
(HttpServletRequest req, HttpServletResponse resp)
throws
"doPost"
"text/html; charset=utf-8"
"doPost"

在实际开发中,我们更多使用 Spring 提供的注解组合,例如 @GetMapping 等同于 @RequestMapping(method = RequestMethod.GET)。

参数接收机制

简单类型与数组

Spring 支持自动绑定 URL 参数到方法参数。

  • 基本类型:如 int age,若未传参且为基本类型可能抛出异常,建议优先使用包装类 Integer。
  • 数组:Spring 原生支持数组类型,能自动将多个同名请求参数值绑定到数组,无需额外注解。
@RequestMapping("/receiveArray")
public String receiveArray(String[] array) {
    return "接收到参数 array:" + Arrays.toString(array);
}
集合类型

对于 List 或 ArrayList,框架无法自动推断是否需要合并同名参数,必须显式添加 @RequestParam。

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

提示:直接使用接口类型 List<String> 而不加注解通常会报错,因为 Spring 尝试实例化接口失败。

JSON 数据与路径变量
  • RequestBody:将 HTTP 请求体中的 JSON 数据绑定到 Java 对象。
  • PathVariable:从 URL 路径中提取动态变量。
@RequestMapping("/receivePerson")
public String receivePerson(@RequestBody Person person) {
    return "接收到参数 person:" + person;
}

@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;
}

控制器注解区别

  • @Controller:标记类为 Web 控制器,返回值通常为视图名称。
  • @ResponseBody:指示方法返回值直接写入 HTTP 响应体,而非渲染视图。
  • @RestController:组合注解,等同于 @Controller + @ResponseBody,所有方法返回值默认作为响应体(JSON/XML),适合 RESTful API 开发。
@RestController
public class HelloController {
    @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = "application/json")
    public String hello() {
        return "{\"Hello\" : World}";
    }
}

文件上传

处理 multipart/form-data 类型数据时,使用 @RequestPart 配合 MultipartFile。

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

目录

  1. 前置准备
  2. Tomcat 环境
  3. Servlet 基础
  4. Spring Boot 演进
  5. Spring Web MVC 核心注解
  6. 请求映射 (@RequestMapping)
  7. 参数接收机制
  8. 简单类型与数组
  9. 集合类型
  10. JSON 数据与路径变量
  11. 控制器注解区别
  12. 文件上传
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 前端安全:别让你的应用变成黑客的游乐场
  • 大模型在影视动漫行业的应用案例详解
  • Java 开发环境搭建:JDK 安装与变量配置详解
  • 前端存储机制:localStorage、sessionStorage 与 Cookie 对比
  • 2026 年 3 月全球 AI 前沿动态:Agent、模型与工具链演进
  • Obsidian Copilot 配置蓝耘 API 实现本地文件智能交互
  • NewStarCTF2025 Week 1 Web 解题报告
  • MaxKB 开源知识库问答系统部署与使用指南
  • 使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战
  • MCP Document Reader:AI 助手本地文档解析工具
  • AI 大模型通信机制:深入理解流式传输与数据封装逻辑
  • 云开发 Copilot:AI 辅助开发实战指南
  • 基于 Microi 吾码低代码框架构建 Vue 高效应用
  • Mac Mini 部署 OpenClaw 本地 AI 智能体配置指南
  • Trae、Cursor、Copilot、Windsurf 深度对比评测
  • Java 开发者构建 AI Agent 指南:基于 Spring AI Alibaba
  • 三维模型格式转换:STL 到 STEP 高效转换方案
  • OpenClaw Skills 安装与实战:构建 AI 技能工具箱
  • Visual C++ 运行库缺失问题排查与修复指南
  • OpenClaw 开源 AI 助手部署与使用指南

相关免费在线工具

  • 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