当前位置: 代码迷 >> 综合 >> Spring 注解面面通 之 @ResponseStatus、@ResponseBody
  详细解决方案

Spring 注解面面通 之 @ResponseStatus、@ResponseBody

热度:93   发布时间:2024-01-17 01:02:46.0

??@ResponseStatus@ResponseBody都是用来处理响应相关内容的。

??注解解析

??@ResponseStatus

??① 使用@ResponseStatus注释的方法或异常类返回注解codereason属性。

??② 当调用处理程序时,@ResponseStatuscode属性将应用于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,可以在实际开发时,更加地如鱼得水。

??若文中存在错误和不足,欢迎指正!

  相关解决方案