@ResponseBody注解


一、@ResponseBody作用:

       该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

       使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)

     GET模式下,这里使用了@PathVariable绑定输入参数,非常适合Restful风格。因为隐藏了参数与路径的关系,可以提升网站的安全性,静态化页面,降低恶意攻击风险。
     POST模式下,使用@RequestBody绑定请求对象,Spring会帮你进行协议转换,将Json、Xml协议转换成你需要的对象。@ResponseBody可以标注任何对象,由Spring完成对象——协议的转换。

     spring mvc处理方法支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, String, void。

二、实例

1、最正常情况,代码如下:

@Controller
@RequestMapping("/test")
public class testcqx {
    private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class);
    @RequestMapping(method = RequestMethod.POST)//没有子路径
    @ResponseBody
 public String Test(){
        logger.info("=========ok");
        return "{success:true}";
    }
}

控制台打印信息和页面信息:

2、如果在存在返回值但是@ResponseBody不存在的时候,代码如下:

 @Controller

@RequestMapping("/test")
public class testcqx {
    private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class);
    @RequestMapping(method = RequestMethod.POST)//没有子路径
 public String Test(){
        logger.info("=========ok");
        return "{success:true}";
    }
}

控制台打印信息和页面信息

具体原因:

@responsebody表示该方法的返回结果直接写入HTTP response body中
一般在异步获取数据时使用,Spring MVC在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据。

这就是为什么去掉BODY注解之后,控制器返回的时候路径会变为,(在当前路径的上一级路径后面追加路径)然后返回过程找不到对应视图,导致404错误,但对于控制器业务处理没什么影响


3、如果控制器返回值类型是空void的情况,代码如下:

 @Controller

@RequestMapping("/test")
public class testcqx {
    private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class);
    @RequestMapping(method = RequestMethod.POST)
    @ResponseBody
 public void Test(){
        logger.info("=========ok");
    }
}

控制台打印信息和页面信息

原因:@ResponseBody必须要有返回对象,(序列化一个返回对象然后注入解释)可以在配置文件中指定注解的对象,可以是json/html/xml等

在void的情况下,不能注入解释,因为根本没有实例对象要去序列化。

4、控制器返回类型为void并且没有body注解的情况,代码如下:(分两种情况)

情况一:(@RequestMapping没有指定子路径值

@Controller
@RequestMapping("/test")类级别
public class testcqx {
    private static final Logger logger = LoggerFactory.getLogger(QpayJsapiController.class);
    @RequestMapping(method = RequestMethod.POST)
    public void Test(){
        logger.info("=========ok");
    }
}

结果信息如下:

原因就是:RequestMapping默认将test当做跳转路径,而在这个时候,控制器名与视图名匹配则we didn’t set a ViewResolver when contructing the standalone MockMvc.

先返回上一级路径然后追加则就是paygate/test ;继续post,request;然后就形成一个环,这是不允许的!

情况二:(@RequestMapping没有指定子路径值:假如是value="/t"

那么最后的结果就是找不到路径(默认将test/t追加到上一级路径后面 ) :paygate/test/test/t










  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值