访问不同的路径,就是发送不同的请求.在发送请求时,可能会带?些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收.
下面博主会对传递参数进行一个详解,咱们主要是使?浏览器和Postman来模拟
比如博主写了以下程序
@RequestMapping("pt")
@RestController
public class Test_1_12 {
@RequestMapping("test1")
public String test1(String name) {
return "接收到的参数名为:" + name;
}
}
当我们运行后,用浏览器进行访问
http://127.0.0.1:8080/pt/test1?name=遇事问春风
访问结果如下:
注意:
@RequestMapping("test2")
public String test2(Integer year) {
return "接收到的参数名为:" + year;
}
@RequestMapping("test2")
public String test2(Integer year) {
return "接收到的参数名为:" + year;
}
@RequestMapping("test3")
public String test3(int year) {
return "接收到的参数名为:" + year;
}
日志中也会进行报错。
与传递单个参数一样
不同的是当有多个参数时,前后端进?参数匹配时,是以参数的名称进?匹配的,因此参数的位置是不影响后端获取参数的结果
@RequestMapping("test4")
public String test4(String name,Integer year) {
return "接收到的参数名为:" + name + " " + year;
}
如果参数?较多时,?法声明就需要有很多形参.并且后续每次新增?个参数,也需要修改?法声明.
我们不妨把这些参数封装为?个对象.
Spring MVC也可以?动实现对象参数的赋值,?如Person对象
public class Person {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}
@RequestMapping("test5")
public String test5(Person person) {
return "接收到的参数名为:" + person.toString();
}
注意:
某些特殊的情况下,前端传递的参数key和我们后端接收的key可以不?致,?如前端传递了?个time给后端,?后端是使?createtime字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使? @RequestParam 来重命名前后端的参数值.
@RequestMapping("test6")
public String test6(@RequestParam("time") String createtime) {
return "接收到的参数名为:" + createtime;
}
注意:
如果我们不想让他变成必传参数,我们可以通过设置@RequestParam 中的 required=false (默认为true,必传)来避免不传递时报错
@RequestMapping("test6")
public String test6(@RequestParam(value = "time",required = false) String createtime) {
return "接收到的参数名为:" + createtime;
}
Spring MVC 可以?动绑定数组参数的赋值
@RequestMapping("test7")
public String test7(String[] names) {
return "接收到的参数名为:" + Arrays.toString(names);
}
数组传参时,有以下几种:
1:http://127.0.0.1:8080/pt/test7?names=张三&names=李四
2:http://127.0.0.1:8080/pt/test7?names=张三%2c李四
3:http://127.0.0.1:8080/pt/test7?names=张三,李四
集合参数:和数组类似,同?个请求参数名有为多个
不同的时需要使? @RequestParam 绑定参数关系
传参方式与上述数组传参三种方式一样
@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){
return "size:"+listParam.size() + ",listParam:"+listParam;
}
JSON:JavaScript Object Notation【JavaScript对象表?法】
JSON是?种轻量级的数据交互格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的?个?集,采?完全独?于编程语?的?本格式来存储和表?数据。
简单来说:JSON就是?种数据格式,有??的格式和语法,使??本表??个对象或数组的信息,因此JSON本质是字符串.
主要负责在不同的语?中数据传递和交换
数据在 键值对(Key/Value) 中
数据由逗号 , 分隔
对象? {} 表?
数组? [] 表?
值可以为对象,也可以为数组,数组中可以包含多个对象
JSON本质上是?个字符串,通过?本来存储和描述数据
Spring MVC框架也集成了JSON的转换?具,我们可以直接使?,来完成JSON字符串和Java对象的互转
简单易?:语法简单,易于理解和编写,可以快速地进?数据交换
跨平台?持:JSON可以被多种编程语?解析和?成,可以在不同的平台和语?之间进?数据交换和传输
轻量级:相较于XML格式,JSON数据格式更加轻量级,传输数据时占?带宽较?,可以提?数据传输速度
易于扩展:JSON的数据结构灵活,?持嵌套对象和数组等复杂的数据结构,便于扩展和使?
安全性:JSON数据格式是?种纯?本格式,不包含可执?代码,不会执?恶意代码,因此具有较?的安全性
基于以上特点,JSON在Web应?程序中被?泛使?,如前后端数据交互、API接?数据传输等
接收JSON对象,需要使? @RequestBody 注解
RequestBody:请求正?,意思是这个注解作?在请求正?的数据绑定,请求参数必须在写在请求正?中
@RequestMapping("test9")
public String test9(@RequestBody Person person) {
return "接收到的参数名为:" + person.toString();
}
我们使用使?Postman来发送json请求参数
path variable:路径变量
和字?表达的意思?样,这个注解主要作?在请求URL路径上的数据绑定
@RequestMapping("/test10/{id}/{name}")
public String test10(@PathVariable Integer id, @PathVariable("name") String userName){
return "解析参数id:"+id+",name:"+userName;
}
注意:
如果?法参数名称和需要绑定的URL中的变量名称?致时,可以简写,不?给@PathVariable的属性赋值,如上述例?中的id变量
如果?法参数名称和需要绑定的URL中的变量名称不?致时,需要@PathVariable的属性value赋值,如上述例?中的userName变量
代码实现如下:
@RequestMapping("/test11")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
//获取?件名称
String fileName = file.getOriginalFilename();
//?件上传到指定路径
file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
return "接收到?件名称为: "+fileName;
}
我们这里使用Postman发送请求
我们到相应路径进行查看是否上穿成功
由于这部分内容较多,博主单独写了出来。链接如下:
获取Header也分为两种方式
@RequestMapping("/test17")
public String test17(HttpServletRequest request, HttpServletResponse response) {
String userAgent = request.getHeader("User-Agent");
return "userAgent:"+userAgent;
}
@RequestMapping("/test18")
public String test18(@RequestHeader("User-Agent") String userAgent) {
return "userAgent:"+userAgent;
}
关于《【JavaEE进阶】 Spring请求如何传递参数详解》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!