知識庫 / Spring / Spring MVC RSS 訂閱

Spring 控制器快速指南

REST,Spring MVC
HongKong
8
03:56 AM · Dec 06 ,2025

1. 簡介

在本教程中,我們將重點介紹 Spring MVC 中的核心概念——控制器(Controllers)。

2. 概述

讓我們先退後一步,來審視 Front Controller 在典型 Spring Model View Controller 架構中的概念。

主要職責如下:

  • 攔截傳入的請求
  • 將請求的 payload 轉換為內部數據結構
  • 將數據發送到 Model 進行進一步處理
  • Model 獲取處理後的數據,並將數據傳遞給 View 進行渲染

以下是 Spring MVC 中高層流程的示意圖:

如我們所見,DispatcherServlet 在架構中扮演着 Front Controller 的角色。

該圖適用於典型的 MVC 控制器,以及 RESTful 控制器,但存在一些細微差異(見下文所述)。

在傳統的做法中,MVC 應用不具備面向服務的特性;因此,存在一個 View Resolver,用於根據從控制器接收的數據渲染最終視圖。

RESTful 應用旨在具備面向服務的特性,並返回原始數據(通常是 JSON/XML)。由於這些應用不進行任何視圖渲染,因此不存在 View Resolver,通常期望控制器通過 HTTP 響應直接發送數據。

讓我們從 MVC 風格的控制器開始。

3. Maven 依賴項

為了使用 Spring MVC 在 Spring Boot 中,我們首先需要處理 Maven 依賴項:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>3.0.2</version>
</dependency>

要獲取庫的最新版本,請查看 Maven 中央倉庫中的 spring-boot-starter-web

4. Spring Boot Web 配置

現在我們來看如何配置 Spring Boot。由於我們在 classpath 中添加了 thymeleaf 依賴,因此我們不需要為它配置任何 @Beans:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

在我們的 WebConfig 中,我們需要添加一個用於 Greeting 對象的 Bean 以及 ObjectMapper,以便啓用默認 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();
    }

因此,例如,如果 控制器返回一個名為 視圖的“歡迎”視圖,視圖解析器將嘗試在 模板文件夾中解析一個名為 “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 路由到 TestController 中的 getTestData 方法。

而且,當然,我們返回 ModelAndView 對象,幷包含一些模型數據以供參考。

視圖對象名稱設置為 “welcome”。 如前所述,View Resolver 將在 templates 文件夾中搜索名為 “welcome.html” 的頁面。

下面是示例 GET 操作的結果:

6. REST 控制器

設置一個 Spring RESTful 應用程序與 MVC 應用程序的設置相同,唯一的區別在於沒有 View Resolversmodel map

API 通常會將原始數據返回給客户端,通常是 XMLJSON 格式,因此 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;
    }
}

我們可以在下面快速查看輸出結果:

上述輸出結果是向API發送GET請求,學生id1的結果。

這裏需要注意的是,@RequestMapping註解是我們需要深入研究和利用的關鍵註解之一。

7. 結論

在本文中,我們探討了 Spring Boot 中控制器使用的基本原理,既從典型的 MVC 應用程序的角度,也從 RESTful API 的角度進行了闡述。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.