Wicketのコンポーネント追加先指定にHTMLのID属性を利用可能にするライブラリを作成してみた

Wicketコンポーネントを追加する場所を指定する場合、通常は該当するタグにwicket:idという属性を付与する必要があるのですが、代わりにHTMLのID(class)属性を利用可能とするライブラリを作成してみました。

Wicketコンポーネントを追加する場所を指定する場合、該当するタグにwicket:idという属性を付けます。XHTMLを利用している場合はこの方式でも良いのですが、XHTML亡き今HTML5が主流になってくると、wicket:という独自namespaceの属性は浮いた感じになってしまいます。またCSSjQueryを頻繁に使い出すと、idやclass属性を付与することが多くなるため、wicket:idを改めて付けるのも面倒になります。

このライブラリを利用すると、wicket:idを付与することなくWicketを利用することが可能となります。等の専用タグを利用しない場合は完全に普通のHTMLになりますので、Pure HTMLにこだわりがある人にはオススメです。ちなみにライブラリの動作確認はWicket 1.4.13で行っています。

使い方

利用前の下準備としては、ライブラリのJARファイルを追加した後、WicketのApplicationクラスで下記のようにMarkupParserFactoryを上書きするだけです。

protected void init() {
    ...
    getMarkupSettings().setMarkupParserFactory(new AlternativeMarkupParserFactory());
    ...
}

実際に利用する際は、HTML内のコンポーネントを追加したい場所に対して、wicket:idの代わりに wicket- で始まるIDを付けてあげます。

<!-- html template -->
<span id="wicket-username"></span>

HTMLにIDを付与することで、wicket:idを用いた場合と同様に、その場所にコンポーネントを追加することが可能です。ただし、wicket:idを用いた場合との違いとして、Java側でIDを指定する場合は wicket- を除いた部分を指定する必要があります(設定によりprefix込みにも変更可能)。

// add Label component (remove "wicket-" from id)
add(new Label("username", "Hoge Hoge"));

基本的な使い方は以上です。

class属性の利用

ID属性以外にclass属性も利用可能です。DataViewなどの繰り返し出力を伴うコンポーネントにID属性を使うと、下記のように重複したIDが出力されてしまいます。

<!-- Do not use id attribute in repeater -->
<span id="wicket-username"></span>
<span id="wicket-username"></span>
<span id="wicket-username"></span>
...

そこで、このような場合はclass属性を利用します。class属性への指定方法はID属性と同じです。

<!-- html template (in repeater) -->
<span class="wicket-username"></span>

またコンポーネントを追加する際の指定方法もまったく同じです。

add(new Label("username", "Hoge Hoge"));

カスタマイズ

IDに関する動作はAlternativeMarkupParserFactoryの引数でカスタマイズが可能です。第1引数はIDに付けるプレフィックス(デフォルトは wicket-)を指定します。第2引数はプレフィックスを除去するかどうかを指定します。デフォルトはtrue(プレフィックスを除去)です。

protected void init() {
    ...
    // プレフィックスを wi- とする。またプレフィックスは残したままとする。
    getMarkupSettings().setMarkupParserFactory(new AlternativeMarkupParserFactory("wi-", false));
    ...
}

...

<span id="wi-username"></span>

...

// 第2引数をfalseとした場合は wi- 付きで指定する。
add(new Label("wi-username", "Hoge Hoge"));

ダウンロード

ソースコードは下記で公開しています。

 http://code.google.com/p/wicket-altmark/

またJARファイルは下記からダウンロードできます。

 http://hudson.madogiwa.org/job/wicket-altmark/

Maven2

JARをダウンロードする以外に、Maven2リポジトリもあります。
もしMaven2で利用する場合は、pom.xmlに下記のリポジトリを追加して下さい。

<repositories>
  <repository>
    <id>maven.madogiwa.org</id>
    <name>madogiwa.org Repository</name>
    <url>http://maven.madogiwa.org/maven2</url>
  </repository>
</repositories>

また同様にpom.xmlに下記の依存設定を追加して下さい。

<dependency>
    <groupId>org.madogiwa</groupId>
    <artifactId>wicket-altmark</artifactId>
    <version>0.2</version>
</dependency>

とりあえず試してみた限りでは動いているのですが、真面目な用途には利用していないため問題があるかもしれません。また実装が手抜きなので、XHTMLでnamespaceを変更してると動かない場合があるはずです。その他、何かありましたらコメント欄などでお知らせ頂ければ幸いです。

追記

どうやって実現しているのかはWicket勉強会の資料をご覧下さい。

おまけ - Wicket 1.5の場合

ソースコードを見た限りですが、1.5ではユーザがMarkup操作用のフィルターを追加することが考慮されているみたいです。実際には試していないのですが、こんな感じに利用することで1.5でも動きそうです。

protected void init() {
    ...
    getMarkupSettings().setMarkupFactory(new MarkupFactory() {
        public MarkupParser newMarkupParser(final MarkupResourceStream resource) {
            MarkupParser parser = super.newMarkupParser(resource);
            parser.add(new org.madogiwa.wicket.altmark.HtmlTagIdentifier());
            return parser;
        }
    });
    ...
}