えっくす・どくれっと

さて、strutsを使うと分かるのだが、画面遷移は全てstruts-config.xmlに書かれる。画面遷移の情報を外部に定義することは色々と都合がいい。ただ、画面数が少ないうちは問題ないが、画面数が増えるとstruts-config.xmlのメンテが大変な事になってしまうという側面もある。
じゃあどうするのさ、ということで多くの猛者達が様々な解決策を編み出している。
そのうちの一つにXDocletというものがある。これはオープンソースのファイルジェネレーターツールでStrutsに限らずHibernateなどの多彩なプロダクトに対応している。
んで、このXDocletの特徴として、設定に必要な情報はソースコードJavadocコメント部に書くというのが大きな特徴である。(要するにアノテーション
ま、百聞は一見に如かず。試してみましょ。
モノを持ってこないと始まらないのでsourceforge経由で最新版であるxdoclet-lib-1.2.3.zipをダウンロードしてくる。ビルドはAntで行なうのでないなら入手しておくべし。
展開されたjarをプロジェクトのライブラリフォルダに丸ごと放り込んでライブラリパスを通す。(昨日の教訓)
んで、WEB-INFの直下にXDoclet用のAntビルドファイルを作成し記述する。build.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<project name="MSDBManamer" default="makeStrutsConfig">

  <!--クラスパスを設定する-->
  <path id="classpath">
    <pathelement path="./classes" />
    <fileset dir="./lib">
      <include name="**/*.jar" />
    </fileset>
  </path>

  <target name="makeStrutsConfig">
    <!--webdocletタスクを定義する-->
    <taskdef name="webdoclet" classname="xdoclet.modules.web.WebDocletTask">
      <classpath refid="classpath" />
    </taskdef>
    <!--XDocletの実行-->
    <webdoclet destdir="." excludedtags="@version,@autshor,@todo,@return" verbose="true" mergedir=".">
      <fileset dir="./src">
        <!--拡張子がjavaのファイルを対象とする-->
        <include name="**/*.java" />
      </fileset>
      <!--struts-cconfig.xmlの出力先を指定-->
      <strutsconfigxml destdir="." version="1.2" />
    </webdoclet>
  </target>
</project>

お次にソースのjavadoc部にアノテーションを記述する。
↓redrisefirm.seasar.s2struts.action.GetAllUnitDataAction.java

/**
 * 全ユニットデータを取得するアクションクラス
 * 
 * @author hiroshi
 * @struts.action
 * path="/allUnitDataList"
 * name="allUnitData"
 * @struts.action-forward
 * name="allUnitData"
 * path="/jsp/allUnitData.jsp"
 */
public class GetAllUnitDataAction extends Action {
・・・(略)・・・
}

↓redrisefirm.seasar.s2struts.actionForm.GetAllUnitDataActionForm.java

/**
 * @author hiroshi
 * 
 * @struts.form
 * name="allUnitData"
 */
public class GetAllUnitDataActionForm extends ActionForm {
・・・(略)・・・
}

書けたところでAntを実行する。出来たモノを見るとform-beanとaction-mappingは書けているようだ。
アレ?そういやS2連動のために記述したcontrollerとpluginの設定がない。これじゃ動かないな。さて、どうしたもんだろう?