セッションを使って入力内容を記憶させる【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 を実行して動作確認をしてみます。
今度はこのまま「あなたのプロフィール」というリンクを踏んで別ページに遷移してみます。
つまり、セッションからデータを取得できていることが確認できます。
広告