セッションを使って入力内容を記憶させる【Java Servlet】

Java

セッションはクッキーと同じく、本来一度限りで途切れてしまうクライアントとサーバー間のやりとりを、継続させる機能のことです。

クッキーとセッションは似ていますが、クッキーがクライアント側に情報を保存するのに対して、セッションはサーバー側に情報を保存します。

クライアント側に保存するという特性上、クッキーの中身は少し知識があれば簡単に見ることができたり、改ざんすることが容易のため、セッションのほうがセキュリティ的に安全だと言われています。

今回は Java Servlet でセッションを使う方法を解説します。

作業環境

  • Eclipse 4.4
  • Tomcat 8.0
スポンサーリンク

フォームに入力した内容をセッションで記憶させておく仕組みを作る

フォームに自己紹介を入力すると、サーバーが覚えていてくれる仕組みを構築してみます。

JSP で入力フォームを作る

whatsyour.jsp というファイル名で、JSP ファイルを作ります。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
String message = "自己紹介を入力してください。";

// セッションからデータを取得
String name = (String)session.getAttribute("name");
String hobby = (String)session.getAttribute("hobby");
String color = (String)session.getAttribute("color");

// 名前が null でなかったら名前を呼ぶ
if(name != null){
	message = "こんにちは! " + name + "さん!";
}

%>
<!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><%= message %></title>
</head>
<body>
<h1><%= message %></h1>

<form action="Session" method="post">
	名前 : <input type="text" name="name"><br>
	趣味 : <input type="text" name="hobby"><br>
	好きな色 : <input type="text" name="color"><br>
	<button type="submit">送信</button>
</form>

<% if(hobby != null && color != null){ %>
<p>
	趣味は<%= hobby %>で、<%= color %>が好きなんですね!
</p>
<% } // endif %>

<a href="profile.jsp">あなたのプロフィール</a>

</body>
</html>

上のようなソースコードになりました。

送信したフォームの内容は Session という名前の Servlet を作成して処理する予定なので、action は Session にします。

今回は送信内容が多く、また URL で残しておく必要もないので、 POST 送信を使うことにします。form の method を post にしておきましょう。

セッションの特性はクッキーに似ていますが、ソースの記述方法はリクエストからデータを取り出すのに似ています。

String name = (String)session.getAttribute("name");
String hobby = (String)session.getAttribute("hobby");
String color = (String)session.getAttribute("color");

また、今度はセッションの確認をするため、 Servlet を介さずに別のページへ移動できるよう、 a タグでリンクを作りました。

<a href="profile.jsp">あなたのプロフィール</a>

この profile.jsp のソースコードはこんな感じになっています。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%

// セッションからデータを取得
String name = (String)session.getAttribute("name");
String hobby = (String)session.getAttribute("hobby");
String color = (String)session.getAttribute("color");

%>
<!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>あなたのプロフィール</title>
</head>
<body>
	<h1>プロフィール表</h1>
	<table>
	<tbody>
		<tr>
			<th>名前</th>
			<th>趣味</th>
			<th>好きな色</th>
		</tr>
		<tr>
			<td><%= name %></td>
			<td><%= hobby %></td>
			<td><%= color %></td>
		</tr>
	</tbody>
	</table>
</body>
</html>

table タグは、表を作るためのタグです。

table と tbody でテーブル本体、tr で行(row)、th や td で列(column)を作ることができます。

th と td は th のほうが少し太字になるだけで、見た目上の違いはほぼありません。しかし HTML は「文章に意味を持たせる言語」ですので、見出しのようなものは th で囲うべきです。

ただ、JSP を学習する上ではあまり気にしないでコピペしていいと思います。

セッションにデータを書き込む Servlet を作る

Session という名前で Servlet を作成しました。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

	// セッション情報の文字化け対策
	request.setCharacterEncoding("UTF-8");

	// セッションの開始
	HttpSession session = request.getSession();

	// フォームに入力されたデータを取得
	String name = request.getParameter("name");
	String hobby = request.getParameter("hobby");
	String color = request.getParameter("color");

	// セッションへの書き込み
	session.setAttribute("name", name);
	session.setAttribute("hobby", hobby);
	session.setAttribute("color", color);

	// フォワード準備
	ServletContext context = this.getServletContext();

	// フォワード先の JSP を context にセット
	RequestDispatcher dispatcher = context
			.getRequestDispatcher("/whatsyour.jsp");

	// フォワード処理
	dispatcher.forward(request, response);
}

上のようなソースコードになりました。今回も一部のみ抜粋してあります。

今回は POST 送信なので、doPost メソッドに書いてください。

request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();

セッションは request.getSession 関数で使うことができるようになります。これを「セッションを開始する」といいます。

なお、セッションデータは JSP 側で文字コードを指定しても文字化けしてしまうことが多いため、 setCharactorEncoding を使って文字コードを指定してから開始したほうがいいです。

session.setAttribute("name", name);
session.setAttribute("hobby", hobby);
session.setAttribute("color", color);

セッションからデータを取り出すときと同様、書き込むときも request と似ていて、 setAttibute することでデータを書き込むことができます。

これも使い方はリクエストと同じで、引数1をキーワードとして、引数2のデータを書き込むことになります。

実行して確認

では、whatsyour.jsp を実行して動作確認をしてみます。

入力項目を打ち込んで、送信してみます。

すると挨拶してくれました。

今度はこのまま「あなたのプロフィール」というリンクを踏んで別ページに遷移してみます。

送信ボタンを押したわけでも、Servlet を介して setAttribute したわけでもないのに先ほど入力した内容がちゃんと反映されているプロフィールが表示されていますね。

つまり、セッションからデータを取得できていることが確認できます。

コメント

タイトルとURLをコピーしました