Teedaのサンプルアプリを読んでみる(8)

次はtodoEdit.html。まず気になるのが「種類」というコンボボックスの部分。HTML上は次のタグが1個あるだけ。

<select id="todoTypeItems"/>

JSPスクリプトレットと比較して非常に楽。これだけで

  • OPTIONを展開してくれる
  • 前回選択していた値を再現してくれる

というのはGJ。TeedaコンポーネントとしてはSelectOneMenuなんだけど、idがhogeの場合Pageクラスには

  1. プロパティhoge
  2. 配列またはList型のプロパティhogeItems(hoge+"Items")

が必要、みたいにJava Expert#01書いてあるけど、このサンプルアプリはそれが当てはまらない。つまり

  • 上記1.を考えるとTodoEditPageにはプロパティtodoTypeItemsが必要になるはずだか、それがない。
  • 同じく上記2.からはtodoTypeItemsItemsが必要なんじゃなかろうか?

という疑問が湧いてくる。試しにtodoEdit.htmlの"todoTypeItems"→"todoType"に変更しても、うまく動いてくれるよう。ただこの場合でも、

  • 上記1.はOK-プロパティtodoTypeはスーパークラスAbstractTodoPageにある。
  • 上記2.はNG-todoTypeItemsというプロパティはどこにも定義されていない。その代わりgetterメソッドに相当するgetTodoTypeItems()がTodoEditPageに定義されているから問題ないのか?

という疑問は残る。あと"todoType"にするとエディタの左端に矢印マークが表示されるようになるだよね...。"todoTypeItems"の時は出てなかったのに。なんかこの辺も気になるね。

まぁともかくこのサンプルの場合、getTodoTypeItems()の返す内容が「種類」コンボで使われるだろう、ということで中を見ていくとSelectHelperのTYPE_ITEMSが返されていることがわかる。これはItemDtoを要素とするListで、初期化処理で内容がセットされている。そのItemDtoはvalueとlabelというプロパティを持っているだけのJavaBeans。TeedaはこのList中から要素をとりだし、プロパティvalueをOPTIONのvalueへ、プロパティlabelをコンボボックスへ表示される選択肢として展開してくれる。状態や優先度のコンボボックスも同じようになっている。

あとはボタンくらいかな。このボタンで不思議なのはinputでvalueを記述していないに、「一覧へ戻る」「確認画面」というキャプションが表示されていること。どこに書かれているかgrepで探したら\web\todo\label_ja.propertiesで発見。しかしその2つを結びつけることができるという説明が見つからない。いろいろぐぐってみるとTeeda1.0.3でbuttonのvalue値をlabelから取得できるようになったらしい([TEEDA-171])。

あとボタンでは[一覧へ戻る]の方のidが"jumpTodoList"で"jump"で始まっているところが目新しい。この場合メソッドも実行しないし、モデルも更新しないし、validatorも起動しない。だから入力データにエラーがあっても、todoList.htmlへ遷移することができるわけだ。ということで、"doXXXX", "goXXXX", "jumpXXXX"の動作を表にまとめると下のような感じかな。

項目doXXXXgoXXXXjumpXXXX備考
validation
×
 
モデル更新
×
Pageクラスのプロパティ
メソッド実行
×
×
 

一方[確認画面]は"goTodoConfirm"なので、validatorが適用される。TodoEditPageでは、このvalidator以外のチェックをしていないため非常にシンプルな作りになっている。実際のDB更新はTodoConfirmPageの担当だからね。