セッションとクッキー (4/4)
作成:2012-05-06 10:51
更新:2012-05-06 10:51
更新:2012-05-06 10:51
■セッションを利用してみる
では、実際にセッションを使ってみることにしましょう。先ほどのサンプルと同じではセッションらしさがわからないので、今回は送信したメッセージをどんどん蓄積していくようなものを作ってみましょう。
下にリストを掲載しておきます。アクセスすると、入力フィールドのある画面が現れます。ここでなにか書いて送信すると、それが下に表示されます。送信する度にそれはリストの一番上に追加されていきます。送信時に、「初期化」のチェックボックスをONにしておくと、セッションを初期化して新たにメッセージを追加します。
このセッション利用のサンプルをGoogle App Engineで動かす場合、注意しておきたいのは「GAEに、セッションをONにする設定を用意する」という点です。プロジェクトに「appengine-web.xml」というファイルを開いてください。これはGAEの諸設定を記したXMLファイルです。この中に<appengine-web-app>というタグがあり、このタグ内に初設定が記述されています。このタグ内に、
――さて、今回はArrayListをセッションに保管しています。メッセージが送信される度に、このArrayListに追加をしていくわけです。ソースコードを見ると、こんな具合にしてArrayListを用意していることがわかります。
こうしてArrayListが用意できたら、送信されたテキストを一番前にaddし、そして再びセッションに保管しておけばいいわけです。
ONだった場合には、invalidateでセッションを無効にします。が、その後で、改めてセッションを開始し、送信された値を保管しておかないといけません。そこで、「request.getSession()」というもので、HttpSessionを取得しなおしています。実をいえば、暗黙オブジェクトのsessionというのは、requestの「getSession」でセッションを取り出したものだったのです。
とりあえずこれで、セッションの値の保管や、セッションの終了と再始動などの基本操作ができるようになりました!
下にリストを掲載しておきます。アクセスすると、入力フィールドのある画面が現れます。ここでなにか書いて送信すると、それが下に表示されます。送信する度にそれはリストの一番上に追加されていきます。送信時に、「初期化」のチェックボックスをONにしておくと、セッションを初期化して新たにメッセージを追加します。
※GAEでのセッション利用の注意
このセッション利用のサンプルをGoogle App Engineで動かす場合、注意しておきたいのは「GAEに、セッションをONにする設定を用意する」という点です。プロジェクトに「appengine-web.xml」というファイルを開いてください。これはGAEの諸設定を記したXMLファイルです。この中に<appengine-web-app>というタグがあり、このタグ内に初設定が記述されています。このタグ内に、
<sessions-enabled>true</sessions-enabled>このようなタグを既述してください。これで、セッションが利用可能になります。これを忘れるとセッションの機能は動かないので注意してください。
――さて、今回はArrayListをセッションに保管しています。メッセージが送信される度に、このArrayListに追加をしていくわけです。ソースコードを見ると、こんな具合にしてArrayListを用意していることがわかります。
ArrayList<String> msgs = (ArrayList<String>)session.getValue("messages");
if (msgs == null) msgs = new ArrayList<String>();まず、getValueで"messages"という名前で保存しておいたArrayListを取得します。これがnullならば、新たにArrayListインスタンスを作成します。こうしてArrayListが用意できたら、送信されたテキストを一番前にaddし、そして再びセッションに保管しておけばいいわけです。
session.putValue("messages", msgs);サンプルでは、セッションをスタートしてからの経過秒数も表示しています。これは、あらかじめ経過秒数の値を計算して変数に収めておき、それを<%= %>タグで表示させているだけです。long create = session.getCreationTime();getCreationTimeとgetLastAccessedTimeをそれぞれ変数に取り出し、最終アクセスからスタート時刻の値を引き、1000で割れば、経過した秒数がわかります。意外と簡単ですね。――最後に、「初期化」チェックボックスがONだったときの処理も見ておきましょう。
long last = session.getLastAccessedTime();
long time = (last - create) / 1000;
if (time < 0) time = 0;
String flg = request.getParameter("check");
if (flg != null){
session.invalidate();
session = request.getSession();
}チェックボックスというのは、チェックがONなら値が送られますが、OFFだと値そのものが送られません。したがって、request.getParameter("check")で取り出した値がnullならばOFF、nullでなければONだと判断することができるのです。ONだった場合には、invalidateでセッションを無効にします。が、その後で、改めてセッションを開始し、送信された値を保管しておかないといけません。そこで、「request.getSession()」というもので、HttpSessionを取得しなおしています。実をいえば、暗黙オブジェクトのsessionというのは、requestの「getSession」でセッションを取り出したものだったのです。
とりあえずこれで、セッションの値の保管や、セッションの終了と再始動などの基本操作ができるようになりました!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.util.*" %>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String flg = request.getParameter("check");
if (flg != null){
session.invalidate();
session = request.getSession();
}
long create = session.getCreationTime();
long last = session.getLastAccessedTime();
long time = (last - create) / 1000;
if (time < 0) time = 0;
String input = request.getParameter("input");
if (input == null) input = "";
ArrayList<String> msgs = (ArrayList<String>)session.getValue("messages");
if (msgs == null) msgs = new ArrayList<String>();
if (!input.equals("")) msgs.add(0, input);
session.putValue("messages", msgs);
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
font-size: 16pt;
background: #AAFFAA;
padding: 5px;
}
</style>
</head>
<body>
<h1>Sample jsp page</h1>
<p>これはサンプルで用意したページです。</p>
<table>
<form method="post" action="helo.jsp">
<tr>
<td>入力</td>
<td>
<input type="text" id="input" name="input">
</td>
</tr>
<tr>
<td></td>
<td>
<input type="checkbox" id="check" name="check">
<label for="check">初期化</label>
</td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="送信">
</td>
</tr>
</form>
</table>
<hr>
<p>(<%=time %> sec.)</p>
<ol>
<% for(int i = 0; i < msgs.size();i++){ %>
<li><%=msgs.get(i) %></li>
<% } %>
</ol>
</body>
</html>
※関連コンテンツ