3.T2機能

T2の機能はJava5のアノテーションをコア技術として採用しています。
アノテーションとは、Javaの標準機能のひとつでクラスやメソッドにつける注釈のようなものです。
T2 はこのアノテーションを読み取って、実行時値を設定したり、あるメソッドを呼び出すか・呼び出さないかを決定したりします。
T2が使うアノテーションには大きく分けて3つあります。
  • クラスにつけるクラスアノテーション
  • メソッドにつけるメソッドアノテーション
  • メソッドの引数につける引数アノテーション
クラスアノテーションはクラス全体で有効なもので、メソッドアノテーションはそのメソッドだけに影響し、 引数アノテーションはメソッドに渡されるパラメータだけに影響するアノテーションです。
従って、このアノテーションをソースコードに書いておくことで、 「このクラスはPageクラスなので、/hogeというURLの時に呼び出してほしい」ということや、
「このメソッドは、リクエストパラメータに"foo"という文字列があった時に呼んでほしい」というような事を、T2に伝えることができます。


3.1.規約
T2では極力規約は使いません.規約よりもアノテーションを重要視しています。
しかしながらミニマムレベルの規約は導入しており、下記のようになります。
  • クラスアノテーション/メソッドアノテーションで省略可能な値がある場合、原則として付与されているクラス・メソッド名が使われます。
  • 引数アノテーションで、代替手段として型によって情報が十分得られる場合、引数アノテーションがなくても必要なインスタンスが設定されます。(たとえば@UploadFileUploadFileクラスなど.)

3.2.アノテーション
T2で使うアノテーションについて説明します。


3.2.1.クラスアノテーション
@Pageアノテーション
Pageコンポーネントであることを通知するアノテーション. T2では必須です。
属性は下記のとおりです。
  • value : アクセスされたときのURLを記載する.省略されると、Pageクラスと同じ名前でアクセスされる。
サンプルはこのようになります。下記の例では、http://localhost:8080/context-root/hello のようなURLにマッピングされます。

@Page("hello")
public class HelloPage {
.....


3.2.2.メソッドアノテーション
・HTTPメソッドアノテーション
HTTPメソッドアノテーションはHTTPメソッドをあらわします。HTTPメソッドアノテーションがついていると、そのHTTPメソッドでリクエストされたときだけ、アクションメソッドが呼ばれます。
以下のようなHTTPメソッドアノテーションがあります。各アノテーションをアクションメソッドにつけておくと、該当のHTTPメソッドのみでそのアクションメソッドが呼ばれます。

 HTTPメソッドアノテーション(*1)  説明
 @GET  HTTP GETメソッドを表します
 @POST  HTTP POSTメソッドを表します
 @PUT  HTTP PUTメソッドを表します
 @DELETE  HTTP DELETEメソッドを表します
 @HEAD  HTTP HEADメソッドを表します
 @OPTIONS  HTTP OPTIONSメソッドを表します
*1 : HTTPメソッドアノテーションのパッケージ名は org.t2framework.t2.annotation.composite です。


デフォルトでは、@GET/@POSTだけが使えるようになっています。

・ActionPathアノテーション(org.t2framework.t2.annotation.core.ActionPath)
ActionPathアノテーションはURL指定でメソッドが呼べるか呼べないかを指定するアノテーションです。
通常のHTTPメソッドアノテーションだけだと、ServletのようにHTTPメソッドが同じであればどのリクエストでも受け取ってしまうので、このActionPathアノテーションで制限を加えます。
属性は下記のとおりです。
  • value : アクセスされたときのURL.省略されると、メソッド名と同一のものが呼ばれる

・ActionParamアノテーション(org.t2framework.t2.annotation.core.ActionParam)
ActionParamアノテーションは主にPOSTで使用され、submit時にname属性で指定された値が同一であれば指定したアクションメソッドが呼ばれるアノテーションです。
@ActionParamとつけることで、画面上に配置されたボタンと、Pageクラスのメソッドが1対1で対応するので直感的にわかりやすく、メソッドもアクションごとに分割することが出来ます。
属性値としては以下のものがあります。
  • value : 主にボタン押下時のname属性。省略すると、メソッド名と同一のボタン等が押されてPOSTされたものとする

・Defaultアノテーション(org.t2framework.t2.annotation.core.Default)
@Defaultは、該当Pageクラス内でどのアクションメソッドも呼ばれなかったときのデフォルトのメソッドを指定します。
T2ではPageクラスに対して、デフォルトメソッドを作ることを推奨しています。

・Ajaxアノテーション
Ajaxリクエストによって呼ばれるアクションメソッドを示すアノテーション(Version 0.5.1から)

・AMFアノテーション
FlexまたはAIRからAMF通信(高速バイナリ通信)で呼ばれるアクションメソッドを示すアノテーション(Version 0.6から)


3.2.3.パラメータアノテーション
@Index : サブミットされたボタンなどでForEach内のindexを取得するためのアノテーション
@Var : URL断片を取得するためのアノテーション
@Upload : FileUpload?されたファイルを取得するためのアノテーション
@Form : サブミットされてきたformをひとつのDTOで扱うときに指定するアノテーション


3.3.API
3.3.1.Navigationクラス
NavigationクラスはT2のアクションメソッドの次の画面遷移先とその出力内容を決めるためのクラスです。
例えば下記のようになります。下記の例では、シンプルに/WEB-INF/pages/login.jspにフォワードしています。

@Default
public Navigation index(final WebContext context) {
return Forward.to("/WEB-INF/pages/login.jsp");
}

もう一つ具体例を見てみましょう。下記の例では、オブジェクトをJSON形式に変換してレスポンスに値を出力します。

@Default
public Navigation toJson(WebContext context) {
Hoge jsonObject = new Hoge();
return Json.convert(jsonObject);
}

このようにNavigationは用途によって使い分けることで様々なレスポンスを返すことが出来ます。また、Navigationインタフェースを実装すれば独自のNavigationも簡単に実装できます。
Navigationは下記のようなインタフェースになっています。

@Published
public interface Navigation {
/**
  * Execute navigation processing.
  *
  * @param context
  * @throws Exception
  */
void execute(WebContext context) throws Exception;
}

現在T2であるNavigationの実装クラスは下記のようになります。
 Navigationクラス名(※1)  説明  代表的な使い方
 Forward  フォワード処理  Forward.to("next.jsp");
 Redirect  リダイレクト処理  Redirect.to("next.jsp");
 NoOperation 何もしない
サーブレットフィルタのFilterChain.doFilter()の呼び出しもしない
 NoOperation.noOp();
 PassThrough  サーブレットフィルタのFilterChain.doFilter()  PassThrough.pass();
 Direct  渡されたデータを直接HttpServletResponseに書き込む  Direct.from(file);
 Json  渡されたデータをJSON形式にしてHttpServletResponseに書き込む  Json.convert(targetObject);
※1:Navigationのクラスは全て org.t2framework.t2.navigation パッケージ


3.4.設定
3.4.1.web.xmlの基本設定
・エンコーディング指定
リクエストのエンコーディング指定はT2のフィルタクラスによって行われます。
コンテキストパラメータに以下の値を設定することでエンコーディングをセットします。

  • t2.encoding : エンコーディング指定する
        設定例:

<context-param>
<param-name>t2.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>


・T2の本体のフィルタ動作指定
T2の起点となる org.t2framework.t2.filter.T2Filterの設定オプションは下記のようなものがあります。
必須なのは、Pageクラスのあるルートパッケージの登録です.T2ではルートパッケージ以下サブパッケージも見て、Pageクラスのメタ情報を初期起動時に作るためです。

 設定項目  必須/任意 デフォルト値
 説明
 t2.rootpackage  必須  なし  Pageクラスを読み込むためのルートパッケージ
カンマ区切りで複数指定可能
 t2.container.adapter  任意  LucyContainerAdapter  IoCコンテナとの連携機能
標準ではシンプルIoCコンテナ「Lucy」が使われる
 t2.config  任意  なし  IoCコンテナの任意の設定ファイルを使うときに指定する
 t2.eagerload  任意  false(自動登録しない)  T2のPageクラスの自動登録機能を使う場合はtrueに設定する


・設定のサンプル
サンプルとして以下のような場合を考えてみましょう。
  • ルートパッケージに「examples.employee.page」, 「examples.admin.page」
  • IoCコンテナにSeasar2を使用する
  • Seasar2の設定ファイルとしてapp.diconを指定する
  • Pageクラスの自動登録はしない

web.xmlの設定のサンプルは、下記のようになります。

<filter>
<filter-name>t2</filter-name>
<filter-class> org.t2framework.t2.filter.T2Filter</filter-class>
<!-- ルートパッケージの指定 -->
<init-param>
<param-name>t2.rootpackage</param-name>
<param-value>examples.employee.page,examples.admin.page</param-value>
</init-param>
<init-param>
<param-name>t2.container.adapter</param-name>
<paramvalue>org.t2framework.t2.adapter.S2Adapter</param-value>
</init-param>
<!-- 設定ファイルの読み込み -->
<init-param>
<param-name>t2.config</param-name>
<param-value>app.dicon</param-value>
</init-param>
<!-- Pageの自動登録 -->
<init-param>
<param-name>t2.eagerload</param-name>
<param-value>false</param-value>
</init-param>
</filter>

3.4.2.web.xmlのファイルアップロード設定
ファイルアップロード機能を使う場合、個別にフィルタを設定する必要があります。
フィルタクラスは、org.t2framework.t2.filter.MultiPartRequestFilter になります。
設定項目としては以下のようなものがあります。

 設定項目  必須/任意  デフォルト値  説明
 uploadMaxSize  任意  100MB  リクエストの最大サイズ
 uploadMaxFileSize  任意  100MB  アップロードファイル1つの最大サイズ
 uploadThresholdSize  任意  10MB  ディスク書き出しファイルの閾値
 uploadRepositoryPath  任意  なし  テンポラリのディスク書き出しのパス


設定サンプルは下記のようになります。

<filter>
<filter-name>uploadFilter</filter-name>
<filter-class>org.t2framework.t2.filter.MultiPartRequestFilter</filter-class>
<init-param>
<param-name>uploadMaxSize</param-name>
<param-value>100m</param-value>
</init-param>
<init-param>
<param-name>uploadMaxFileSize</param-name>
<param-value>100m</param-value>
</init-param>
<init-param>
<param-name>uploadThresholdSize</param-name>
<param-value>100k</param-value>
</init-param>
<init-param>
<param-name>uploadRepositoryPath</param-name>
<param-value>C:/temp/</param-value>
</init-param>
</filter>


3.5.推奨プラグイン
T2のサンプルを動かすために、以下のプラグインを推奨します。勿論あくまで推奨ですので使いやすいプラグインを使っていただいてもかまいません。
T2はどのプラグインにも依存しているわけではありません。

WebLauncherプラグイン : Tomcat/Jetty/SDLoaderをサポートしたWebコンテナブートストラップのためのEclipseプラグインです。
EclipseプラグインUpdateサイトは以下のとおりです.Eclipseのプラグインアップデートからお使いください。使い方についてはまた別途記載します.
http://dev.handwerkszeug.org/eclipse/3.4/werkzeugkasten.update