ログ日記

作業ログと日記とメモ

SeasarでWicketを使う

GWTを使いつつ、たまに静的ページも出したい。
ということでWicketを使ってみることにした。


まずWicketの設定。
wicket-*.jar をビルドパス、WEB-INF/lib に追加。

http://wicket.apache.org/learn/examples/helloworld.html

ここの通りにサンプルを作成。


次にS2Wicketの設定。
wicket-ioc-*.jarとs2wicket-*.jarをビルドパス、WEB-INF/lib に追加。また、S2Wicketのlibディレクトリにあるcglib-nodep-*.jarなど必要なjarをWEB-INF/libに追加。

http://s2wicket.sandbox.seasar.org/userguide.html
ここの通りに設定。
リロードのクラスパターンは

 <init-param>
      <param-name>reloadingClassPattern</param-name>
      <param-value>app.server.**</param-value>
 </init-param>

のようにした。
また、フィルターは

<filter-mapping>
    <filter-name>s2wicketfilter</filter-name>
    <url-pattern>/wicket/*</url-pattern>
</filter-mapping>

のように階層を一つ掘った。
# 逆の方がいいかもしれない。wicketをルートにして、GWTを任意のディレクトリまたはトップ以下にする。静的ファイルがある場合はそのまま表示するので、s2wicketfilterがかかっていてもGWTのエントリHTMLは表示できる。まだ試行錯誤中。


あとS2JDBCのエラーが出るので

AbstractService の setEntityClass(Class) メソッドをオーバーライドして、アクセス修飾子を

publicに変更するだけ。

public abstract class AbstractService<ENTITY extends EntityBase> extends S2AbstractService<ENTITY> {

    /**
     * wicket-ioc で利用している cglib で protected なメソッドが呼び出せないので、
     * オーバーライドして、public にしておくが、アプリケーションからは呼び出していはいけない。
     * 
     * @deprecated このメソッドを呼び出しは禁止
     */
    @Override
    @TransactionAttribute(TransactionAttributeType.NEVER)
    public void setEntityClass(Class<ENTITY> entityClass) {
        super.setEntityClass(entityClass);
    }
    
}
WicketでS2JDBCのAbstractServiceが動かないので回避方法を考えてみた - hakobera's blog

この設定をする。



これでPageクラスでResouceアノテーションなどS2の機能が使えるようになった。
/ にアクセスすれば GWTアプリが起動し、/wicket/にアクセスすればWicketが起動する。



http://d.hatena.ne.jp/t_yano/20090118/1232287169
こちらのwicket-seasar2も試してみたが、S2ContainerServletやS2ContainerFilterを使っている状態だとダメだった。この記事の後にS2Wicketがバージョンアップして新しいWicketに対応したので現状ではS2Wicketがベターなのかな?


http://s2wicket.sandbox.seasar.org/apidocs/org/seasar/wicket/S2WicketFilter.html
S2WicketにもS2ContainerFilterは登録しないように書いてあるが、こっちの場合はS2Wicketが相応の処理を代わりにやってくれる?


ざっとソースを見た感じ、SingletonS2ContainerInitializerS2ContainerFilterでやっている同じ処理をS2WicketFilterでやっていそうだ。