Search on the blog

2013年2月13日水曜日

Learn Struts(9)

ついにここまで来たー!
ようやく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 件のコメント:

コメントを投稿