RestController和 @ResponseBody的理解
@RestController=@Controller+@ResponseBody
- @Controller 注解的类会被标记,启动后会加入IOC容器。
- @ResponseBody
- 在方法上使用@ResponseBody注释,通过HttpMessageConverter将返回结果序列化到响应体,根据结果不同写入到响应体的数据格式也不同【如application/text、application/json、application/xml】。【方法返回不进行视图跳转,而是在http响应体中返回】。
- HttpMessageConverter是一个接口,通过InputStream和OutputStream读取和写入HTTP请求体和响应体。
- HttpMessageConverter有很多实现类,你甚至可以自定义实现类来完成消息转换。
- 不加此注解,由RequestMapping注解的方法的返回值会被解析为路径【解析的路径由视图解析器中的前缀+字符串+后缀构成】
- 加上此注解
- List、Map、Object都会被转换成JSON格式直接返回。
响应格式为ContentType:application/json - String 字符串类型,响应体为字符串
响应格式为ContentType:application/text
- List、Map、Object都会被转换成JSON格式直接返回。
- 在方法上使用@ResponseBody注释,通过HttpMessageConverter将返回结果序列化到响应体,根据结果不同写入到响应体的数据格式也不同【如application/text、application/json、application/xml】。【方法返回不进行视图跳转,而是在http响应体中返回】。
测试不同的返回值类型得到的数据结果
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
return "haHa";
}
@RequestMapping(value = "testResponseBodyMap")
@ResponseBody
public Map<String,Object> testResponseBody2(){
Map<String,Object> map = new HashMap<>();
Sport sport1 = new Sport("篮球", "拍");
Sport sport2 = new Sport("足球", "踢");
map.put("sport1",sport1);
map.put("sport2",sport2);
return map;
}
@RequestMapping(value = "testResponseBodyList")
@ResponseBody
public List<Object> testResponseBody3(){
List<Object> list = new ArrayList<>();
Sport sport1 = new Sport("篮球", "拍");
Sport sport2 = new Sport("足球", "踢");
list.add(sport1);
list.add(sport2);
return list;
}
@RequestMapping(value = "testResponseBodyObject")
@ResponseBody
public Sport testResponseBody4(HttpSession session){
System.out.println(session.getAttribute("运动"));
System.out.println();
Sport sport1 = new Sport("篮球", "拍");
return sport1;
}
@RequestMapping(value = "testResponseBodyVoid")
@ResponseBody
public void testResponseBody5(HttpSession session){
Sport sport1 = new Sport("篮球", "拍");
session.setAttribute("运动",sport1);
}
前端响应结果
1.字符串 “haHa”
2.Map {"sport2":{"name":"足球","action":"踢"},"sport1":{"name":"篮球","action":"拍"}}
3.List [{"name":"篮球","action":"拍"},{"name":"足球","action":"踢"}]
4.对象 {"name":"篮球","action":"拍"}
5.void 空页面
常用的使用场景:AJAX异步请求中直接返回json或者其它数据格式**
不使用spring MVC 时的ajax:
$(ajax)-function(data)
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ResultInfo info = new ResultInfo();
....
//响应数据
ObjectMapper mapper = new ObjectMapper();
response.setContentType("application/json;charset=utf-8");
mapper.writeValue(response.getOutputStream(),info);
}
最终从前端页面的data中获取到返回的数据
使用SpringMVC时的ajax
$(ajax)-function(data)
@RequestMapping(value = "testResponseBodyAJAX")
@ResponseBody
public ResultInfo testResponseBodyAJAX(){
ResultInfo info = new ResultInfo();
return info ;
}
最终从前端页面的data中获取到返回的数据