~~
~~ Copyright 2004-2010 the Seasar Foundation and the Others.
~~
~~ Licensed under the Apache License, Version 2.0 (the "License");
~~ you may not use this file except in compliance with the License.
~~ You may obtain a copy of the License at
~~
~~     http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
~~ either express or implied. See the License for the specific language
~~ governing permissions and limitations under the License.
~~

  --------
  S2Container 統合
  --------
  baba
  --------
  2010-02-25
  --------

{目次}

 *{{{#前提}前提}}

 *{{{#プロジェクトの作成}プロジェクトの作成}}

  *{{{#Maven2_によるプロジェクトの雛形作成}Maven2 によるプロジェクトの雛形作成}}

 *{{{#各種ファイル}各種ファイル}}

  *{{{#必要なライブラリ_WEB-INFlib}必要なライブラリ (WEB-INF/lib)}}

  *{{{#デプロイメント記述子_WEB-INFweb.xml}デプロイメント記述子 (WEB-INF/web.xml)}}

  *{{{#diconファイル_WEB-INFclasses}diconファイル (WEB-INF/classes)}}

  *{{{#プロパティファイル_WEB-INFclasses}プロパティファイル (WEB-INF/classes)}}

{前提}

 S2Container に統合する場合は S2Container2.4 の {{{http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeploy}SMART Deploy}} 環境下で動作させることを前提としています。
 ソースコードのパッケージ構成は {{{http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeployPackage}SMART Deploy 推奨のパッケージ構成}} に従ってください。\

[]

{プロジェクトの作成}

 *{Maven2 によるプロジェクトの雛形作成}

   まずは以下のコマンドを入力してください。\
   もし「BUILD FAILURE」と表示されエラーになった場合は、maven-archetype-plugin が古い可能性があります。
   その場合「M2_REPO/org/apache/maven/plugins/maven-archetype-plugin/」をディレクトリごと削除して再実行することで、
   最新のmaven-archetype-pluginを使用して実行することができます。(M2_REPOはMavenのローカルリポジトリ)

+------------------------------------------------------+
mvn archetype:generate -DarchetypeCatalog=http://cubby.seasar.org/
+------------------------------------------------------+

   コマンド入力後、いくつかの質問に回答していきます。

+------------------------------------------------------+
Choose archetype:
1: remote -> cubby-s2-archetype (Cubby 2.0.1 S2Container Integration)
2: remote -> cubby-guice-archetype (Cubby 2.0.1 Guice Integration)
3: remote -> cubby-guice-archetype (Cubby 2.0.1 Spring Integration)
4: remote -> cubby-archetype (Cubby 1.1.7)
Choose a number:  (1/2/3/4): 
+------------------------------------------------------+

   1を入力して、cubby-s2-archetype (Cubby 2.0.1 S2Container Integration) を選んでください。

+------------------------------------------------------+
Define value for groupId: :
+------------------------------------------------------+

   作成するプロジェクトのグループIDを入力してください。 例 : com.example.foo

+------------------------------------------------------+
Define value for artifactId: :
+------------------------------------------------------+

   作成するプロジェクトのアーティファクトIDを入力してください。 例 : barapp

+------------------------------------------------------+
Define value for version: :
+------------------------------------------------------+

   作成するプロジェクトのバージョンを入力してください。 例 : 1.0-SNAPSHOT

+------------------------------------------------------+
Define value for package: :
+------------------------------------------------------+

   作成するプロジェクトのパッケージを入力してください。 例 : com.example.foo.barapp

+------------------------------------------------------+
Confirm properties configuration:
cubby-version: 2.0.1
s2container-version: 2.4.38
s2dao-version: 1.0.50
use-s2dao: false
use-s2jdbc: true
groupId: com.example.foo
artifactId: barapp
version: 1.0-SNAPSHOT
package: com.example.foo.barapp
 Y: :
+------------------------------------------------------+

   いままで入力した内容の確認を求められます。問題がなければ Y を入力してください。プロジェクトの雛形が作成されます。\
   s2container などのライブラリのバージョン、S2Dao/S2JDBC を使用するかどうかの設定を変更する場合はここで N を選択して再度設定を入力してください。
   再設定の際に全てのオプションが設定可能です。（プロジェクトのアーティファクト名、パッケージ名は再入力する必要があります。）\
   デフォルトでは上記のように S2JDBC を使用する、S2Dao を使用しない設定になっています。

   また、ここで作成された pom.xml に含まれる production プロファイルにはリリース向けの log4j.properties と env.txt が含まれます。
   以下のようにプロファイルを指定して (-Pproduction) war ファイルを作成した場合、Cool Deploy での動作となります。
   (参考：{{{http://s2container.seasar.org/2.4/ja/DIContainer.html#Env}Seasar2のevn.txtについての説明}})

+------------------------------------------------------+
mvn clean package -Pproduction
+------------------------------------------------------+

{各種ファイル}

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

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

 {{{cubby-s2/dependencies.html}依存関係}}を参照してください。
 WEB-INF/lib 以下に配備します。

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

*--------------------------*--------------------------*------*
| cubby-*.jar              | Cubby 本体               | 必須 |
*--------------------------*--------------------------*------*
| cubby-s2-*.jar           | S2Container 統合         | 必須 |
*--------------------------*--------------------------*------*
| cubby-unit-*.jar         | 単体テストサポート         | 必須 |
*--------------------------*--------------------------*------*
| cubby-gson-*.jar         | JSON サポート             | 任意 |
*--------------------------*--------------------------*------*
| s2-framework-*.jar       | S2Container              | 必須 |
| s2-extension-*.jar       |                          |      |
| s2-tiger-*.jar           |                          |      |
*--------------------------*--------------------------*------*
| slf4j-api.jar            | ログ出力                 | 必須 |
*--------------------------*--------------------------*------*
| commons-fileupload-*.jar | ファイルアップロード機能 | 必須 |
| commons-io-*.jar         |                          |      |
*--------------------------*--------------------------*------*
主な依存ライブラリ

*-----------*-------------*
| Cubby     | S2Container |
*-----------*-------------*
| 2.0.0+    | 2.4.38+     |
*-----------*-------------*
Cubby と S2Container のバージョンの推奨の組み合わせ

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

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

 [[1]]{{{cubby/apidocs/org/seasar/cubby/filter/SendErrorFilter}SendErrorFilter}} (任意)

      \*.jsp ファイルなど、直接アクセスされたくないファイルへのアクセスを制御するフィルターです。\
      この例ではブラウザ等から *.jsp へアクセスがあった場合に NotFound (404) を返します。

+------------------------------------------------------+
	<filter>
		<filter-name>senderror</filter-name>
		<filter-class>org.seasar.cubby.filter.SendErrorFilter</filter-class>
		<init-param>
			<param-name>statusCode</param-name>
			<param-value>404</param-value>
		</init-param>
	</filter>
+------------------------------------------------------+

+------------------------------------------------------+
	<filter-mapping>
		<filter-name>senderror</filter-name>
		<url-pattern>*.jsp</url-pattern>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
+------------------------------------------------------+

 [[2]]{{{cubby/apidocs/org/seasar/cubby/filter/EncodingFilter}EncodingFilter}} (任意)

      リクエストのエンコーディングを設定するためのフィルタです。

+------------------------------------------------------+
	<filter>
		<filter-name>encoding</filter-name>
		<filter-class>org.seasar.cubby.filter.EncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
+------------------------------------------------------+

+------------------------------------------------------+
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
+------------------------------------------------------+

 [[3]]S2ContainerFilter (必須)

      {{{http://s2container.seasar.org/ja/DIContainer.html#request}リクエストの自動バインディング}}を使用するので、S2ContainerFilter を定義します。

+------------------------------------------------------+
	<filter>
		<filter-name>s2container</filter-name>
		<filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
	</filter>
+------------------------------------------------------+

+------------------------------------------------------+
	<filter-mapping>
		<filter-name>s2container</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
+------------------------------------------------------+

 [[4]]HotdeployFilter

      {{{http://s2container.seasar.org/ja/S2.4SmartDeploy.html#HotDeploy}Hot deploy}} を使用する場合は HotdeployFilter を定義します。

+------------------------------------------------------+
	<filter>
		<filter-name>hotdeploy</filter-name>
		<filter-class>org.seasar.framework.container.hotdeploy.HotdeployFilter</filter-class>
	</filter>
+------------------------------------------------------+

+------------------------------------------------------+
	<filter-mapping>
		<filter-name>hotdeploy</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
+------------------------------------------------------+

 [[5]]{{{cubby/apidocs/org/seasar/cubby/filter/CubbyFilter}CubbyFilter}} (必須)

      Cubby の主な処理を行うフィルタです。
      リクエストの情報からアクションメソッドを起動します。
      対象のアクションが見つからない場合は FilterChain で後続のフィルタに処理を移譲します。

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

+------------------------------------------------------+
	<filter>
		<filter-name>cubby</filter-name>
		<filter-class>org.seasar.cubby.filter.CubbyFilter</filter-class>
		<init-param>
			<param-name>ignorePathPattern</param-name>
			<param-value>/css/.*,/js/.*,/img/.*</param-value>
		</init-param>
	</filter>
+------------------------------------------------------+

+------------------------------------------------------+
	<filter-mapping>
		<filter-name>cubby</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>INCLUDE</dispatcher>
	</filter-mapping>
+------------------------------------------------------+

 [[6]]S2ContainerServlet (必須)

      S2Container のサーブレットです。

+------------------------------------------------------+
	<servlet>
		<servlet-name>s2container</servlet-name>
		<servlet-class>org.seasar.framework.container.servlet.S2ContainerServlet</servlet-class>
		<init-param>
			<param-name>configPath</param-name>
			<param-value>app.dicon</param-value>
		</init-param>
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
+------------------------------------------------------+

+------------------------------------------------------+
    <servlet-mapping>
        <servlet-name>s2container</servlet-name>
        <url-pattern>/s2container/*</url-pattern>
    </servlet-mapping>
+------------------------------------------------------+

 [[7]]{{{cubby/apidocs/org/seasar/cubby/servlet/CubbyServlet}CubbyServlet}} (必須)

      Cubby のプラグインの初期化を行うサーブレットです。

+------------------------------------------------------+
	<servlet>
		<servlet-name>cubby</servlet-name>
		<servlet-class>org.seasar.cubby.servlet.CubbyServlet</servlet-class>
		<load-on-startup>2</load-on-startup>
	</servlet>
+------------------------------------------------------+

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

 [[1]]app.dicon

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

      * 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="cubby.dicon"/>
	<include path="app-cubby.dicon"/>
</components>
+------------------------------------------------------+

 [[2]]convention.dicon
      
      {{{http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeployPackage}dicon ファイルの設定例}}を参考に、ルートパッケージを設定してください。

 [[3]]creator.dicon
      
      {{{http://s2container.seasar.org/2.4/ja/DIContainer.html#Creator}dicon ファイルの設定例}}を参考に、ActionCreator を設定してください。

 [[4]]customizer.dicon

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

+------------------------------------------------------+
<?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"/>

  <component name="actionCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
    <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>

  </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">
	<include path="cubby-handlers.dicon"/>
	<include path="cubby-converters.dicon"/>

	<!-- date and time format patterns -->
	<component class="org.seasar.cubby.controller.impl.DefaultFormatPattern">
		<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>

	<!-- request parsers -->
	<component class="org.seasar.cubby.controller.impl.DefaultRequestParser" />
	<component class="org.seasar.cubby.controller.impl.MultipartRequestParser" />

	<!-- file upload -->
	<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"/>

	<!-- messages behaviour -->
	<component class="org.seasar.cubby.controller.impl.DefaultMessagesBehaviour">
		<property name="baseName">"messages"</property>
	</component>

</components>
+------------------------------------------------------+

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

 [[1]]messages_ja.properties (messages_en.properties)

      メッセージリソース用のプロパティファイル。
      {{{messages.html}メッセージリソース}}を参照してください。
