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

Java Web 开发基础 (1):Spring Web MVC 核心注解详解

Servlet 生命周期由 Web 容器管理,涵盖加载、初始化、请求处理和销毁阶段。Spring Boot 基于 Spring Framework,通过约定大于配置和嵌入式容器简化开发。深入讲解 Spring Web MVC 核心注解,包括 RequestMapping 映射规则、RequestBody 与 RequestParam 参数绑定差异、PathVariable 路径变量提取,以及 Controller、ResponseBody 和 RestController 的使用场景,配合代码示例阐述 Web 层开发最佳实践。

咸鱼开飞机发布于 2026/4/9更新于 2026/9/1058 浏览
Java Web 开发基础 (1):Spring Web MVC 核心注解详解

前置知识

Tomcat

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

核心功能:

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

目录结构:

  • bin:存放可执行文件,如 startup.bat。
  • conf:存放配置文件。
  • lib:存放 Tomcat 运行所需的 jar 文件。
  • logs:存储日志文件。
  • temp:存放临时文件,如上传文件或缓存数据。
  • webapps:默认 web 应用部署目录。
  • work:服务器工作目录,存放运行时生成的临时文件。

Servlet

定义

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

配置示例

创建 Maven 项目后,需在 pom.xml 中添加依赖,并确保版本与 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 web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" >

    Archetype Created Web Application

"http://java.sun.com/dtd/web-app_2_3.dtd"
<web-app>
<display-name>
</display-name>
</web-app>
代码实现

使用 @WebServlet 注解简化配置,继承 HttpServlet 并重写对应方法:

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 doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("doPost");
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("doPost");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("doPut");
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("doPut");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("doDelete");
        resp.setContentType("text/html; charset=utf-8");
        resp.getWriter().write("doDelete");
    }
}
生命周期

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

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

SpringBoot

随着应用复杂度提升,直接使用 Servlet 显得笨重。Spring 框架通过抽象简化了企业级开发。

演进对比:

  • Servlet 时代:类似自己烧砖砌墙。需手动编写每个 Servlet,在 web.xml 中配置映射,手动解析参数。高度灵活但极其繁琐,难以维护。
  • Spring 时代:使用预制件和设计图纸。通过 IoC 容器管理 Bean,利用依赖注入(DI)解耦对象。AOP 像装修队一样非侵入式地处理日志、事务。但配置复杂。
  • Spring Boot:基于 Spring Framework 4,发布于 2014 年。显著减少配置工作量,消除配置地狱。
    • 约定大于配置:提供默认配置。
    • Start 机制:依赖管理机制,引入 Starter 即可启用功能模块。
    • 嵌入式容器:内置 Tomcat,无需部署 war 包,直接运行启动。

Spring Web MVC

概述

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,正式名称源自源模块 spring-webmvc。MVC 模式将逻辑分为 Model(数据)、View(展示)和 Controller(交互)。Spring MVC 是 MVC 模式在 Spring 中的具体化扩展。

必需工具

  • Postman:API 开发和测试工具,支持发送 HTTP 请求及管理历史。
  • Fiddler:网络调试代理工具,监控分析 HTTP/HTTPS 流量,支持修改请求和性能分析。

RequestMapping

最核心的注解之一,用于将 HTTP 请求映射到具体方法。支持类和方法级别。

@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。
  • 数组类型(如 String[])无需注解即可自动接收。
  • 接口类型(如 List<String>)不能直接作为参数,必须配合 @RequestParam 或使用具体实现类。

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

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

目录

  1. 前置知识
  2. Tomcat
  3. Servlet
  4. 定义
  5. 配置示例
  6. 代码实现
  7. 生命周期
  8. SpringBoot
  9. Spring Web MVC
  10. 概述
  11. 必需工具
  12. RequestMapping
  13. RequestBody
  14. RequestParam
  15. PathVariable
  16. RequestPart
  17. Controller & ResponseBody & RestController

更多推荐文章

查看全部
  • Python 全套学习路线:基础、进阶与标准库实战指南
  • AI 大模型学习路线:从入门到精通实战指南
  • Mac Mini 部署 OpenClaw 实战指南
  • Ubuntu 虚拟机部署 OpenClaw 个人 AI 助手指南
  • 深度学习模型优化策略与实战调参
  • 零成本搭建飞书机器人:利用 Webhook 实现高效消息推送
  • 01 - 大模型推理框架选型入门:Ollama、llama.cpp与vLLM全景对比
  • 企业级 AI 编程挑战:百万行 Java 代码的长周期维护与高可靠实践
  • GitHub Copilot 网络代理配置与故障排查指南
  • 基于 cocotb 与 VCS 验证 Xilinx FPGA IP 核实战
  • 7 天用 Electron 开发跨平台桌面应用实战指南
  • 基于C++的学生健康信息管理系统设计与实现
  • FAIR plus 机器人全产业链接会:智启未来链动全球
  • 基于 Stable Diffusion v1.5 的企业产品概念图批量生成实践
  • GitHub Copilot 版本差异解析:免费版与 Pro 版对比及适配建议
  • 法律领域自然语言处理(NLP)应用场景与实战
  • 数据产品经理与 AI 产品经理的核心区别与发展前景
  • ARP 与 NAT 协议深度解析:原理与区别
  • 阿里开源 Page-Agent:一行 JS 代码让大模型寄生前端 DOM
  • Whisper 语音识别库编译与 CUDA 加速配置指南

相关免费在线工具

  • 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