Controller中返回数据总结(ResponseEntity,@ResponseBody,@ResponseStatus)

在传统的开发过程当中,咱们的控制CONTROLLER层一般须要转向一个JSP视图;但随着WEB2.0相关技术的崛起,咱们不少时候只须要返回数据便可,而不是一个JSP页面。html

  • ResponseEntity:表示整个HTTP响应:状态代码,标题和正文。所以,咱们可使用它来彻底配置HTTP响应,它是一个对象。
  • @ResponseBody:返回json格式的结果
  • @ResponseStatus:返回状态

 

ResponseEntity

ResponseEntity是一种泛型类型。所以,咱们可使用任何类型做为响应主体:java

@Controller
public class XXXController{

 @GetMapping("/hello")
 public ResponseEntity<String> hello() {
   return new ResponseEntity<>("Hello World!", HttpStatus.OK);
}			   

这里字符串"Hello World!"做为字符串返回给REST端。spring

咱们能够设置HTTP标头:json

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
   HttpHeaders headers = new HttpHeaders();
   headers.add("Custom-Header", "foo");

   return new ResponseEntity<>(
         "Custom header set", headers, HttpStatus.OK);
}

设置自定义标头:springboot

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
   return ResponseEntity.ok()
         .header("Custom-Header", "foo")
         .body("Custom header set")

若是将一个对象放入:app

@GetMapping("/hello")
 public ResponseEntity<String> hello() {
   return new ResponseEntity<>(new User(‘jdon’), HttpStatus.OK);
 }

返回的是JSON字符串:post

[ { ‘name’: 'jdon'}]url

下面是返回对象的JSON列表:spa

public ResponseEntity<List<ProcessDef>> repositoryProcessDefinitionsGet() {
   return new ResponseEntity<>(processDefRepo.findAll(), HttpStatus.FOUND);
}

以上是经过ResponseEntity这个对象在代码中灵活操控响应,可是在通常状况下咱们只是想返回一个带有数据的正常响应,那么只要使用@注解便可code

 

@ResponseBody

在类级别使用@Controller标注状况下, @ResponseBody注解告诉返回的对象将自动序列化为JSON,并经过回控制器的HttpResponse对象。

@Controller
public class XXXController{

  @ResponseBody
  public User postResponseController(@RequestBody LoginForm loginForm) {
      return new User("Thanks For Posting!!!");
  }

将返回客户端JSON字符串:

[ { ‘name’: Thanks For Posting!!!"}]

在@RestController注解了类的状况下,咱们就不须要再使用@ResponseBody了。

 

@ResponseStatus

ResponseStatus虽然只是规定了返回的状态,可是只须要标注在方法上,简单,并且状态码与返回类型分离,比较清晰。咱们将上面返回对象列表的代码使用ResponseStatus改写以下,注意类级别@RestController:

@RestController
public class XXXController{

 @ResponseStatus(HttpStatus.FOUND)
 public User postResponseController() {
    return new User("Thanks For Posting!!!");
 }

这也会返回客户端JSON字符串:

[ { ‘name’: Thanks For Posting!!!"}]

这样的代码更加专一于业务。

 

直接操控响应

Spring还容许咱们直接访问javax.servlet.http.HttpServletResponse对象; 咱们只须要将它声明为方法参数:

@GetMapping("/manual")
public void manual(HttpServletResponse response) throws IOException {
      response.setHeader("Custom-Header", "foo");
      response.setStatus(200);
      response.getWriter().println("Hello World!");
      }

因为Spring在底层实现之上提供了抽象和附加功能,所以若是以这种方式直接操纵响应,会失去不少Spring提供方便功能。

 

 

 

 

参考:

SPRING MVC3.2案例讲解--SPRING MVC3的@ResponseBody和ResponseEntity

ResponseEntity和@ResponseBody以及@ResponseStatus区别

相关文章
相关标签/搜索