Spring中@Controller和@RestController区别

在介绍@Controller和@RestController区别之前,要先介绍网站开发模式

网站的开发模式,主要有2种:前端台分离和混合开发前后台分离:(目前企业开发的主流)这种开发模式的特点如下

  • 前端人员开发前端程序,前端程序单独部署到前端服务器上
  • 后端人员开开发后端程序,后端程序单独部署到后端服务器上
图片[1]-Spring中@Controller和@RestController区别-不念博客

混合开发:(早期的开发技术,目前慢慢退出市场),这种开发模式的特点是:前端人员开发的代码和后端人员开发的代码在同一个项目中,一起打包部署。

图片[2]-Spring中@Controller和@RestController区别-不念博客

思考:@Controller和@RestController与混合开发以及前端台分离开发之间关系

1. @Controller和混合开发

在前后端混合开发节点使用@Controller注解作用:

  • 主要用于传统前后端混合开发,生成HTML页面的控制器。
  • 通过@RequestMapping配合处理请求,通常返回视图(View)。
  • 适用于以服务器渲染为主的应用,不太适合前后端分离的场景。

1.1. 代码演示

【步骤一】:创建SpringBoot项目,并在pom.xml添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

【步骤二】:在resources目录下创建templates文件夹,并创建test.html页面

<html>
<head></head>

<body>
<h1>一个简单的视图</h1>
</body>
</html>

【步骤三】:创建TutorialController控制器

@Controller
@RequestMapping("tutorial")
public class TutorialController {
    @GetMapping
    public String update(){

        return "test";
    }
}

访问过程如下

图片[3]-Spring中@Controller和@RestController区别-不念博客

测试: 使用浏览器访问http://localhost:8080/tutorial

结果如下

图片[4]-Spring中@Controller和@RestController区别-不念博客

2. @Controller和前后端分离开发

前后台分离开发,后端单独开的,返回的数据不再是视图(html/JSP等),而是JSON数据

思考:@Controller如何让方法返回JSON数据,从而实现前后端开发

实际上很简单就是@Controller+@ResponseBody注解实现方法返回JSON数据

@ResponseBody注解可以在类上,也可以在方法上,在控制器类上表示所有方法返回的都是JSON数据

@GetMapping
@ResponseBody
public String update(){

    return "test";
}

测试: 使用浏览器访问http://localhost:8080/tutorial

结果如下:

图片[5]-Spring中@Controller和@RestController区别-不念博客

之间返回方法返回值,而不是视图

3. @RestController和前后端分离开发

前后端分离开发流行之后,实际上就是在控制器上添加@Controller+@ResponseBody注解,但是用两个注解好像有点麻烦,Spring官方就推出了一个新的注解用于替代@Controller+@ResponseBody组合,就是@RestController注解

RestController注解代码如下

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

 @AliasFor(annotation = Controller.class)
 String value() default "";

}
图片[6]-Spring中@Controller和@RestController区别-不念博客

从代码看我们发现RestController注解就是@Controller+@ResponseBody结合

© 版权声明
THE END