springmvc的获取请求数据

server/2025/1/16 0:29:46/

在使用 SpringMVC 开发 web 应用时,我们经常需要从用户的请求中获取数据。不管是表单提交、查询参数,还是路径上的数据,SpringMVC 都为我们提供了简单而强大的方式来获取这些数据。

1. 使用 @RequestParam 获取查询参数

  1. 基本使用:
    RequestParam注解作用:将请求参数与方法上的形参映射。
    最常见的情况就是获取请求路径中的查询参数,比如 ?name=Grace&age=25。在 SpringMVC 中,可以使用 @RequestParam 注解来轻松获取这些参数:
java">@RequestMapping("/greet")
public String greet(@RequestParam("name") String name, @RequestParam("age") int age) {System.out.println("Name: " + name);System.out.println("Age: " + age);return "greeting";
}

对于@RequestParam注解来说,属性有value和name,这两个属性的作用相同,都是用来指定提交数据的name。

  1. RequestParam注解的defaultValue属性
    @RequestParam 允许你指定参数的名称,如果这个参数是必需的,你可以省略其他配置。你还可以为它指定默认值,以防请求中缺少该参数:
java">@RequestParam(value = "country", defaultValue = "Unknown") String country
  1. RequestParam注解的required属性

required属性用来设置该方法参数是否为必须的。默认情况下,这个参数为true,表示方法参数是必需的。如果请求中缺少对应的参数,则会抛出异常。 可以将其设置为false,false表示不是必须的,如果请求中缺少对应的参数,则方法的参数为null。

测试,修改register方法,如下:

java">
@RequestMapping("/greet")
public String greet(@RequestParam("name") String name, @RequestParam("age") int age,
@RequestParam(value = "girlfrind" required = "false") String girlfrind) {System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("girlfrind: " + girlfrind);return "greeting";
}

如果一个参数被设置为不是必需的,当没有提交对应的请求参数时,形参默认值null

2. 依靠控制器方法上的形参名来接收

@RequestParam 这个注解是可以省略的,如果方法形参的名字和提交数据时的name相同,则 @RequestParam 可以省略。

但有一个前提:如果你采用的是Spring6+版本,你需要在pom.xml文件中指定编译参数’-parameter’,配置如下:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.12.1</version><configuration><source>21</source><target>21</target><compilerArgs><arg>-parameters</arg></compilerArgs></configuration></plugin></plugins>
</build>

注意:如果你使用的是Spring5的版本,以上的配置是不需要的。

Controller中的方法只需要这样写:形参的名字必须和提交的数据的name一致!!!!!
form表单

<form th:action="@{/user/reg}" method="get">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>性别:男 <input type="radio" name="sex" value="1"><input type="radio" name="sex" value="0"><br>爱好:抽烟 <input type="checkbox" name="hobby" value="smoke">喝酒 <input type="checkbox" name="hobby" value="drink">烫头 <input type="checkbox" name="hobby" value="perm"><br>简介:<textarea rows="10" cols="60" name="intro"></textarea><br><input type="submit" value="注册">
</form>
java">    @PostMapping("/user/reg")public String register(String username, String password, String sex, String hobby, String intro){System.out.println(username);System.out.println(password);System.out.println(sex);System.out.println(hobby);System.out.println(intro);return "testPage";}

另外,还有一点,对于提交的hobby数据,也可以采用String来接收,不一定使用数组方式

3.使用POJO类/JavaBean接收请求参数

以上方式大家可以看到,当提交的数据非常多时,方法的形参个数会非常多,这不是很好的设计。在SpringMVC中也可以使用POJO类/JavaBean来接收请求参数。不过有一个非常重要的要求:POJO类的属性名必须和请求参数的参数名保持一致。提供以下的JavaBean:

java">
public class User {private Long id;private String username;private String password;private String sex;private String[] hobby;private String intro;public User() {}public User(Long id, String username, String password, String sex, String[] hobby, String intro) {this.id = id;this.username = username;this.password = password;this.sex = sex;this.hobby = hobby;this.intro = intro;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getUsername() {return username;public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String[] getHobby() {return hobby;}public void setHobby(String[] hobby) {this.hobby = hobby;}public String getIntro() {return intro;}public void setIntro(String intro) {this.intro = intro;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +", sex='" + sex + '\'' +", hobby=" + Arrays.toString(hobby) +", intro='" + intro + '\'' +'}';}
}

在控制器方法的形参位置上使用javabean来接收请求参数:

java">@PostMapping("/register")
public String register(User user){System.out.println(user);return "success";
}

底层的实现原理:反射机制。先获取请求参数的名字,因为请求参数的名字就是JavaBean的属性名,通过这种方式给对应的属性赋值究其根本就是找到其Set方法

4. 使用 HttpServletRequest 手动获取请求数据

当然,有时你可能需要更底层的操作,这时候可以使用 HttpServletRequest,它让你可以直接获取所有请求信息:

java">@RequestMapping("/info")
public String getInfo(HttpServletRequest request) {String name = request.getParameter("name");System.out.println("Name: " + name);return "infoPage";
}

在SpringMVC当中,一个Controller类中的方法参数上如果有HttpServletRequest,SpringMVC会自动将当前请求对象传递给这个参数,因此我们可以通过这个参数来获取请求提交的数据。
这种方式虽然灵活,但相比于注解的方法,需要写更多的代码,所以不推荐作为首选。

CookieValue注解

该注解的作用:将请求提交的Cookie数据映射到方法形参
同样是有三个属性:value、required、defaultValue

前端页面中编写发送cookie的代码:

<script type="text/javascript">javascript">function sendCookie(){document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";document.location = "/springmvc/register";}
</script>
<button onclick="javascript language-javascript">sendCookie()">向服务器端发送Cookie</button>

后端UserController代码:

java">    @GetMapping("/user/reg")public String register(User user,@RequestHeader(value="Referer", required = false, defaultValue = "")String referer,@CookieValue(value="id", required = false, defaultValue = "")String id){System.out.println(user);System.out.println(referer);System.out.println("客户端提交过来的Cookie: " + id);return "testPage";}

http://www.ppmy.cn/server/158700.html

相关文章

基于Hiperwalk的量子行走Python编程

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,量子计算已成为全球科研领域的焦点,被视为未来计算技术的革命性突破方向。随着对量子比特操控精度的提升、量子纠错码的发展以及量子算法的不断创新,量子计算正从理论研究逐步迈向实际应用阶段。从材料科学领域加速新型…

pytorch张量分块投影示例代码

张量的投影操作 背景 张量投影 是深度学习中常见的操作,将输入张量通过线性变换映射到另一个空间。例如: Y=W⋅X+b 其中: X: 输入张量(形状可能为 (B,M,K),即批量维度、序列维度、特征维度)。W: 权重矩阵((K,N),将 K 维投影到 N 维)。b: 偏置向量(可选,(N,))。Y:…

神经网络初始化 (init) 介绍

文章目录 引言1. 初始化的重要性1.1 打破对称性1.2 控制方差1.3 加速收敛与提高泛化能力 2. 常见的初始化方法及其应用场景2.1 Xavier/Glorot 初始化2.2 He 初始化2.3 正交初始化2.4 其他初始化方法 3. 如何设置初始化4. 基于 BERT 的文本分类如何进行初始化4.1 项目背景4.2 模…

分布式ID的实现方案

1. 什么是分布式ID ​ 对于低访问量的系统来说&#xff0c;无需对数据库进行分库分表&#xff0c;单库单表完全可以应对&#xff0c;但是随着系统访问量的上升&#xff0c;单表单库的访问压力逐渐增大&#xff0c;这时候就需要采用分库分表的方案&#xff0c;来缓解压力。 ​…

<C++学习> C++ Boost 字符串操作教程

C Boost 字符串操作教程 Boost 提供了一些实用的库来增强 C 的字符串操作能力&#xff0c;特别是 Boost.StringAlgo 和其他与字符串相关的工具。这些库为字符串处理提供了更高效、更简洁的方法&#xff0c;相比标准库功能更为丰富。 1. Boost.StringAlgo 简介 Boost.StringAl…

数据结构:栈(Stack)和队列(Queue)—面试题(二)

1. 用队列实现栈。 习题链接https://leetcode.cn/problems/implement-stack-using-queues/description/描述&#xff1a; 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&a…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器&#xff0c;基于 Region 内存布局的&#xff0c;不设分代&#xff0c;使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障&#xff0c;而 ZGC 用到了读屏障 染色指针&a…

2025年01月13日Github流行趋势

1. 项目名称&#xff1a;Jobs_Applier_AI_Agent 项目地址url&#xff1a;https://github.com/feder-cr/Jobs_Applier_AI_Agent项目语言&#xff1a;Python历史star数&#xff1a;25929今日star数&#xff1a;401项目维护者&#xff1a;surapuramakhil, feder-cr, cjbbb, sarob…