springmvc的获取请求数据
在使用 SpringMVC 开发 web 应用时,我们经常需要从用户的请求中获取数据。不管是表单提交、查询参数,还是路径上的数据,SpringMVC 都为我们提供了简单而强大的方式来获取这些数据。
1. 使用 @RequestParam
获取查询参数
- 基本使用:
RequestParam注解作用:将请求参数
与方法上的形参
映射。
最常见的情况就是获取请求路径中的查询参数,比如?name=Grace&age=25
。在 SpringMVC 中,可以使用@RequestParam
注解来轻松获取这些参数:
@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。
- RequestParam注解的defaultValue属性
@RequestParam
允许你指定参数的名称,如果这个参数是必需的,你可以省略其他配置。你还可以为它指定默认值,以防请求中缺少该参数:
@RequestParam(value = "country", defaultValue = "Unknown") String country
- RequestParam注解的required属性
required属性
用来设置该方法参数是否为必须的。默认情况下,这个参数为
true,表示方法参数是必需的。如果请求中缺少对应的参数,则会抛出异常。 可以将其设置为false
,false表示不是必须的,如果请求中缺少对应的参数,则方法的参数为null。
测试,修改register方法,如下:
@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>
@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:
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", sex='" + sex + '\'' +
", hobby=" + Arrays.toString(hobby) +
", intro='" + intro + '\'' +
'}';
}
}
在控制器方法的形参位置上使用javabean来接收请求参数:
@PostMapping("/register")
public String register(User user){
System.out.println(user);
return "success";
}
底层的实现原理:反射机制。先获取请求参数的名字,因为请求参数的名字就是JavaBean的属性名,通过这种方式给对应的属性赋值。究其根本就是找到其Set方法
4. 使用 HttpServletRequest
手动获取请求数据
当然,有时你可能需要更底层的操作,这时候可以使用 HttpServletRequest
,它让你可以直接获取所有请求信息:
@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">
function sendCookie(){
document.cookie = "id=123456789; expires=Thu, 18 Dec 2025 12:00:00 UTC; path=/";
document.location = "/springmvc/register";
}
</script>
<button onclick="sendCookie()">向服务器端发送Cookie</button>
后端UserController代码:
@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";
}