Wicketでアプリを作る際に言われる一つが、”URLが汚い”があると思います。もちろんWicketの仕組みでniceURLを使えばカッコイイURLにする事ができます。今回は自分がプロジェクトでWicketを使う際にやっているものとして、niceURLのテクニック?について書きたいと思います。もしかしたら既出とか、ダークハックかもしれませんが。
niceURLをプロパティファイルで登録
niceURLはご存知Wicketのページクラスと任意のURLを紐つけるようにする機能ですが、WebApplicatioon#init()などで設定します。
public class MyApp extends WebApplication { public void init(){ mountPackage("/top", TopPage.class); mountPackage("/login", LoginPage.class); moundPackage("/manage", ManagePage.class); mountPackage("/test", TestPage.class); } }
これを動的に設定できるようにします。どういう事かというと、プロパティファイルなんかを用意して、その中でniceURLを設定できるようにします。例えばこんな風です。下はあくまでイメージです。
# Nice URL のリスト url.list=top,login,manage,test... url.top.class=jp.co.hogehoge.app.TopPage url.login.class=jp.co.hogehoge.app.LoginPage url.manage.class=jp.co.hogehoge.app.ManagePage url.test.class=jp.co.hogehoge.app.TestPage
url.list=で示すカンマで括ったのがniceURLです。そのniceURLの実態としてurl.XXXX.class=で示す完全修飾クラス名です。これをWebApplicatioon#init()で読み込んで、niceURLをマウントしてあげます。(コードはカンベン)
メリット、デメリット
クリティカルパスの削除
Wicketに限らず画面系を製造する際に、UIの流れに沿った製造(一覧を作ってから詳細画面を作るといった流れ)やログイン後の画面はログイン画面が出来てから作るといったいわゆるクリティカルパスがありますが、これを幾分か緩和します。ログイン画面が出来てなくてもその後の画面を作れたり、一覧がなくとも詳細が作れたりと、一気に製造をお願いできるようになります。
プロパティファイル上でのURL封鎖
テスト中に作った画面やデバッグ中に必用で作った画面、それらを本番環境に入れないようにするために何が出来るでしょうか?たとえばANTなどでwarを作成するときに不要なクラスをwarファイルに入れないとか・・・上記のniceURLをプロパティ化すると、url.listの項目をいじることによって、環境により使える画面を制御する事が可能になります。(そのため、プロパティファイルを環境により変える方法は必要になりますが。)
開発用プロパティファイル(イメージ)
# Nice URL のリスト url.list=top,login,manage,test... url.top.class=jp.co.hogehoge.app.TopPage url.login.class=jp.co.hogehoge.app.LoginPage url.manage.class=jp.co.hogehoge.app.ManagePage url.test.class=jp.co.hogehoge.app.TestPage
リリース用プロパティファイル(イメージ)
# Nice URL のリスト url.list=top,login,manage,test... url.top.class=jp.co.hogehoge.app.TopPage url.login.class=jp.co.hogehoge.app.LoginPage url.manage.class=jp.co.hogehoge.app.ManagePage #url.test.class=jp.co.hogehoge.app.TestPage
逆に、本番中でも何らかの障害でとあるデバッグ画面が使いたくなった。そういうときは、運用中のプロパティファイルをいじってその画面を一時的に復活させる事などが可能になります。(例がいささかありえない気がしますが)
欠点として、niceURLの静的解決ができない。これに尽きるでしょう。多分これにより、Wicketらしさが無くなるという方もいると思います。
おまけ
さきほどのプロパティファイルですが、開発時には"/"がこの画面、リリース時にはこの画面と言ったように切り替えたい時も僕は使っています。自分の場合は開発時(UT)は自分の今開発中の画面、リンクテスト以降はログイン画面からと言ったようにその制御に使います。下記のようにです。(コードイメージですので無い部分は妄想でお願いします)
# Nice URL のリスト url.list=top,login,manage,test... url.top.class=jp.co.hogehoge.app.TopPage url.login.class=jp.co.hogehoge.app.LoginPage url.manage.class=jp.co.hogehoge.app.ManagePage url.test.class=jp.co.hogehoge.app.TestPage # 開発中はテスト画面を起動 url.start=test ~~~~~~~~~~~~~~~
WebApplicationを継承したMyAppクラス
public class MyApp extends WebApplication { public void init(){ /* * app.propertiesを読み込んでnice URLsをマウントする。 */ } public class getHomePage(){ // プロパティファイルからurl.startの値を取得 String niceurl = getProperties("url.start"); // プロパティファイルからniceurlが示すページクラスの完全修飾名を取得 String classstr = getProperties("url." + niceurl + ".class"); // クラスオブジェクトにして返す Class clazz = Class.forName(classstr); // try - catchは省略 return clazz; } }
これが、開発が終わりリンクテスト以降になったらスタートページを固定化します。
# Nice URL のリスト url.list=top,login,manage,test... url.top.class=jp.co.hogehoge.app.TopPage url.login.class=jp.co.hogehoge.app.LoginPage url.manage.class=jp.co.hogehoge.app.ManagePage url.test.class=jp.co.hogehoge.app.TestPage # 最初に出るページはログイン画面とする url.start=login ~~~~~~~~~~~~~~~