请求
简单参数
在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
原始方式知道原理即可,实际开发不会采用
在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数:
http请求时,服务器会把请求的相关信息封装到HttpServletRequest对象中
在Controller中,我们要想获取Request对象,可以直接在方法的形参中声明HttpServletRequest 对象。然后就可以通过该对象来获取请求信息:
//根据指定的参数名获取请求参数的数据值
String request.getParameter("参数名")
关于文中出现的注解可在其他文章中了解
@RestController
public class RequestController {
//原始方式
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
// http://localhost:8080/simpleParam?name=Tom&age=10
// 请求参数: name=Tom&age=10 (有2个请求参数)
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
String name = request.getParameter("name");//name就是请求参数名
String ageStr = request.getParameter("age");//age就是请求参数名
int age = Integer.parseInt(ageStr);//需要手动进行类型转换
System.out.println(name+" : "+age);
return "OK";
}
}
SpringBoot方式,主流方式
在Springboot的环境中,对原始的API进行了封装,接收参数的形式更加简单。 如果是简单参数,参数名与形参变量名相同,定义同名的形参即可接收参数。
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=10
// 第1个请求参数: name=Tom 参数名:name,参数值:Tom
// 第2个请求参数: age=10 参数名:age , 参数值:10
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name , Integer age ){
//形参名和请求参数名保持一致
System.out.println(name+" : "+age);
return "OK";
}
}
请求参数名与形参变量名不一样会发生什么?controller方法中的形参还能接收到请求参数值吗?
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=20
// 请求参数名:name
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String username , Integer age ){
//请求参数名和形参名不相同
System.out.println(username+" : "+age);
return "OK";
}
}
运行没有报错。 controller方法中的username值为:null,age值为20
结论:对于简单参数来讲,请求参数名和controller方法中的形参名不一致时,无法接收到请求数据
如何处理?
使用Spring提供的@RequestParam注解完成映射,在方法形参前面加上 @RequestParam 然后通过value属性执行请求参数名,从而完成映射。代码如下:
@RestController
public class RequestController {
// http://localhost:8080/simpleParam?name=Tom&age=20
// 请求参数名:name
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam("name") String username, Integer age ){
System.out.println(username+" : "+age);
return "OK";
}
}
注意:@RequestParam中的required属性默认为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错,但可以手动设置为false
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name = "name", required =
false) String username, Integer age){
System.out.println(username+ ":" + age);
return "OK";
}
实体参数
在使用简单参数做为数据传递方式时,前端传递了多少个请求参数,后端controller方法中的形参就要书写多少个。如果请求参数比较多,通过上述的方式一个参数一个参数的接收,会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:
-
简单实体参数
-
复杂实体参数
请求参数名与形参对象属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。
在实体类中有一个或多个属性,也是实体对象类型的。如:User类中有一个Address类型的属性(Address是一个实体类)
-
数组集合参数
在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值- 请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
- 请求参数名与形参集合对象名相同且请求参数为多个,@RequestParam 绑定参数关系
- 请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数
日期参数
因为日期的格式多种多样(如:2022-12-12 10:05:45 、2022/12/12 10:05:45),那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
- @DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。
- 后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。
JSON参数
- 传递json格式的参数,在Controller中会使用实体类进行封装。
- 封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用@RequestBody标识。
路径参数
传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面通过?key=value的形式传递(GET请求)
在现在的开发中,经常还会直接在请求的URL中传递参数。例如:
http://localhost:8080/user/1
http://localhost:880/user/1/0
- 前端:通过请求URL直接传递参数
- 后端:使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数