今回の開発では、StrutsのActionクラスにおいても、 SpringのDI機能を享受する為に、 若干面倒な手順を踏むことになる。
通常は、Actionであるとか、 LookupDispachAction?であるとかのクラスを拡張してActionを作成する。 Springを使う場合は、 Springの機能を使いやすくするために、 ActionSupport?、LookupDispachActionSupport?といった、 サポート機能付クラスを拡張して、 Actionを作ることになる。
内容を作りこむうえで、 これらのクラスに影響を受けることはさほどないと思う。
だがそれとは別に、 WebサービスをDIしてもらうために、 WebサービスのBeanを受け取るための、 インタフェースを用意しておく必要がある。
今回の開発では、 このメソッド名のつけ方のルールとして、 そのサービスのインタフェース名をそのままつけることにする。
たとえば、UserManager?というサービスだとすると、
public void setUserManager(UserManager userManager)
というようなメソッドを作っておく。
通常、Actionを作るときには、 struts-config.xmlに以下のような記述を行う。
<action path="/checkLogin" type="jp.co.nskint.wsrg.bookshelf.action.LoginAction" name="loginForm" validate="true" input="/login.do"/>
Springの場合は、以下のようになる。
<action path="/checkLogin" name="loginForm" validate="true" input="/login.do"/>
見てのとおり、typeが無い。 pathとActionを結びつけるのは、 Struts側ではなくSpring側で行われるからである。
それに伴い、pathとActionを結びつける設定が、 別途必要となる。 この場合以下のようになる。
<bean name="/checkLogin" class="jp.co.nskint.wsrg.bookshelf.action.LoginAction"> <property name="service"> <ref bean="userManager"/> </property> </bean>
beanタグのname属性にpathの値である"/checkLogin"、 class属性にtypeの値であった"jp.co.nskint.wsrg.bookshelf.action.LoginAction?"を記述している。
またここで、beanタグの内容として、
<property name="userManager"> <ref bean="userManager"/> </property>
と書かれている。 これは、LoginAction?のuserManagerプロパティ(setUserManager?メソッド)に、 userManagerというbeanがセットされるという意味である。
上記の内容を実際に実装例として提供する。 *1