前提

Cubby は S2Container2.4 の SMART Deploy 環境下で動作させることを前提としています。 ソースコードのパッケージ構成は SMART Deploy 推奨のパッケージ構成としてください。

プロジェクトの作成

Cubby は maven2 の archetype を用意していますので、これを仕様してプロジェクトの雛形を作成することをおすすめします。 データベースと連携した WEB アプリケーションを作成するための web.xml や pom.xml の基本的な設定が含まれます。

Maven2 のインストール後、以下のコマンドでプロジェクトの雛形を作成します。

mvn archetype:create \
-DgroupId=(作成するプロジェクトのグループID 例:com.foo.bar) \
-DartifactId=(作成するプロジェクトのアーティファクトID 例:barapp) \
-Dversion=(作成するプロジェクトのバージョン 例:1.0-SNAPSHOT) \
-DarchetypeGroupId=org.seasar.cubby \
-DarchetypeArtifactId=cubby-archetype \
-DarchetypeVersion=0.9.0 \
-DremoteRepositories=http://maven.seasar.org/maven2/
(実際には1行で入力してください)

プロジェクトを Eclipse で開発する場合は、プロジェクトのディレクトリで以下のコマンドを実行することで、必要な jar ファイルのダウンロードと WTP の設定ができます。

mvn eclipse:eclipse

各種ファイル

ディレクトリに配備する必要があるファイルを説明します。 Maven2 を使わずにプロジェクトを作成するときも参考にしてください。

必要なライブラリ (WEB-INF/lib)

依存関係を参照してください。 WEB-INF/lib 以下に配備します。

主な依存ライブラリを以下にあげます。

  • cubby-*.jar

    Cubby 本体です。

  • s2-framework-*.jar、s2-extension-*.jar、s2-tiger-*.jar

    Seasar2 です。

  • commons-fileupload-*.jar、commons-io-*.jar

    ファイルアップロード機能で使用されます。

デプロイメント記述子 (WEB-INF/web.xml)

Cubby はサーブレットフィルタとして動作します。 web.xml にサーブレットフィルタとフィルタマッピングを追加します。 登録する際は以下の順序で登録してください。

  1. S2ContainerFilter (必須)

    Cubby 内部ではリクエストの自動バインディングを使用するので、S2ContainerFilter を定義します。

    <web-app>
        <filter>
            <filter-name>s2Filter</filter-name>
            <filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>s2Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    </web-app>
  2. HotdeployFilter

    Hot deploy を使用する場合は HotdeployFilter を定義します。

    <web-app>
        <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>
            <dispatcher>INCLUDE</dispatcher>
        </filter-mapping>
    </web-app>
  3. UrlRewriteFilter

    リクエストされた URL を、以下で述べる CubbyFilter が処理できるデフォルトの URL に変換して FORWARD します。 このマッピングはアクションクラスに @URL アノテーションをつけることで変更できます。

    また、処理の対象外とする URL を ignorePathPattern で指定できます。 Hot deploy の場合はすべてのパスを対象としてしまうとクラスパスを走査する回数が増えるので、イメージのフォルダなどはここで指定して処理対象外とすることでパフォーマンスの低下を防ぐことができます。 対象外にするパスを正規表現のカンマ区切りで指定してください。

    <web-app>
            <filter>
                    <filter-name>urlRewriteFilter</filter-name>
                    <filter-class>org.seasar.cubby.filter.UrlRewriteFilter</filter-class>
            <init-param>
                <param-name>ignorePathPattern</param-name>
                <param-value>/css/.*,/js/.*,/img/.*</param-value>
            </init-param>
            </filter>
    
        <filter-mapping>
            <filter-name>urlRewriteFilter</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>REQUEST</dispatcher>
        </filter-mapping>
    </web-app>
  4. CubbyFilter (必須)

    Cubby の主な処理を行うフィルタです。 リクエストされた URL をパースしてアクションメソッドを起動します。

    たとえば、以下のURLならば > http://(ホスト)/(コンテキストパス)/aaa/bbb/ccc *アクションクラスのコンポーネント名 : aaa_bbb *メソッド名 : ccc となります。

    対象のコンポーネントが見つからない場合は FilterChain で後続のフィルタに処理を移譲します。

    <web-app>
            <filter>
                    <filter-name>cubbyFilter</filter-name>
                    <filter-class>org.seasar.cubby.filter.CubbyFilter</filter-class>
            </filter>
    
        <filter-mapping>
            <filter-name>cubbyFilter</filter-name>
            <url-pattern>/*</url-pattern>
            <dispatcher>FORWARD</dispatcher>
        </filter-mapping>
    </web-app>

diconファイル (WEB-INF/classes)

  1. app.dicon

    以下の dicon ファイルをインクルードしてください。

    • dxo.dicon (S2Extension の jar ファイルに含まれます)
    • cubby.dicon (Cubby の jar ファイルに含まれます)
    • app-cubby.dicon (必要な場合に作成してください。必須ではありません)
      <?xml version="1.0" encoding="UTF-8"?>
      <!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="dxo.dicon"/>
              <include path="urlfilter.dicon"/>
              <include path="cubby.dicon"/>
              <include path="app-cubby.dicon"/>
      </components>
  2. convention.dicon

    dicon ファイルの設定例を参考に、ルートパッケージを設定してください。

  3. creator.dicon

    dicon ファイルの設定例を参考に、ActionCreator を設定してください。

  4. customizer.dicon

    Cubby はアクションクラスのメソッドにインターセプタを適用することで、前処理やバリデーションを行います。 cubby-customizer.dicon (Cubby の jar ファイルに含まれます) をインクルードして、そこで定義されているカスタマイザがアクションクラスに適用されるように設定します。

    アクションメソッドでトランザクションの制御が必要な場合もここで定義してください。 org.seasar.cubby.customizer.ActionMethodCustomizer は、アクションメソッドのみが対象になるカスタマイザです。

    JSP の ELでは public フィールドをアクセスできないので、プロパティを public フィールドにしているばあいは PropertyInterType を適用してアクセサメソッドが生成されるようにしてください。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
            "http://www.seasar.org/dtd/components24.dtd">
    <components>
      <include path="default-customizer.dicon"/>
      <include path="cubby-customizer.dicon"/>
    
      <component name="propertyInterTypeCustomizer" class="org.seasar.framework.container.customizer.InterTypeCustomizer">
        <property name="interTypeName">"aop.propertyInterType"</property>
      </component>
    
      <component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
    
        <!-- アクセサメソッドの生成 -->
        <initMethod name="addCustomizer"><arg>propertyInterTypeCustomizer</arg></initMethod>
    
        <initMethod name="addCustomizer">
          <arg>traceCustomizer</arg>
        </initMethod>
    
        <!-- トランザクションの設定 -->
        <initMethod name="addCustomizer">
          <arg>
            <component class="org.seasar.cubby.customizer.ActionMethodCustomizer">
              <initMethod name="addInterceptorName">
                <arg>"j2ee.requiredTx"</arg>
              </initMethod>
              <property name="pointcut">".*"</property>
            </component>
          </arg>
        </initMethod>
    
        <!-- Cubby の前処理 -->
        <initMethod name="addCustomizer"><arg>cubby.initializeCustomizer</arg></initMethod>
    
        <!-- Cubby のバリデーション -->
        <initMethod name="addCustomizer"><arg>cubby.validationCustomizer</arg></initMethod>
    
      </component>
    </components>
  5. app-cubby.dicon

    Cubby アプリケーション全体の設定です。 任意で作成して、app.dicon からインクルードしてください。 現在はデフォルトの日付フォーマットとファイルアップロード用の設定を指定できます。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
            "http://www.seasar.org/dtd/components24.dtd">
    <components namespace="app-cubby">
    
            <!-- 日付フォーマットの設定 -->
            <component class="org.seasar.cubby.action.impl.FormatPatternImpl">
                    <property name="datePattern">"yyyy-MM-dd"</property>
                    <property name="timePattern">"HH:mm:ss"</property>
                    <property name="timestampPattern">"yyyy-MM-dd HH:mm:ss"</property>
            </component>
    
            <!-- ファイルアップロードの設定 -->
            <component class="org.seasar.cubby.controller.impl.MultipartRequestParserImpl" />
    
            <component class="org.apache.commons.fileupload.servlet.ServletFileUpload" instance="prototype">
                    <property name="fileItemFactory">
                            <component class="org.apache.commons.fileupload.disk.DiskFileItemFactory">
                                    <property name="sizeThreshold">4096</property>
                            </component>
                    </property>
                    <property name="fileSizeMax">10000000</property>
            </component>
    
            <component class="org.apache.commons.fileupload.servlet.ServletRequestContext" instance="prototype"/>
    
    </components>

プロパティファイル (WEB-INF/classes)

  1. messages.properties

    org.seasar.cubby.util.Messagesで使用する、アプリケーションで表示するメッセージを定義します。 Cubby のバリデータが出力するメッセージもここに定義します。

    デフォルトのメッセージは Cubby の jar ファイルに含まれていますので、差し替える場合はクラスパス上で先に検索される場所に置いてください。

    valid.required={0}は必須です。
    valid.maxLength={0}は{1}文字以下で入力してください。
    valid.number={0}は数値のみで入力してください。
    valid.equals={0}は{1}を入力してください。
    valid.range={0}は{1}〜{2}の間で入力してください。
    valid.dateFormat={0}の日付の形式が正しくありません。
    valid.regexp={0}に不正な文字が入力されました。
    valid.rangeLength={0}は{1}文字以上{2}文字以下で入力してください。
    valid.maxSize={0}は{1}以下選択してください。
    valid.minSize={0}は{1}以上選択してください。
    valid.fileRegexp={0}のファイル名が不正です。
    valid.email={0}のメールアドレスの形式が正しくありません。