ひがやすを技術ブログ

電通国際情報サービスのプログラマ

PRGパターン時の変数の寿命

PRG(Post Redirect Get)パターンを使う場合、次の画面には、redirectで遷移するため、変数を次の画面に渡すためには、セッションを使う必要があります。
ただ、できるだけセッションは使いたくないし、例えセッションに変数をおいたとしてもできる限り早く消してしまいたいものです。
Teedaの現在のバージョンでは、10画面分の情報を保持していて、10画面を越える場合は、最もアクセスしていないデータから削除されていきます。RailsFlashのように、redirectが終われば削除したら良いんじゃないのと思う方もいるかもしれませんが、戻るボタンで戻ってリロードしたりする場合があるので、10画面分は保存しているのです。
これを次のバージョンからは、同一のウィンドウで違うサブアプリケーションに移動したら自動的に消すようにします。これをサブアプリケーションスコープと呼んでいます。サブアプリケーションとは、同じディレクトリに存在するHTML達です。例えば、/view/add/addInput.html, /view/add/addResult.htmlは同一の/view/addサブアプリケーションに所属します。/view/hello/hello.htmlは、/view/helloサブアプリケーションです。
Teedaは、新しいウィンドウが開いたときに、そのことをきちんと認識しているのでウィンドウごとに管理することができます。違うウィンドウで同一サブアプリケーションを動かしても何の問題もありません。
Seam, Shale, SpringWebFlowでは、カンバセーションのスコープを持っていて、あるメソッドを起動してからあるメソッドが終了するまで、自動的に変数を管理するという機能があります。ユーザが正規のオペレーションをしてくれるなら、きちんと終了されるのですが、最後まで処理を行わずに別の機能(サブアプリケーション)に遷移したとすると、終了処理が行われず、変数はリークして残ったままになります(Seamだとタイムアウトがあったかも)。Teedaの場合は、最後まで処理を行わなくても、別の機能に遷移した時点で自動的に変数が解放されるのです。
さらに、リダイレクトスコープも追加します。これは、プロパティに


@RedirectScope
private String aaa;
のように書いておけば、次の画面へのリダイレクト処理が完了すると自動的にこの変数は消去されます。