第二回Wicket勉強会で発表してきた『WicketアプリケーションをWebで公開する前にやっておく3つのこと』
第二回Wicket勉強会で発表してきました。
内容はそのままpptをあげようかと思ったのですが、ソースコードの部分が少しあってその辺が見づらかったので記事に書き直しました。pptでの発表だとどうしてもソースコードを見せるのが難しいので、何か対策を考えたいですね。
以下発表内容と感想と宣伝です。
WicketアプリケーションをWebで公開する前にやっておく3つのこと
WicketでWebに公開する
1. エラーページを変更する
- Wicketでの開発で頻繁に遭遇するPage Expired
- 自前でExpredPageクラスを作る
public class MyExpiredErrorPage extends WebPage { public MyExpiredErrorPage(){ ((WebResponse)getResponse()).getHttpServletResponse().setStatus(400); } }
- 表示されるExpiredPageクラスの変更
- WebApplicationクラスを継承したクラスのinitメソッド内で変更
@Override protected void init() { getApplicationSettings().setPageExpiredErrorPage(MyExpiredErrorPage.class); }
-
- ちなみにInternalErrorPageの場合
@Override protected void init() { getApplicationSettings().setInternalErrorPage(MyInternalErrorPage.class); }
2. robots.txt
- Wicketがステートフルであることの弊害
- サーバがページのインスタンスを持つため、一時的に使用可能なURLが存在する
- 例:http://localhost:8080/?wicket:interface=:5:login_menu:login::ILinkListener::
- Webサービスとして公開した場合→クローラがアクセスしまくり
- フォームを使うページだとよくある
- robots.txtを置く
- クローラにアクセスしてほしくないページを定義するもの
- ドメイン直下にrobots.txtファイルを置いておくとクローラがここをまず読んでくれる
- 重い処理をするところや半無限に生成されるページなどには書いておくとよい
- 実際の記述
User-Agent: * Allow: / Disallow: /?wicket*
- robots.txt問題点
- robots.txtはあくまで紳士協定→無視するクローラも存在する
- 正確な記述方法が規定されていない→解釈が各社で異なる
- 今回の書き方は多くのクローラでうまく解釈してくれている
- 個人的には
- こういうページにはHybridUrlCodingStrategyを使ってhttp://localhost:8080/login.0のようにする
public class WicketApplication extends WebApplication{ @Override protected void init() { mount(new HybridUrlCodingStrategy("/login", LoginPage.class)); } }
3. jsessionid対策
- Wicketアプリの初回アクセス時
- Tomcatだと以下のようなURLになる
- http://locahost:8080/login;jsessionid=E3190E13AD1FD7D8F4E59F5C4BB46537
- 仕様上最初のアクセス時にそのクライアントがcookieを使用可能かわからないため
- 利用者としては気持ち悪いし、クローラによっては別ページと解釈してしまう
- 対策1 getClientInfoメソッド
- 対策1の問題点
- デフォルトで表示されるBrowserInfoPageクラスがrefleshを使っているが、クローラは解釈できない
- クローラがページにアクセスできない = GoogleやYahooにインデックスされない
- 対策2 自前のLinkクラスを作る
public class MyLink extends BookmarkablePageLink{ //コンストラクタも適当に書いてください @Override protected CharSequence getURL() { String url = super.getURL().toString() .replaceAll(";jsessionid=[^\\?]+", ""); return url; } }
終わりに
- 今回話した内容が参考になれば幸いです。
今回の勉強会の感想
今回はメモを取っていないので大雑把な感想を。
80人の参加者の勉強会で参加率も高かったので部屋がいっぱいでした。
前回もLTをやりましたが、これだけ人数が多いと少し緊張しますねw自分の今回の話は反応がいまいちだったので次回話す機会があったら内容の路線を変更しようかと思っています。
第一回目はWicketの運用の話が多かったですが、今回はJavaScriptに関する話が多かったです。発表内でも触れられていましたが、クライアント側で動的に変化する需要が増えているようですので、その辺もカバーしているところがWicketが注目されている理由のひとつかもしれません。とはいえ指摘があったように、結局JavaでJSを薄くラッピングしているだけなのでちゃんとやろうと思ったらJavaScriptの知識が必要になるのですが。
id:NAGASEYASUHiTOさんのComponentInstantiationListenerを使う話が個人的には一番参考になりました。自分では使ったことがないのですが、いろいろとできることの幅が広がりそうです。
あとグリーパネェと書くのが礼儀らしいので書いておきますね。会場を貸していただいてありがとうございました。
懇親会の感想
かなり人数がいたので場所の確保や参加者の把握がすごく大変だったと思うのですが、id:Yamashiro0217さんの幹事力が光りましたね。
Wicketの話もいろいろできてよかったのですが、ORMの話やLuceneの話もできてよかったです。ORMにiBatisを使っている方が何人かいらっしゃったのですが、皆さん基本的なSQLは自動生成してらっしゃるそうで、自分だけじゃなくて安心しましたwこういう場でLuceneの話ができたのも初めてなので新鮮でした。
id:bose999さんにJBossをプッシュされたので、早速手元の開発で5.0.1.GAを試してみています(といっても今のところ普通にTomcatを使うのと違いない使い方ですが)。
途中で眠気が限界が来たので始発で帰ったのですが、二次会では濃い話が聞けて面白かったです。
【宣伝】Wicket本発売日決定
ページで告知されていますが、明日3月13日にid:t_yanoさんの書いたWicket本が発売されるようです。初のWicketを扱った和書ですので、これでもっと国内でWicketが盛り上がるとよいですね。
現在実家に帰っている最中なので本を読むのは当分先になりそうです。