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

Spring 與 Struts 整合的三種方式完整解析

     編輯:Java 相關知識

前言

Spring 與 Struts 都是經典 Java Web 框架,整合兩者可發揮 Spring IOC 容器管理業務邏輯元件、Struts 處理表現層的優勢。本文詳細說明三種主流整合方式、配置步驟與優缺點比較,並推薦最佳實踐。

共同前置步驟:載入 Spring 容器

在 struts-config.xml 加入外掛,載入 Spring 應用程式上下文:

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
    <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>

確保 applicationContext.xml 位於 WEB-INF 目錄下。

方式一:繼承 Spring 的 ActionSupport

原理

org.springframework.web.struts.ActionSupport 繼承自 Struts Action,提供 getWebApplicationContext() 取得 Spring 容器。

程式碼範例

public class LoginAction extends org.springframework.web.struts.ActionSupport {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest request, HttpServletResponse response) {
        LoginForm loginForm = (LoginForm) form;
        WebApplicationContext ctx = getWebApplicationContext();
        LoginDao dao = (LoginDao) ctx.getBean("loginDao");
        // ... 業務邏輯 ...
    }
}

Spring 配置

<beans>
    <bean id="loginDao" class="com.cao.dao.LoginDao"/>
</beans>

優缺點

  • ✅ 簡單直接,業務邏輯與表現層解耦。
  • ❌ Action 強耦合 Spring API(繼承 ActionSupport),移植性差。

方式二:使用 DelegatingRequestProcessor

原理

以 Spring 的 DelegatingRequestProcessor 取代 Struts 預設 RequestProcessor,攔截 Action 建立過程,自動將 Spring Bean 注入 Action 的 setter 屬性。

struts-config.xml 關鍵配置

<controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>

Action 寫法

public class LoginAction extends Action { // 繼承原生 Struts Action
    private LoginDao dao; // 提供 setter/getter
    public void setDao(LoginDao dao) { this.dao = dao; }
    public ActionForward execute(...) {
        // 直接使用 dao,無需手動取得 Context
    }
}

Spring 配置

<beans>
    <bean id="loginDao" class="com.cao.dao.LoginDao"/>
    <bean name="/login" class="com.cao.struts.action.LoginAction">
        <property name="dao"><ref local="loginDao"/></property>
    </bean>
</beans>

name="/login" 對應 Struts <action path="/login",class 對應 type。

優缺點

  • ✅ Action 不依賴 Spring API,純 POJO。
  • ❌ 若需自訂 RequestProcessor(如編碼處理),會與 DelegatingRequestProcessor 衝突。

方式三:全權委托

原理

Action 的建立與依賴注入完全交給 Spring IOC 容器,Struts 僅透過 DelegatingActionProxy 代理轉發請求給 Spring 管理的 Action Bean。

struts-config.xml 關鍵配置

<action-mappings>
    <action path="/login"
            type="org.springframework.web.struts.DelegatingActionProxy"
            name="loginForm" scope="request" input="login.jsp">
        <forward name="success" path="/ok.jsp"/>
        <forward name="error" path="/error.jsp"/>
    </action>
</action-mappings>
  • type 指向 Spring 代理類,而非實際 Action 類。
  • 移除 <controller> 設定(不再需要 DelegatingRequestProcessor)。

Spring 配置

<beans>
    <bean id="loginDao" class="com.cao.dao.LoginDao"/>
    <bean name="/login" class="com.cao.struts.action.LoginAction">
        <property name="dao"><ref local="loginDao"/></property>
    </bean>
</beans>

優缺點

  • ✅ 完全解耦,Action 為純 Spring Bean,支援完整 IOC/AOP 功能。
  • ✅ 避免 RequestProcessor 衝突,擴充性最佳。
  • ✅ 符合「依賴注入」核心精神,官方推薦方式。

三種方式比較總結

方式耦合度擴充性推薦指數
1. ActionSupport高低⭐⭐
2. DelegatingRequestProcessor中中⭐⭐⭐
3. 全權委托低高⭐⭐⭐⭐⭐

整合步驟總結

  1. 修改 struts-config.xml(加入外掛、設定 controller 或 action type)。
  2. 配置 applicationContext.xml(定義業務 Bean、Action Bean 及注入關係)。
  3. 為 Action 添加 setter 方法以接收依賴注入。

結語

雖然三種方式皆可達成整合,但全權委托最能發揮 Spring IOC 容器優勢,實現表現層與業務層的徹底解耦,也是官方文件與社群公認的最佳實踐。建議新專案直接採用方式三。

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