ようやくStruts1とSpringを連携させることが出来ました。
設定
mavenで追加したライブラリをtomcatのクラスローダに認識させる方法が分からずに手作業でやりました。(プラグイン使うとうまくクラスパスの設定ができるようなので、後で調べたいと思います。)以下の2つのjarファイルをWEB-INF/libに追加します。
- spring.jar
- spring-webmvc-struts.jar
これだけです。
サンプル
簡単なサンプルを書きました。インスタンスの生成する処理も、DIコンテナからBeanを取得する処理も、ソースコード上にはありません。インスタンスの生成はDIコンテナが、Beanの取得はDelegatingActionProxyが行います。DelegatingActionProxyの内部処理は、単純ですが多態性と移譲をうまく使っていてなかなかおもしろいです。それではサンプルを見ていきましょう。まずstrutsの設定ファイル。ポイントは、plug-inタグでspringのプラグインをインポートするところです。あと/hogeへのリクエストをDelegatingActionProxyが受けているところも要チェック。
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <action-mappings> <action path="/hoge" type="org.springframework.web.struts.DelegatingActionProxy"/> </action-mappings> <message-resources parameter="MessageResources" /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" /> </plug-in> </struts-config>次に、Springの設定ファイル。これはいつもどおりに書けばOKです。
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <context:component-scan base-package="main.java.controller" /> <context:component-scan base-package="main.java.service" /> </beans>次にコントローラークラス。リクエストを処理するパスと同じ名前のBean名をつけます。
package main.java.controller; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import main.java.service.CalcService; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @Controller("/hoge") public class HogeAction extends Action { @Autowired CalcService service; @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { int x = 10; int y = 2; PrintWriter writer = response.getWriter(); writer.write(x + " + " + y + " = " + service.add(x, y) + "<br/>"); writer.write(x + " - " + y + " = " + service.sub(x, y) + "<br/>"); writer.write(x + " * " + y + " = " + service.mul(x, y) + "<br/>"); writer.write(x + " / " + y + " = " + service.div(x, y) + "<br/>"); return null; } }最後に、サービスクラス。コントローラーから@Autowiredで注入される機能です。
package main.java.service; public interface CalcService { public int add(int x, int y); public int sub(int x, int y); public int mul(int x, int y); public int div(int x, int y); }
package main.java.service; import org.springframework.stereotype.Service; @Service public class CalcServiceImpl implements CalcService { @Override public int add(int x, int y) { return x + y; } @Override public int sub(int x, int y) { return x - y; } @Override public int mul(int x, int y) { return x * y; } @Override public int div(int x, int y) { return x / y; } }これで、MVCフレームワークとDI×AOPフレームワークの連携ができました。次の目標はORMとの連携です。
0 件のコメント:
コメントを投稿