では、実際に構築の話に移ろう。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.