SpringMVC项目请求(五种类型参数传递)

以你之姓@ 2024-04-01 14:30 137阅读 0赞

前面使用GET或POST来发送请求和数据,所携带的数据都是比较简单的数据,接下来在这个基础上,研究一些比较复杂的参数传递,常见的参数种类有:

  • 普通参数
  • POJO类型参数
  • 嵌套POJO类型参数
  • 数组类型参数
  • 集合类型参数

这些参数如何发送,后台改如何接收?

1. 普通参数

  • 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。

在这里插入图片描述

如果形参与地址参数名不一致该如何解决?

发送请求与参数:

  1. http://localhost/springmvc/user/select?name=张三&age=20

后台接收参数:

  1. @RequestMapping("/user")
  2. @Controller
  3. public class UserController {
  4. @RequestMapping("/select")
  5. @ResponseBody
  6. public String select(String username,Integer age){
  7. System.out.println("普通参数传递 name ==> "+username);
  8. System.out.println("普通参数传递 age ==> "+age);
  9. return "{\"userName\":\""+username+"\",\"age\":"+age+"}";
  10. }
  11. }

因为前端给的是name,后台接收使用的是userName,两个名称对不上,导致接收数据失败:

在这里插入图片描述

解决方案:使用@RequestParam注解

  1. @RequestMapping("/user")
  2. @Controller
  3. public class UserController {
  4. @RequestMapping("/select")
  5. @ResponseBody
  6. public String select(@RequestParam("name") String username, Integer age){
  7. System.out.println("普通参数传递 name ==> "+username);
  8. System.out.println("普通参数传递 age ==> "+age);
  9. return "{\"userName\":\""+username+"\",\"age\":"+age+"}";
  10. }
  11. }

在这里插入图片描述

注意:写上@RequestParam注解框架就不需要自己去解析注入,能提升框架处理性能

2. POJO数据类型

简单数据类型一般处理的是参数个数比较少的请求,如果参数比较多,那么后台接收参数的时候就比较复杂,这个时候我们可以考虑使用POJO数据类型。

  • POJO参数:请求参数名与形参对象属性名相同,定义POJO类型形参即可接收参数

此时需要使用前面准备好的POJO类,先来看下User

  1. public class User {
  2. private String userName;
  3. private Integer userAge;
  4. private String adress;
  5. private String userSex;
  6. public String getUserName() {
  7. return userName;
  8. }
  9. public void setUserName(String userName) {
  10. this.userName = userName;
  11. }
  12. public Integer getUserAge() {
  13. return userAge;
  14. }
  15. public void setUserAge(Integer userAge) {
  16. this.userAge = userAge;
  17. }
  18. public String getAdress() {
  19. return adress;
  20. }
  21. public void setAdress(String adress) {
  22. this.adress = adress;
  23. }
  24. public String getUserSex() {
  25. return userSex;
  26. }
  27. public void setUserSex(String userSex) {
  28. this.userSex = userSex;
  29. }
  30. @Override
  31. public String toString() {
  32. return "User{" +
  33. "userName='" + userName + '\'' +
  34. ", userAge=" + userAge +
  35. ", adress='" + adress + '\'' +
  36. ", userSex='" + userSex + '\'' +
  37. '}';
  38. }
  39. }

发送请求和参数:

在这里插入图片描述

后台接收参数:

  1. //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
  2. @RequestMapping("/pojoUser")
  3. @ResponseBody
  4. public String userInfo(User user){
  5. System.out.println("pojo参数传递 user ==> " + user);
  6. return user.toString();
  7. }

在这里插入图片描述

注意:

  • POJO参数接收,前端GET和POST发送请求数据的方式不变。
  • 请求参数key的名称要和POJO中属性的名称一致,否则无法封装。

3. 嵌套POJO类型参数

如果POJO对象中嵌套了其他的POJO类,如

  1. public class City {
  2. private String country;
  3. private String provice;
  4. private String area;
  5. public String getCountry() {
  6. return country;
  7. }
  8. public void setCountry(String country) {
  9. this.country = country;
  10. }
  11. public String getProvice() {
  12. return provice;
  13. }
  14. public void setProvice(String provice) {
  15. this.provice = provice;
  16. }
  17. public String getArea() {
  18. return area;
  19. }
  20. public void setArea(String area) {
  21. this.area = area;
  22. }
  23. @Override
  24. public String toString() {
  25. return "{" +
  26. "country='" + country + '\'' +
  27. ", provice='" + provice + '\'' +
  28. ", area='" + area + '\'' +
  29. '}';
  30. }
  31. }
  32. public class User {
  33. private String userName;
  34. private Integer userAge;
  35. private String userSex;
  36. private City city;
  37. public String getUserName() {
  38. return userName;
  39. }
  40. public void setUserName(String userName) {
  41. this.userName = userName;
  42. }
  43. public Integer getUserAge() {
  44. return userAge;
  45. }
  46. public void setUserAge(Integer userAge) {
  47. this.userAge = userAge;
  48. }
  49. public String getUserSex() {
  50. return userSex;
  51. }
  52. public void setUserSex(String userSex) {
  53. this.userSex = userSex;
  54. }
  55. public City getCity() {
  56. return city;
  57. }
  58. public void setCity(City city) {
  59. this.city = city;
  60. }
  61. @Override
  62. public String toString() {
  63. return "{" +
  64. "userName='" + userName + '\'' +
  65. ", userAge=" + userAge +
  66. ", userSex='" + userSex + '\'' +
  67. ", city=" + city +
  68. '}';
  69. }
  70. }
  • 嵌套POJO参数:请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套POJO属性参数

发送请求和参数:

在这里插入图片描述

后台接收参数:

  1. //POJO参数:请求参数与形参对象中的属性对应即可完成参数传递
  2. @RequestMapping("/pojoUser")
  3. @ResponseBody
  4. public String userInfo(User user){
  5. System.out.println("pojo参数传递 user ==> " + user);
  6. return user.toString();
  7. }

在这里插入图片描述

注意:

请求参数key的名称要和POJO中属性的名称一致,否则无法封装

4. 数组类型参数

举个简单的例子,如果前端需要获取用户的爱好,爱好绝大多数情况下都是多个,如何发送请求数据和接收数据呢?

  • 数组参数:请求参数名与形参对象属性名相同且请求参数为多个,定义数组类型即可接收参数

发送请求和参数:

在这里插入图片描述

后台接收参数:

  1. //数组参数:同名请求参数可以直接映射到对应名称的形参数组对象中
  2. @RequestMapping("/arrayParam")
  3. @ResponseBody
  4. public String arrayParam(String[] citys){
  5. String arrayStr = Arrays.toString(citys);
  6. System.out.println("Array参数传递 arrayStr ==> " +arrayStr);
  7. return arrayStr;
  8. }

在这里插入图片描述

5. 集合类型参数

数组能接收多个值,那么集合是否也可以实现这个功能呢?

发送请求和参数:

在这里插入图片描述

后台接收参数:

  1. //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
  2. @RequestMapping("/listParam")
  3. @ResponseBody
  4. public String listParam(List<String> citys){
  5. System.out.println("List参数传递 citys ==> " +citys);
  6. return citys.toString();
  7. }

运行会报错,

在这里插入图片描述

错误的原因是:SpringMVC将List看做是一个POJO对象来处理,将其创建一个对象并准备把前端的数据封装到对象中,但是List是一个接口无法创建对象,所以报错。

解决方案是:使用@RequestParam注解

  1. //集合参数:同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
  2. @RequestMapping("/listParam")
  3. @ResponseBody
  4. public String listParam(@RequestParam List<String> likes){
  5. System.out.println("集合参数传递 likes ==> "+ likes);
  6. return "{'module':'list param'}";
  7. }

在这里插入图片描述

  • 集合保存普通参数:请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam绑定参数关系
  • 对于简单数据类型使用数组会比集合更简单些。

知识点1:@RequestParam


























名称 @RequestParam
类型 形参注解
位置 SpringMVC控制器方法形参定义前面
作用 绑定请求参数与处理器方法形参间的关系
相关参数 required:是否为必传参数
defaultValue:参数默认值

项目代码

  • gitee 代码下载
  • github 代码下载

发表评论

表情:
评论列表 (有 0 条评论,137人围观)

还没有评论,来说两句吧...

相关阅读

    相关 springMVC参数传递

    本文是本人在学习网络视屏springMVC的过程中的学习笔记。 为了更便于理解我决定从实际使用的角度解释。 我们在浏览器输入地址 http://localhost:808