首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JavaWeb 框架演進啟示錄:為什麼我們需要 Struts2、SpringMVC 與 Spring?

     編輯:Java 綜合教學

從 Servlet 說起:Web 開發的「原始痛點」

Servlet 是 JavaWeb 的基石,職責單一:接收 Request → 業務處理 → 返回 Response。但實際開發中,Servlet 直觀卻粗糙:

  1. 協議綁定重:開發者需熟悉 HTTP 協議細節(GET/POST、請求頭、請求體解析),文件上傳、多部分表單處理極其繁瑣。
  2. 類型轉換與封裝全手工:參數全是 String,貨幣、日期、數字需手動轉換封裝到 JavaBean,大量樣板代碼,極易出錯。
  3. 視圖渲染硬編碼:Response 寫死 Content-Type、輸出流邏輯,復用性差,前後端強耦合。
  4. 請求映射靈活性低:一個 Servlet 對應一個 URL 模式,業務方法分發需自寫 if (action.equals("add")) ...。
  5. 攔截/預處理能力弱:Filter/Listener 粒度粗,無法優雅實現權限、日誌、事務等橫切關注點。

Struts2:Action 即 JavaBean,屏蔽 Servlet 細節

Struts2 以 Action 類(POJO/JavaBean)替代 Servlet,核心價值:

  • 自動類型轉換與封裝:表單參數按名稱自動映射到 Action 屬性(含巢狀屬性 user.name),內建常用類型轉換器,徹底消除手工 set/get。
  • 方法即動作,URL 映射零配置:Action 中每個 public 方法可直接對應一個 URL(user_add.action → add()),無需在 web.xml 註冊 Servlet,支持通配符映射。
  • 結果視圖配置化:struts.xml 定義 <result> 類型(JSP、Velocity、FreeMarker、JSON、Stream 等),邏輯視圖名與物理資源分離,統一管理,易維護。
  • 攔截器鏈(AOP 思想):比 Filter 更強—— 基於反射,可攔截 Action 方法執行前後、字段訪問、異常處理,實現驗證、文件上傳、國際化、權限等橫切邏輯,defaultStack 開箱即用。
  • 標籤庫:完整的 UI 標籤(表單、數據展示、AJAX),極大提升頁面開發效率,但也導致前端技術棧綁定。
反思:Struts2 大量使用反射(註解配置更甚),性能不如原生 Servlet;且標籤庫與前端模板引擎(Velocity/FreeMarker)綁定,前後端分離趨勢下顯得笨重。但其「Action 即 JavaBean、攔截器 AOP、配置化視圖」設計思想深刻影響後續框架。

SpringMVC:輕量、RESTful、原生 Servlet API 友好

SpringMVC 保留 Struts2 精華,修正痛點:

Spring:企業級開發的「粘合劑」與「總線」

若說 Struts2/SpringMVC 解決 Web 層問題,Spring 則解決 整個應用架構的對象管理與解耦。

IoC(控制反轉 / 依賴注入):對象創建與裝配的「容器化」

  • 痛點:new 產生強耦合,單例/工廠模式手寫繁瑣,對象圖嵌套(槍→子彈→機床→...)構建極其複雜。
  • 方案:將對象定義(BeanDefinition)與依賴關係外置到 XML/註解,由 IoC 容器 統一實例化、注入、生命週期管理。
  • 兩種注入:構造器注入(強依賴、不可變)、Setter 注入(可選依賴、可重配置)。
  • Scope 控制:singleton(默認)、prototype、request、session、application。

AOP(面向切面編程):橫切關注點的「非侵入式」模塊化

  • 代理模式本質:為目標對象創建代理(JDK 動態代理/CGLIB),在調用鏈織入「增強」(前置/後置/環繞/異常/最終)。
  • 核心概念:Joinpoint(連接點)、Pointcut(切點表達式)、Advice(增強)、Aspect(切面 = 切點 + 增強)。
  • 典型應用:聲明式事務(@Transactional)、日誌、權限、緩存、性能監控、重試/熔斷。
Spring 的本質 = 溝通機制:它不直接創造業務價值,但通過管理對象創建(IoC)與橫切邏輯織入(AOP),極大降低模塊間耦合,讓業務代碼專注核心邏輯。像銀行不生產貨幣但掌控資金流向,Spring 不寫業務卻掌控對象流向。

框架選型決策樹

維度Struts2SpringMVC
核心控制器Filter(StrutsPrepareAndExecuteFilter)Servlet(DispatcherServlet)
Action/Controller 實例每請求一個實例(原型)單例(默認),線程安全需開發者保證
參數綁定屬性驅動(Action 即表單模型)方法參數綁定(@RequestParam、@ModelAttribute、POJO 直接接收)
類型轉換OGNL 表達式,功能強但複雜、有安全漏洞史ConversionService/Formatter,簡潔可擴展
視圖解析struts.xml 配置 resultViewResolver 鏈(InternalResourceViewResolver 等),支持 RESTful 內容協商
攔截機制Interceptor(反射實現,功能豐富)HandlerInterceptor(基於 Servlet API,輕量)+ AOP
REST 支持弱(需插件)原生支持 @PathVariable、@RequestBody、HttpMessageConverter
場景推薦理由
傳統企業級應用、團隊熟悉 Struts2、需豐富標籤庫Struts2 + Spring成熟穩定,攔截器功能最強,標籤庫開發效率高
RESTful API、前後端分離、微服務、高併發、性能敏感SpringMVC + Spring(或 Spring Boot)輕量、原生 Servlet、REST 支持佳、易測試、與 Spring 生態無縫整合
新項目、追求開發效率、約定優於配置Spring Boot + SpringMVC自動配置、內嵌容器、生產級監控、雲原生就緒

結語

框架非銀彈,但優秀框架的設計思想(IoC、AOP、MVC、攔截器、類型轉換、視圖解析)是通用的架構智慧。理解 Servlet 痛點 → Struts2 解法 → SpringMVC 改良 → Spring 底層支撐,這條演進線索,才是掌握 JavaWeb 開發的真正鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved