一.@ResponseBody注解
我们通过@ResponseBody注解来将方法的返回值直接响应,如果返回值类型是实体对象/集合,将会转换为JSON格式响应。
那为何在方法/类上没有加@ResponseBody呢?那是因为当类/方法上加了@RestController注解时,就相当于加了@ResponseBody
package com.gjw.controller;
import com.gjw.pojo.Address;
import com.gjw.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 测试响应数据
*/
@RestController
public class ResponseController {
// 我们在Controller当中定义的每一个对外暴露的方法,我们称之为一个功能接口
@RequestMapping("/hello")
public String hello() {
System.out.println("hello world!");
return "hello world";
}
@RequestMapping("/getAddr")
public Address getAddr(){
Address address = new Address();
address.setProvince("江苏");
address.setCity("南京");
return address;
}
@RequestMapping("/listAddr")
public List<Address> listAddr(){
List<Address> list = new ArrayList<>();
Address addr1 = new Address("河南", "郑州");
Address addr2 = new Address("陕西", "西安");
list.add(addr1);
list.add(addr2);
return list;
}
}
@RestController注解会将方法中return的值作为响应数据直接相应给浏览器。
hello路径会直接返回一个"hello world"字符串浏览器。
getAddr路径会直接返回一个Address类型的对象,会转换为JSON格式响应。
listAddr路径会返回一个List对象,也会转换为JSON格式响应。
二. 统一响应结果
这样的响应显得太杂乱无章了,有时以字符串响应,有时以JSON格式的数据响应。因此如果我们能够规定一个数据的统一响应格式,将大大的提高数据的可读性,也便于前端人员的开发和维护。
因此我们定义一个Result类代表响应的结果类,该类中有三个属性,其中包括:
* code:状态码(0:失败,1:成功)
* msg:响应状态(success:成功,error:失败)
* data:响应数据
package com.gjw.pojo;
/**
* 目标:定义一个返回结果类,用来定义所有类型的响应对象,其中包括:
* code:响应码
* msg:响应状态
* data:响应数据
*/
public class Result {
private Integer code;
private String msg;
private Object data; // 响应数据无法确定数据类型,就使用Object类型
public Result() {
}
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 定义静态方法用来更好的返回数据(两个success,但是参数的个数/类型不同,属于方法的重载)
public static Result success(Object data){
return new Result(1,"success",data);
}
//
public static Result success(){
return new Result(1,"success",null);
}
public static Result error(){
return new Result(0,"error",null);
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", msg='" + msg + '\'' +
", data=" + data +
'}';
}
}
定义好后,我们每次响应一个Result对象即可,该对象当中包含了此次相应的状态码,响应状态以及响应数据。为了能够方便响应,我们可以定义重载的静态方法来直接调用静态方法返回生成的Result对象,并且根据是否需要返回参数来选择不同的静态方法。
以下是通过改造的统一响应结果:
package com.gjw.controller;
import com.gjw.pojo.Address;
import com.gjw.pojo.Result;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 测试响应数据
*/
@RestController
public class ResponseController {
// 我们在Controller当中定义的每一个对外暴露的方法,我们称之为一个功能接口
@RequestMapping("/hello")
public Result hello() {
System.out.println("hello world!");
// return new Result(1,"success","hello world!");
return Result.success("hello world!");
}
@RequestMapping("/getAddr")
public Result getAddr(){
Address address = new Address();
address.setProvince("江苏");
address.setCity("南京");
return Result.success(address);
}
@RequestMapping("/listAddr")
public Result listAddr(){
List<Address> list = new ArrayList<>();
Address addr1 = new Address("河南", "郑州");
Address addr2 = new Address("陕西", "西安");
list.add(addr1);
list.add(addr2);
return Result.success(list);
}
}