@Controller和@RestController的区别

今天使用springboot试了一下跳转视图,死活显示不了页面的数据给我返回视图名字,查了一下结果是加上@RestController

@RestController

  如果使用@RestController:所有方法都会返回数据,不会跳转页面

  网上查找的原因: 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,
  配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

查看RestController注解的代码

(1)Target(ElementType.TYPE): 表示此注解可以修饰 类、接口、注解、枚举类型
(2)Retention(RetentionPolicy.RUNTIME):表示此注解被编译器编译后存储到Class文件中,并且jvm会通过java反射机制获取此注解的信息。
(3)Documented:表示在使用javadoc命令生成javaAPI时,此注解会显示出来。
(4)还有两个注解:一个是Controller、一个是ResponseBody
  源码的解释:一个方便的注释,本身是被Controller和ResponseBody注释的。意思就是两者的结合。

ResponseBody的源码定义中的解释:

    首先这个注解可以用于修饰注解,所以它可以修饰RestController。
    其次看一下英文注释:这个注解指明一个方法的返回值应该绑定到response body中。
    在4.0版本中,这个注解可以添加到类型级别的元素上,它向下遗传,所以就不用添加到方法级别的元素上。
    看到这里:大概也就明白了为什么不跳转,因为使用了这个注解,spring会把返回的信息放到response的body中,不会再去走视图解析器了

@Controller

使用@Controller会跳转页面
如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

查看Controller注解的代码

  如果使用了此注解,则表示类是一个Controller,会被java容器管理,
  其类中的每个方法都可以声明为一个Action。
  Controller注解的注释:指明一个类是一个“Controller”。这个注解是对Component注解的专门化,
 允许实现类通过类路径扫描被自动检测。它一般会和注解RequestMapping一起使用。

Component注解:指明一个类是一个“component"。当使用基于注解的配置和类路径扫描时,这个些类会被自动检测。

总结

 如果使用@RestController:所有方法都会返回数据,不会跳转页面
 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,
 配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。


使用@Controller:会跳转页面
如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。
如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。
原文地址:https://www.cnblogs.com/rzkwz/p/12936806.html