springmvc的获取请求数据

embedded/2025/1/15 20:22:37/

在使用 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/embedded/154182.html

相关文章

C语言基本知识复习浓缩版:控制语句--分支

选择结构 if语句 if控制语句 #include <stdio.h>int main() { int hour; float money; printf("请输入上网小时数&#xff1a;"); scanf("%d", &hour); if (hour <10) { money 30; }else if (hour >10 && hour <50) { mone…

C# PDF下载地址转图片(Base64 编码)

实现思路&#xff1a; 步骤一、根据PDF地址下载pdf文件保存为临时文件&#xff0c;获得pdf文件的byte[]数组 /// 从指定的 URL 下载 PDF 文件public byte[] DownloadPdf(string url){try{using (WebClient client new WebClient()){return client.DownloadData(url);}}catc…

Codeforces Round 976 (Div. 2) and Divide By Zero 9.0(A-E)

链接&#xff1a;Dashboard - Codeforces Round 976 (Div. 2) and Divide By Zero 9.0 - Codeforces A. Find Minimum Operations 思路 可以观察发现这里有个进制的思想&#xff0c;转换为k进制把每位数相加即可 代码 void solve(){int n,k;cin>>n>>k;if(k1){…

CSS语言的语法

CSS语言的语法与应用 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于描述网页文档外观的样式表语言。它主要用于网页的设计和布局&#xff0c;与HTML&#xff08;超文本标记语言&#xff09;相辅相成。通过CSS&#xff0c;我们可以控制网…

用AI技术提升Flutter开发效率:ScriptEcho的力量

引言 在当今快速发展的技术时代&#xff0c;Flutter作为一种跨平台开发框架&#xff0c;正在越来越多的开发者中崭露头角。它不仅能够为开发者提供一套代码同时部署到iOS和Android平台的解决方案&#xff0c;还能帮助企业节省人力成本和开发时间。然而&#xff0c;对于新手开发…

计算机网络之---SSL/TLS协议

SSL/TLS协议 **SSL&#xff08;Secure Sockets Layer&#xff09;和TLS&#xff08;Transport Layer Security&#xff09;**是加密协议&#xff0c;用于确保通过不安全的网络&#xff08;如互联网&#xff09;传输的数据的安全性和隐私。它们通过提供数据加密、身份验证和数据…

win32汇编环境,窗口程序中单选框的一般操作示例

;运行效果 ;win32汇编环境,窗口程序中单选框的一般操作示例 ;比如在窗口程序中生成单选框&#xff0c;默认哪项选中&#xff0c;判断当前选中哪一项&#xff0c;让哪项选中&#xff0c;得到选中项的名称等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>&g…

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(四)

《拉依达的嵌入式\驱动面试宝典》—操作系统篇(四) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…