目录
1. 传递单个参数
1.1 关于参数名的问题
2. 传递多个参数
2.1 关于参数顺序的问题
2.2 关于基本类型与包装类的问题
3. 使用对象传参
4. 后端参数重命名问题
4.1 关于@RequestPara注解
1. 传递单个参数
现创建Spring MVC项目,.java文件内容如下:
package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/M1")public String m1(String name){return "Parameter has Received: Name:"+name;}
}
运行启动类,使用Postman向目标地址发送一个GET请求,将待传参数置于query string中,发送的请求与得到的响应如下::
1.1 关于参数名的问题
请注意:客户端传递给服务器的参数应与服务器创建的参数名相同;
对于传递单个参数的底层逻辑就是从请求的参数中获取参数名为name的值,并给name赋值;
2. 传递多个参数
在Spring MVC项目的.java文件内容如下:
package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/M2")public String M2(String name, Integer age){return "Parameters have received: \n"+ "Name: "+name + "; Age: "+age;}
}
运行启动类后,构造HTTP请求并发送,详情如下:
2.1 关于参数顺序的问题
注:多个参数传参,与参数的顺序无关,仅与参数名是否匹配有关;
2.2 关于基本类型与包装类的问题
现以基本类型 int 与 包装类Integer 为例:
现Spring MVC项目的.java文件内容如下:
package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController@RequestMapping("/M3")public String M3(String name, int age){return "Parameters have received: \n"+ "Name: "+name + "; Age: "+age;}
}
示例1:当 int 型参数有具体传参时:
运行启动类,构造HTTP请求并发送,详情如下:
可见接收正常,返回正常;
示例2:当 int 型参数没有具体传参时:
启动运行类,构造HTTP请求并发送,详情如下:
查看报错信息如下:
建议:在开发中尽量使用包装类,如果使用基本类型的参数,必须要传值;
关于包装类的问题,可查看数据结构专栏包装类与泛型一文,链接如下:
【数据结构】_包装类与泛型-CSDN博客https://blog.csdn.net/m0_63299495/article/details/136436372
3. 使用对象传参
如上文所述,当传递的参数个数与类型不同时,就需要频繁修改。
这于前后端配合是非常不便的,在Spring MVC项目中,常使用对象进行传参:
现创建 Person class, 令目录如下:
Person.java文件内容如下:
package com.example.demo;public class Person {Integer id;String name;Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}
ParaController.java内容如下:
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/M4")public String M4(Person person){return "Parameters have received: \n"+ person.toString();}
}
使用postman构造并发送请求,详情如下:
在spring项目开发中,通常使用对象对要传递的参数组进行封装,这样可以简化接口逻辑。
也方便使用一些逻辑进行默认值的设定;
4. 后端参数重命名问题
在前后端配合时,也有可能会出现对于前端传递的参数名(如name),在后端需要进行修改的问题(如username,articlename等等),此时可以使用@RequestParm注解对后端参数重命名:
现.java文件内容如下:
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/M5")public String m5(@RequestParam("name") String username){return "Parameter has Received: Name:"+username;}
}
运行启动类,构造HTTP请求并发送,详情如下:
示例1:前端使用name,后端使用username:
示例2:前端与后端均使用username:
查看日志警告信息:
4.1 关于@RequestPara注解
Ctrl+左键点击查看@RequestPara注解源码:
可见@RequestPara注解默认情况为:
当后端使用@RequestPara注解对后端参数进行重命名时,默认该属性为必传属性;
可以修改为false,取消其必传限制:
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/M5")public String m5(@RequestParam(value = "name",required = false) String username){return "Parameter has Received: Name:"+username;}
}
此时再构造请求发送给服务器: