FacebookLinkedInTweet更新日期: 2025 年 2 月 21 日
本文為 Java 常見框架與伺服器 系列文,第 10 篇:
Web 伺服器與應用伺服器的區別與搭配——打造高效能 Web 架構
什麼是 Servlet?——Java Web 開發的核心技術
Tomcat 入門指南:從零開始了解 Java Web 伺服器
Apache 軟體基金會 (ASF) 完整指南:新手入門必讀
新手入門:什麼是 JBoss?完整指南
新手指南:什麼是 Red Hat?完整介紹與應用解析
新手指南:什麼是 WebLogic?完整介紹與應用解析
新手指南:什麼是 WebSphere?完整介紹與應用解析
Spring 框架新手指南:深入理解 Spring 的核心概念與應用
Spring MVC 初學者指南:深入了解 Spring 的強大框架 👈進度
在現代 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 來處理。例如:
/login → LoginController
/products → ProductController
如果請求的 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,然後返回給用戶的瀏覽器,例如:
預設訊息
這樣,當用戶訪問 /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 建立專案
訪問 Spring Initializr。
選擇 Spring Boot 版本(如 3.1)。
選擇 Maven 或 Gradle 作為專案管理工具。
添加依賴:
Spring Web
Thymeleaf(可選)
生成並下載專案。
步驟 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:
Default Message
這樣當用戶訪問 /greet,就會顯示 Welcome to Spring MVC!。
處理表單提交
Spring MVC 也能輕鬆處理 Web 表單。假設我們有一個簡單的表單:
對應的 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 應用不可或缺的技能! 🚀