《Struts2的詳細(xì)工作原理》——一位老碼農(nóng)的深度拆解
你是不是也曾在項目中遇到過這樣的困惑:一個請求進(jìn)來,為什么能自動調(diào)用對應(yīng)的Action?表單數(shù)據(jù)又是怎么“神奇”地綁定到Java對象上的?別急,今天我們就用問答形式,帶你深入Struts2的核心機(jī)制,就像老朋友聊天一樣,講清楚它背后的邏輯。
Q1:Struts2是怎么接收到HTTP請求的?
答案很簡單:它靠一個叫FilterDispatcher(在新版本中是StrutsPrepareAndExecuteFilter)的過濾器。這個家伙就像門衛(wèi),所有請求都得先經(jīng)過它。它會根據(jù)URL路徑找到對應(yīng)的Action類和方法,然后交給Struts2的核心引擎處理。
比如你訪問 /user/login,Struts2會根據(jù)配置文件(通常是struts.xml)里的<action name="login" class="com.example.LoginAction">,把請求分發(fā)給LoginAction的execute()方法。
Q2:表單數(shù)據(jù)怎么自動注入到Java對象里?
這就是Struts2最優(yōu)雅的設(shè)計之一——OGNL表達(dá)式語言 + ValueStack值棧。當(dāng)用戶提交表單時,Struts2會自動把參數(shù)(如username、password)通過反射設(shè)置到Action對象的屬性上,不需要你手動寫request.getParameter()!
舉個真實案例:我在某電商項目里,有個注冊Action叫RegisterAction,里面定義了String username、String email等字段。前端表單提交后,Struts2自動就把數(shù)據(jù)塞進(jìn)去了,代碼干凈得像藝術(shù)品。
Q3:攔截器(Interceptor)到底是什么?有什么用?
攔截器就像是你代碼中的“中間人”。它能在Action執(zhí)行前后做各種事情,比如權(quán)限校驗、日志記錄、異常處理。Struts2內(nèi)置了很多常用攔截器,比如params(參數(shù)注入)、validation(校驗)、session(會話管理)。
我曾在一個項目中用自定義攔截器記錄每個接口的調(diào)用時間,只加了一行配置:<interceptorref name="timeLog"/>,整個系統(tǒng)性能監(jiān)控就輕松實現(xiàn)了。
Q4:Struts2和Spring整合是怎么工作的?
Struts2天生支持依賴注入。你可以在Action里直接用@Autowired注解注入Service層Bean,因為Struts2的Action是由Spring容器管理的。這樣既保持了Action的輕量,又享受了Spring的IoC優(yōu)勢。
比如:private UserService userService; 加上@Autowired,就能直接調(diào)用userService.saveUser(),不用new,也不用手動管理生命周期。
總結(jié)一下:Struts2不是過時的技術(shù),而是一個設(shè)計精巧、可擴(kuò)展性強(qiáng)的MVC框架。它的核心在于過濾器驅(qū)動 + 值棧機(jī)制 + 攔截器體系,三者協(xié)同,讓開發(fā)者專注于業(yè)務(wù)邏輯,而不是底層細(xì)節(jié)。
如果你還在用Spring Boot寫Controller,不妨回頭看看Struts2——它教會我們的,不只是如何寫代碼,更是如何優(yōu)雅地組織系統(tǒng)架構(gòu)。

