目录
原生方式获取请求参数
控制器方法形参获取请求参数
@RequestParam注解
@RequestHeader注解
@CookieValue注解
通过POJO获取请求参数
html代码
测试原生Servlet获取请求参数
接收参数代码
@RequestMapping(value = "/testServlet")
//形参位置的request表示当前请求
public String testServlet(HttpServletRequest request) {
System.out.println(request.getParameter("username"));
System.out.println(request.getParameter("password"));
return "test";
}
这种方式当然可以接收到传递过来的参数,但是方式略显繁琐。
html代码
测试使用控制器的形参获取请求参数
接收代码,直接将传递过来的参数名写成函数形参来获取对应的值。
@RequestMapping(value = "/testParam")
public String testParam(String username, String password) {
System.out.println("username = " + username + ", passwprd = " + password);
return "test";
}
输出内容
当然通过控制器方法形参获取请求参数还有几个我们需要注意的地方。
使用这一个注解,可以在请求参数和形参之间建立映射关系,大致意思就是获取到传递过来的这一参数然后赋值给形参。@RequestParam注解有三个属性:
value属性:设置指定的请求参数名。
required属性:设置是否必须传输此参数,默认值为true,如果设置为true但是没有接收到这一个参数,那么将会报错。
defaultValue属性:设置参数的默认值,不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值为空字符串时,则使用默认值为形参赋值。
例如我们修改传递过来的参数,下面只传递了参数名为username007的用户名,并且没有传递密码。
测试使用控制器的形参获取请求参数
接收参数代码
@RequestMapping(value = "/testParam")
public String testParam(@RequestParam(value = "username007", required = false, defaultValue = "默认username") String username,
@RequestParam(value = "password007", required = false, defaultValue = "默认password") String password) {
System.out.println("username = " + username + ", passwprd = " + password);
return "test";
}
输出结果
从输出结果可以看出,由于我们传递了username007,@RequestParam注解讲其内容传递给了形参username,但是我们并没有传递password007,所以使用的是默认值。
使用这一个注解,可以将请求头信息和控制器方法的形参创建映射关系,@RequestHeader注解也有三个属性:value属性,required属性,defaultValue属性,用法同@RequestParam。
首先查看请求标头的信息如下
html代码
测试使用控制器的形参获取请求参数
接收参数代码
@RequestMapping(value = "/testParam")
public String testParam(
@RequestHeader(value = "Host", required = false, defaultValue = "默认Host") String host,
@RequestHeader(value = "Cookie", required = false, defaultValue = "默认Cookie") String cookie,
String username, String password) {
System.out.println("username = " + username + ", passwprd = " + password);
System.out.println("Host = " + host + ", Cookie = " + cookie);
return "test";
}
输出结果
从输出结果我们可以看出,程序获取到了请求头的Host和Cookie信息,并且传递给了形参。相比于原生的ServletAPI获取请求头的信息,这种方式更加高效简便。
使用这一个注解,可以将cookie数据和控制器方法的形参创建映射关系, @CookieValue注解一共有三个属性:value属性、required属性、defaultValue属性,用法同@RequestParam。
通过查看请求头的信息,我们可以看到Cookie数据如下
html代码
测试使用控制器的形参获取请求参数
接收参数代码
@RequestMapping(value = "/testParam")
public String testParam(
@CookieValue("JSESSIONID") String JSESSIONID,
String username, String password) {
System.out.println("username = " + username + ", passwprd = " + password);
System.out.println("JSESSIONID = " + JSESSIONID);
return "test";
}
输出结果
相当于获取到了Cookie中的JSESSIONID属性下的信息。
想一想,要是我们提交的是一个表单,并且表单的提交内容十分的多,那我们岂不是要写很多个形参,而且也不方便维护,所以当参数很多时,我们可以用一个实体类来接收数据并进行操作。当浏览器传输的请求参数的参数名和实体类中的属性名一致时,请求参数就会为此属性赋值。其底层原理是通过反射set方法进行属性注入。
如果通过POJO获取请求参数出现了乱码问题,可以先在web.xml文件当中配置过滤器设置编码。
web.xml文件配置过滤器代码
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceResponseEncoding
true
CharacterEncodingFilter
/*
html代码
实体类代码,就相当于根据表单设置了对应的属性,然后生成了属性的set和get方法,创建了对应的构造方法和空构造方法。
package com.mvc.bean;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String location;
private String phoneNumber;
private String sex;
private String email;
public User() {
}
public User(Integer id, String username, String password, Integer age, String location, String phoneNumber, String sex, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.location = location;
this.phoneNumber = phoneNumber;
this.sex = sex;
this.email = email;
}
//属性的get和set方法这里写出,太占篇幅了。
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", location='" + location + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
接收代码
@RequestMapping(value = "/testBean")
public String testBean(User user) {
System.out.println(user);
return "test";
}
测试
输出结果
这种方式可以很方便的接收数据并且进行相对于的数据库操作。