前言
在我们面试的时候,时常会被问到spring boot的一些注解的问题,而@Controller注解与@RequestController注解是其中被问到比较常见的几个注解之一,因为我们在平时开发中对这两个注解的使用频率还是比较高的,接下来我们就俩谈谈@Controller注解与@RequestController注解的联系和区别。
@Controller:
在SpringMVC 中,控制器Controller的作用是负责处理由DispatcherServlet分发的请求,并把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
SpringMVC提供了一个比较简便的定义Controller 的方法,我们不需要继承指定的类或实现指定的接口,只需使用@Controller注解记性标记一个类是Controller ,然后通过使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样Controller 就能被外界访问到。
@Controller注解是将返回结果按照MVC视图解析,而@RequestController注解则表明这就是返回的主体部分,不需要解析,也就是你返回什么东西就会在页面上呈现什么。当然这又涉及到了前后端通信的数据传输格式,一般来说应该是一个json格式的字符串。
所以你的类大部分方法都是返回一个页面,那么就可以在类上面写上@Controller注解,小部分不需要返回页面的方法,则需要在上面加上@RequestBody注解。
@RequestController:
相当于@Controller+@ResponseBody两个注解的结合,返回json数据时不需要在方法的前面加@ResponseBody注解,但使用@RestController这个注解时,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。
@ResponseBody注解的作用是,将Controller层中的方法所返回的对象,通过适当的转换器转换成为指定的格式后,然后写入到response对象的body区中去。通常是用来返回JSON数据或者是XML数据。在使用此注解之后就不会再走视图处理器,而是直接将数据写入到输入流中。
总结:
- 从源码上看,其实@RestController就是@Controller + @ResponseBody,即RequestController==Controller和ResponseBody两个注解
- 如果只使用@RestController注解来标记Controller层,则在Controller层中的方法是无法返回jsp页面,或者html,其返回的内容就是Return里的内容。
- 如果想要跳转到指定页面,则需要使用 @Controller注解配合视图解析器InternalResourceViewResolver才能够实现。如需返回一些JSON,XML或自定义mediaType内容到页面中去,则需要在对应的方法中加上@ResponseBody注解,将内容转换为json等内容进行return。