クッキーを使用して Web ページへの訪問回数を表示する【Java Servlet】

Java

通常、別の Web ページに移動してしまうとクライアントとサーバー間のやりとりは途切れ、お互いに無関係な存在となってしまいます。よって、自分が入力した情報も、サーバーは覚えていてくれません。

しかし、なにかしらのサイトのログインフォームに、自分が入力した ID が入力された状態になっていたりした経験があると思います。

これは、クッキーやセッションという機能を利用したものです。

今回はこのクッキーのについて説明と、クッキーを Servlet で使用する方法を解説します。

作業環境

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

クッキーを Servlet で使ってみる

今回は クッキーを使って Web ページにアクセスしたときに「初回の訪問かどうか」を表示させる仕組みを構築してみます。

Servlet の作成

Visited という名前の Servlet を作成します。

// クッキーの値を格納する変数を用意しておく
int visited = 1;

// リクエストからクッキーを取得
Cookie[] cookies = request.getCookies();

// cookie が null ではない場合のみ探す
if (cookies != null) {

	// クライアントがクッキーをすでに持っているか確認
	for (int i = 0; i < cookies.length; i++) {
		if (cookies[i].getName().equals("visited")) {

			// visited という名前が見つかったら、getValue して変数に代入
			// クッキーの値は文字列なので、parseInt で数値に変換します。
			visited = Integer.parseInt(cookies[i].getValue());

			// 「訪問回数」なので、インクリメントで増加させておきます
			visited++;

			// 文字列にキャストしてクッキーに上書き
			cookies[i].setValue(Integer.toString(visited));

			// クッキーの保存をクライアントへ指示
			response.addCookie(cookies[i]);

			// else 文を通過しないようにループを抜けておく
			break;
		} else {
			// クライアントがクッキーを持っていなかった場合
			// visited という名前で新しいクッキーを作成
			cookies[i] = new Cookie("visited", "1");

			// クッキーの保存をクライアントへ指示
			response.addCookie(cookies[i]);
		}

	}
}

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

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

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

doGet の中身は上のようなソースコードになります。重要な箇所を一つずつ解説していきます。

今回も doGet メソッド以外は省略しています。

クッキーの作成と設定

ソースコード上ではクッキーの取得もまとめておこなっていますが、先にクッキーの作成を説明。

Cookie cookie = new Cookie("visited", "1");
response.addCookie(cookie);

Cookie を new するときに引数1にクッキーの名前、引数2にそのクッキーの初期値を設定できます。

今回は visited という名前で、1 という初期値を指定してクッキーを作成しました。

今回はクッキーがあるかないかの処理もまとめておこなっているので、cookies[i]になっていますが、基本は同じです。

その後、作成したクッキーを addCookie することでクライアントへクッキーを渡して保存させることができます。

クッキーの取得

クライアントから送信されたクッキーは、 getCookies 関数を使用することで取得できます。

Cookie[] cookies = request.getCookies();

しかし、取得できるクッキーは一つとは限らないので、サーバー側で指定した visited という名前のクッキーを探し出すために for 文で回してあげましょう。

クッキーの名前を探すには getName 関数を、名前からクッキーの値を取り出すには getValue 関数を使用します。

// cookie が null ではない場合のみ探す
if (cookies != null){
  for (int i = 0 ; i < cookies.length ; i++){
    if (cookies[i].getName().equals("visited")){

      // visited という名前が見つかったら、getValue して変数に代入
      String visited = cookies[i].getValue();
    }
  }
}

JSP の作成

処理をするための Servlet の作成が終わったら、今度は表示をするために JSP を作成します。

visited.jsp というファイル名で JSP ファイルを作成します。

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

// リクエストからクッキーを取得
Cookie cookies[] = request.getCookies();

// visited という名前のクッキーを探して、visited に代入
// クッキーが null ではないときだけ探す
if(cookies != null){
	for (int i = 0; i < cookies.length; i++) {
		if (cookies[i].getName().equals("visited")) {
			visited = Integer.parseInt(cookies[i].getValue());
		}
	}
}
%>
<!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>
<% if(visited == 1){ %>
<p>初めての訪問です。</p>
<% } else { %>
<p><%= visited %> 回目の訪問です。</p>
<% } // endif %>
</body>
</html>

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

今回の JSP は入力フォームのときよりも単純かと思います。

なので、if 文をスクリプトレットで書いて、クッキーの値によって表示される文字が少し変わるようにすることにします。

 <% if(visited == 1){ %>
<p>初めての訪問です。</p>
<% } else { %>
<p><%= visited %> 回目の訪問です。</p>
<% } // endif %>

スクリプトレットはただ変数を代入したり表示させるだけでなく、 HTML の内容を挟み込んで if 文で分岐させたり、for 文で繰り返させることも可能です。使いこなせるようになるととても便利なので、覚えておきましょう。

さて、これで1回目の訪問は「1回目」とは表示されずに「初めて」と表示されるのに対し、2回目以降は「n 回目」と数字で表示されるはずです。

Servlet を実行して確認

上で作成した Visited をサーバーで実行します。

visited.jsp ではないので注意。

すると実装通り初めてと表示されました。

ページを更新するとちゃんと2回目と表示されていますね。

再読み込みをおこなうと、1ずつ訪問回数がカウントアップしていくことがわかります。

コメント

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