??@ResponseStatus
和@ResponseBody
都是用来处理响应相关内容的。
??注解解析
??@ResponseStatus
??① 使用@ResponseStatus
注释的方法或异常类返回注解code
和reason
属性。
??② 当调用处理程序时,@ResponseStatus
的code
属性将应用于Http响应状态代码,并将重写其他方式已设置过的响应状态原因,例如:ResponseEntity
或:redirect
设置过的响应状态原因。
??③ 需要注意的是,在异常类上使用此注解或设置此注解的reason
属性时,将使用HttpServletResponse.sendError
方法。
??④ 使用HttpServletResponse.sendError
,则认为响应处理已完成,不应再写入任何内容。此外,Servlet
容器通常会编写一个错误页面,因此使用reason
不适合REST API
。对于这种情况,最好使用org.springframework.http.ResponseEntity
作为返回值类型,并完全避免使用@ResponseStatus
注解。
??⑤ @ResponseStatus
注解可以应用在控制器类级别上,这种情况下,类中所有@RequestMapping
注释的方法都会受此注解影响。
??⑥ value
:
????用于设置响应的状态代码。
????默认值为HttpStatus.INTERNAL_SERVER_ERROR
,通常应将其更改为更合适的值。
??⑦ code
:
????用于设置响应的状态代码。
????默认值为HttpStatus.INTERNAL_SERVER_ERROR
,通常应将其更改为更合适的值。
??⑧ reason
:
?????用于设置响应的状态原因。
??@ResponseBody
??① 该注解表示方法返回值将绑定到Web
响应正文。
??② 支持Servlet
环境中带注解的处理程序方法。
??③ 从4.0
版本开始,此注解可以应用于控制器类级别,在这种情况下,类中所有@RequestMapping
注释的方法都会受此注解影响。
??④ @ResponseBody
注解没有任何属性,仅当做标记属性来使用。
??注解示例
??@ResponseStatus
和@ResponseBody
都是用来处理响应相关内容的,示例混合在一起演示。
??1) 建Controller
,用来演示@ResponseStatus
和@ResponseBody
使用方法。
package com.arhorchin.securitit.webannotations;import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;/*** @author Securitit.* @note 演示@ResponseStatus和@ResponseBody使用方法.*/
@Controller
@RequestMapping("/WebAnnotations")
public class ResponseController {
/*** logger.*/private Logger logger = LoggerFactory.getLogger(ResponseController.class);/*** 跳转页面.*/@RequestMapping(value = "/ResponseStatus.html",method = RequestMethod.GET)public ModelAndView responseStatusHtml(HttpServletRequest req, HttpServletResponse res, ModelMap modelMap)throws Exception {
return new ModelAndView("webannotations/Response", modelMap);}/*** 指定响应的状态码和状态描述.*/@ResponseBody@RequestMapping(value = "/ResponseStatus.do",method = RequestMethod.GET)@ResponseStatus(code = HttpStatus.BAD_REQUEST,reason = "ResponseStatus Annotation Request Accepted")public String responseStatus() throws Exception {
logger.info("ResponseStatus Annotation Test!!!");return "ResponseStatus Annotation Test!!!";}/*** 指定响应数据绑定.*/@ResponseBody@RequestMapping(value = "/ResponseBody.do",method = RequestMethod.GET)public Map<String, String> responseBody() throws Exception {
logger.info("ResponseBody Annotation Test!!!");Map<String, String> responseBodyMap = null;responseBodyMap = new HashMap<String, String>();responseBodyMap.put("name", "Securitit");responseBodyMap.put("age", "108");return responseBodyMap;}}
??2) 建html
,用来演示ResponseController
中有关@ResponseStatus
功能。
<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="Author" content="Securitit"><meta name="Keywords" content="-"><meta name="Description" content="Securitit @ResponseStatus 测试页面"><title>@ResponseStatus 测试页面</title></head><body><a href="http://localhost:9199/spring-annotations/WebAnnotations/ResponseStatus.do" target="_blank">点击链接,获取请求,请求使用@ResponseStatus指定了状态码和状态描述.</a></body>
</html>
??3) 访问http://localhost:9199/spring-annotations/WebAnnotations/ResponseStatus.html
,验证ResponseController
中有关@ResponseStatus
功能。
??点击链接,获取请求,请求使用@ResponseStatus指定了状态码和状态描述.
??可以看到,响应的状态码和状态描述已成为ResponseController
中@ResponseStatus
注解指定的值。
??4) 使用《Spring 注解面面通 之 Http测试工具》提供的Http测试工具测试ResponseController
中有关@ResponseBody
功能。
??可以看到,ResponseController
控制器中方法返回了Map<String, String>
类型,由于@ResponseBody
注解的作用,Spring将返回值自动转换为了JSON
。
??总结
??@ResponseStatus
注解的使用频率有待考证,但是@ResponseBody
注解几乎是Web开发中不可或缺的注解,使用它可以方便的使各种返回值类型进行统一格式返回。完全的掌握@ResponseStatus
和@ResponseBody
,可以在实际开发时,更加地如鱼得水。
??若文中存在错误和不足,欢迎指正!