Wicket 1.5でHTML5なタグを使う
はじめに
「Wicket 1.5ってHTML5なタグ使えるの?」というのは、多くの人が気にされることかと思います。
Wicket1.5の新機能でHTML5っぽいのは以下の内容は以下だけです。
HTML5 components added: EmailTextField, NumberTextField, UrlTextField and RangeTextField(http://wicket.apache.org/2011/09/07/wicket-1.5-released.html)より
「なんでそれだけ?」と思っていたのですが、「意外とそんな程度で良いのかもしれないなー」ということが分かったのでメモ。
ちなみに「JavaScriptのCanvasでリッチな感じにしたい」とかそういうのを望んでいるならば、無理ですが(そうなると、そもそもタグは関係無い)。
inputタグ以外について
HTML5で増えたタグを見てみると、ほぼすべて、LabelかWebMarkupContainerを割り当てておけば使えます(厳密に検証したわけじゃないですが)。
よって、実は困りません。
inputタグについて
inputタグには、いろんなtype属性が追加されていますが、専用コンポーネントが無い場合でも、TextFieldの派生クラスを作ってやれば対応可能です。
といいますのも、どうぜブラウザは文字列で入力値を返却してくるからです。
とはいえ、そのままTextFieldを使うと実行時にWicketがエラーを出力します。
これは、getInputType()をオーバーライドすることによって解決します。
getInputType()の戻り値として、使いたいtype属性の名前を返すようにしてやれば良いのです。
なぜgetInputType()をオーバーライドすることによって問題が解決するか示すために、以下にTextField#onComponentTag(final ComponentTag)のソースを引用します。
protected void onComponentTag(final ComponentTag tag) { // Must be attached to an input tag checkComponentTag(tag, "input"); // check for text type String inputType = getInputType(); if (inputType != null) { checkComponentTagAttribute(tag, "type", inputType); } else { if (tag.getAttributes().containsKey("type")) { checkComponentTagAttribute(tag, "type", "text"); } } tag.put("value", getValue()); // Default handling for component tag super.onComponentTag(tag); }
ちなみにTextField#getInputType()はWicket1.3.xにも存在します(少なくともWicket1.3.6にはあることを確認した)。
素晴らしいですね。