Wicket BookmarkableLink の アンカーテキスト を設定する


Wicket で BookmarkableLink、ExternalLink というものがありますが、
ExternalLinkは、コンストラクタで、以下のようにアンカーテキストを設定できます。

add(new ExternalLink("google", "https://www.google.co.jp", Google));

BookmarkableLink は、コンストラクタ経由では、アンカーテキストの設定ができず、

以下のような、HTMLを記述し、

 <a href="https://www.google.co.jp" wicket:id="link"><wicket:container wicket:id="anchorText"/></a>

JAVA側で、BookmarkableLink に Label を add する 実装を行なっていました。

    BookmarkableLink bookmarkableLink = new BookmarkableLink<Void>("link", HogePage.class);
    bookmarkableLink.add(new Label("label", Model.of("Google"));
    add(bookmarkableLink);

しかし、そんなことはする必要はなく、AbstractLink には、setBody というメソッドがあり、

    /**
     * Sets the link's body model
     * 
     * @param bodyModel
     * @return <code>this</code> for method chaining
     */
    public AbstractLink setBody(final IModel<?> bodyModel)
    {
        this.bodyModel = wrap(bodyModel);
        return this;
    }

このメソッドを使用すると、下記のように記述できます。

    BookmarkablePageLink bookmarkablePageLink = new BookmarkablePageLink<Void>("link", HogePage.class);
    bookmarkablePageLink.setBody(Model.of("Google"));
    add(bookmarkablePageLink)

ExternalLink リンクのコンストラクタ内でも、setBody をCall しており、
AbstractLink#onComponentTagBody()getBody() 経由で設定値が使用されます。

    public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
        IModel<?> tmpBodyModel = this.getBody();
        if(tmpBodyModel != null && tmpBodyModel.getObject() != null) {
            this.replaceComponentTagBody(markupStream, openTag, this.getDefaultModelObjectAsString(tmpBodyModel.getObject()));
        } else {
            super.onComponentTagBody(markupStream, openTag);
        }

    }

これで、HTML上 Wicket の マークアップは1つ減らせます。
css で styleを設定したいわけではなければ、これで問題なさそうに思います。

以上です。

コメント