タグBODYや、属性の書き換え

Wicket で、HTML タグBODY や、属性を任意に書き換える例をまとめておく。

タグBODYや属性の書き換え

public class SampePage extends WebPage{
   public SampePage(){
      final String linkbody = "リンクBody 書き換え";
      add(new BookmarkablePageLink<Void>("menu",MenuPage.class){
         @Override
         protected void onComponentTagBody(MarkupStream mst,ComponentTag openTag){
            replaceComponentTagBody(mst,openTag,linkbody);
         }
      });

      final String linkbody2 = "WebMarkupContainer でリンクBody 書き換え";
      WebMarkupContainer link = new WebMarkupContainer("menu2"){
         @Override
         protected void onComponentTagBody(MarkupStream mst,ComponentTag openTag){
            replaceComponentTagBody(mst,openTag,linkbody2);
         }
      };
      link.add(new SimpleAttributeModifier("href"
                  ,"?wicket:bookmarkablePage=:"+MenuPage.class.getName()));
      add(link);

   Image image = new Image("cat"
                ,new ResourceReference(SampePage.class,"cat.jpg"));
      image.add(
         new SimpleAttributeModifier("width","20")
        ,new SimpleAttributeModifier("height","15")
      );
      add(image);
   }
}

タグ名を書き換えるなら、ComponentTag.setName

WebMarkupContainer span = new WebMarkupContainer("span"){
   @Override
   protected void onComponentTag(ComponentTag tag){
      tag.setName("div");
   }
};
add(span);

form の action を書き換え tag.put を使用

// tag.getAttributes().getString(String) で 元の属性取得
Form<Void> form1 = new Form<Void>("form1"){
   @Override
  protected void onComponentTag(ComponentTag tag){
      super.onComponentTag(tag);
      tag.put("action",tag.getAttributes().getString("action")+"&guid=ON");
   }
};
add(form1);

// ?wicket:bookmarkablePage=: で、
Form<Void> form2 = new Form<Void>("form2"){
   @Override
   protected void onComponentTag(ComponentTag tag){
      super.onComponentTag(tag);
      tag.put("action","?wicket:bookmarkablePage=:"+SamplePage.class.getName());
   }
};
add(form2);

タグを書きたくない時!

コンポーネントに対して、setRenderBodyOnly(true)を実行する。

例えば、

<span wicket:id="label"></span>

の時、、、

 add(new Label("label","これはタグを書かない").setRenderBodyOnly(true));

で、上の span タグは出力されない