文章目录
- 一、传统同步业务数据响应
- 1. 请求资源转发
- 2. 请求资源重定向
- 3. 响应模型数据
- 4. 直接回写数据
- 二、前后端分离异步业务数据响应
一、传统同步业务数据响应
Spring响应数据给客户端,主要分为两大部分:
⚫ 传统同步方式:准备好模型数据,在跳转到执行页面进行展示,此方式使用越来越少了,基于历史原因,一些旧项目还在使用;
⚫ 前后端分离异步方式:前端使用Ajax技术+Restful风格与服务端进行Json格式为主的数据交互,目前几乎都是此种方式了。传统同步业务在数据响应时,SpringMVC又涉及如下四种形式:
⚫ 请求资源转发;
⚫ 请求资源重定向;
⚫ 响应模型数据;
⚫ 直接回写数据给客户端;
1. 请求资源转发
2. 请求资源重定向
3. 响应模型数据
响应模型数据本质也是转发,在转发时可以准备模型数据
@GetMapping("/forward5")
public ModelAndView forward5(ModelAndView modelAndView){
// 准备JavaBean模型数据
User user = new User();
user.setUsername("haohao");
// 设置模型
modelAndView.addObject("user",user);
// 设置视图
modelAndView.setViewName("/index.jsp");
return modelAndView;
}
4. 直接回写数据
直接通过方法的返回值返回给客户端的字符串,但是SpringMVC默认的方法返回值是视图,可以通过@ResponseBody 注解显示的告知此处的返回值不要进行视图处理,是要以响应体的方式处理的
@GetMapping("/response2")
@ResponseBody
public String response2() throws IOException {
return "Hello haohao!";
}
二、前后端分离异步业务数据响应
其实此处的回写数据,跟上面回写数据给客户端的语法方式一样,只不过有如下一些区别:
⚫ 同步方式回写数据,是将数据响应给浏览器进行页面展示的,而异步方式回写数据一般是回写给Ajax引擎的,即谁访问服务器端,服务器端就将数据响应给谁
⚫ 同步方式回写的数据,一般就是一些无特定格式的字符串,而异步方式回写的数据大多是Json格式字符串回写普通数据使用@ResponseBody标注方法,直接返回字符串即可,此处不在说明;
回写Json格式的字符串,即将直接拼接Json格式的字符串或使用工具将JavaBean转换成Json格式的字符串回写
@GetMapping("/response3")
@ResponseBody
public String response3(HttpServletResponse response) {
return "{\"username\":\"haohao\",\"age\":18}";
}
@GetMapping("/response4")
@ResponseBody
public String response4() throws JsonProcessingException {
// 创建JavaBean
User user = new User();
user.setUsername("haohao");
user.setAge(18);
// 使用Jackson转换成json格式的字符串
String json = new ObjectMapper().writeValueAsString(user);
return json;
}
在讲解SringMVC接收请求数据时,客户端提交的Json格式的字符串,也是使用Jackson进行的手动转换成JavaBean
当我们使用了@RequestBody时,直接用JavaBean就接收了Json格式的数据,原理其实就是SpringMVC底层帮我们做了转换,此处@ResponseBody也可以将JavaBean自动给我们转换成Json格式字符串回响应
@GetMapping("/response5")
@ResponseBody
public User response5() throws JsonProcessingException {
// 创建JavaBean
User user = new User();
user.setUsername("haohao");
user.setAge(18);
// 直接返回User对象
return user;
}
@ResponseBody注解使用优化,在进行前后端分离开发时,Controller的每个方法都是直接回写数据的,所以每个方法上都得写@ResponseBody,可以将@ResponseBody写到Controller上,那么该Controller中的所有方法都具备了返回响应体数据的功能了
@Controller
@ResponseBody
public class UserController{
@GetMapping("/response7")
public ResultInfo response7() {
// 省略其他代码
return info;
}
@GetMapping("/response5")
public User response5() throws JsonProcessingException {
//省略其他代码
return user;
}
// ... 省略其他方法 ...
}
进一步优化,可以使用@RestController替代@Controller和@ResponseBody,@RestController内部具备的这两个注解的功能
@RestController
public class UserController{
@GetMapping("/response7")
public ResultInfo response7() {
// 省略其他代码
return info;
}
@GetMapping("/response5")
public User response5() throws JsonProcessingException {
//省略其他代码
return user;
}
// ... 省略其他方法 ...
}