前面使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,研究一些比较复杂的参数传递,常见的参数种类有:
这些参数如何发送,后台改如何接收?
如果形参与地址参数名不一致该如何解决?
发送请求与参数:
http://localhost/springmvc/user/select?name=张三&age=20
后台接收参数:
@RequestMapping("/user")
@Controller
public class UserController {
@RequestMapping("/select")
@ResponseBody
public String select(String username,Integer age){
System.out.println("普通参数传递 name ==> "+username);
System.out.println("普通参数传递 age ==> "+age);
return "{\"userName\":\""+username+"\",\"age\":"+age+"}";
}
}
因为前端给的是name
,后台接收使用的是userName
,两个名称对不上,导致接收数据失败:
解决方案:使用@RequestParam注解
@RequestMapping("/user")
@Controller
public class UserController {
@RequestMapping("/select")
@ResponseBody
public String select(@RequestParam("name") String username, Integer age){
System.out.println("普通参数传递 name ==> "+username);
System.out.println("普通参数传递 age ==> "+age);
return "{\"userName\":\""+username+"\",\"age\":"+age+"}";
}
}
注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能
简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。
此时需要使用前面准备好的POJO类,先来看下User
public class User {
private String userName;
private Integer userAge;
private String adress;
private String userSex;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
", adress='" + adress + '\'' +
", userSex='" + userSex + '\'' +
'}';
}
}
发送请求和参数:
后台接收参数:
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoUser")
@ResponseBody
public String userInfo(User user){
System.out.println("pojo参数传递 user ==> " + user);
return user.toString();
}
注意:
如果POJO对象中嵌套了其他的POJO类,如
public class City {
private String country;
private String provice;
private String area;
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getProvice() {
return provice;
}
public void setProvice(String provice) {
this.provice = provice;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
@Override
public String toString() {
return "{" +
"country='" + country + '\'' +
", provice='" + provice + '\'' +
", area='" + area + '\'' +
'}';
}
}
public class User {
private String userName;
private Integer userAge;
private String userSex;
private City city;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public Integer getUserAge() {
return userAge;
}
public void setUserAge(Integer userAge) {
this.userAge = userAge;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public City getCity() {
return city;
}
public void setCity(City city) {
this.city = city;
}
@Override
public String toString() {
return "{" +
"userName='" + userName + '\'' +
", userAge=" + userAge +
", userSex='" + userSex + '\'' +
", city=" + city +
'}';
}
}
发送请求和参数:
后台接收参数:
//POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoUser")
@ResponseBody
public String userInfo(User user){
System.out.println("pojo参数传递 user ==> " + user);
return user.toString();
}
注意:
请求参数key的名称要和POJO中属性的名称一致,否则无法封装
举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?
发送请求和参数:
后台接收参数:
//数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] citys){
String arrayStr = Arrays.toString(citys);
System.out.println("Array参数传递 arrayStr ==> " +arrayStr);
return arrayStr;
}
数组能接收多个值,那么集合是否也可以实现这个功能呢?
发送请求和参数:
后台接收参数:
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(List<String> citys){
System.out.println("List参数传递 citys ==> " +citys);
return citys.toString();
}
运行会报错,
错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。
解决方案是:使用@RequestParam
注解
//集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("集合参数传递 likes ==> "+ likes);
return "{'module':'list param'}";
}
名称 | @RequestParam |
---|---|
类型 | 形参注解 |
位置 | SpringMVC控制器方法形参定义前面 |
作用 | 绑定请求参数与处理器方法形参间的关系 |
相关参数 | required:是否为必传参数 defaultValue:参数默认值 |
gitee 代码下载
github 代码下载