前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >@RequestMapping属性详解 - SpringMVC高手进阶

@RequestMapping属性详解 - SpringMVC高手进阶

作者头像
陈哈哈
发布于 2020-07-06 02:24:14
发布于 2020-07-06 02:24:14
5.3K11
代码可运行
举报
文章被收录于专栏:MySQL入坑记MySQL入坑记
运行总次数:1
代码可运行

目录
  • 前言
  • RequestMapping接口源码解析
  • RequestMapping属性介绍
    • 1、name
    • 2、value
    • 3、path
    • 4、method
    • 5、params
    • 6、headers
    • 7、consumes
    • 8、produces

前言

在日常java面试中springMVC已经是必不可少的一环了,昨天与几位朋友交流了一下面试SpringMVC框架时的心得。 我们发现大部分面试者仅了解SpringMVC的执行流程和组件这第一层,有些确实说的有模有样,也有些比较糊弄,但当追问到SpringMVC注解(Annotation)具体实现部分时,多显得异常狼狈。

因此,我在这记录一下我们常考查的注解实战性问题之一:

@RequestMapping注解的属性有哪些?分别都是干什么用的?

设想:如果是你回答这个问题,你有几成把握

RequestMapping接口源码解析

RequestMapping接口的源码如下,里面定义了八个属性(Spring4.3.8)。 注:SpringMVC在4.1版本对RequestMapping属性做了相应调整,去掉了path属性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Target({ElementType.METHOD, ElementType.TYPE}) // 可以在方法和类的声明中使用
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {

    String name() default "";// 指定映射的名称

    @AliasFor("path")
    String[] value() default {}; // 指定请求路径的地址

    @AliasFor("value")
    String[] path() default {}; // 指定请求路径的地址

	// 指定请求的方式,是一个RequsetMethod数组,可以配置多个方法
    RequestMethod[] method() default {};
	
	// 指定参数的类型
    String[] params() default {};
	
	// 指定请求头内容
    String[] headers() default {};
	
	// 指定数据请求的格式
    String[] consumes() default {};
	
	// 指定返回的内容类型
    String[] produces() default {};
}
  • 如上源码所示,在@Target中有两个属性,分别为 ElementType.METHOD 和 ElementType.TYPE ,也就是说@RequestMapping 可以在方法和类的声明中使用
  • 可以看到注解中的属性除了 name() 返回的字符串,其它的方法均返回数组,也就是可以定义多个属性值,例如 value() 和 path() 都可以同时定义多个字符串值来接收多个URL请求

RequestMapping属性介绍

1、name

此处name属性,相当于方法的注释,使方法更易理解

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",name = "用户登录")
@ResponseBody
public String login() {
	return "success";
}

官方文档说:它能让你非常方便的在JSP页面上使用它,形如这样子可以直接通过静态页面调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
...
<a href="${s:mvcUrl('PAC#getAddress').arg(0,'US').buildAndExpand('123')}">Get Address</a>

2、value

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Controller
@RequestMapping("user")   //此处如果不省略,则为@RequestMapping(value="user")
public class UserController {
 
    @RequestMapping("login")
    @ResponseBody
    public String login() {
		return "success";
	}
}

指定请求的实际地址,指定的地址可以是URI 模板模式(Template Pattern);

由于value属性是@RequestMapping注释的默认属性,因此如果只有唯一的属性,则可以省略该属性名,如果有超过一个属性,则必须写上value属性名称。即如下两个标注含义一样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value="login")
@RequestMapping("login")

value属性支持通配符匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value="login/*")

即:http://localhost:8080/login/1或者http://localhost:8080/login/hahaha都能够正常访问该接口

此处通过URL:http://localhost:8080/user/login进行访问,将由login()方法进行处理

3、path

与value同义,path(value)(path 和 value 互相引用,参见RequestMapping接口源码) path属性,和1中的value属性使用一致,两者都是用来作为映射使用的。

@RequestMapping(value=“login”)、@RequestMapping(path=“login”),这两种情况都能对login()方法进行访问

path属性支持通配符匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(path="login/*")

即:http://localhost:8080/login/1或者http://localhost:8080/login/abc都能够正常访问

4、method

指定请求类型, 如GET、POST、PUT、DELETE等;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",method = RequestMethod.GET)
@ResponseBody
public String login() {
	return "success";
}

以上方法表示,该方法只支持GET请求。

此处也可以为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",method = {RequestMethod.GET,RequestMethod.POST})

说明该方法可以同时支持GET和POST请求。

如果没有method属性,则说明该方法支持全部的HTTP请求。

5、params

该属性指定,请求中必须包含params属性规定的参数时,才能执行该请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",params = "flag")
@ResponseBody
public String login() {
	return "success";
}

以上方法,说明请求中必须包含flag参数才能执行该请求,flag参数值不做要求

http://localhost:8080/login?flag=xxx // 正常访问

http://localhost:8080/login // 无法访问

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",params = "flag=true")
@ResponseBody
public String login() {
	return "success";
}

以上方法,说明请求中必须包含flag参数,而且参数值必须为true才能执行该请求

http://localhost:8080/login?flag=true // 正常访问

http://localhost:8080/login?flag=false // 无法访问

http://localhost:8080/login // 无法访问

6、headers

  • 用于HTTP协义交互的信息被称为HTTP报文,客户端发送的HTTP报文被称为请求报文,服务器发回给客户端的HTTP报文称为响应报文,报文由报文头部和报文体组成。
  • 请求头部(Request Headers):请求头包含许多有关客户端环境和请求正文的信息,例如浏览器支持的语言、请求的服务器地址、客户端的操作系统等。
  • 响应头部(Rsponse Headers):响应头也包含许多有用的信息,包括服务器类型、日期、响应内容的类型及编码,响应内容的长度等等。

该属性指定,请求中必须包含某些指定的header值,才能够让该方法处理请求

如Chrome浏览器:

可以通过点击F12(进入开发者模式)---->Network---->Name中点击网页---->右侧查看Headers即可,下边是我电脑中的一个请求头部示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Request Headers
    Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:zh-CN,zh;q=0.8
    Cache-Control:max-age=0
    Connection:keep-alive
    Cookie:JSESSIONID=210075B5E521CWE3CDE938076295A57A
    Host:localhost:8080
    Upgrade-Insecure-Requests:1
    User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 表示只接收本机发来的请求
@RequestMapping(path = "/login", headers="Referer=http://localhost:8080")
public String login() {
	return "success";
}

以上方法 ,必须满足请求的header中包含了指定的"Referer"请求头和值为"http://localhost:8080"时,才能执行该请求

7、consumes

指定处理请求的提交内容类型(Content-Type),例如:application/json、text/html时,才能够让该方法处理请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",consumes = "application/json")
@ResponseBody
public String login() {
	return "success";
}

8、produces

指定返回的内容类型,返回的内容类型必须是request请求头(Accept)中所包含的类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",produces = "application/json")
@ResponseBody
public String login() {
	return "success";
}

此外,produces属性还可以指定返回值的编码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RequestMapping(value = "login",produces = "application/json,charset=utf-8")

如上,则指明返回utf-8编码

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
感谢分享,最后的produces = "application/json,charset=utf-8"笔误了,应该是"application/json;charset=utf-8"
感谢分享,最后的produces = "application/json,charset=utf-8"笔误了,应该是"application/json;charset=utf-8"
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day9】 —— SpringBoot1
  本栏目Java开发岗高频面试题主要出自以下各技术栈:Java基础知识、集合容器、并发编程、JVM、Spring全家桶、MyBatis等ORMapping框架、MySQL数据库、Redis缓存、RabbitMQ消息队列、Linux操作技巧等。
陈哈哈
2021/10/13
5210
SpringMVC-@RequestMapping的参数和用法
从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC 接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。
全栈程序员站长
2022/09/01
8010
SpringMVC-@RequestMapping的参数和用法
SpringMVC系列第2篇:@Controller、@RequestMapping
用来标注在类上,表示这个类是一个控制器类,可以用来处理 http 请求,通常会和@RequestMapping 一起使用。
路人甲Java
2021/06/25
7350
SpringMVC系列第2篇:@Controller、@RequestMapping
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现。 控制器解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器可以包含多个Action(动作、方法)。
张果
2022/05/09
1.1K0
Spring MVC 学习总结(二)——控制器定义与@RequestMapping详解
《Springboot极简教程》问题解决:Spring MVC 关于controller的字符编码问题描述原因分析@RequestMapping
在使用springMVC框架构建web应用,返回http请求json格式的数据,中文乱码。
一个会写诗的程序员
2018/08/20
1.3K0
Springmvc之RequestMapping
Springmvc之RequestMapping 本人独立博客https://chenjiabing666.github.io RequestMapping 标记客户的请求与哪一个类和方法对应 使用@RequestMapping同时对类和方法进行注解,相当于最终将这两处的注解路径拼接起来,比如类上使用@RequestMapping("/user"),在方法上使用@RequestMapping("/login.do"),那么拼接时访问的路径为http://localhost:8080/ProjectName/
爱撒谎的男孩
2018/05/10
1.2K1
Springmvc之RequestMapping
快速学习-@RequestMapping注解
带占位符的 URL 是 Spring3.0 新增的功能,该功能在 SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中: URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。
cwl_java
2020/02/19
5840
Content-Type与SpringMVC
在Http请求中,使用Content-Type来指定不同格式的请求信息,全面了解Content-Type中允许的值是什么,有时对开发非常有好处,这里将讲解Content-Type的可用值,以及在Spring MVC中如何使用它们来映射请求信息。
BUG弄潮儿
2020/06/12
1.2K0
Content-Type与SpringMVC
SpringBoot学习笔记(三)——Spring MVC控制器、 Restful、Swagger
控制器提供访问应用程序的行为,通常通过服务接口定义或注解定义两种方法实现。 控制器解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器可以包含多个Action(动作、方法)。
张果
2022/05/09
1.6K0
SpringBoot学习笔记(三)——Spring MVC控制器、 Restful、Swagger
@RequestMapping 用法详解之地址映射
前段时间项目中用到了RESTful模式来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据。为了找出原因,便对参数绑定(@RequestParam、 @RequestBody、 @RequestHeader 、 @PathVariable)进行了研究,同时也看了一下HttpMessageConverter的相关内容,在此一并总结。
Java编程指南
2019/08/02
1.4K0
@RequestMapping 用法详解之地址映射
SpringMVC基础
SpringWebMVC是基于ServletAPI构建的原始Web框架,从⼀开始就包含在Spring框架中。
用户9645905
2023/11/19
2730
SpringMVC基础
【刨根问底】在Springboot中MVC的常用注解<中>
@RequestMapping注解是我们在开发web项目中使用最多的注解之一,前段时间面试很多人的时候,发现很多人也就是用用而已, 更奇葩的是遇到两个人干了将近三年了,说这个注解没见过或者不知道怎么用。个人认为如果你是个三年以下的程序员这主要是能干活为主,如果最基本的一些东西你都不知道或者不清楚,那么会很尴尬的。扯远了!!!回到咱们的话题,咱们来看看@RequestMapping这个注解到底是个什么东东,
田维常
2019/07/16
6510
【刨根问底】在Springboot中MVC的常用注解<中>
2. RequestMapping注解
​@RequestMapping​ 注解是 Spring MVC 框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上。具体来说,它可以将指定 URL 的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。
捞月亮的小北
2024/06/26
1960
2. RequestMapping注解
Spring源码系列:注解详解
因为要看Spring中注解的具体定义,所以在说之前,先来简单说下JAVA中注解的一些基本知识。
磊叔的技术博客
2025/06/07
380
Spring源码系列:注解详解
SpringMVC_总结_03_SpringMVC相关注解
在前面的小节中,我们配置了注解驱动和自动扫描包,然后就可以使用SpringMVC相关注解了。
shirayner
2018/09/20
3840
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
由于前端控制器对浏览器发送的请求进行了统一的处理,但是具体的请求有不同的处理过程,因此需要创建处理具体请求的类,即请求控制器
.29.
2023/10/17
3800
【SpringMVC】 一文掌握 》》》 @RequestMapping注解
@RequestMapping
@RequestMapping 是 Spring Framework 中用于映射 URL 到控制器方法的注解。它被用于将一个特定的 URL 请求映射到一个处理该请求的方法上。在 Spring 的 Web 应用程序中,@RequestMapping 注解通常用于控制器类的方法上,以确定哪个方法将处理特定的 HTTP 请求。
用户4396583
2024/07/16
1310
Spring MVC中常用注解之RequestMapping详解
林老师带你学编程
2018/01/03
1.4K0
@RequestMapping与@RequestParam注解
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一。这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上。 该注解不仅可以用于方法上,还可以用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径,例如可以加个虚拟目录什么的。
端碗吹水
2020/09/23
4940
@RequestMapping与@RequestParam注解
《JavaEE进阶》----5.<SpringMVC②剩余基本操作(Cookie&Session&Header&响应)>
默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信和下次通信之间没有直接的联系.
用户11288958
2024/09/24
1280
《JavaEE进阶》----5.<SpringMVC②剩余基本操作(Cookie&Session&Header&响应)>
推荐阅读
相关推荐
Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day9】 —— SpringBoot1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验