在传统的开发过程当中,咱们的控制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提供方便功能。
参考: