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が相応の処理を代わりにやってくれる?
ざっとソースを見た感じ、SingletonS2ContainerInitializerとS2ContainerFilterでやっている同じ処理をS2WicketFilterでやっていそうだ。