SpringMVC项目请求(五种类型参数传递) | 您所在的位置:网站首页 › springmvc参数映射 › SpringMVC项目请求(五种类型参数传递) |
前面使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,研究一些比较复杂的参数传递,常见的参数种类有: 普通参数POJO类型参数嵌套POJO类型参数数组类型参数集合类型参数这些参数如何发送,后台改如何接收? 1. 普通参数 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。如果形参与地址参数名不一致该如何解决? 发送请求与参数: 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注解框架就不需要自己去解析注入,能提升框架处理性能 2. POJO数据类型简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。 POJO参数:请求参数名与形参对象属性名相同,定义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参数接收,前端GET和POST发送请求数据的方式不变。请求参数key的名称要和POJO中属性的名称一致,否则无法封装。 3. 嵌套POJO类型参数如果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参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数发送请求和参数: 后台接收参数: //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递 @RequestMapping("/pojoUser") @ResponseBody public String userInfo(User user){ System.out.println("pojo参数传递 user ==> " + user); return user.toString(); }注意: 请求参数key的名称要和POJO中属性的名称一致,否则无法封装 4. 数组类型参数举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢? 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数发送请求和参数: 后台接收参数: //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中 @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 citys){ System.out.println("List参数传递 citys ==> " +citys); return citys.toString(); }运行会报错, 错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。 解决方案是:使用@RequestParam注解 //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据 @RequestMapping("/listParam") @ResponseBody public String listParam(@RequestParam List likes){ System.out.println("集合参数传递 likes ==> "+ likes); return "{'module':'list param'}"; }gitee 代码下载 github 代码下载 |
CopyRight 2018-2019 实验室设备网 版权所有 |