java框架(2.2)@ResponseBody和@Requestbody

  • • 发表于 7年前
  • • 作者 大妖怪
  • • 2682 人浏览
  • • 1 条评论
  • • 最后编辑时间 7年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

上章讲到了@RestController注解,该注解是对@Controller注解的增强,处理标记控制器,还可以让类下所有的方法都返回json格式的数据。有人会问了:我并不是控制器下每个方法都要返回json啊,我有可能要返回渲染页面啥的怎么办?不用担心,接下来要讲到的@ResponseBody就是解决方案。
在上章基础之上,我们改回@Controller,然后在类上加上一个@ResponseBody注解。

@Controller
@RequestMapping(value = "/json")
@ResponseBody
public class JsonController {

    @RequestMapping(value = "/test")
    public String jsonTest(){
        return "dayaoguai";
    }
}

运行效果一样

我们再改成注解到类上面,为了有区别,我们再写一个同样功能的:

@Controller
@RequestMapping(value = "/json")
public class JsonController {

    @RequestMapping(value = "/test")
    @ResponseBody
    public String jsonTest(){
        return "dayaoguai";
    }

    @RequestMapping(value = "/test1")
    public String jsonTest1(){
        return "dayaoguai";
    }
}

访问test:

访问test1:

由上述实验可以看出我们的@ResponseBody注解的作用就是返回json格式的内容。而@RestController其实就是@Controller和@ResponseBody的结合。我们来对比一下@Controller和@RestController的源码:

  • @Controller:
  • @RestController:

    很显然,@RestController的做法就是加了@Controller和@ResponsBody罢了:

    所以其实真正控制返回json格式的注解还是@ResponsBody。
    那么我们既然有返回json格式的方法,那么有没有接收json格式的方法呢?
    答案还是有(废话,要是没有我在这问什么!!!)。我们可以用@Requestbody作为解决方案。
    新建一个方法,然后我们去接收一个参数name:
    @RequestMapping(value = "/jsonParam",method = RequestMethod.POST)
      public void jsonParam(String name){
          System.out.println(name);
      }
    
    我们用poster先用普通方式访问一下,传参数name=dayaoguai:

    在控制台我们可以看到接收到了结果:

    那么我们再用json方式访问一下:

    可以在控制台看到打印了null:

    这说明请求成功了但是没有成功获取到参数。
    那么,我们再加上@Requestbody注解试试:
    @RequestMapping(value = "/jsonParam",method = RequestMethod.POST)
      public void jsonParam(@RequestBody String name){
          System.out.println(name);
      }
    
  • 注意这个注解必须要加在参数的前面。
    我们再来进行json请求试试:

    这次看到控制台打印了参数,说明接收成功了:

    但是我们用普通传参试试:

    但是结果并不是我们想要的:

    通过这个结果,我们不难猜出加了@ResponseBody注解SrpingMVC注解在底层对我们的数据进行了某些拼装,有兴趣的同学可以自己去了解了解源码。

总结:

  • @ResponseBody可以注解到类或方法上,注解到类表示对该类下所有方法都生效,注解到方法上则表示只对该方法生效
  • @RequestBody只能注解到参数上,表示要接收的参数是一个json格式的参数。
  • 带@RequestBody只能接收json格式的参数不能接收普通参数。

老规矩,献上源码:https://share.weiyun.com/93cc277170716b0c8f9dc36bbf9f30de

分享到:
1条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top