Struts2 作為經典的 MVC 框架,其核心機制圍繞「請求處理」與「響應結果」展開。本文將系統梳理 Action 處理流程、Result 類型機制、通配符映射、動態方法調用,以及 Web 資源獲取的兩種模式,幫助開發者建立清晰的知識體系。
在 Struts2 中,Action 扮演雙重角色:既是 struts.xml 中定義的 <action> 元素,也是表單提交的 action 屬性指向的目標,本質上代表一個 Struts2 請求的處理入口。
setXxx() 接收請求參數,getXxx() 供頁面顯示數據。execute())。ActionSupport 實現了多個關鍵接口,提供開箱即用的功能:
| 接口 | 核心功能 |
|---|---|
| Action | 提供 SUCCESS、INPUT 等結果常量與 execute() 抽象方法 |
| Validateable | 支援程式化輸入驗證 |
| ValidationAware | 管理類級別與字段級別錯誤訊息 |
| TextProvider | 從資源檔讀取屬性值,實現國際化 |
| LocaleProvider | 獲取 Locale 物件,支援國際化 |
| Serializable | 使 Action 可序列化 |
Struts2 根據請求路徑中的 ServletPath 後綴(如 .action、.do)判斷是否由框架處理。預設支援 .action 和無後綴兩種模式。可透過 struts.xml 中的 <constant> 元素自訂:
<constant name="struts.action.extension" value=".action,,.do"/>
所有預設常量定義於 default.properties,採用「約定優於配置」原則。
每個 <action> 可包含多個 <result>,核心屬性包括:
name:對應 Action 方法返回的字串值(預設 success)type:結果類型,決定跳轉方式| 類型 | 類別 | 適用場景 |
|---|---|---|
| dispatcher(預設) | ServletDispatcherResult | 內部轉發至 JSP/HTML,無法轉發至另一 Action(攔截器不會再次執行) |
| chain | ActionChainResult | 轉發至另一 Action,攔截器鏈重新執行,共享請求數據 |
| redirect | ServletRedirectResult | 客戶端重定向,目標可為 JSP 或 Action,需使用虛擬路徑(不含應用上下文) |
| redirectAction | ServletActionRedirectResult | 重定向至指定 Action,支援傳遞參數與命名空間 |
| stream | StreamResult | 以輸出流響應,適用於檔案下載、AJAX 回應 |
<action name="hello" class="com.example.HelloWorld" method="secondMethod">
<result type="chain">
<param name="actionName">worldhello</param>
<param name="namespace">/</param>
</result>
</action>
redirectAction 範例:
<action name="helloworld_*" class="com.example.HelloWorld" method="{1}">
<result>/success.jsp</result>
<result type="redirectAction" name="redirectAction">
<param name="actionName">redirect2Action</param>
</result>
</action>
actionName!methodName.action,預設關閉,需設定 struts.enable.DynamicMethodInvocation=true 啟用Struts2 將 Servlet API 封裝為 Map 物件:RequestMap、SessionMap、ApplicationMap、ParameterMap。
ActionContext.getContext().getSession() 等獲取 Map 物件RequestAware、SessionAware、ApplicationAware、ParameterAware,框架自動注入對應 MapHttpServletRequest、HttpServletResponse、ServletContextServletRequestAware、ServletResponseAware、ServletContextAware最佳實踐:優先採用解耦方式,僅在需直接操作 Servlet API(如檔案上傳、Cookie 處理)時使用耦合模式。