Cubby は S2Container2.4 の SMART Deploy 環境下で動作させることを前提としています。 ソースコードのパッケージ構成は SMART Deploy 推奨のパッケージ構成 としてください。
Cubby は Maven2 の archetype コンテナ を用意していますので、これを使用してプロジェクトの雛形を作成することをおすすめします。 データベースと連携した WEB アプリケーションを作成するための web.xml や pom.xml の基本的な設定が含まれます。
Maven2 のインストール後、以下のようにプロジェクトの雛形を作成します。
まずは以下のコマンドを入力してください。
mvn archetype:generate -DarchetypeCatalog=http://cubby.seasar.org
コマンド入力後、いくつかの質問に回答していきます。
Choose archetype: 1: remote -> cubby-archetype (Cubby 1.0.0) Choose a number: (1):
1を入力して、cubby-archetype (Cubby 1.0.0) を選んでください。
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: groupId: com.example.foo artifactId: barapp version: 1.0-SNAPSHOT package: com.example.foo.barapp Y: :
いままで入力した内容の確認を求められます。問題がなければ Y を入力してください。プロジェクトの雛形が作成されます。
プロジェクトのディレクトリで以下のコマンドを実行すると Tomcat が起動し、ブラウザで「http://localhost:8080/(アーティファクトID)/」にアクセスすることで、雛形アプリケーションの動作を確認できます。
mvn tomcat:run
Mayaaを使用する場合は依存する jarファイルを「src/main/webapps/WEB-INF」以下に配備する必要があります。 プロジェクトのディレクトリで以下のコマンドを実行し、jarファイルを配備してからTomcatを実行してください。 (EclipseからWTP等で実行する場合は不要です)
mvn war:inplace
プロジェクトを Eclipse で開発する場合は、Maven2 で Eclipse のワークスペースやプロジェクトを設定します。
Eclipse ワークスペースにビルドパスのクラスパス変数(M2_REPO)を追加します。
以下のコマンドを実行してください。
mvn eclipse:add-maven-repo -Declipse.workspace=(ワークスペースのディレクトリ 例 "C:/eclipse/workspace")
プロジェクトに .project や .classpath などといった Eclipse プロジェクトの設定ファイルを作成します。
プロジェクトのディレクトリに移動して以下のコマンドを実行してください。
mvn eclipse:eclipse
Cubby や Seasar2 など、プロジェクトに必要な jar ファイルがダウンロードされ、WTP でサーバーアプリケーションを実行するための準備が整います。
プロジェクトを Eclipse のワークスペースへインポートします。
以下のコードテンプレート設定を Eclipse にインポートすることで「アクションメソッドのコード雛形作成」「バリデーションフィールドのコード雛形作成」が行えます。
補完名 | 内容 |
cubby_action_method | アクションメソッドの雛形作成 |
cubby_validation_field | バリデーションフィールドの雛形作成 |
ディレクトリに配備する必要があるファイルを説明します。 Maven2 を使わずにプロジェクトを作成するときも参考にしてください。
依存関係 を参照してください。 WEB-INF/lib 以下に配備します。
主な依存ライブラリを以下にあげます。
Cubby 本体です。
Seasar2 です。Cubby1.0.0-RC2以降ではs2-2.4.22以降を使用する必要があります。
Cubby | Seasar2 |
1.0.0 | 2.4.22以上 |
1.0.0-RC2 | 2.4.22以上 |
1.0.0-RC1 | 2.4.21 |
0.9.2 | 2.4.17 |
ファイルアップロード機能で使用されます。
Cubby はサーブレットフィルタとして動作します。 web.xml にサーブレットフィルタとフィルタマッピングを追加します。 登録する際は以下の順序で登録してください。
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> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> </web-app>
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>
リクエストされた URL から、以下で述べる CubbyFilter が「どのアクションメソッドを処理するか」という情報を抽出し、その情報からリクエストを組み立てて FORWARD します。 このマッピングはアクションクラスに @Path アノテーションをつけることで変更できます。
また、処理の対象外とする URL を ignorePathPattern で指定できます。 Hot deploy の場合はすべてのパスを対象としてしまうとクラスパスを走査する回数が増えるので、イメージのフォルダなどはここで指定して処理対象外とすることでパフォーマンスの低下を防ぐことができます。 対象外にするパスを正規表現のカンマ区切りで指定してください。
<web-app> <filter> <filter-name>requestRoutingFilter</filter-name> <filter-class>org.seasar.cubby.filter.RequestRoutingFilter</filter-class> <init-param> <param-name>ignorePathPattern</param-name> <param-value>/css/.*,/js/.*,/img/.*</param-value> </init-param> </filter> <filter-mapping> <filter-name>requestRoutingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> </web-app>
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 ファイルをインクルードしてください。
<?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="routing.dicon"/> <include path="cubby.dicon"/> <include path="app-cubby.dicon"/> </components>
dicon ファイルの設定例 を参考に、ルートパッケージを設定してください。
dicon ファイルの設定例 を参考に、ActionCreator を設定してください。
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>
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>
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}のメールアドレスの形式が正しくありません。