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の定義は以下に示す通りです。
AOPで挿入する処理を持つクラス - SampleAdviceクラス
実行するメソッドと実行条件 - 対象メソッドが実行される前にSampleAdviceクラスのprintMsg()メソッドを実行
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の設定によっては、処理を挿入する対象を複数とすることも可能です。
連携概要
概要
StrutsからSpring FrameworkのDelegatingActionProxyクラスをActionクラスとして呼び出し、クラス内部で改めてActionクラスのBeanを取得して呼び出しを行います。
構成図
以下に、本連携における構成図を示します。
図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> |
Actionクラスの定義
連携させるActionクラスをBeanとして定義します。
name属性の値はStruts設定ファイルで定義したactionタグのpath属性の値と一致させる必要があります。
class属性の値は連携するActionクラスを定義します。
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"); } } |