連載
» 2000年10月30日 00時00分 公開

Java Servlet徹底解説(前編):JSPとどう連携して使うのか (3/4)

[米持幸寿,日本アイ・ビー・エム]

サーブレットにおけるセッション管理

 では、実際に構築の話に移ろう。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> 
リスト1 atmarkit.htm

 IBM HTTP Server の場合は、c:\IBM HTTP Server\htdocsの上に置く。 Webブラウザからhttp://localhost/atmarkit.htm を開くと画面4が現れる。

画面4 画面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>");
    }
}
リスト2  Login.java

 同様に、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>");
    }
}
リスト3 Userinfo.java

 テキストエディタでこれらのファイルを作成し、コンパイルする。

 ソースコードを見ると、取り出した文字列の参照を変数に代入するとき、次のように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」を指定したとする。

画面5 画面5

 すると次のような画面が表示される。

画面6 画面6

 このとき、サーバ側のセッションオブジェクトには、ユーザIDとパスワードのそれぞれに「userid」「password」という名前が付けられて保存されている。ユーザ情報のリンクをクリックしてみよう。

画面7 画面7

 入力した内容が表示された。保存されていた文字列が使われたわけだ。 再表示を行うと、同じ画面が表示される。ブラウザを再起動して同じアドレスを表示すると、値として「null」が表示される。これは、セッションが新しくなったことを示す。さらに、一通り操作して表示されるようになってから、1時間ほど放っておいてから再表示してもnullが表示されるだろう。いろいろなことをしてセッション・オブジェクトの動きを確認してほしい。

  セッション・オブジェクトは、不揮発のメモリのように見えるが、実際には期限がある。通常、セッション・オブジェクトが生成されてからある一定時間が経過すると、リストから除去され、ガベージ・コレクタによって削除される。貼り付けたデータも、このとき(他のところから参照されていなければ)削除される。

 WebSphereでは、セッションを保持する時間がデフォルトで30分に設定されており、管理コンソールから変更可能である(画面8)。

画面8 画面8

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。