在傳統的開發過程當中,咱們的控制CONTROLLER層一般須要轉向一個JSP視圖;但隨着WEB2.0相關技術的崛起,咱們不少時候只須要返回數據便可,而不是一個JSP頁面。html
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
在類級別使用@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改寫以下,注意類級別@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提供方便功能。
參考: