画面表示中にタイムアウトが発生するなどしてセションが切断すると、セションに関連付けられたオブジェクトは初期化されます。
最初にセションが起動された時に特定の処理を実行する
最初のセション起動かセション切断かの判定はできませんが、JSPで判定するのが簡単な方法です。 HTTPパラメタのuji.verbはコマンドを直接指定します。
<BODY> <% if(session.isNew() && request.getParameter("uji.verb") == null) { %> <jsp:forward page="main.jsp?uji.verb=login" /> <% } %> <uji:dispatch />
セション切断時に特定の処理を実行する
タイムアウトが発生してセションが切断した場合、setResponseBeanメソッドや、uji:useBeanタグで指定したデータBeanは削除されます。アプリケーションクラスのnotifyBeanLostメソッドはこの状態を検出します。 notifyBeanLostメソッドの復帰値は、セション切断時のコマンドを差し替えます。
package sample; public class SampleApplication extends com.fujitsu.uji.ApplicationProfile { public String notifyBeanLost(String id) { return("timeout"); } }
この場合、Beanなし、コマンド名timeoutに対応するビジネスクラスのメソッドが呼ばれます。コマンドマップでメソッドに対応付けます。
;timeout=sample.SampleHandler.timeout
ビジネスクラスのメソッドでは画面構成を決めるなどの処理をします。
public class SampleHandler extends GenericHandler { public void timeout(DispatchContext context) { // タイムアウトの処理を記述 ... } }
notifyBeanLostメソッドを利用する場合は、入出力ページを作成する際に以下に注意してください。
フォームにリクエストパラメタuji.idを含めてください。また、uji.idで指定したデータBeanに対し、uji:useBeanタグでrequest="true"を指定してください。uji.idは、フォームに入力されたデータを受け取るデータBeanを指定します。
<uji:useBean id="body" cls="sample.BodyBean" request="true" /> <FORM method="post"> <INPUT name="uji.id" type="hidden" value="body"> .... </FORM>
フォームにリクエストパラメタuji.beanを含めないでください。
セション切断を検出した処理を再実行する
セション切断の検出後、ログイン等の割り込み処理を行ってリトライする場合は、以下のようにアプリケーションを作成します。 uji:useBeanタグで指定したデータBeanは削除されても再度生成できるように、uji.beanパラメタを追加します。
<INPUT name="uji.id" type="hidden" value="body"> <INPUT name="uji.bean" type="hidden" value="sample.SampleBean">
セションのプリプロセスでは、フラグ等を設定して、現在の状態が新規のセションかどうか判定します。
package sample; public class SampleSession extends com.fujitsu.uji.http.HttpSessionProfile implements com.fujitsu.uji.Preprocessor { protected boolean loginFlag = false; protected transient DispatchContext savedContext; int preprocess(DispatchContext context) { if(!loginFlag) { // 初回でなければコンテキストを保存 if(context.getRequestBean() != null) savedContext = context; // context.setResponseBeanで画面を構成 .... return Preprocessor.SKIP_ALL; } return Preprocessor.EVAL; } }
ログイン処理が正常に実行されたあと、再処理をします。
public void login(DispatchContext context, LoginBean dataBean) { // ログイン実行 .... // 正常の場合 SampleSession sp = (SampleSession)context.getSessionProfile(); sp.loginFlag = true; if(sp.savedContext != null) { // コンテキストが保存されている場合、再実行 Dispatcher.redispatch(context, sp.savedContext); sp.savedContext = null; } else { // 初期画面の処理 .... } }