文章目录
1.简单参数
简单参数:在向服务器发起请求时,向服务器传递的是一些普通的请求数据。
1.1 原始方式(HttpServletRequest)
在原始的Web程序当中,需要通过Servlet中提供的API:HttpServletRequest(请求对象),获取请求的相关信息。
//原始方式
@RequestMapping("/simpleParam")
public String simpleParam(HttpServletRequest request){
//从HttpServletRequest对象中获取名为"name"的请求参数
String name=request.getParameter("name");
//从HttpServletRequest对象中获取名为"age"的请求参数
String ageStr=request.getParameter("age");
//将获取到的年龄字符串转换为整型
int age=Integer.parseInt(ageStr);
//在控制台中打印出获取到的信息
System.out.println(name+";"+age);
//返回获取到的信息
return (name+";"+age);
}
1.2 Springboot方式
在Springboot的环境中,对原始的API进行了封装,如果是简单参数,则请求参数名要与形参名相同,定义同名的形参即可接收参数。
//springboot方式
@RequestMapping("/simpleParam")
public String simpleParam(String name,Integer age){//形参名和请求参数名保持一致
System.out.println(name+";"+age);
return "OK";
}
1.3 参数名不一致(@RequestParam)
如果形参名与请求参数名不一致,那么值会为null
解决方案:使用Spring提供的@RequestParam注解完成映射,那么请求参数名就要跟name的值一致,而不是跟形参名一致
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name111") String username, Integer age){
return (username+";"+age);
}
如果@RequestParam中的required属性为true(默认值也是true),代表该请求参数必须传递,如果不传递将报错
将required属性设置为false,将不会报错,而是为null
@RequestMapping("/simpleParam")
public String simpleParam(@RequestParam(name="name",required = false) String username, Integer age){
return (username+";"+age);
}
2.实体参数
将请求参数封装到一个实体类对象中,请求参数名要与与实体类的属性名相同
2.1 简单实体参数
User实体类:
@Data
public class User {
private String name;
private Integer age;
}
Controller方法:
//实体参数:简单实体对象
@RequestMapping("/simplePojo")
public User simplePojo(User user){
return user;
}
2.2 复杂实体参数
复杂实体对象指的是,在实体类中有一个或多个属性,也是实体对象类型的。
例如:User类中有一个Address类型的属性(Address是一个实体类)
User实体类:
@Data
public class User {
private String name;
private Integer age;
private Address address; //地址对象
}
Address实体类:
@Data
public class Address {
private String province;
private String city;
}
Controller方法:
//实体参数:复杂实体对象
@RequestMapping("/complexPojo")
public User complexPojo(User user){
return user;
}
3.JSON参数(@RequestBody)
在前后端进行交互时,如果是比较复杂的参数,前后端通过会使用JSON格式的数据进行传输。
传递json格式的参数,在Controller中会使用实体类进行封装。
封装规则:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数。需要使用 @RequestBody标识。
//JSON参数
@RequestMapping("/jsonParam")
public User jsonParam(@RequestBody User user){
return user;
}
@RequestBody注解:将JSON数据映射到形参的实体类对象中(JSON中的key和实体类中的属性名保持一致)
4.路径参数(@PathVariable)
传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面传递(GET请求)。但在现在的开发中,经常还会直接在请求的URL中传递参数。
传统请求参数:
http://localhost:8080/user?name=hs&age=18
直接在请求的URL中传递参数:
http://localhost:8080/user/1
http://localhost:880/user/1/0
4.1 单个路径参数
使用{xx}来标识该路径参数,需要使用@PathVariable获取路径参数
//路径参数
@RequestMapping("/pathParam/{id}")
public Integer pathParam(@PathVariable Integer id){
return id;
}
4.2 传递多个路径参数
继续加/{xx}
//多个路径参数
@RequestMapping("/pathParam/{id}/{name}")
public String pathParam(@PathVariable Integer id,@PathVariable String name){
return (id+","+name);
}
5.数组集合参数
数组集合参数的使用场景:在HTML的表单中,有一个表单项是支持多选的(复选框),可以提交选择的多个值。
后端程序接收上述多个值的方式有两种:
1.数组
2.集合
5.1 数组参数
//数组参数
@RequestMapping("/arrayParam")
public String arrayParam(String[] hobby){
return Arrays.toString(hobby);
}
请求参数名与形参数组名称相同,且请求参数为多个,定义数组类型形参即可接收参数
在前端请求时,有两种传递形式:
方式一: ?hobby=game&hobby=java
方式二: ?hobby=game,java
5.2 集合参数(@RequestParam)
默认情况下,请求中参数名相同的多个值,是封装到数组。如果要封装到集合,要使用@RequestParam绑定参数关系
@RequestMapping("/listParam")
public List listParam(@RequestParam List<String> hobby){
return hobby;
}
在前端请求时,有两种传递形式:
方式一: ?hobby=game&hobby=java
方式二: ?hobby=game,java
6.日期参数(@DateTimeFormat)
在一些特殊的需求中,可能会涉及到日期类型数据的封装。
因为日期的格式多种多样,那么对于日期类型的参数在进行封装的时候,需要通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。
@DateTimeFormat注解的pattern属性中指定了哪种日期格式,前端的日期参数就必须按照指定的格式传递。
后端controller方法中,需要使用Date类型或LocalDateTime类型,来封装传递的参数。
//日期参数
@RequestMapping("/dateParam")
public LocalDateTime dataParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
return updateTime;
}
7.响应
7.1 @ResponseBody
@ResponseBody注解:
- 类型:方法注解、类注解
- 位置:书写在Controller方法上或类上
- 作用:将方法返回值直接响应给浏览器
- 如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器
在类上添加的@RestController注解,是一个组合注解。@RestController = @Controller + @ResponseBody
@RestController源码:
@Target({ElementType.TYPE}) //元注解(修饰注解的注解)
@Retention(RetentionPolicy.RUNTIME) //元注解
@Documented //元注解
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(
annotation = Controller.class
)
String value() default "";
}
类上有@RestController注解或@ResponseBody注解时:表示当前类下所有的方法返回值做为响应数据,方法的返回值,如果是一个POJO对象或集合时,会先转换为JSON格式,在响应给浏览器
7.2 统一响应结果
统一的返回结果使用类来描述,在这个结果中包含:
- 响应状态码:当前请求是成功,还是失败
- 状态码信息:给页面的提示信息
- 返回的数据:给前端响应的数据(字符串、对象、集合)
定义在一个实体类Result来包含以上信息。代码如下:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Result {
private Integer code;//响应码,1 代表成功; 0 代表失败
private String msg; //响应码 描述字符串
private Object data; //返回的数据
//增删改 成功响应(不需要给前端返回数据)
public static Result success(){
return new Result(1,"success",null);
}
//查询 成功响应(把查询结果做为返回数据响应给前端)
public static Result success(Object data){
return new Result(1,"success",data);
}
//失败响应
public static Result error(String msg){
return new Result(0,msg,null);
}
}
改造Controller:
//响应统一格式的结果
@RequestMapping("/hello")
public Result hello(){
System.out.println("Hello World ~");
return Result.success("Hello World ~");
}