Strutsと連携するには?(理論編) | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

StrutsとSpringを連携するには、一般に4つの方法があります。

4つにはそれぞれ欠点があるので、システムの性格に応じて方法を選んでいく必要があります。

そして、自分が考える第5の方法があるので、それはあとの記事 で見ることにします。



名称 概要 Spring設定ファイルへの記述 制限がかかる箇所
ActionSupport系を使う

Springが提供するActionSupportクラスを継承させる方法です。ActionSupportクラス自体はStrutsのActionクラスを継承しています。

なし

Springの設定ファイルにActionクラスが記述できない(DIが使えない)。つまり、Actionに対してAOPなどを使用できない。

DelegatingActionProxy系を使う

Springが提供するDelegatingActionProxyクラスをStrutsのActionとして使用する。

必要 ※問題点1
DelegatingRequestProcessor系を使う Strutsの設定ファイルに左記のクラスを設定することでRequestProcessorを乗っ取ることで連携します。 必要

※問題点1

と、StrutsではRequestProcessorは1つしか設定できない問題あり。

それをSpringが使ってしまうので、他の人がReqestProcessorの機能拡張をしたいときにできない。

AutowiringRequestProcessor系を使う

Strutsの設定ファイルに左記のクラスを設定することでReqestProcessorを乗っ取ることで連携します。

ただし、Springファイルにパスを記述する必要がないため、※問題点1のようなことが発生しません。

なし

DIが使えない。

AOPが使えない。


これらの実際のやり方は、以下のページが詳しいです。

 http://itpro.nikkeibp.co.jp/article/COLUMN/20080929/315624/

メリット、デメリットのまとめ(下のほうに表があります)

 http://itpro.nikkeibp.co.jp/article/COLUMN/20080929/315624/?ST=develop&P=5


それぞれの問題点:

 http://d.hatena.ne.jp/chiba_mk3/20080701/1215187585

 


※問題点1について
 1.Strutsのactionに設定するpathと同じidでSpring設定ファイルにActionクラスを設定しないといけません。

  ですので、1つパスが増えると2つのファイルに記述をしないといけないという問題があります。

 2.Springであれば、beanの使い回しができるのが当たり前ですが、beanのidをパス名と合わせない

  といけないです。ですので、同じActionクラスでも、path名が違えば、違うbeanとして設定しないといけません。 

 3.もうひとつ、beanのid名を自由に選べないという弱点もあります。

 

以下の感じでファイルに2つの記述が必要です。


Spring設定ファイル:

<bean name="/login" class="Aaaa"/>

<bean name="/topmenu" class="Aaaa"/>←classが同じなので本当は上だけ記述して使いまわしたいけどできない


Struts設定ファイル:

<action path="/login" ...../>

<action path="/topmenu" ...../>


※この問題の逃げ道はあります。(参照: 連携方法を拡張して、より自由度が高い連携をするには?



※「DIが使えない」問題点について

これはどういう意味かというと、StrutsのActionクラスをSpringの設定ファイルに設定できないという意味です。

これによる問題点は、Actionクラスにsetterを作成しても、Springの設定ファイル上で設定ができないということです。

もっと言うと、Springを使用できれば何かあってもsetterで設定するクラスや定数を変更することで動作を変更できます。これが全くできないということになります。

また、Springで設定されていないので、当然ながらAOPも使用できないということにもなります。

・DIxAOPの機能について の注意点を参照。


【結局どれがいいの?】

正直どれも何かしらの面倒くささはあります。

しかし、面倒なことよりも、後で機能が使えない制限の方が問題です。

例えばDIを使えないとか、AOPを使えないとか、ReqestProcessorを拡張できないとかです。

すると必然的に以下の物が残ります。


  ・DelegatingActionProxy


個人的には、これがいいと思っています。

が、ケースバイケースなので、システムごとに考えなきゃですかね。




参照:

・トップ

Strutsと連携するには?(理論編)

Strutsと連携するには?(実践編)

連携方法を拡張して、より自由度が高い連携をするには?

検索画面を簡単に実現するには?