Web アプリケーションは、ユーザーとアプリケーションの相互作用に関する情報を自動的には保存しないため、ステートレス であると見なされます。 アプリケーションで、ユーザーのアクションに関する詳細を保持する必要がある場合は、その情報をどこかに明示的に保存しなければなりません。
Web アプリケーションは、多くの場合、この詳細をユーザーのセッション・オブジェクト (ユーザーのトランザクション、およびそのユーザーと Web アプリケーションの相互作用に関する一時情報を保存するための、サーバーのメモリー領域) に保存します。 セッションが終了するとセッション・オブジェクトが失われるため、セッション・オブジェクト内のデータには、データベースに保存されたデータほどの継続性はありません。 それでも、セッション・オブジェクトにデータを保存して効率よく使用すれば、短期的には役に立ちます。
ユーザーが EGL 制御された Web ページにアクセスすると、サーバーは、実行時にページ Bean として表示されるそのページの JSF ハンドラーをロードし、その Bean をセッション変数 としてセッション・オブジェクトに保存して、ページのロジックを提供するためにその Bean を使用します。 JSF ハンドラーの scope プロパティーが session に設定され、cancelOnPageTransition プロパティーが no に設定されている場合、セッションが終了するか Bean がタイムアウトになるまで、この Bean はセッション・オブジェクト内に残されます。これにより、ユーザーが別のページに移動しても、ハンドラー内の変数の値はセッションの間保持されます。
ただし、ページ Bean は大量のメモリーを占有することがあります。 セッション・オブジェクト (すなわち、サーバー・リソース) をより効率的に使用する方法として、ユーザーの情報を独自の小さなセッション変数に保存してから、JSF ハンドラーの scope を request に設定するか、あるいは cancelOnPageTransition を yes に設定することにより、その Bean をセッション・オブジェクトから除去することができます。こうすることで、ハンドラー内のすべての変数ではなく、アプリケーションに必要なデータのみを保持することができます。
myVar string = "Hello";
J2EELib.setSessionAttr("mySessionVar", myVar);
myVarFromSession string;
J2EELib.getSessionAttr("mySessionVar", myVarFromSession);
package jsfhandlers;
handler sessionPageOne type JSFHandler
{scope = request,
view = "sessionPageOne.jsp"}
userRecord sessionRecord;
function storeAndForward()
J2EELib.setSessionAttr("mySessionRecord",
userRecord);
forward to "sessionPageTwo";
end
end
record sessionRecord type BasicRecord
userName string;
idNumber int;
end
この例では、レコード内のフィールドにバインドされた 2 つの入力フィールドと、storeAndForward 関数にバインドされた 1 つのコマンド・ボタンを含む sessionPageOne.jsp という名前の Web ページがあることを想定しています。
storeAndForward 関数にバインドされたボタンを、ユーザーがクリックすると、そのユーザーのセッション変数にレコードが追加され、以下の JSF ハンドラーで表されている別のページに移動します。
package jsfhandlers;
handler sessionPageTwo type JSFHandler
{view = "sessionPageTwo.jsp",
onPreRenderFunction = onPreRender}
submittedRecord sessionRecord;
function onPreRender()
J2EELib.getSessionAttr("mySessionRecord",
submittedRecord);
end
end
前のハンドラーと同じように、この例では、レコード内のフィールドが sessionPageTwo.jsp ページにある出力変数にバインドされていることを想定しています。
このハンドラーはセッション変数からデータを取得し、JSF ハンドラーで一時的に使用するためにそのデータを変数に割り当てます。J2EELib.clearSessionAttr("mySessionRecord");
また、J2EELib.clearEGLSessionAttrs 関数を使用すると、すべての EGL 制御セッション変数をそのユーザーのセッション・オブジェクトから除去できます。
セッション関連の関数について詳しくは、「EGL 言語解説書」の『EGL ライブラリー j2eeLib』を参照してください。