book-of-vaadin.pdfはよくできている。この本がVaadinの概要、アーキテクチャ資料であり、チュートリアルであり、そして開発環境の構築資料でありと、この1冊さえあれば学習するには事足りる。(しかしその反面Javadocが・・・というのは置いておく~L~)ということで、サーブレットでは使われるHttpServletRequestオブジェクトと、HttpServletResponseオブジェクトをVaadinではどうやってアクセスするの?って話です。タイトルはpdfの章そのまんまなんで〜。
HttpServletRequestListener
Vaadinのイベントモデルでは、開発者が上記のオブジェクトを意識しないようにうまく隠蔽されているんだけど、時々使いたいこともあるでしょうに。その場合にはcom.vaadin.terminal.gwt.server.HttpServletRequestListenerというインターフェースをApplicationクラスに実装すればよいとのこと。
実装するのは下記の2つのメソッド。
public void onRequestStart( HttpServletRequest request, HttpServletResponse response ); public void onRequestEnd( HttpServletRequest request, HttpServletResponse response );
気をつけなくてはいけないのは、onRequestStart()メソッドが呼び出されるのは、Applicationクラスに実装したinit()メソッドが呼び出される前であること。なのでinit()でインスタンス変数の初期化なんかしている場合、このonRequestStart()内ではそのインスタンス変数は当然使えないです。
サンプル
以下に、サンプルとしてやって見ました。
public class MyvaadinApplication extends Application implements HttpServletRequestListener{ public void init() { Window win = new Window("HttpServletRequestListenernoのテストでござ〜る"); Label lbl = new Label("はろー!"); win.addComponent(lbl); setMainWindow(win); System.out.println("init!!"); } public void onRequestStart( HttpServletRequest request, HttpServletResponse response ) { System.out.println("onRequestStart!!"); System.out.println(" query: " + request.getQueryString()); System.out.println(" Path: " + request.getPathInfo()); } public void onRequestEnd( HttpServletRequest request, HttpServletResponse response ) { System.out.println("onRequestEnd!!"); } }
これでhttp://localhost:8080/appnameで画面を表示。
実行結果:
onRequestStart!! query: null Path: / init!! onRequestEnd!! onRequestStart!! query: repaintAll=1&sh=768&sw=1366&cw=1362&ch=590&vw=1362&vh=590&fr= Path: /UIDL/ onRequestEnd!!
上記を見ると2回リクエストが飛んでくるのが分かる。1回目はアドレスバーに打ち込んだパスに対するリクエスト。2回目以降は、その後のUIDLプロトコル経由でのAJaxのリクエストとのこと。init()メソッドは、Applicationがロードされるときに1回だけ呼び出されるので、次以降のリクエストにはinit!!の文字列は表示されなくなるはず。で、やってみたのが以下。
onRequestStart!! query: windowName=2053895827&onunloadburst=1 Path: /UIDL/ onRequestEnd!! onRequestStart!! query: null Path: / onRequestEnd!! onRequestStart!! query: repaintAll=1&sh=768&sw=1366&cw=1362&ch=590&vw=1362&vh=590&fr= Path: /UIDL/ onRequestEnd!!
上記は2回目以降のリクエスト。init!!が表示されないのが分かる。これを見るとUIDLのリクエストではさまれているので、Vaadinのイベントモデルは必ずAjax⇒本当のリクエスト⇒Ajaxという順番なんだろうか・・・
昨日調べた?debugを行ったときはどうなんだろう?ということで一応結果だけ載せておく。
onRequestStart!! query: windowName=2053895827&onunloadburst=1 Path: /UIDL/ onRequestEnd!! onRequestStart!! query: debug Path: / onRequestEnd!! onRequestStart!! query: repaintAll=1&sh=768&sw=1366&cw=1362&ch=590&vw=1362&vh=590&fr= Path: /UIDL/ onRequestEnd!!
これもUIDLで囲まれてリクエストが飛んでいる。この、UIDLの仕組みはのちのちクッキーを使うときに重要になってくるらしい。