SpringとStruts Struts 連 携 トラストサービス 2006/05/27
DIコンテナ 前 回 ご 説 明 したSpring DIコンテナに 共 通 するこ とは 依 存 を 注 入 することによってシステム 内 に 存 在 するオブジェクト 同 士 の 結 びつきを 緩 くすることで あり そのための 仕 組 み 提 供 を 意 味 する [Spring のDIコンテナはBean 定 義 ファイルに 基 づき JavaBeansの 管 理 と 構 成 を 行 う(Beanファクトリと Bean ファクトリの 上 に 構 成 されるApplicationコンテキストによっ てDIコンテナは 構 成 されている)] Bean 定 義 ファイル(デフォルト:applicationContext.xml)
DIコンテナ またSpringは Setter Injectionと 呼 ばれる 手 法 (オブジェクト 間 の 関 連 がXMLファイルに 記 述 され DIコンテナがオブジェクト のSetterメソッドを 利 用 して 参 照 するオブジェクトを 設 定 すること) Constructor Injectionと 呼 ばれる 手 法 (DIコンテナが オブジェクトのコンストラクタのパラメータとして 参 照 する オブジェクトを 設 定 する 参 照 するオブジェクト 参 照 され るオブジェクトの 作 成 は 開 発 者 が 行 い コンテナには 関 連 付 けだけを 依 頼 する (Seasar2もSpringと 同 様 の 上 記 2つをサポートしている)
SpringはなぜWEBアプリケーション 開 発 に 必 要 なのか システム 構 築 を 検 討 していく 上 で 開 発 者 のためのアーキテクチャとして 開 発 効 率 テスト 精 度 保 守 (デバッグ)や 拡 張 ( 二 次 開 発 ) のしやすい 設 計 が 必 要 である 開 発 効 率 意 図 を 把 握 しやすく 理 解 しやすい 構 造 を 設 計 (5000ページもあるド キュメントを 読 まないとわからないのはよくない) テストが 容 易 に 行 える 構 造 を 設 計 (テストをするのにライブラリにクラスパスを 通 さなければならないとか WEBコンテナを 用 意 したり テストのために 実 装 変 更 をするのはよくない) 柔 軟 性 保 守 しやすく 拡 張 しやすい 構 造 を 設 計 (システムに 対 するユーザ 要 求 が 変 化 しやすいため) 将 来 の 環 境 の 変 動 に 耐 える 頑 健 な 構 造 を 設 計
SpringはなぜWEBアプリケーション 開 発 に 必 要 なのか アスペクトの 注 入 Spring Aspect Injection を 利 用 することでビジネス 層 で 業 務 ロジックを 実 現 するオブジェクトはフレームワークや コンテナに 依 存 しないPOJOで 作 成 することができる 独 立 した 業 務 ロジックを 作 れることはSpringの 設 計 上 の 最 大 の 魅 力 点 だと 思 われる 開 発 効 率 がよいまた 保 守 性 や 拡 張 性 に 強 い 設 計 が 実 現 できると 思 われる POJO :Plain Old Java Object の 略 語 Pure JAVA 昔 ながらのJAVA
StrutsとSpringを 連 携 させる 場 合 の 問 題 点 プレゼンテーション 層 ビジネスロジック 層 Action Servlet Action この 関 連 構 築 をどうするか サービスオブジェクト Struts 生 成 生 成 Spring(DIコンテナ) 今 回 は 説 明 しないが データアクセス 層 が 実 装 modelとしてある
2つの 解 決 方 法 プレゼンテーション 層 ビジネスロジック 層 Springが 提 供 するクラス DelegatingActionProxyを 利 用 する Action Servlet 代 理 クラス Action サービス オブジェクト 生 成 生 成 注 入 生 成 Struts Spring(DIコンテナ)
2つの 解 決 方 法 プレゼンテーション 層 サポート クラス ビジネスロジック 層 Springが 提 供 する 抽 象 クラス ActionSupportを 利 用 する Action Servlet Action サービス オブジェクト Struts 生 成 生 成 Spring(DIコンテナ) 抽 象 クラスActionSupportはstrutsのActionを 継 承 しているが Springと 連 携 する 際 にActionをサポートするメソッドを 幾 つか 追 加 しているだけであることに 注 意 したい
シーケンス 図 入 力 項 目 : 姓 + 名 前 を 連 結 する
画 面 遷 移
入 力 した 姓 * 名 が 連 結 して 表 示 される 画 面 遷 移
jsp <%@ page language="java" pageencoding="windows 31J" contenttype="text/html; charset=windows 31J" %> <html:form action="/login" method="post"> <TABLE border="0"> <TR><TD><bean:message key="label.firstname"/></td> <TD><html:text property="firstname"/></td> </TR> <TR><TD><bean:message key="label.lastname"/></td> <TD><html:text property="lastname"/></td></tr> <TR> <TD colspan="2" align="center"> <html:submit property="button"> <bean:message key="welcome.button"/> </html:submit> </TD></TR> <TR><BR></TR> <TR><TD bgcolor="pink" colspan="2" align="center"> <bean:write name= loginform property= fullname /> </TD> </TR> </TABLE> </html:form>
ApplicationContext.xml
LoginActionクラス WebApplicationCont ext()からbeanを 取 得
ビジネスLogic
通 常 Actionクラスの 実 装 Struts 基 本 処 理 フロー Public class SampleAction extends Action{ ( 省 略 ) public ActionForward execute( ActionMapping mapping, ActionForm form, HttpRequest requset, HttpResponse response){ Actionクラスは 通 常 ビジ ネス 層 のオブジェクトを 生 成 してビジネスロジックを 呼 び 出 している ActionSupportService actionservice = new ActionSupportService(); String fullname = sampleservice.createfullname( firstname,lastname); ( 省 略 ) } }
Struts Spring 基 本 処 理 フロー ActionSupportクラスの 実 装 Public class SampleAction extends SapportAction{ ( 省 略 ) public ActionForward execute( ActionMapping mapping, ActionForm form, HttpRequest requset, HttpResponse response){ ActionSupportService actionservice = (actionservice) getwebapplicationcontext.getbean( loginservice ); String fullname = actionservice.createfullname( firstname,lastname); ( 省 略 ) } }
まとめ ビジネスロジック 層 が 変 更 されても Actionクラス 内 は 変 更 せず 読 み 込 むxmlファイルの<bean id= class 名 = >を 変 更 するだけで OK!! 上 記 を 実 現 するためSpringが 提 供 しているActionSupport を 継 承 して 実 装 することでSpring application contextへのリファランスが 取 得 でき ていることが 保 守 や 拡 張 のしやすさが 実 現 できると 思 われる (getwebapplicationcontext()メソッド) ActionSupportは 簡 単 にSpringとStrutsの 連 携 ができるが デメリッ トとしてSpring AOPが 使 えないことがあげられる
Bean 定 義 ファイル Bean 定 義 ファイル 例 <beans> <bean id = オブジェクトA class= パッケージ 名.クラス 名 A > <property name= 変 数 名 ><value> 文 字 列 </value></property> <property name= 変 数 名 ><value> 文 字 列 </value></property> </bean> <bean id= オブジェクトB class= パッケージ 名.クラス 名 B > </bean> <bean id= オブジェクトC class= パッケージ 名.クラス 名 C > <property name= 変 数 名 ><ref bean= オブジェクト 名 B /> </property> </bean> <beans>
属 性 id name class parent singleton lazy-init beanタグの 属 性 意 味 オブジェクト 名 オブジェクトに 別 名 をつける 空 白, ; で 区 切 る ことにより 複 数 の 名 前 をつけることができる StrutsプラグインなどContextLoaderPlaginを 利 用 した 場 合 使 用 する idの 実 装 パッケージ 名 +クラス 名 設 定 情 報 を 引 き 継 ぐオブジェトのidを 指 定 する true 属 性 を 省 略 した 場 合 のデフォルト メソッドgetBean で 取 得 する オブジェクトはシングルトン false メソッドgetBean 取 得 するオブジェクトは 毎 回 インスタンス 化 されたもの true オブジェクトの 生 成 を 遅 らせる false 属 性 を 省 略 した 場 合 のデフォルト Beanファクトリの 起 動 時 にオブジェクトを 生 成 する
beanタグの 属 性 属 性 意 味 Autowire no 省 略 した 場 合 デフォルト <property>タグには<ref>タグ で 指 定 されたオブジェクトがプロパティに 設 定 される byname 指 定 した 名 前 のオブジェクトがプロパティに 設 定 される byname=employee はsetEmployee()に 相 当 bytype 指 定 されたタイプのオブジェクトがプロパティに 設 定 される constructor bytypeと 同 義 Type3 利 用 時 に 利 用 する autodetect bytypeもしくはcustrutorのいずれかを 実 行 する dependency-check none simple object all 属 性 を 省 略 した 場 合 デフォルト 依 存 関 係 のチェックをしない プロパティに 基 本 型 が 設 定 されているかチェック プロパティにオブジェクトが 設 定 されているかチェック simpleとobjectの 複 合
beanタグの 属 性 属 性 意 味 depend-on 依 存 関 係 の 対 象 となるオブジェクトの 存 在 をチェックする init-method メソッド 名 を 記 述 することにより プロパティの 設 定 後 に 呼 ばれる ここで 指 定 するメソッドには 引 数 がないこと destroy-method メソッド 名 を 記 述 することにより システム 終 了 時 に 呼 ばれる ここで 指 定 するメソッドを 持 つオブジェクトは シングルトンであること