上章讲到了@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格式的参数不能接收普通参数。