ユーザー・セッションへのデータ保存

Web アプリケーションは、ユーザーとアプリケーションの相互作用に関する情報を自動的には保存しないため、ステートレス であると見なされます。 アプリケーションで、ユーザーのアクションに関する詳細を保持する必要がある場合は、その情報をどこかに明示的に保存しなければなりません。

Web アプリケーションは、多くの場合、この詳細をユーザーのセッション・オブジェクト (ユーザーのトランザクション、およびそのユーザーと Web アプリケーションの相互作用に関する一時情報を保存するための、サーバーのメモリー領域) に保存します。 セッションが終了するとセッション・オブジェクトが失われるため、セッション・オブジェクト内のデータには、データベースに保存されたデータほどの継続性はありません。 それでも、セッション・オブジェクトにデータを保存して効率よく使用すれば、短期的には役に立ちます。

ユーザーが EGL 制御された Web ページにアクセスすると、サーバーは、実行時にページ Bean として表示されるそのページの JSF ハンドラーをロードし、その Bean をセッション変数 としてセッション・オブジェクトに保存して、ページのロジックを提供するためにその Bean を使用します。 JSF ハンドラーの scope プロパティーが session に設定され、cancelOnPageTransition プロパティーが no に設定されている場合、セッションが終了するか Bean がタイムアウトになるまで、この Bean はセッション・オブジェクト内に残されます。これにより、ユーザーが別のページに移動しても、ハンドラー内の変数の値はセッションの間保持されます。

ただし、ページ Bean は大量のメモリーを占有することがあります。 セッション・オブジェクト (すなわち、サーバー・リソース) をより効率的に使用する方法として、ユーザーの情報を独自の小さなセッション変数に保存してから、JSF ハンドラーの scoperequest に設定するか、あるいは cancelOnPageTransitionyes に設定することにより、その Bean をセッション・オブジェクトから除去することができます。こうすることで、ハンドラー内のすべての変数ではなく、アプリケーションに必要なデータのみを保持することができます。

セッション変数の設定および取得

セッション変数を設定するには、ストリング ID と EGL 変数をセッション・オブジェクトに渡します。
myVar string = "Hello";
J2EELib.setSessionAttr("mySessionVar", myVar);
後で値を取得するには、J2EELib.getSessionAttr システム関数で、同じ ID と新規変数を使用します。
myVarFromSession string;
J2EELib.getSessionAttr("mySessionVar", myVarFromSession);
セッション変数の設定と取得を行う 2 つの JSF ハンドラーの詳しい例を、次に示します。最初のハンドラーは、セッション変数を設定します。
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 ハンドラーで一時的に使用するためにそのデータを変数に割り当てます。

セッション変数のクリア

単一セッション変数のストリング ID を J2EELib.clearSessionAttr 関数に渡すことにより、その変数をセッション・オブジェクトから除去できます。
J2EELib.clearSessionAttr("mySessionRecord");

また、J2EELib.clearEGLSessionAttrs 関数を使用すると、すべての EGL 制御セッション変数をそのユーザーのセッション・オブジェクトから除去できます。

セッション関連の関数について詳しくは、「EGL 言語解説書」の『EGL ライブラリー j2eeLib』を参照してください。


フィードバック