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でリッチな感じにしたい」とかそういうのを望んでいるならば、無理ですが(そうなると、そもそもタグは関係無い)。

環境

  • Wicket 1.5.3(あまりバージョンが厳密に関係する話ではないですが)


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にはあることを確認した)。
 素晴らしいですね。

さいごに

 念のために書いておきますと、使う際は要検証です。「id:sekomが使えると言っていたけど使えない」と言われても困ります(いくつか試した感じでは大丈夫ではあったのですが)。
 とはいえ、「HTML5で追加された、HTMLのタグと属性使えますよ。一応実験は要りますけど」と言えるのは、今のご時世、大変気分が楽になるのではないでしょうか。