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