Spring MVC 初學者指南:深入了解 Spring 的強大框架

Published February 16, 2025 by 徐培鈞
程式語言

在現代 Java Web 開發中,Spring MVC 是最受歡迎的框架之一。

它基於 Spring 框架,提供強大的模型-視圖-控制器(Model-View-Controller,簡稱 MVC)架構,能夠有效地組織 Web 應用程式,使開發變得更簡單、更靈活。

本篇文章將詳細介紹 Spring MVC 的概念、架構、核心組件,以及如何建立一個簡單的 Spring MVC 應用程式。

如果你是 Java 開發新手,或者想學習如何使用 Spring MVC 來開發 Web 應用,那麼這篇文章將對你非常有幫助!


什麼是 Spring MVC?

Spring MVC 是 Spring Framework 提供的一個 基於 MVC 設計模式 的 Web 應用開發框架。

它提供了一個靈活且模組化的架構,使得開發者能夠更容易地管理 Web 應用程式的各個部分。

MVC 設計模式

MVC(Model-View-Controller)是一種流行的軟體設計模式,用於分離應用程式的不同部分,以提高可維護性和可測試性:

  • Model(模型): 負責處理應用程式的業務邏輯和數據。
  • View(視圖): 負責顯示數據,通常是 HTML 或 JSP 頁面。
  • Controller(控制器): 負責處理請求,與 Model 交互並返回相應的 View。

Spring MVC 完全遵循 MVC 模式,提供了一個強大的請求處理機制,使開發 Web 應用變得更加簡單。


Spring MVC 的架構

Spring MVC 的架構主要由 前端控制器(DispatcherServlet)控制器(Controller)服務層(Service)數據訪問層(Repository)視圖(View) 等核心組件組成。

這些組件互相協作,負責處理 Web 請求,將用戶的需求轉換為具體的業務邏輯和視圖回應。

當用戶訪問一個 Spring MVC 應用程式時,整個處理流程如下:

處理流程

1️⃣ 用戶發送請求

用戶透過瀏覽器輸入網址,例如 https://www.hukp.cn/login,發送一個請求到 Web 伺服器。

2️⃣ DispatcherServlet(前端控制器)接收請求

所有進入的 Web 請求,無論是 GET、POST 還是其他 HTTP 方法,都會先被 Spring MVC 的 DispatcherServlet 截獲

它的主要作用是作為整個 Spring MVC 應用的中央調度器,負責協調請求的處理流程。

3️⃣ DispatcherServlet 將請求分派給 Controller

DispatcherServlet 接收到請求後,會根據 URL 對應關係(HandlerMapping) 來決定應該把請求轉發給哪個 Controller 來處理。例如:

  • /loginLoginController
  • /productsProductController

如果請求的 URL 沒有對應的 Controller,則會返回 404 錯誤。

4️⃣ Controller(控制器)處理請求

Controller 負責處理具體的業務邏輯。例如:

@Controller
@RequestMapping("/login")
public class LoginController {

    @GetMapping
    public String showLoginPage() {
        return "login";  // 返回 "login" 視圖名稱
    }
}

Controller 收到 /login 請求時,它可能會:

  • 呼叫 Service 層 來進行數據處理,例如驗證用戶登入。
  • 根據業務邏輯的結果,選擇要回應的視圖。

5️⃣ Service 層與 Repository 層處理業務邏輯與數據存取

如果 Controller 需要查詢數據,例如驗證用戶登入資訊,它會調用 Service 層,而 Service 層又會進一步請求 Repository 層 查詢數據庫。

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User findUserByUsername(String username) {
        return userRepository.findByUsername(username);
    }
}

Repository 層負責直接與數據庫互動,並將結果返回給 Service 層,最終傳遞回 Controller。

6️⃣ Controller 返回 ModelAndView 給 DispatcherServlet

當 Controller 執行完業務邏輯後,它會返回一個 視圖名稱(View)數據模型(Model)DispatcherServlet,例如:

@GetMapping("/welcome")
public ModelAndView welcomePage() {
    ModelAndView mav = new ModelAndView("welcome");
    mav.addObject("message", "歡迎使用 Spring MVC!");
    return mav;
}

這裡 welcome 是視圖名稱,而 message 是要傳遞到視圖的數據。

7️⃣ DispatcherServlet 透過 ViewResolver 找到對應的視圖

DispatcherServlet 收到 ModelAndView("welcome") 後,它會通過 ViewResolver(視圖解析器),將 welcome 這個視圖名稱轉換成 對應的 HTML、JSP 或者 Thymeleaf 頁面

然後再把 message 變數傳遞到視圖。

8️⃣ 最終視圖(View)呈現結果給用戶

視圖引擎(如 JSP、Thymeleaf 或 FreeMarker)會接收 Model 中的數據,並動態生成 HTML,然後返回給用戶的瀏覽器,例如:

<h1 th:text="${message}">預設訊息</h1>

這樣,當用戶訪問 /welcome 頁面時,瀏覽器就會顯示:

歡迎使用 Spring MVC!

完整的流程圖

graph TB
    %% (A) 使用者端
    A["使用者請求: https:\/\/www\.hukp\.cn\/login"]

    %% (1) Controller 區域
    subgraph "Controller 區域"
        B["DispatcherServlet"]
        C["HandlerMapping"]
        D["LoginController"]
    end

    %% (2) Model 區域
    subgraph "Model 區域"
        E["UserService"]
        F["UserRepository"]
        G["(Database)"]
    end

    %% (3) View 區域
    subgraph "View 區域"
        H["ViewResolver"]
        I["JSP / FreeMarker"]
    end

    %% (Z) 使用者瀏覽器 (最終回應)
    J["使用者瀏覽器"]

    %% --- 流程箭頭 + 編號 ---

    A -->|"\(1\) 請求"| B
    B -->|"\(2\) 查找對應的 Controller"| C
    C -->|"\(3\) 找到對應的 Controller"| D
    D -->|"\(4\) 處理請求,調用 Service"| E
    E -->|"\(5\) 查詢數據庫"| F
    F -->|"\(6\) 從 Database 取得數據"| G
    G -->|"\(7\) 回傳查詢結果"| F
    F -->|"\(8\) 回傳給 Service"| E
    E -->|"\(9\) 回傳結果給 Controller"| D
    D -->|"\(10\) 返回 ModelAndView"| B
    B -->|"\(11\) 透過 ViewResolver 解析視圖"| H
    H -->|"\(12\) 找到對應的 JSP / Thymeleaf"| I
    I -->|"\(13\) 生成 HTML 並回應給使用者"| J

如何建立一個 Spring MVC 專案?

接下來,我們將一步步建立一個簡單的 Spring MVC Web 專案。

建立 Spring Boot 專案

最簡單的方式是使用 Spring Boot,它內建 Spring MVC,讓開發更高效。

步驟 1:使用 Spring Initializr 建立專案

  1. 訪問 Spring Initializr
  2. 選擇 Spring Boot 版本(如 3.1)。
  3. 選擇 MavenGradle 作為專案管理工具。
  4. 添加依賴:
    • Spring Web
    • Thymeleaf(可選)
  5. 生成並下載專案。

步驟 2:建立 Controller

在專案的 src/main/java/com/example/demo/controller 目錄下建立 HelloController.java

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/hello")
public class HelloController {

    @GetMapping
    @ResponseBody
    public String sayHello() {
        return "Hello, Spring MVC!";
    }
}

這個 Controller 會處理 /hello 的請求,並返回 Hello, Spring MVC!

步驟 3:運行應用

在專案根目錄執行:

mvn spring-boot:run

或者使用 Gradle:

./gradlew bootRun

然後在瀏覽器打開 http://localhost:8080/hello,就能看到輸出 Hello, Spring MVC!


Spring MVC 的進階功能

使用 Model 來傳遞數據

如果我們想在視圖中顯示數據,可以使用 Model

@GetMapping("/greet")
public String greet(Model model) {
    model.addAttribute("message", "Welcome to Spring MVC!");
    return "greeting";
}

這樣 greeting.html 視圖就能訪問 message 變數。

使用 Thymeleaf 作為模板引擎

Spring MVC 支持多種視圖技術,如 JSP、Thymeleaf 等。Thymeleaf 是 Spring 官方推薦的模板引擎。

範例 src/main/resources/templates/greeting.html

<!DOCTYPE html>
<html>
<head>
    <title>Greeting Page</title>
</head>
<body>
    <h1 th:text="${message}">Default Message</h1>
</body>
</html>

這樣當用戶訪問 /greet,就會顯示 Welcome to Spring MVC!

處理表單提交

Spring MVC 也能輕鬆處理 Web 表單。假設我們有一個簡單的表單:

<form action="/submit" method="post">
    <input type="text" name="username" />
    <button type="submit">Submit</button>
</form>

對應的 Controller:

@PostMapping("/submit")
public String submit(@RequestParam String username, Model model) {
    model.addAttribute("user", username);
    return "result";
}

這樣用戶提交表單後,result.html 可以顯示用戶名。


結語

Spring MVC 是一個強大且靈活的 Web 框架,它提供了一整套完整的解決方案,使 Web 應用的開發變得更加簡單和高效。

本文介紹了 Spring MVC 的基本概念、架構和實作步驟,希望對初學者有所幫助。

如果你想進一步學習,建議深入研究 Spring Boot、RESTful API、Spring Security 等相關技術,這些都是開發現代 Web 應用不可或缺的技能! 🚀