Seasar DI Container with AOP

概要

S2Struts1.2.xから1.3.xへ移行する手順について、S2StrutsExampleの移行を通して説明します。 移行するために必要となるファイルはS2StrutsBlank V1.3.xに含まれていますので、あらかじめダウンロードしてください。

S2.4への移行

S2Struts1.3.xはS2.4で動作するため、S2.3からS2.4への移行が必要です。移行は以下の手順で行います。

  1. jarファイルの置き換え 以下のjarファイルを置き換えます
    • s2-framework-2.4.0-rc-2-SNAPSHOT.jar
    • s2-extension-2.4.0-rc-2-SNAPSHOT.jar
  2. diconファイルの追加 以下のdiconファイルをWEB-INF/srcへコピーします
    • convention.dicon
    • jdbc.dicon
  3. 不要なdiconファイルの削除 以下のdiconファイルをWEB-INF/srcから削除します
    • j2ee.dicon(s2-extension-2.4.0-rc-2-SNAPSHOT.jarに含まれているため削除してください)

S2Struts1.3.xへの移行

S2Struts1.3.xへの移行は以下の手順で行います。

  1. jarファイルの置き換え 以下のjarファイルを置き換えます
    • s2-struts-1.3.0-beta-2.jar
    • s2-struts-1.3.0-beta-2.jarでは、MessageManagerクラスのパッケージを移動したためjarを入れ替えるとコンパイルエラーが発生します。 import文をorg.seasar.struts.MessageManagerからorg.seasar.struts.pojo.MessageManagerへ修正してください。

    • s2-struts-tiger-1.3.0-beta-2.jar(Tigerアノテーションを利用している場合、置き換えてください)
  2. 不要なdiconファイルの削除 以下のdiconファイルをWEB-INF/srcから削除します
    • s2struts.dicon(s2-struts-1.3.0-beta-2.jarに含まれているため削除してください)
  3. struts-config.xmlの修正
    • org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugInを org.seasar.struts.lessconfig.plugin.AutoStrutsConfigRegisterPlugInに変更します。
    • <struts-config>
          :
          :
        <!-- PlugInのクラス名を修正
        <plug-in className="org.seasar.struts.plugin.AutoStrutsConfigRegisterPlugIn">
        -->
        <plug-in className="org.seasar.struts.lessconfig.plugin.AutoStrutsConfigRegisterPlugIn">
          <set-property property="enableJar" value="false"/>
          <set-property property="docRoot" value="/pages"/>
        </plug-in>
          :
          :
      </struts-config>
      
  4. web.xmlの修正
    • S2ActionServletを利用していたところをorg.apache.struts.action.ActionServletに戻します。 S2ActionServletにはActionを自動的にS2へ登録する機能が含まれていますが、この機能は使わず、 S2.4のHOTdeploy / COOLdeploy機能を利用しActionを登録するためです。
    • <web-app>
          :
          :
        <!-- Standard Action Servlet Configuration (with debugging) -->
        <servlet>
          <servlet-name>action</servlet-name>
          <!-- S2ActionServletをActionServletに戻す
          <servlet-class>org.seasar.struts.servlet.S2ActionServlet</servlet-class>
          -->
          <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
          <init-param>
            <param-name>config</param-name>
            <param-value>/WEB-INF/struts-config.xml</param-value>
          </init-param>
          <init-param>
            <param-name>debug</param-name>
            <param-value>2</param-value>
          </init-param>
          <init-param>
            <param-name>detail</param-name>
            <param-value>2</param-value>
          </init-param>
          <load-on-startup>2</load-on-startup>
        </servlet>
          :
          :
      </web-app>
      
  5. S2StrutsExampleではさらに...
    • S2ActionServletで自動登録されていたAddActionをAdd.diconファイルにコンポーネント定義を追加します。
    • S2Struts1.3.xよりRequestProcessorの定義が変わりました。 そのためRequestProcessor.diconがエラーになるので、コメントアウトします。

以上でS2Struts1.3.xへの移行は完了です。Tomcatを起動し動作に問題がないことを確認してください。 次からは、HOTdeploy対応するための作業です。

S2StrutsのHOTdeploy対応

HOTdeploy化を行う場合は、FilterをFORWARDに適用するためServlet2.4が必要となります。 struts-config.xml、validation.xml、application.propertiesの変更をすぐに反映させるためには以下の修正が必要です。

  1. diconファイルの追加 以下のdiconファイルをWEB-INF/srcへコピーします
    • creator.dicon
    • customizer.dicon
    • s2container.dicon
  2. app.diconの修正
    • add.diconにs2struts-hotdeploy.diconを追加します。 環境によりHOTdeploy / COOLdeployの切り替えを行えるようにするために条件付includeとします。
    • <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
        "http://www.seasar.org/dtd/components24.dtd">
      <components>
        <include condition="#ENV != 'ut'" path="s2struts.dicon"/>
        <include condition="#ENV == 'ut'" path="s2struts-hotdeploy.dicon"/>
          :
          :
      </components>
      
  3. env.txtの追加
    • 条件付includeで利用する環境名をenv.txtに書き、WEB-INF/srcへ追加します。 HOTdeployを利用するため環境名は「ut」とします。
  4. struts-config.xmlの修正
    • org.seasar.struts.hotdeploy.plugin.HotdeployPlugInを追加します。
    • <struts-config>
          :
          :
        <!-- HotdeployPlugInの追加 -->
        <plug-in className="org.seasar.struts.hotdeploy.plugin.HotdeployPlugIn"/>
          :
          :
      </struts-config>
      
  5. web.xmlへHotdeployFilterの追加
    • HotdeployFilterは、REQUESTとFORWARDに適用します (FORWARDにもFilterを適用するためServlet2.4が必要となります)。
    • <?xml version="1.0" encoding="ISO-8859-1"?>
      <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
                            http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
        version="2.4">
          :
          :
        <filter>
          <filter-name>hotdeployfilter</filter-name>
          <filter-class>org.seasar.framework.container.hotdeploy.HotdeployFilter</filter-class>
        </filter>
          :
          :
        <filter-mapping>
          <filter-name>hotdeployfilter</filter-name>
          <url-pattern>/*</url-pattern>
          <dispatcher>REQUEST</dispatcher>
          <dispatcher>FORWARD</dispatcher>
        </filter-mapping>
          :
          :
      </web-app>
      

これでstruts-config.xml、validation.xml、application.properties(リソースファイル)の変更が即時反映されます。 Tomcatを起動し試してください。

ソースコードを編集するたびにコンテキストのリロードが実行されてしまう場合は、 FAQ「HOT deploy時にソースコードを編集するとコンテキストのリロードが実行されてしまう」を 参照してください。

無設定S2StrutsのHOTdeploy対応

無設定S2StrutsのHOTdeploy化を行います。

S2.4が推奨するディレクトリ構成に近い Employee機能(org.seasar.struts.examples.employeeパッケージ)のHOTdeploy化は以下の手順で行います。

  1. convention.diconの修正
    • RootPackageNameを追加します。
    • <!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
        "http://www.seasar.org/dtd/components21.dtd">
      <components>
        <component class="org.seasar.framework.convention.impl.NamingConventionImpl">
          <initMethod name="addRootPackageName">
            <arg>"org.seasar.struts.examples.employee"</arg>
          </initMethod>
        </component>
      </components>
      
  2. customizer.diconの修正
    • Employee機能では、Action/DTO/Logic/Daoを利用しています。それぞれのCustomizerが以下のように定義します。
    • <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
        "http://www.seasar.org/dtd/components24.dtd">
      <components>
        <component name="defaultCustomizer"
            class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"aop.traceInterceptor"</property>
        </component>
        <component name="commandAspectCustomizer"
            class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"aop.traceInterceptor"</property>
          <property name="pointcut">"do.*, go.*, initialize"</property>
        </component>
        <component name="traceThrowsAspectCustomizer"
            class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"aop.traceThrowsInterceptor"</property>
        </component>
        <component name="txAspectCustomizer"
            class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"j2ee.requiredTx"</property>
        </component>
        <component name="daoAspectCustomizer"
            class="org.seasar.framework.container.customizer.AspectCustomizer">
          <property name="interceptorName">"dao.interceptor"</property>
        </component>
      
        <component name="actionCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>commandAspectCustomizer</arg>
          </initMethod>
        </component>
        <component name="daoCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
          </initMethod>
          <initMethod name="addCustomizer">
            <arg>daoAspectCustomizer</arg>
          </initMethod>
        </component>
        <component name="dtoCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
        </component>
        <component name="dxoCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
          </initMethod>
        </component>
        <component name="helperCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
          </initMethod>
        </component>
        <component name="logicCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
          </initMethod>
          <initMethod name="addCustomizer">
            <arg>txAspectCustomizer</arg>
          </initMethod>
        </component>
        <component name="pageCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>commandAspectCustomizer</arg>
          </initMethod>
        </component>
        <component name="serviceCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
          <initMethod name="addCustomizer">
            <arg>defaultCustomizer</arg>
          </initMethod>
          <initMethod name="addCustomizer">
            <arg>txAspectCustomizer</arg>
          </initMethod>
        </component>
        <component name="interceptorCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
        </component>
        <component name="validatorCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
        </component>
        <component name="converterCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
        </component>
        <component name="connectorCustomizer"
            class="org.seasar.framework.container.customizer.CustomizerChain">
        </component>
      </components>
  3. creator.diconの修正
    • Action/DTO/Logic/DaoのCreatorが以下のように定義します。 Employee機能では、DTOをActionFormとして利用しています。 DTO(ActionForm)のインスタンス管理はS2ContainerではなくStrutsが行います。 そのため、DtoOndemandCreatorのinstanceDefをREQUEST(デフォルト)からPROTOTYPEに変更します。
    • <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
        "http://www.seasar.org/dtd/components24.dtd">
      <components>
        <include path="convention.dicon"/>
        <include path="customizer.dicon"/>
        <component class="org.seasar.framework.container.creator.ActionCreator"/>
        <component class="org.seasar.framework.container.creator.DaoCreator"/>
        <component class="org.seasar.framework.container.creator.DtoCreator">
          <property name="instanceDef">
            @org.seasar.framework.container.deployer.InstanceDefFactory@PROTOTYPE
          </property>
        </component>
        <component class="org.seasar.framework.container.creator.DxoCreator"/>
        <component class="org.seasar.framework.container.creator.HelperCreator"/>
        <component class="org.seasar.framework.container.creator.LogicCreator"/>
        <component class="org.seasar.framework.container.creator.PageCreator"/>
        <component class="org.seasar.framework.container.creator.ServiceCreator"/>
        <component class="org.seasar.framework.container.creator.InterceptorCreator"/>
        <component class="org.seasar.framework.container.creator.ValidatorCreator"/>
        <component class="org.seasar.framework.container.creator.ConverterCreator"/>
        <component class="org.seasar.framework.container.creator.ConnectorCreator"/>
      </components>
  4. s2container.diconの修正
    • hotdeploy.diconをインクルードします。
    • <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
        "http://www.seasar.org/dtd/components24.dtd">
      <components>
        <include condition="#ENV == 'ut'" path="hotdeploy.dicon"/>
      </components>
      
  5. app.diconの修正
    • employee.diconは不要となるためコメントアウトし、cooldeploy.diconをインクルードします。 convention.dicon、aop.dicon、dao.diconをインクルードします。
    • <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
        "http://www.seasar.org/dtd/components24.dtd">
      <components>
        <include path="convention.dicon"/>
        <include path="aop.dicon"/>
        <include path="dao.dicon"/>
      
        <include condition="#ENV != 'ut'" path="s2struts.dicon"/>
        <include condition="#ENV == 'ut'" path="s2struts-hotdeploy.dicon"/>
          :
          :
        <!--
        <include path="org/seasar/struts/examples/dicon/employee.dicon"/>
        -->
        <include condition="#ENV != 'ut'" path="cooldeploy.dicon"/>
      </components>
      
  6. S2StrutsExampleではさらに...
    • HttpSessionに格納するオブジェクトはシリアライズできる必要があります。 Employee機能では、ProcessModeDtoをHttpSessionに格納しているため、 ProcessModeDtoにSerializableを実装します。
    • Employee機能では、S2Daoを利用しているため、 HOTdeployに対応しているS2Daoに置き換える必要があります。 s2-dao-1.0.36-SNAPSHOT.jarに置き換え、dao.diconを/WEB-INF/srcから削除します。

これでEmployee機能のHOTdeploy化は完了です。 Tomcatを起動しHOTdeployを試してください。

また、COOLdeployを試したい場合は、env.txtの内容を「it」(「ut」以外の値)等に変更後、Tomcatを起動してください。