1. 簡介
在本教程中,我們將重點介紹 Spring MVC 中的核心概念:控制器。
2. 概述
讓我們先退後一步,考察 前端控制器 在典型 Spring 模型視圖控制器 架構中的概念
在較高層面上,主要職責包括:
- 攔截傳入的請求
- 將請求的負載轉換為內部數據結構
- 將數據發送到 模型 進行進一步處理
- 從 模型 獲取處理後的數據,並將數據傳遞到 視圖 進行渲染
以下是 Spring MVC 中高層級流程的快速圖表:
正如我們所看到的,DispatcherServlet 在架構中扮演着 前端控制器 的角色
該圖適用於典型的 MVC 控制器,以及 RESTful 控制器,但存在一些細微差異(見下文所述)
在傳統方法中,MVC 應用程序不是面向服務的;因此,有一個 視圖解析器,用於根據從 控制器 接收的數據渲染最終視圖
RESTful 應用程序旨在面向服務,並返回原始數據(通常是 JSON/XML)。由於這些應用程序不進行任何視圖渲染,因此沒有 視圖解析器,並且通常預期 控制器 通過 HTTP 響應直接發送數據
讓我們從 MVC 風格的控制器開始
3. Maven 依賴項
為了使用 Spring MVC 在 Spring Boot 中,我們首先處理 Maven 依賴項:
org.springframework.boot
spring-boot-starter-web
3.0.2
要獲取庫的最新版本,請查看 spring-boot-starter-web 在 Maven Central。
4. Spring Boot Web 配置
現在我們來看如何配置 Spring Boot。由於我們在 classpath 中添加了 thymeleaf 依賴,因此我們不需要為它配置任何 @Beans:
org.springframework.boot
spring-boot-starter-thymeleaf
在我們的 WebConfig 中,我們需要為 Greeting 對象和 ObjectMapper 對象添加一個 Bean,以便啓用默認 Servlet:
@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> enableDefaultServlet() {
return factory -> factory.setRegisterDefaultServlet(true);
}
@Bean
public Greeting greeting() {
Greeting greeting = new Greeting();
greeting.setMessage("Hello World !!");
return greeting;
}
@Bean
public ObjectMapper objectMapper() {
return new ObjectMapper();
}
例如,如果 Controller 返回名為 “welcome 的 view,則 view resolver 將嘗試在 templates 文件夾中搜索名為 “welcome.html” 的頁面。這是 thymeleaf 默認搜索視圖的文件夾。
5. MVC 控制器
現在,我們終於實現了 MVC 風格的控制器。
請注意,我們返回了一個 ModelAndView 對象,其中包含一個 模型映射 和一個 視圖對象,這兩個對象將由 視圖解析器 用於數據渲染:
@Controller
@RequestMapping(value = "/test")
public class TestController {
@GetMapping
public ModelAndView getTestData() {
ModelAndView mv = new ModelAndView();
mv.setViewName("welcome");
mv.getModel().put("data", "Welcome home man");
return mv;
}
}
那麼,我們設置了什麼呢。
首先,我們創建了一個名為 TestController 的控制器,並將其映射到 “/test” 路徑。 在類中,我們創建了一個返回 ModelAndView 對象的 方法,該方法映射到 GET 請求。 因此,以 “test” 結尾的任何 URL 調用都將由 DispatcherServlet 路由到 getTestData 方法 在 TestController 中。
當然,我們返回了帶有模型數據的 ModelAndView 對象,以備不時之需。
視圖對象已設置為 “welcome”。 如上所述,視圖解析器 將在 templates 文件夾中搜索名為 “welcome.html” 的頁面。
下面是 GET 操作的示例結果:
6. REST 控制器
構建 Spring RESTful
應用程序的設置與 MVC 應用程序的設置相同,唯一的區別在於沒有 View Resolvers 或 model map。API 通常會將原始數據返回給客户端,通常是 XML
和 JSON 表示形式,因此 DispatcherServlet 會繞過 view resolvers 並 直接在 HTTP 響應體中返回數據。讓我們來看一個簡單的 RESTful 控制器實現:
@RestController
public class RestController {
@GetMapping(value = "/student/{studentId}")
public Student getTestData(@PathVariable Integer studentId) {
Student student = new Student();
student.setName("Peter");
student.setId(studentId);
return student;
}
}
我們可以看到以下輸出的快照:
上述輸出是發送 GET
請求到 API 並使用學生 id 的結果,即 1。這裏有一個快速説明是,@RequestMapping
註解是那些核心註解之一,我們需要深入瞭解才能充分發揮其潛力。7. 結論
在本文中,我們探討了 Spring Boot 中使用控制器的基本原理,既從典型的 MVC 應用程序的角度,也從 RESTful API 的角度進行了研究。