1. 注解:@ResponseBody 概念
@ResponseBody :该注解使用在Controller 方法上的 。将方法的返回值通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区),通常用来给客户端返回 JSON 数据或者是 XML 数据。
当方法上面没有写 ResponseBody 时,底层会将方法的返回值封装为 ModelAndView 对象;需要注意的是,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过 response 对象输出指定格式的数据。
如果返回值是 POJO 那么必须导入 以下的 jackson 类库包,否者无法将对象转换成json格式的 从而发生错误 。
<!-- jackson 包 :用于将对象 转换成 json格式的数据 --> <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.9</version> </dependency>
使用@ResponseBody注解 响应ajax请求 实例请看:https://blog.csdn.net/weixin_42325327/article/details/104264512
2. ResponseEntity 响应实体对象
ResponseEntity可以定义返回的HttpStatus(状态码)和 HttpHeaders(响应头) 和 响应体body
Controller 中的 方法返回值 可以定义为ResponseEntity ,那么效果就是展示响应体,就和@ResponseBody 一样。(同样不会被SpringMVC解析成视图 ModelAndView),但它更加强大,内部可以自定义响应头,状态码。
注:如果ResponseEntity中的响应体为 POJO 也要配置jackson 类库包
ResponseEntity 对象有几个构造方法 ,指定 :HttpStatus 创建POJO ,指定状态码 和响应体创建POJO ,以及指定 状态码 响应体 响应头 传进POJO ............可以按照自己的需求创建对象。
以下编写一个 Controller 演示 ResponseEntity :
@RequestMapping("hanlder01")
@ResponseBody
public ResponseEntity<Employee > hanlder01() {
/*
* 使用 SpringMVC 中的 ResponseEntity对象 作为返回值
* 该对象表示 响应的实体 : 响应体、响应头、 (响应行-状态码)
*/
//响应体
Employee emp = new Employee(1,"小黑","男",20,new Dept());
//响应头, HttpHeaders实现map集合 ,存储多个 header
HttpHeaders header = new HttpHeaders();
header.add("Context-type", "text/html;charset=utf-8");
//创建ResponseEntity 实体对象
ResponseEntity<Employee > responseEntity = new ResponseEntity<Employee >(body, header,HttpStatus.OK);
return responseEntity;
}
ResponseEntity 泛型中指定响应体数据类型
浏览器访问
3. 注解 @RequestBody
该注解 加在Controller 的处理方法的形参上,作用其实是将json格式的数据转为java对象,让我们看以下案例吧
Controller:
jsp:
注意:如果表单中提交了字符数据,通过@RequestBody注解的方式取出来会乱码,这是因为form表单中有一个默认属性enctype="application/x-www-form-urlencoded",就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
可以将这个属性改为:enctype="text/plain" (表单数据会在未编码的情况下发送到服务器),这样提交字符时就不会乱码。
接下里浏览器访问 jsp 页面,点击提交,向服务器发送请求
控制台输出:
name=xiaohei&age=20
4. RequestEntiry 请求实体对象
RequestEntiry 对象表示一个 请求实体对象,内部封装了 请求行,请求头,请求体 。
该对象可以用作 Controller 控制器中 处理方法的入参,SpringMVC会将请求解析成对象
代码演示:
Controller:
jsp页面:用来发送请求
浏览器访问jsp页面,提交按钮,发送请求。看以下控制台的输出:
<POST http://localhost:8080/springMvcCrud/Hanlder06,name=xiaohei&age=20,{host=[localhost:8080], connection=[keep-alive], content-length=[19], cache-control=[max-age=0], origin=[http://localhost:8080], upgrade-insecure-requests=[1], user-agent=[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36], sec-fetch-dest=[document], accept=[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9], sec-fetch-site=[same-origin], sec-fetch-mode=[navigate], sec-fetch-user=[?1], referer=[http://localhost:8080/springMvcCrud/body.jsp], accept-encoding=[gzip, deflate, br], accept-language=[zh-CN,zh;q=0.9], cookie=[JSESSIONID=FF33462F558A6EC86AB40D47057F7A47], Content-Type=[application/x-www-form-urlencoded;charset=UTF-8]}>