ページの先頭行へ戻る
Interstage Business Application ServerV11.0.0 オープンJavaフレームワークユーザーズガイド
Interstage

3.3.6 Strutsとの連携

StrutsとSpring Frameworkを連携させることにより、Strutsを利用して構成したアプリケーションにおいてもSpring Frameworkの機能を利用することが可能になります。

StrutsとSpring Frameworkを連携させることにより、Strutsで作成された既存のWebアプリケーション資産をSpring Frameworkが持つ機能AOPやDIなどの機能を利用して拡張していくことができます。

Actionクラスに対する依存性の注入

Spring Frameworkと連携することによって、DIコンテナの機能を利用することが可能になります。

DIコンテナの利用方法については、“3.3 Spring Frameworkアプリケーションの開発” を参照してください。

Actionクラスに対するAOPの適用

ActionクラスがSpring FrameworkのDIコンテナの管理下にあるとき、Actionクラスに対するAOPの適用が可能になります。

以下に、適用例を示します。

Loginクラス  (業務ロジッククラス)

package test;
public class Login {
    ・・・
    public boolean checkId(String userId) {
        //認証処理
        ・・・
        return true;
    }
    ・・・
}

SampleAdviceクラス  (AOPで挿入したい処理を実装したクラス)

package test;
public class SampleAdvice {
    public void printMsg(){
        System.out.println("AOPで処理が挿入されました");
    }
}

Spring FrameworkのBean定義ファイル (AOPに関する定義を記述)

<beans>
    ・・・
    <aop:config>
        <!-- 1 -->
        <aop:aspect id="helloAspect" ref="AOPClass">  ※1
            <!-- 2 -->
            <aop:before method="printMsg" pointcut-ref="pc1" />
            <!-- 3 -->
            <aop:pointcut expression="execution(* execute(..))" id="pc1" />
        </aop:aspect>
    </aop:config>
    <bean id="AOPClass" class=" test.SampleAdvice" />
    ・・・
</beans>

※1 ・・・ ref要素でbean id“AOPClass”を参照しています。

本サンプルにおけるAOPの定義は以下に示す通りです。

  1. AOPで挿入する処理を持つクラス - SampleAdviceクラス

  2. 実行するメソッドと実行条件  - 対象メソッドが実行される前にSampleAdviceクラスのprintMsg()メソッドを実行

  3. AOPの対象メソッド - “execute”という名称のメソッド(完全一致のみ)

自作ActionクラスへのAOP適用イメージ

package test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.DynaActionForm;
public class SampleAction extends Action{
    // AOPによって、ここに処理が挿入されます。
    public ActionForward execute(ActionMapping map, ActionForm form, 
        HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        DynaActionForm dynaForm = (DynaActionForm)form;
        String userId = dynaForm.getString("userId");
        if(userId.equals("")){
            userId = "ユーザ名を入力して下さい";
        }
        // 変数userIdの値を出力します。
        System.out.println(userId);
        // Actionクラス内で呼び出す業務ロジックです。
        Login login = new Login();
        boolean result =login.checkId(userId);  
        if (true == result){
            // 業務処理成功時
            return map.findForward("success");
        }
        // 業務処理失敗時
        return map.findForward("failure");
    }
}

以下に、本サンプル実行時の処理結果を示します。

処理結果

AOPで処理が挿入されました

spring  (HTMLフォームで入力した値)

ポイント

AOPの設定によっては、処理を挿入する対象を複数とすることも可能です。

連携概要

概要

構成図

以下に、本連携における構成図を示します。

図3.1 Struts-Spring連携の構成図

WebApplicationContext  ・・・  Spring  FrameworkのBean定義ファイルの情報を保持します。

クラスパスの設定

IJServerクラスタのクラスパスへ機能連携のために必要なjarファイルを設定します。

設定手順については、“Interstage Application Server/Interstage Web Server Java EE運用ガイド” を参照してください。

以下のjarファイルを設定します。

[Interstageのインストールディレクトリ]\BAS\struts12\lib\struts12.jar

[Interstageのインストールディレクトリ]\BAS\spring25\lib\spring25.jar

[Interstageのインストールディレクトリ]\BAS\spring25\lib\spring-webmvc25.jar

[Interstageのインストールディレクトリ]\BAS\spring25\lib\spring-webmvc-struts25.jar

[Interstageのインストールディレクトリ]\BAS\lib\commons-beanutils-1.8.3.jar

[Interstageのインストールディレクトリ]\BAS\lib\commons-digester-2.1.jar

[Interstageのインストールディレクトリ]\BAS\lib\aopalliance.jar

[Interstageのインストールディレクトリ]\BAS\lib\aspectjweaver.jar

[Interstageのインストールディレクトリ]\BAS\lib\cglib-nodep2.2.2.jar

[Interstageのインストールディレクトリ]\BAS\lib\commons-logging-1.1.1.jar

[Interstageのインストールディレクトリ]\BAS\lib\apfwlogging.jar

/opt/FJSVibs/struts12/lib/struts12.jar

/opt/FJSVibs/spring25/lib/spring25.jar

/opt/FJSVibs/spring25/lib/spring-webmvc25.jar

/opt/FJSVibs/spring25/lib/spring-webmvc-struts25.jar

/opt/FJSVibs/lib/commons-beanutils-1.8.3.jar

/opt/FJSVibs/lib/commons-digester-2.1.jar

/opt/FJSVibs/lib/aopalliance.jar

/opt/FJSVibs/lib/aspectjweaver.jar

/opt/FJSVibs/lib/cglib-nodep2.2.2.jar

/opt/FJSVibs/lib/commons-logging-1.1.1.jar

/opt/FJSVibs/lib/apfwlogging.jar

Struts-Spring連携のための手順

以下に連携機能の利用手順を示します。

Struts設定ファイル

Action定義

非連携時と同様にaction-mappingsタグを記述しますが、actionタグのtype属性を以下のように定義します。

Action定義の詳しい方法については、“第2章 Struts (Java EE)“の“2.3 Strutsアプリケーションの開発” を参照して下さい。

    <action-mappings>
        ・・・
        <action path="/login" name="loginForm" type="org.springframework.web.struts.DelegatingActionProxy">
          <forward name="success" path="/WEB-INF/jsp/loginSuccess.jsp" />
          <forward name="failure" path="/WEB-INF/jsp/loginError.jsp"   />
        </action>
    </action-mappings>

Spring FrameworkのBean定義ファイル

連携させるActionクラスのBean定義を追加

<beans>
    ・・・
    <!-- 1. Actionクラスの定義 -->
    <bean name="/login" class="test.SampleAction">
        <!-- 2. ActionクラスへのDI定義 -->
        <property name="loginService" ref="injectionClass"  />
    </bean>
    <bean name="injectionClass" class="test.Login" />
    ・・・
</beans>
  1. Actionクラスの定義
    連携させるActionクラスをBeanとして定義します。
    name属性の値はStruts設定ファイルで定義したactionタグのpath属性の値と一致させる必要があります。
    class属性の値は連携するActionクラスを定義します。

  2. ActionクラスへのDI定義
    Actionクラスに対して依存性を注入する場合は、“3.3 Spring Frameworkアプリケーションの開発” と同様の手順で実現することが可能です。

注意

beanタグのid属性には、“/”(スラッシュ)で始まる値を指定することができません。そのため、id属性ではなく必ずname属性を指定します。
beanタグにはワイルドカードは使用できません。そのため、Struts設定ファイルで定義したactionタグのpath属性の値にワイルドカードを使用している場合は、対応するbeanタグを複数定義する必要があります。

Actionクラス

Actionクラスを作成

StrutsのActionクラスを継承したクラスを作成します。

詳しい作成方法については、“第2章 Struts (Java EE)“の“2.3 Strutsアプリケーションの開発” を参照してください。

package test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.DynaActionForm;
 public class SampleAction extends Action{ 
    // DIコンテナのセッターインジェクションを利用したActionクラスへの依存性の注入
    Login login = null;  
    public void setLoginService(Login login){
        this.login = login;
    }
    public ActionForward execute(ActionMapping map, ActionForm form, 
        HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        DynaActionForm dynaForm = (DynaActionForm)form;
        String userId = dynaForm.getString("userId");
        if(userId.equals("")){
            userId = "ユーザ名を入力して下さい";
        }
        // Actionクラス内で呼び出す業務ロジックです。
        boolean result = login.checkId(userId);
        if (true == result){
            // 業務処理成功時
            return map.findForward("success");
        }
        // 業務処理失敗時
        return map.findForward("failure");
    }
}