サーブレットにおけるセッション管理
では、実際に構築の話に移ろう。Webアプリケーションで、まず始めに考えなければならないことは、セッションの管理である。本稿では、サーブレットのみでの構築と、JSPと連携した構築の両方について説明する。
セッション管理はセッション・オブジェクトを使う
HTTPリクエストがセッションレスであり、そのため、セッション管理という機構が必要だということは「サーバサイドJavaテクノロジ 重点キーワード」で述べた。サーブレットは、基本的に1つのURLに対して1つのインスタンスで稼働するため、そのインスタンスは複数のブラウザで共有される。ブラウザごとに違う状態やデータを管理するには、セッション・オブジェクトを利用する必要がある。では、具体的にどのように使うのか、その例をあげてみよう。
セッション管理を利用するには、ブラウザと1対1で対応付けられたセッション・オブジェクトにアクセスすることが必要である。まず、セッション・オブジェクトを使って2つ以上の画面から1つのデータを共有する手順を解説しよう。
次のように、画面が全部で3つあるとする。
画面1 | ログイン画面 | ユーザIDとパスワードを入力する |
---|---|---|
画面2 | 「ようこそ」の表示 | 次の画面へのリンクを持っている |
画面3 | ユーザー情報 | ユーザーの情報を表示する |
画面3では、ログインしたあと新たに表示される画面であるため、セッション・オブジェクトを利用してログイン情報を得る。これらの画面を構成するため、次の3つのファイルを準備する。
ファイル名 | 種別 | 役割 |
---|---|---|
atmarkit.htm | HTML(ログイン画面を表示) | フォームを持ち、次の画面を呼び出す。フィールドとして「userid」「password」を持っている |
atmarkit\Welcome.java | ようこそ表示Java Servlet(「ようこそ」を表示) | userid、passwordを受取り、セッション・オブジェクトに保管し、「ようこそ」を表示する |
atmarkit\Userinfo.java | Java Servlet(ユーザ情報) | セッション・オブジェクトからユーザIDを取り出し、ユーザ情報を表示する |
サーブレットのみでの構築
では、サーブレットのみでのプログラミングを見てみよう。
まず、入力用のHTMLファイル「atmarkit.htm」を準備する。テキストエディタで次のようなHTMLファイルを作成し、HTTPサーバのドキュメントルートに置く。
<HTML> <BODY> <FORM action="/servlet/atmarkit.Login" method="POST"> ユーザID:<INPUT type="input" name="userid"><BR> パスワード:<INPUT type="password" name="password"><BR> <INPUT type="submit" value="ログイン"> </FORM> </BODY> </HTML>
IBM HTTP Server の場合は、c:\IBM HTTP Server\htdocsの上に置く。 Webブラウザからhttp://localhost/atmarkit.htm を開くと画面4が現れる。
FORMタグによって入力フィールドが2つと送信ボタンが表示される。type=submitとすると、入力した文字が表示されず「****」が表示される。
actionに「/servlet/atmarkit.Login」と記述している理由を説明しよう。サーブレットはLogin.javaというファイル名で作られ、コンパイルによってLogin.classになる。このファイルをatmarkitという名前のディレクトリに置きたい。Javaのクラスファイルなので、当然のことながら、パッケージ名が「atmarkit」となる。
サーブレットをアクセスするための標準的なURLは次の通りである。
http://hostname/servlet/Classname
もしパッケージ「package」に入っていれば、
http://hostname/servlet/package.Classname
となる。
HTTPの設定ファイルや、アプリケーション・サーバの設定によって、全く別のURLでサーブレットを呼び出すこともできるので、サーバのマニュアルを調べていただきたい。
さて、次に、画面2、画面3を表示するためのサーブレットを見てみよう。ソースコードは次のようになる。
package atmarkit; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Login extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // ブラウザからの情報の読み取り String userid = request.getParameter("userid"); String password = request.getParameter("password"); // セッション・オブジェクトに保管 HttpSession session = request.getSession(true); session.putValue("userid", userid); session.putValue("password", password); // ブラウザに画面(HTML)を送信 PrintWriter out = response.getWriter(); out.println("<HTML><BODY> out.println("<H1>"+userid+"さん、ようこそ!</H1><BR>"); out.println("<A HREF='/servlet/atmarkit.Userinfo'>ユーザ情報</A>"); out.println("</BODY></HTML>"); } }
同様に、Userinfo.javaは次のようになる。
package atmarkit; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Userinfo extends HttpServlet { public void service( HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // セッション・オブジェクトから復元 HttpSession session = request.getSession(true); String userid = (String)session.getValue("userid"); String password = (String)session.getValue("password"); // ブラウザに画面(HTML)を送信 PrintWriter out = response.getWriter(); out.println("<HTML><BODY>"); out.println("<H1>パスワードの表示</H1><BR>"); out.println("<TABLE><TR><TD>ユーザID</TD> out.println("<TD>"+userid+"</TD></TR>"); out.println("<TR><TD>パスワード</TD> out.println("<TD>"+password+"</TD></TR></TABLE>"); out.println("</BODY></HTML>"); } }
テキストエディタでこれらのファイルを作成し、コンパイルする。
ソースコードを見ると、取り出した文字列の参照を変数に代入するとき、次のようにStringにキャストしているのがわかるだろうか。
String userid = (String)session.getValue("userid");
セッション・オブジェクトに張りつけられるのは、「Object」である。つまり、オブジェクトならなんでも良い。取り出すときもObjectが戻り値となっているので、キャストが必要である。裏を返せば、セッション・オブジェクトにはどんなオブジェクトでも貼り付けておける。自作のクラスやBean、DBのコネクションや分散オブジェクトの参照など、ブラウザごとに管理したいものはなんでもである。多くのものを同時に管理する必要があるようであれば、1つずつ付けるのではなく、これらを管理するBeanを定義してそれを1つだけ付けたほうが良い場合もある。
WebSphereでは、c:\WebSphere\AppServer\servlets\atmarkitにこれらの2つのファイルをコンパイルして置く。コンパイルは、次の手順でできる。
1. コマンドプロンプトを開く
2. 次のコマンドでPATHを設定する
SET PATH=c:\WebSphere\AppServer\jdk\bin;%PATH%
3. CLASSPATH環境変数をセットする
CD c:\WebSphere\AppServer\bin setenv
4. CLASSPATHに、サーブレットのディレクトリが入っていないので追加する
CLASSPATH=%CLASSPATH%;c:\WebSphere\AppServer\servlets
5. コンパイルする
CD c:\WebSphere\AppServer\servlets\atmarkit javac Login.java javac Userid.java
実際に動かしてみよう。Webブラウザで、http://localhost/atmarkit.htmを開き、適当にユーザIDとパスワードを入れ、「ログイン」ボタンを押す。ここでは、ユーザIDに「よねもち」、パスワードに「yukihisa」を指定したとする。
すると次のような画面が表示される。
このとき、サーバ側のセッションオブジェクトには、ユーザIDとパスワードのそれぞれに「userid」「password」という名前が付けられて保存されている。ユーザ情報のリンクをクリックしてみよう。
入力した内容が表示された。保存されていた文字列が使われたわけだ。 再表示を行うと、同じ画面が表示される。ブラウザを再起動して同じアドレスを表示すると、値として「null」が表示される。これは、セッションが新しくなったことを示す。さらに、一通り操作して表示されるようになってから、1時間ほど放っておいてから再表示してもnullが表示されるだろう。いろいろなことをしてセッション・オブジェクトの動きを確認してほしい。
セッション・オブジェクトは、不揮発のメモリのように見えるが、実際には期限がある。通常、セッション・オブジェクトが生成されてからある一定時間が経過すると、リストから除去され、ガベージ・コレクタによって削除される。貼り付けたデータも、このとき(他のところから参照されていなければ)削除される。
Copyright © ITmedia, Inc. All Rights Reserved.