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區別

相關文章
相關標籤/搜索