WicketでHTMLを別のディレクトリに配置する

前回の続き。

Wicket-jaのメーリングリストで最近話題になった内容。

WicketはデフォルトではPageクラスに対応するHTMLファイルはPageクラスと同じ階層にある必要がある。というかPageクラスと同じ階層を検索するようになっている。
特に問題はないけど、一般的にはWEB-INFの下に置いてあるのが普通だし、今回はHTML部分は自称デザイナーOが作ることになっているので、javaのパッケージ内をいじられるのはあまり好ましくない。というか彼も.javaやらのファイルがあるところで作業するのは嫌だろうと思う。

なのでHTMLファイルはWEB-INF以下に配置しようと思う。
まずはViewFileLocatorを作成する。
ViewFileLocator.java

public class ViewFileLocator extends ResourceStreamLocator{
   private String pagesPath;
   public ViewFileLocator(String pagesPath){
      this.pagesPath = pagesPath;
   }
   
   @Override
   public IResourceStream locate( Class<?> clazz, String path ){
      if( path.indexOf( pagesPath, 0 ) != -1 ){
         IResourceStream located = super.locate( clazz, path.substring(pagesPath.length() + 1));
         if( located != null ){
            return located;
         }
      }
      return super.locate( clazz, path );
   }
}

つぎにApplicationクラスのinitメソッド内に以下を追加

MyApplication.java

IResourceSettings resourceSettings = getResourceSettings();
resourceSettings.addResourceFolder( "WEB-INF/pages" );
resourceSettings.setResourceStreamLocator( new ViewFileLocator("taka/of/master/pages" ) );

以上で完了。
すると

taka.of.master.pages.HomePage.java

に対応するHTMLファイルは

WEB-INF/pages/HomePage.html

が使用される。

taka.of.master.pages.user.UserPage.java

WEB-INF/pages/user/UserPage.html

が使用される。

階層は保つ必要がありそうだけど、これでjavaソースフォルダ内からHTMLファイルがなくなった。


メーリングリスト、参考になりました。

以上。

Wicketで携帯Webアプリを作る際の注意点

前回の続き。

画面が少しずつできてきたので携帯からアクセスして見た。すると何故かドロップダウンのラベルが表示されてない。数字のところはでてるのに日本語のところがでてない。PCからだと表示されているが、携帯からだと表示されない。。。「Docomoの嫌がらせか?」と思い、早速調べてみると

http://www.eisbahn.jp/yoichiro/2007/01/wicket_4.html

こんなようなことになってるらしい。。。
出力されたソースを見てみるとたしかに日本語の部分が数値参照になっている。携帯では数値参照の部分を解釈してくれないらしく、何も表示されてなかったんだね。。。

どうやらWicketを修正してビルドしなおすと解決するらしい。めんどいなぁと思いつつソースを追っているとこんな部分を発見。

AbstractChoise.java(416行目あたり)

if (getEscapeModelStrings())
{
   escaped = escapeOptionHtml(display);
}
buffer.append(escaped);
...

ん?なにやら分岐してるじゃないか?getEscapeModelStringsを追い求めてソースを追うこと5クラス目。あったあったComponent#setEscapeModelStrings((final boolean escapeMarkup)メソッドが!!
というわけで試してみる。

DropDownChoice<SexType> sex = new DropDownChoice<SexType>("sexType",
                                    Arrays.asList(SexType.MAN,SexType.WOMAN),
                                      new ChoiceRenderer<SexType>("label","code"));
sex.setEscapeModelStrings(false);

ちなみにSexTypeはenumです。こんなふうにもできるWicketすばらしい。
で、実行結果。。
まずはPCで出力ソースを見てみる。うん。数値参照になってない。そして携帯でアクセス。うん。ちゃんと表示されてる。
こことはやりかた違ったけど俺が使ってるのは1.4rc1(知らない間にでてたのでm3からrc1にした)なので改良されたっぽい。。。

このブログWicketの人に報告するよ〜って書いてあったので報告して改良されたのかな?すばらしいことです。大変参考になりました。

ともかく携帯で数値参照問題も解決&さらにWicket詳しくなれた。

以上。