Click勉強記 その2 〜 Controlの作成と表示まで

前回から大分時間が経ってしまいました。実際触れてなかった。反省。

今回はClickの特徴の一つでもあるコントロールの扱いについてActionLinkを元に基本的な仕組みを見ていきたいと思います。ただ、シンプルな目的でシンプルなコードを書いて「おお、動いた」という路線ではなくて、動作をおっかけていきながら仕組みを理解していこうと思います。Clickは「学習が容易」というあたりがウリになっていて、仕組みを理解するまでのコストが低く、それなら仕組み理解してしまったほうがいざというときにかなり応用が効くという利点があるので…さて。

まずコントロール(Control)はPageインスタンスが所有しています。ClickServletからは、

  1. Pageを初期化 (constructor, onInit())
  2. Page#getControlsを呼び出してコントロールのリストを取得
  3. それぞれのコントロールの onProcess()を呼び出す

という流れでHTTPリクエストに対してコントロールの処理が呼ばれるようになっています。

ということで、コントロールを登録/作成する場所は

  • addControl()するのはPageクラスのコンストラクタもしくはonInit()で実施する
    • コンストラクタではServletRequestなどの情報は扱えない
    • onInit()だと出来る

となります。

このシーケンスはClickのドキュメントを見たほうがヌケモレなく解りやすいかもしれません。


さて、さっそくPageクラスでコントロール作成してみます。いくつかのサンプルを見習ってコンストラクタでaddControl()する、あまり個人的には好きじゃないコードを書いてみます。

public class HogePage extends Page {
.
   public HogePage() {
        ActionLink editLink = new ActionLink("editLink");
        editLink.setListener(this, "onEditLink");
        addControl(editLink);
   }
.
}

ここで、以下のことも覚えておく必要があります。

  • コンストラクタの引数名は nameプロパティ。name重要。かぶらないように〜
  • setListenerでイベントハンドラなことができる。ActionLinkの場合はリンクが叩かれると thisの onEditLinkメソッドがコールされる
  • イベントハンドラ(コールバック)メソッドは publicでboolean(もしくはBoolean)な戻り値で引数なしなメソッドである必要がある
  public boolean onEditLink() {
   .
   .
  }

ではさっそくこのコントロールをVelocityなビューに貼り付けてやります。コントロールの名前(nameプロパティ)はそのまま属性名に使われるので上記の例だと

$editLink

でアンカーが作成されます。簡単(デザイナーにやさしくないけど!)

ここでは"Edit Link"とか出ますね。これはClickがnameプロパティから動的に生成したものです。が、標準の振る舞いで、表示すべき内容をリソースバンドルから取得もしてくれます。この場合適切なpropertiesファイルにeditLink.label=hogeとかしておくと hogeになります。

Clickではこの仕組みをMessageMapというリソースバンドルのラッパみたいなMapで実現しています。

ところで、"適切なpropertiesファイル"は

  1. Pageクラスと同じパッケージにある HogePage.propertiesとか HogePage_ja.propertiesとか
  2. click-control_ja.properties (click標準のブツ)

の順序で検索されます。コントロールの表示内容を変えるのにページのMessageMap(≒properties)を参照しているわけですが、Clickのデザインコンセプトとしては一貫しているように思われます。

上記propertiesファイルに editLink.label=編集 とか書いておけばリンクも「編集」になります。

と、表示まで来ましたので今回はここまで。コントロールはもう少し整理しておきたいな〜(ハマりそうというよりかは美味しいとこを見逃しそう)