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

Java 學習雜談(十)—— Struts 2 核心架構與 IoC/AOP 實踐

     編輯:Java 相關知識

歷史脈絡:從 Struts 1 到 Struts 2

  • 2002 年 WebWork 發布,引入 IoC、AOP 等革命性思想,與 Struts 1 不兼容。
  • 2005 年 12 月 WebWork 與 Struts Ti 合併,Struts Ti 更名為 Struts Action Framework 2.0,成為 Struts 官方下一代。

Struts 2 處理流程

  1. 瀏覽器發起請求,框架根據配置決定攔截器鏈、Action 類、Result 類型。
  2. 請求經過攔截器鏈(按層級執行不同邏輯),類似 Struts 1 的 RequestProcessor。
  3. 實例化 Action,調用業務邏輯方法(默認 execute())。
  4. 根據返回結果字符串匹配 <result>,實例化對應 Result 類型(JSP、FreeMarker、Velocity、Stream 等)。
  5. 響應階段再次經過攔截器鏈(可配置縮減)。
  6. 控制器返回 Servlet,生成 HTML 輸出。

關鍵差異:無 FormBean 作用域封裝,Action 直接獲取請求參數。

核心配置

web.xml:Filter 替代 Servlet

<filter>
  <filter-name>controller</filter-name>
  <filter-class>org.apache.struts.action2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
  <filter-name>controller</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
  • 默認 action 擴展名 .action(struts.action.extension 配置)。
  • 與 Struts 1 (.do) 可共存。

struts.xml:Action 配置

<package name="default" extends="struts-default">
  <action name="myAction" class="com.example.MyAction">
    <result name="success">/success.jsp</result>
    <result name="input">/form.jsp</result>
  </action>
</package>

Action 實現:POJO 化

public class MyAction {
    public String execute() throws Exception {
        // 業務邏輯
        return "success";
    }
}
  • 無需繼承基類或實現接口,純 POJO。
  • 任意無參、返回 String 的公共方法均可作為 Action 入口(通過配置指定)。

IoC:參數自動注入

Struts 2 利用 控制反轉 (IoC) 將請求參數、Servlet API 對象注入 Action:

  1. Action 定義屬性及 Setter(如 private HttpServletRequest request; setServletRequest())。
  2. 實現感知接口(ServletRequestAware、SessionAware、ParameterAware 等)。
  3. 框架在調用 Action 前,通過反射調用 Setter 注入對象,控制權從程序員轉移到容器。
public class MyAction implements ServletRequestAware {
    private HttpServletRequest request;
    public void setServletRequest(HttpServletRequest request) { this.request = request; }
    public String execute() { /* 直接使用 request */ return Action.SUCCESS; }
}

AOP:攔截器機制

攔截器基於 Proxy 模式 實現 AOP(面向切面編程):

  • 全局監控單一代理點,控制所有被代理方法調用。
  • 前置/後置邏輯分離:認證、日誌、事務、異常處理等橫切關注點集中在攔截器。
  • Struts 2 默認攔截器棧(defaultStack)包含:params(參數注入)、validation、workflow、servletConfig 等。

線程安全:Action 多實例

Struts 1 Action 單例,需開發者自行保證線程安全。Struts 2 每請求創建新 Action 實例,天然線程安全,開發者可放心使用實例字段。

總結

Struts 2 通過 IoC 和 AOP 徹底解耦 Action 與框架,Action 成為純 POJO。這兩種思想已滲透現代框架(Spring 更徹底體現)。理解 Proxy 模式與控制反轉本質,比記憶配置細節更重要。

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