深圳维特网站建设,windows 2008 wordpress,北京工程信息网,沈阳妇科哪个医院比较专业2. 响应
前面我们学习过HTTL协议的交互方式#xff1a;请求响应模式#xff08;有请求就有响应#xff09;
那么Controller程序呢#xff0c;除了接收请求外#xff0c;还可以进行响应。
2.1 ResponseBody
在我们前面所编写的controller方法中#xff0c;都已经设置了…2. 响应
前面我们学习过HTTL协议的交互方式请求响应模式有请求就有响应
那么Controller程序呢除了接收请求外还可以进行响应。
2.1 ResponseBody
在我们前面所编写的controller方法中都已经设置了响应数据。 controller方法中的return的结果怎么就可以响应给浏览器呢
答案使用ResponseBody注解
ResponseBody注解 类型方法注解、类注解 位置书写在Controller方法上或类上 作用将方法返回值直接响应给浏览器 如果返回值类型是实体对象/集合将会转换为JSON格式后在响应给浏览器
但是在我们所书写的Controller中只在类上添加了RestController注解、方法添加了RequestMapping注解并没有使用ResponseBody注解怎么给浏览器响应呢
RestController
public class HelloController {RequestMapping(/hello)public String hello(){System.out.println(Hello World ~);return Hello World ~;}
}
原因在类上添加的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注解。 类上有RestController注解或ResponseBody注解时表示当前类下所有的方法返回值做为响应数据 方法的返回值如果是一个POJO对象或集合时会先转换为JSON格式在响应给浏览器 下面我们来测试下响应数据
RestController
public class ResponseController {//响应字符串RequestMapping(/hello)public String hello(){System.out.println(Hello World ~);return Hello World ~;}//响应实体对象RequestMapping(/getAddr)public Address getAddr(){Address addr new Address();//创建实体类对象addr.setProvince(广东);addr.setCity(深圳);return addr;}//响应集合数据RequestMapping(/listAddr)public ListAddress listAddr(){ListAddress list new ArrayList();//集合对象Address addr new Address();addr.setProvince(广东);addr.setCity(深圳);
Address addr2 new Address();addr2.setProvince(陕西);addr2.setCity(西安);
list.add(addr);list.add(addr2);return list;}
}
在服务端响应了一个对象或者集合那私前端获取到的数据是什么样子的呢我们使用postman发送请求来测试下。测试效果如下 2.2 统一响应结果
大家有没有发现一个问题我们在前面所编写的这些Controller方法中返回值各种各样没有任何的规范。 如果我们开发一个大型项目项目中controller方法将成千上万使用上述方式将造成整个项目难以维护。那在真实的项目开发中是什么样子的呢
在真实的项目开发中无论是哪种方法我们都会定义一个统一的返回结果。方案如下 前端只需要按照统一格式的返回结果进行解析(仅一种解析方案)就可以拿到数据。 统一的返回结果使用类来描述在这个结果中包含 响应状态码当前请求是成功还是失败 状态码信息给页面的提示信息 返回的数据给前端响应的数据字符串、对象、集合
定义在一个实体类Result来包含以上信息。代码如下
public class Result {private Integer code;//响应码1 代表成功; 0 代表失败private String msg; //响应码 描述字符串private Object data; //返回的数据
public Result() { }public Result(Integer code, String msg, Object data) {this.code code;this.msg msg;this.data data;}
public Integer getCode() {return code;}
public void setCode(Integer code) {this.code code;}
public String getMsg() {return msg;}
public void setMsg(String msg) {this.msg msg;}
public Object getData() {return data;}
public void setData(Object data) {this.data 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
RestController
public class ResponseController { //响应统一格式的结果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 addr new Address();addr.setProvince(广东);addr.setCity(深圳);return Result.success(addr);}
//响应统一格式的结果RequestMapping(/listAddr)public Result listAddr(){ListAddress list new ArrayList();
Address addr new Address();addr.setProvince(广东);addr.setCity(深圳);
Address addr2 new Address();addr2.setProvince(陕西);addr2.setCity(西安);
list.add(addr);list.add(addr2);return Result.success(list);}
}
使用Postman测试