Cubbyをいじっていて気がついたとこ

今回は正真正銘Cubbyネタ。というか今回がたぶん初めてかと。

3つあるけど、すべてselectカスタムタグまわりだけ。


まず、いろいろと調べていたらタグライブラリのexampleがミスしてるっぽい。たんなる参考情報なので影響はないけれども、使用例という部分なので真っ先に目を向けるであろう部分がミスをしてるのはまずいのかな?とおもた。


selectタグの抜粋。

 <example>
      <![CDATA[
(JSP)
<t:select name="typeId" items="${todoTypes}" labelProperty="name" valueProperty="id"/>

(実行結果)
<select name="typeId">
  <option name="1">TodoType 1</option>
  <option name="2">TodoType 2</option>
</select>
      ]]>
    </example>

optionのところはnameじゃなくてvalueだとおもわれ。



次。これは要望というべきか。

カスタムタグでHTMLは出来るだけ生成しないほうが、DreamWeaverやブラウザで直接JSP表示したときなどツールとの相性がよいのは皆さんご存知のとおり。Cubbyは一応用意はしているけど、使わなくてももちろん問題はない。

でも、面倒なのがselectタグ。optionを表示するのにぐるぐるforeatchさせるのがたるい。ここだけはなんとかしたいのだが、cubbyで用意されているタグはselectタグまるごと生成するのでツールとの相性が悪い。

そこで、selectTag.javaをコピって名前をOptionTagへ、そしてtldもselectをコピーしnameを消した(必須じゃなくした)。selectを生成しているところをコメント化。

つまり、

<t:select items="${action.items}" name="select" labelProperty="名前" valueProperty="id"/>

が、以下のようになる。

<select name="select">
    <t:option items="${action.items}"  labelProperty="名前" valueProperty="id"/>
</select>

生成されるHTMLは同じ。でも、こちらならばツールとの相性も悪くない。デザイナと協業するのならこちらのほうがよい。タグを入れたりとかする場合にも融通が利く。 ちゃんとやるのならselectedあたりの処理を変えたほうが分かりやすいかも。コレクションに格納されている各要素にselectedに対応するboolean型をもっても対応できるとか、そんな感じのやつがあればなお良い。 あとselectedをセットするのにnameで指定された配列やコレクションのプロパティを使うというのはあまりにも全自動すぎて非常に分かりにくいと思う。素直に配列やコレクション、もしくは単体(ドロップダウンリストの使用頻度は高いため単体が一番使うと思う)をセットしてくれるselectedValueとかいう属性がタグライブラリにあると良いかなとか。


最後に。 itemsを入力ミス等するとヌルポがでる。181行目あたりから始まる文で。たしかに、nullの場合ここにたどり着く。そしてヌルポだとあまりにも原因が分かりにくいのでdoTagの頭でitemsがnullならばitemsの入力ミスの可能性があるよ!という分かりやすいエラーをさっさと投げてあげたほうが良いと思う。