t2でpilikaを使う

昨日のエントリーにも書きましたが、T2はWebアプリの中でもフロント部分(リクエストを受け付けてディスパッチする)に特化したフレームワークです。Viewになにを使っても良いですし、O/RマッパーやDIコンテナも自由に組み合わせることが出来る事が特徴です。フレームワークとして軽い組み合わせを可能にしますし、AjaxやAppletなどの処理も対応しやすい為、これまでPHPで作っていたようなデザインをある程度重視した動的ウェブサイトでは選択肢の1つになるのではないかと思います。
そんなT2なので、デザイナにやさしい事をゴールとしているpilikaとの相性はいいのでは?という事で試してみました。

Pageクラスを定義する

T2ではアノテーションを付与したクラスを登録しておくことで、リクエストの処理を設定します。

@RequestScope
@Page("/sample")
public class SamplePage {
}

このような形で/sample/* のリクエストはSamplePage クラスが処理すると簡潔に設定できます。

Actionを定義する

Pageクラスには@ActionPathを用いて、処理を複数定義することができます。

@GET
@ActionPath("/structued_text/context")
public Navigation content() {
    return NoOperation.noOp();;
}

直感的に理解できますね。
GETのPageのパスを加えた/sample/structued_text/contextというリクエストに対する処理を記述するわけです。
戻り値としてはJSPにforwardしたり、別のページへridirectしたりというような記述ができます。
全体のソースはこちらから確認してください。

その他の設定ファイルとしては、web.xmlにT2を使うための設定を行ったり、DIコンテナでページクラスを登録する設定を行う程度です。
非常に簡単に、かつ直感的にサーバ側の処理の受付窓口を記述できるのがわかると思います。

レンダリングエンジンにPilikaを使ってみる

とりあえずは、サンプルコードを示します。

@GET
@ActionPath("/structued_text/context")
public Navigation content() {
  Map<String, Object> viewModel = new HashMap<String, Object>();
  viewModel.put("page_title", "T2 Sample");
  return jp.deathmarch.pilika.t2.PilikaView.renderTo("sample/structued_text/context.html", viewModel);
}

jp.deathmarch.pilika.t2.PilikaView.renderToはstatic importしてしまえば、スッキリするでしょう。
このようにmapにkey=valueの形で設定し、renderToに渡すだけです。
これはテンプレートの抜粋です。

      <div>ネストした要素がpage_titleの評価値で置換され、次のように表示されます。</div>
      <div class="result">
        <span plk:content="page_title">xxx</span>
      </div>

もしくは、Pageクラスのpublic fieldやgetterの値を使用するならば次のように書きます。

public String[] results= new String[0];
@GET
@ActionPath("/condition/if_empty")
public Navigation ifEmpty() {
  return renderTo("sample/condition/if_empty.html", this);
}
      <div class="result">
        <p plk:if.empty="results">結果はありません。</p>
      </div>

RailsTeedaのようにPageクラスのインスタンス変数に処理結果を設定していく場合に使用します。Mapを使うパターンよりもスペルミスなどのバグが発生しにくいのでお勧めです。

このように機能やパフォーマンス的な課題さえクリアできれば、綺麗に書くことも出来ます。
興味のある方は、サンプルはまだ作りかけですが、http://www.deathmarch.jp/svn/pilika/t2-sample/trunk からどうぞ。

たいした話ないような・・・

確かにテンプレートエンジンが使えるって意味ではたいした話ではありません。テンプレートから文字列を生成して返しているだけです。ですが、実はRailsのサンプルと全く同じテンプレートで動作しており、そのテンプレートはDreamweaverでコーディングしています。