Wicketのtipsメモ

Wicket Wikiをあんまり読んでなかったので、少し読んでみました。その中で個人的に参考になった書き方をメモ。
あと、そのほかのブログやtwitterでの参考になったものも。

Pageのマークアップのファイルを変更する方法

ログイン前とログイン後で変更したかったので地味に困っていました。
WebPageクラスのサブクラスでpublic String getVariation()をオーバーライドして、適当な文字列を返すようにします。
Pageの名前がIndexPage.javaの場合、普段はIndexPage.htmlが利用されますが、getVariationがたとえば"foo"を返した時はIndexPage_foo.htmlが利用されるようになります。

public class IndexPage extends WebPage {
	public IndexPage(PageParameters parameters) {
		if(parameters!=null) {
			this.variant = (String)parameters.get("foo");
		}
	}

	private String variant;
	public String getVariation() {
		return variant;
	}
}

ログアウトの実装

リンクをクリックしたらログアウトして特定のページにリダイレクトする時の書き方。

Link logoutLink = new Link("my-link-wicket-id") {
	public void onClick() {
		//セッションの破棄
		getSession().invalidate();
		getRequestCycle().setRedirect(true);
		//リダイレクト
		setResponsePage(WhereEverYouWantToRedirect.class); 
	}
};

現在表示されているページへのリンクを無効にする

ナビゲーションなどで、表示されているページへのリンクを無効にしたいときに使うようです。
有効にすると、条件を満たしたときにaがspanとemに置き換わります。

new BookmarkablePageLink("page", Page.class).setAutoEnable( true );

ページ単位、アプリケーション単位でも設定できるようです。

cookieを使う

生成
((WebResponse)getRequestCycle().getResponse()).addCookie(new Cookie("cookieName", "cookieValue"));
取得
Cookie[] cookies = ((WebRequest)getRequestCycle().getRequest()).getCookies();
そのほかの方法
//staticメソッドを使っていつでも実行可能
((WebResponse)RequestCycle.get().getResponse()).addCookie(new Cookie("cookieName", "cookieValue"));
//WebPageのサブクラスで可能
getWebRequestCycle().getWebResponse().addCookie(new Cookie("cookieName", "cookieValue"));

強制的にページ遷移

ログインしてないときなどに、強制的にログインページに飛ばしたりするのに使うようです。
setResponsePageを使うのではなく、Exceptionを発生させて遷移させるようです。

throw new RestartResponseException(WhereEverYouWantToRedirect.class);

LinkのBody部分の書き換え

アンカータグの中を変える方法がわからず悩んでいたところ、id:t_yanoさんにTwitter経由で教えてもらいました。
以下のように、onComponentTagBodyをオーバーライドしてreplaceComponentTagBodyを使ってやればよいそうです。

BookmarkablePageLink link = new BookmarkablePageLink("link", IndexPage.class){
	private static final long serialVersionUID = 1L;
	@Override
	protected void onComponentTagBody(MarkupStream arg0, ComponentTag arg1) {
		replaceComponentTagBody(arg0, arg1, "アンカータグの中の文字");
	}};

おまけ

Wicket Wikiのリファレンスのタイトルを一部翻訳しました(リンク先は英語です)。
どんなことが載ってるのかを知るための参考程度に使ってください。
拙い英語力ですので、間違っているところがありましたらご指摘ください。

Wicket Wikiのリファレンス > WicketのHowTo