Spring MVC 如何映射 HTTP 请求到 Controller 方法?

Spring Boot 2从入门到入坟 | 请求参数处理篇:全网最硬核的请求映射原理的源码分析 在前前讲中,我给大家详细讲解了一下REST映射原理,大家觉得写得还行吧!那可是我花费了大量的心血写就的哟!嘿嘿🤭,千万不要吝啬你的关注与点赞哟! 现在,我再给大家隆重推出一篇朴实无华、妙笔生花的文章,让大家看了都鼓掌叫好,只不过这篇文章具有一定的深度,并不推荐初学者观看,因为在这一篇文章中我会从底层源码的角度来分析请求映射原理。接下来,请大家系好安全带,我要开车准备出发了! ... 阅读详情

我们来详细分析一下如何在 Spring MVC 中将 HTTP 请求映射到 Controller 的处理方法(Handler Methods)上,以及 @RequestMapping 注解的使用方法。

请求映射的核心:@RequestMapping 注解

@RequestMapping 是 Spring MVC 中最核心、最通用的映射注解。它可以用于类级别(Class-level)和方法级别(Method-level)。

  1. 类级别映射 (Class-level Mapping):

    • 当 @RequestMapping 应用在类上时,它定义了Controller 处理所有请求的基类URL 路径。
    • 这样可以避免在每个方法上添加重复相同的路径前缀。
  2. 方法级别映射 (Method-level Mapping):

    • 当 @RequestMapping 应用在方法上时,它指定了该方法具体处理哪个(或哪些)URL 路径的请求。
    • 这个路径是相对于类级别路径的(如果存在的话)。

@RequestMapping 的主要属性:

  • value 或 path:

    • 指定映射的 URL 路径。可以是一个字符串数组,表示映射多个路径到同一个方法。
    • 支持 Ant 风格的路径模式(如 *, **, ?)和 URI 模板变量(路径变量,如 {userId})。
    • value 和 path 是同义词,可以互换使用。
  • method:

    • 指定该方法处理的 HTTP 请求方法(GET, POST, PUT, DELETE, PATCH, OPTIONS, HEAD, TRACE)。
    • 可以是一个 RequestMethod 枚举值的数组,表示处理多种 HTTP 方法。
    • 如果不指定,默认会匹配 所有 HTTP 方法。
  • params:

    • 根据请求参数(Query Parameters 或 Form Data)进行映射。只有当请求中包含(或不包含,或具有特定值)指定的参数时,才会匹配成功。
    • 表达式语法:
      • "myParam": 参数 myParam 必须存在。
      • "!myParam": 参数 myParam 必须不存在。
      • "myParam=myValue": 参数 myParam 必须存在且值为 myValue。
      • "myParam!=myValue": 参数 myParam 必须存在且值不为 myValue。
      • 可以组合多个条件,如 {"myParam=val", "otherParam"}(AND 关系)。
  • headers:

    • 根据请求头(Request Headers)进行映射。只有当请求包含(或不包含,或具有特定值)指定的头信息时,才会匹配成功。
    • 语法与 params 类似,如 "Accept=application/json", "!User-Agent", "X-Custom-Header=value"。
  • consumes:

    • 指定该方法能够处理的请求的 Content-Type(即客户端发送的数据类型)。只有当请求的 Content-Type Header 与指定的值匹配时,才会映射成功。
    • 例如:consumes = "application/json" 或 consumes = MediaType.APPLICATION_JSON_VALUE。可以指定多个,如 {"application/json", "application/xml"}。
  • produces:

    • 指定该方法能够生成的响应的 Content-Type(即服务器返回的数据类型)。Spring 会根据请求的 Accept Header 和此属性进行内容协商(Content Negotiation),选择最合适的 HttpMessageConverter 来序列化返回值。
    • 例如:produces = "application/json" 或 produces = MediaType.APPLICATION_JSON_VALUE。可以指定多个。

示例:使用 @RequestMapping

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@Controller
@RequestMapping("/users") // 类级别映射,所有方法都在 /users 路径下
public class UserController {

    // 映射 GET /users/{id}
    @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody // 如果用 @Controller 需要加这个来返回数据
    public User getUser(@PathVariable Long id) {
        // ... 获取用户逻辑 ...
        return new User(id, "Example User");
    }

    // 映射 POST /users
    @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String createUser(@RequestBody User newUser) {
        // ... 创建用户逻辑 ...
        return "User created";
    }

    // 映射 GET /users?admin=true (需要 admin 参数)
    @RequestMapping(method = RequestMethod.GET, params = "admin=true")
    @ResponseBody
    public String getAdminUsers() {
        // ... 获取管理员用户列表 ...
        return "List of Admin Users";
    }

    // 映射 GET /users (只接受 JSON 请求)
    @RequestMapping(method = RequestMethod.GET, headers = "Accept=application/json")
    @ResponseBody
    public String getUsersAcceptingJson() {
        // ... 获取用户列表 ...
        return "List of Users (JSON requested)";
    }
}

@RequestMapping 的变体 (快捷方式注解)

为了提高代码的可读性和简洁性,Spring 提供了针对特定 HTTP 方法的快捷方式注解。它们本质上是 @RequestMapping 预设了 method 属性的别名。

  • @GetMapping: 映射 HTTP GET 请求。等价于 @RequestMapping(method = RequestMethod.GET)。
  • @PostMapping: 映射 HTTP POST 请求。等价于 @RequestMapping(method = RequestMethod.POST)。
  • @PutMapping: 映射 HTTP PUT 请求。等价于 @RequestMapping(method = RequestMethod.PUT)。
  • @DeleteMapping: 映射 HTTP DELETE 请求。等价于 @RequestMapping(method = RequestMethod.DELETE)。
  • @PatchMapping: 映射 HTTP PATCH 请求。等价于 @RequestMapping(method = RequestMethod.PATCH)。

这些快捷注解也支持 @RequestMapping 的 value/path, params, headers, consumes, produces 属性。

使用快捷方式注解的优点:

  1. 更简洁: 代码更短。
  2. 更清晰: 一眼就能看出方法处理的是哪种 HTTP 请求。

示例:使用快捷方式注解 (@RestController 简化)

import org.springframework.web.bind.annotation.*;
import org.springframework.http.MediaType;

@RestController // 使用 @RestController,无需在每个方法上加 @ResponseBody
@RequestMapping("/api/items") // 类级别映射
public class ItemController {

    // 映射 GET /api/items/{itemId}
    // produces 也可直接写字符串
    @GetMapping(value = "/{itemId}", produces = MediaType.APPLICATION_JSON_VALUE)
    public Item getItem(@PathVariable String itemId) {
        // ... 获取物品逻辑 ...
        return new Item(itemId, "Sample Item");
    }

    // 映射 POST /api/items
    // consumes 可以指定多个
    @PostMapping(consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
    public String createItem(@RequestBody Item newItem) {
        // ... 创建物品逻辑 ...
        return "Item created: " + newItem.getName();
    }

    // 映射 PUT /api/items/{itemId}
    @PutMapping("/{itemId}")
    public Item updateItem(@PathVariable String itemId, @RequestBody Item updatedItem) {
        // ... 更新物品逻辑 ...
        updatedItem.setId(itemId); // 假设更新成功
        return updatedItem;
    }

    // 映射 DELETE /api/items/{itemId}
    @DeleteMapping("/{itemId}")
    public String deleteItem(@PathVariable String itemId) {
        // ... 删除物品逻辑 ...
        return "Item deleted: " + itemId;
    }

    // 映射 GET /api/items?type=gadget
    @GetMapping(params = "type=gadget")
    public String getGadgets() {
        return "List of Gadgets";
    }

    // 映射 GET /api/items (需要特定 Header)
    @GetMapping(headers = "X-API-Version=2")
    public String getItemsV2() {
        return "List of Items (API V2)";
    }
}

// 示例 Pojo
class Item {
    private String id;
    private String name;
    // constructors, getters, setters...
    public Item(String id, String name) { this.id = id; this.name = name; }
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

class User {
    private Long id;
    private String username;
    // constructors, getters, setters...
    public User(Long id, String username) { this.id = id; this.username = username; }
    public Long getId() { return id; }
    public String getUsername() { return username; }
}

总结

  • @RequestMapping 是基础,可以映射任何 HTTP 方法,并提供最全面的配置选项(path, method, params, headers, consumes, produces)。
  • @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping 是针对特定 HTTP 方法的快捷方式,使代码更简洁明了,是目前 Spring MVC/WebFlux 开发中的推荐用法。
  • 可以在类级别和方法级别同时使用映射注解,类级别定义基础路径,方法级别定义相对路径。
  • URL 路径通过 value 或 path 属性匹配,支持模式和路径变量 ({var})。
  • HTTP 方法通过 method 属性(在 @RequestMapping 中)或选择特定的快捷注解(如 @GetMapping)来匹配。
  • 请求参数通过 params 属性进行匹配。
  • 请求头通过 headers 属性进行匹配。
  • 请求体类型 (Content-Type) 通过 consumes 属性进行匹配。
  • 可接受的响应类型 (Accept) 通过 produces 属性参与内容协商。
Unity多渠道APK打包:同一工程稳定输出不冲突安装包 Android应用多渠道分发是移动开发的基础场景,其核心在于解决包名唯一性、渠道可识别性与构建可重复性三大问题。原理上,Unity安卓打包本质是三阶段流程:生成Android工程、Gradle编译、APK签名,而包名冲突根源在生成阶段对PlayerSettings的强依赖。技术价值体现在规避人工配置失误、支撑CI/CD自动化、满足华为/小米等商店合规要求。典型应用场景包括应用宝、TapTap、B站等渠道独立包管理,以及AB测试、灰度发布等运营需求。本文聚焦Unity原生方案,通过BuildPlayerOpt 阅读详情

相关推荐

北京理工大学计算机学院赵曜,中国进出口银行2016年度拟接收毕业生情况公示...

《中国进出口银行2016年度拟接收毕业生情况公示》由会员分享,可在线阅读,更多相关《中国进出口银行2016年度拟接收毕业生情况公示(5页珍藏版)》请在技术文库上搜索。1、二级(三级)单位二级(三级)单位姓名姓名性别性别学历学历毕业学校毕业学校专业专业 中国进出口银行总行 机关 许凯男硕士研究生北京大学法学 中国进出口银行总行 机关 冯晨男硕士研究生北京大学教育技术学 中国进出口银行总行 机关 刘鹏...

weixin_42168902的博客 4274

Spring-MVC web 实现http 请求的三种方式

对于web http 请求我们在项目里常用的就是@Controller/@RestController 定义类,并且通过@RequestMapping 定义控制器的路径,除了常见的这种web 请求,实际上在mvc 层面还提供了另外两种的路由方式。此种适应于WebFlux ,如果我们在gateWay 网关想要处理http 请求,因为gateWay 使用了WebFlux 并没有使用传统的Spring MVC 所以此时就需要通过定义RouterFunction 类型的bean来实现;/**

拽着尾巴的鱼儿的博客 1073

vivado实现SDI接口

XAPP1249,用来介绍UHD_SDI的实现。

Huskar_Liu的博客 7076

【小家Spring】Spring MVC控制器中Handler的四种实现方式:Controller、HttpRequestHandler、Servlet、@RequestMapping

前言 曾几何时,Apache下的 struts框架可谓是MVC模式的主流框架。但随着Spring MVC3.0的发布,可以使用注解的方式进行快速开发。并且基于无状态Bean的方法级别Handler设计,当然还有与Spring Framework天然集成,迅速吞并了 struts的大部分市场份额 另外在2013年 struts爆出了安全漏洞问题,基本上算是压死它的最后一根稻草了。如今Spring家族...

架构师:通透,才能写出好代码! 1万+

国产操作系统替换方案:3个避坑指南

坑核心误区避坑核心原则关键动作坑一:选型只看信创信创目录=唯一标准兼容性优先,信创是约束三维评估(兼容性+信创+生态),分场景选型坑二:迁移只管能跑功能能跑=迁移成功性能确认+运维回归适配-压测-回归三阶段,基线对比坑三:不防二次迁移解决停服=完成任务一步到位,两级兼容信创路线优先,双轨制发布,终态规划。

weixin_43524706的博客 298

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 166

SpringBoot--Controller获取HttpServletRequest

本文介绍SpringBoot如何在Controller中获取HttpServletRequest。

IT利刃出鞘的博客 1万+

手把手教你搭建离线语音助手:FunASR+DeepSeek+TTS保姆级教程

本文详细介绍了如何利用FunASR、DeepSeek和TTS技术搭建离线语音助手系统。从环境配置、模型部署到唤醒词检测优化、语音识别与语义理解联调,再到语音合成与系统集成,提供全链路实战教程。特别适合智能家居控制、企业内部知识问答等需要数据隔离的场景,实现高响应、低延迟的离线语音交互体验。

weixin_30316097的博客 475

ELK 基础原理 HTTP的映射 (三)

此时再次查询就会按照之前我们的映射来了。使用前,我们先对创建几个对象。

qq_50909707的博客 369

Google antigravity 不支持你所在地区?手把手教你把账号改成支持地区

Google antigravity功能火爆,但国内老账号根本用不了🤬本文分享几种有效的账号国家地区切换方法,最快几分钟就能让antigravity直接亮起🔥

XiaoqiangClub的博客 2万+

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1695

SpringMVC源码剖析之自动注入Request,为什么可行?

问题: 我们知道在SpringMVC中controller层可以通过Autowire自动注入Request到当前类来使用 如果看过Spring源码,IOC容器进行实例化bean的时候,一级缓存中存放的都是单例Bean。 那么是否意味着Request,也是单例Bean,会不会出现线程安全? 如果使用过request,发现其并不会出现线程安全问题,那为什么单例Bean Request不会出现线程安全问题? 解决概述 request实际上是一个代理对象,因此依赖注入request是一个代理对象,当通过reques

白鸽 980

dify进阶:使用 FastAPI 的 StreamingResponse 实现高效的数据流传输

在 FastAPI 框架中,是一个非常有用的工具,它允许你以流的方式发送数据给客户端,而不是一次性加载所有内容到内存中再发送。这对于处理大型文件下载、视频流或者任何需要长时间处理的任务特别有用。

xiezhipu的博客 1433

SpringMVC的请求-获得请求参数-获得POJO类型参数

Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。 public class User { private String username; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.user

Leon_Jinhai_Sun的博客 274

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

springMVC之@RequestMapping作用

进行URl映射定义COntroller方法对应的映射url,如下代码,jsp页面对应访问的路径为:http://localhot:8080/项目名/checkjson.action时,则调用check方法进行处理 @RequestMapping("/checkJson.action") public String check(String name,String pwd){

大湿胸的博客 5653

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

spring mvc controller实现原理

讲解spring mvc controller实现原理,以及如果自定义不同注解来简化写各种配置

大鸡腿的博客 2042

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring MVC 中@RequestMapping 注解是如何工作的?

Spring MVC 中@RequestMapping 注解是如何工作的?

专注于技术分享 1434

spring boot web请求数据映射到controller过程

Spring Boot 通过集成 Spring MVC 框架,并利用其强大的请求映射和数据绑定机制,将 HTTP 请求数据自动映射到 Controller 方法的参数中。:根据请求的 URL 和 HTTP 方法,找到对应的 Controller 方法。:将 HTTP 请求中的数据(如路径变量、请求参数、请求体等)转换为方法参数。:URL、HTTP 方法、请求头、Content-Type 等。:执行 Controller 方法,处理参数绑定和返回值。调用参数解析器,将请求数据绑定到方法参数。

papa_2019的博客 935

Spring MVC添加支持Http的delete、put请求!(HiddenHttpMethodFilter)

浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求。 1.配置springmvc配置文件springmvc-servlet.xml<!--浏览器不支持put,delete等method,由该filter将/xxx?_met...

weixin_30708329的博客 207

spring mvc 一个controlller对应一个请求

spring mvc 一个controlller对应一个请求

responsecool的专栏 950

springboot请求映射原理(二)请求路径是如何映射到后端接口

springboot 请求映射

扎根农村的博客 776

MVC处理HTTP分发请求

本节一起学习MVC处理HTTP分发请求

dxh0823的专栏 1393

SpringMVC源码分析(三)——————HTTP请求是如何与对应Handler的对应method映射的

三、HTTP请求是如何与对应Handler的对应method映射的 从上面的分析已经知道了当初始化完成的时候context中所有的handlerMapping都被加载了,并且它们都存放在hadlerMappings这么一个List中并且被排序了。我们看看HandlerMapping的设计及类的结构关系如下: 这里可以看到顶层的父接口就是HandlerMapping,进入这个类发现这个顶层接...

Nuomizhende45 938

springsecurity 怎么只拦截http请求_springmvc调试运行过程 拦截器 简单打印所有http请求的信息...

参考:《spring技术内幕》springmvc相应http请求的过程:HttpServlet是FrameworkServlet的父类。HttpServlet 的service方法注意,这里的request已经封装好了http请求里的所有信息,都是可以从中获取的。然后通过this.service到FrameworkServlet---service然后httpMethod为get方法,所以执行su...

weixin_28706423的博客 489

URL请求映射与Controller处理器参数绑定

还记得以前在配置参数绑定时,视图渲染一直404- -、,注解的映射器和适配器没问题,扫描Controller包配置也没问题,视图逻辑名,请求路径都检查过很多遍,最后发现,竟然是视图解析器没配置好!!崩溃!!!排除故障后,正确运行,算是当初踩过的一个大坑。 请求映射 在前面配置注解的处理器映射器和适配器时,我用的是简写方式,即使用标签: <mvc:annotation-driven...

大力海棠的博客 2738

程序员都会用到的13个Spring MVC实用技巧,收藏!!!

通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求。然后,控制器调用业务类来处理与业务相关的任务,然后将客户端重定向到逻辑视图名称,该名称由Spring的调度程序Servlet解析,以呈现结果或输出。 这样就完成了典型的请求–响应周期的往返。 今天整理了一下编写Spring MVC控制器的13个技巧,你今天get到了吗? 这里总结Java程序员相关面试题,有的很基础,有的很细节,大家可以评估一下自己掌握的情况。 1.使用@Controller构造型 这是创建可以处理一个或多个请求的控

程序媛小琬的博客 560
上一篇: 如何使用可视化工具分析 JVM 的性能瓶颈?
下一篇: Redis Sentinel 和 Redis Cluster 各自的原理、优缺点及适用场景是什么?
冰糖心书房
博客等级 码龄15年 6014粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值