MVC (Model-View-Controller) 由 Trygve Reenskaug 於 1979 年 Smalltalk-80 提出,Sun 於 J2EE 藍圖確立為核心模式。本文梳理 Java Web 從 JSP Model 1/2、Struts 1/2、Spring MVC 到 Spring Boot 的架構演進,剖析各階段核心痛點與解決方案。
<%-- list.jsp --%>
<%
Connection conn = DriverManager.getConnection(...);
ResultSet rs = stmt.executeQuery("SELECT * FROM user");
while(rs.next()) { %>
<tr><td><%= rs.getString("name") %></td></tr>
<% } %>
| 角色 | 技術實現 | 職責 |
|---|---|---|
| Model | JavaBean / EJB | 業務邏輯、資料存取、狀態封裝 |
| View | JSP (僅 JSTL/EL) | 頁面渲染,無 Java 腳本片 |
| Controller | Servlet (單入口或多 Servlet) | 請求分發、參數綁定、視圖轉向 |
web.xml 配置 Servlet 映射:
<servlet>
<servlet-name>UserController</servlet-name>
<servlet-class>com.example.UserController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserController</servlet-name>
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
共同局限:侵入性強 (繼承基類/實作介面)、配置繁重、視圖技術綁定 JSP、難以單元測試 Controller 邏輯。
@Controller + @RequestMapping,無需繼承/實作,易測試 (直接 new Controller().method())。@RequestParam, @PathVariable, @RequestBody, @ModelAttribute,支援驗證 (JSR-303)。@RestController、ResponseEntity、HTTP 狀態碼語義化。| 階段 | 代表技術 | 核心特點 | 適用場景 |
|---|---|---|---|
| 手寫 JDBC | DataSource + Template | 完全控制、效能最高、樣板碼極多 | 極簡專案、批量導入、存儲過程 |
| 全自動 ORM | Hibernate / JPA | 物件關係映射、一級/二級快取、HQL/JPQL、延遲載入 | 領域模型豐富、複雜關聯、團隊有 ORM 經驗 |
| 半自動 SQL 映射 | MyBatis / MyBatis-Plus | SQL 手寫可控、動態 SQL 強、映射靈活、無快取驚喜 | 報表查詢、複雜 SQL、DBA 管控嚴格、團隊偏好 SQL |
| Repository 抽象 | Spring Data JPA | 接口宣告即實現、方法名解析查詢、Spec/QueryDSL 複雜查詢 | 標準 CRUD 佔 80%+、快速開發、規範化團隊 |
spring-boot-starter-web 一鍵引入 Tomcat + Spring MVC + Jackson + Validation。java -jar app.jar,無需 WAR 部署 Tomcat。| 專案類型 | 推薦棧 | 理由 |
|---|---|---|
| 企業級單體/模塊化單體 | Spring Boot 3 + Spring MVC + MyBatis-Plus + Thymeleaf/Vue/React | 成熟穩定、生態豐富、團隊易招聘、長期維護低風險 |
| 微服務/雲原生 | Spring Boot 3 + Spring Cloud 2023 + Gateway + Nacos + Sentinel + OpenFeign | 服務治理完備、K8s 原生、GraalVM 原生映像支援 |
| 高併發 API / 即時系統 | Spring WebFlux (Reactive) + R2DBC + Netty 或 Vert.x / Go | 非阻塞、背壓、少執行緒高吞吐 |
| 輕量級 / Serverless / GraalVM Native | Micronaut / Quarkus / Helidon | 啟動極快、記憶體極小、編譯期 DI/AOP、無反射 |
| Kotlin 技術棧 | Spring Boot 3 + Kotlin + Coroutines + Exposed/Ktorm | 語法簡潔、空安全、協程非阻塞、與 Spring 無縫互操作 |
架構師心法:MVC 只是分層指導原則,非具體框架。Spring MVC 是實現 MVC 的最佳 Java 實踐,Spring Boot 讓它開箱即用。不要為了「純粹」拒絕成熟框架,也不要為了「方便」濫用自動配置掩蓋架構腐化。定期進行架構評審,保持 Controller 薄、Service 富、Repository 專、Domain 核心。