Wicketが生成するアドレスを今風(?)にする

Wicketが生成するアドレスは標準だとこんな感じで非常に見た目がよろしくないです。

http://localhost:8080/app/?wicket:bookmarkablePage=page.HomePage

こんな時はmountBookmarkablePage()を使って特定のパスにページをマッピングすることですっきりします。

mountBookmarkablePage("/home", HomePage.class);

生成されるアドレスはこんな感じです。

http://localhost:8080/app/home

一見するとこれで解決なのですが、mountBookmarkablePage()では、パラメータが必要な場合に微妙な問題が残ります。パラメータを指定した場合のアドレスはこんな感じです。

http://localhost:8080/app/home/id/user01/message/hello

昔(?)だと?id=user01&message=helloというそのままな感じだったので、それに比べればマシなのですが、今時はidという文字がないのが主流な気がします。というわけでそれをWicketで実現する方法です。

一つはIndexedParamUrlCodingStrategyを使う方法です。使い方はmountBookmarkablePage()の時とあまり変わりませんが、代わりにmount()にCodingStrategyを渡してやります。コンストラクタに渡す値の意味はmountBookmarkablePage()と同じです。

mount(new IndexedParamUrlCodingStrategy("/home", HomePage.class));

これで生成されるアドレスはこんな感じです。

http://localhost:8080/app/home/user01/hello

それぞれの値は、PageParametersのgetString("0")やgetString("1")と0から始まるインデックスを指定してやることで取得できます。

もう一つはMixedParamUrlCodingStrategyを使う方法です。さきほどとあまり変わりありませんが、3つ目の引数としてパラメータのキー値を指定する必要があります。

mount(new MixedParamUrlCodingStrategy("/home", HomePage.class, new String[] {"id"}));

これで生成されるアドレスはこんな感じです。3つ目の引数として指定したものだけが/で区切った形になり、それ以外は?以降のパラメータとなります。

http://localhost:8080/app/home/user01/?message=hello

値の取得はPageParametersのgetString("id")やgetString("message")で普通に行うことができます。

二つの違いは、IndexedParamUrlCodingStrategyでは/で区切ったパラメータの個数に制限はありませんが、MixedParamUrlCodingStrategyでは3つ目の引数で指定した分だけしか/で区切られた形になりません。その代わりとして、?以降のパラメータも認識するようになるため、固定部分と可変部分で指定方法を変えて利用することになります。

二つとも似たようなことが実現できるのですが、IndexedParamUrlCodingStrategyだとパラメータ名が0,1という意味が分からないものになってしまいますので、どちらかと言えばMixedParamUrlCodingStrategyの方が使いやすい気がします。