セッションとクッキー (2/4)
作成:2012-05-06 10:43
更新:2012-05-06 10:43
更新:2012-05-06 10:43
■クッキーを使ってみる
では、実際にクッキーを使ってデータをクライアントに保存し、それを取り出して操作をしてみることにしましょう。
ここでは、簡単なメッセージとロード回数をクッキーに保管するサンプルを考えてみました。下のリストがそのJSPソースコードです。このJSPページにアクセスすると、入力フィールドが1つのフォームが表示されます。ここでテキストを書いて送信すると、そのメッセージがクッキーに保管され、アクセス時にページに表示されます。何度かリロードしてみると、送信したメッセージをちゃんと覚えていてページに表示されることがわかるでしょう。
またリロードする度に、カウンタの数が増えていきます。前回のカウンタ数がクッキーに保管されており、それに1足した値をクッキーに保存しなおして値を更新するようになっているのですね。これはメッセージを送信して変更すると初期化され、又ゼロからカウントし直します。
ここでは、名前を指定してCookieを取得するのに、getCookieというメソッドを定義しておきました。このメソッドでは、getCookiesで全Cookieの配列を取得し、繰り返しを使って名前をチェックしています。ここでちょっと注意しておきたいのは「暗黙オブジェクト」の扱いです。
このgetCookieメソッドではreq.getCookies();としてCookie配列を得ていますが、このreqは暗黙オブジェクトではありません。実をいえば、このようにメソッド定義の中では、暗黙オブジェクトは使えないのです。暗黙オブジェクトは、<% %>内に書かれたコード(一般に「スクリプトレット」と呼ばれます)内でしか使えないのです。ですから、ここではあらかじめグローバル変数を用意しておき、これにrequestを代入して利用しています。
また、もう1つ注意したいのは「クッキーに保管するテキスト」についてです。クッキーに保管できるのは、一般的なアスキーテキスト(半角英数字)だけです。日本語などはそのまま保管はできないのです。
では、日本語はどうやって保存すればいいのか。これは「アスキーテキストで表現できる形にエンコードする」ことになります。「URLエンコード」と呼ばれるもので、この形式にテキストを変換して保存し、取り出したら再びデコードしてテキストを取り戻すのです。
・テキストをURLエンコードする
・テキストをURLデコードする
URLEncoder.encodeは、テキストをURLエンコードしたものを返します。そしてURLDecoder.decodeはエンコードされたテキストを元のテキストに戻したものを返します。これらを利用し、テキストをエンコードしてクッキーに保存し、クッキーから取り出したら再びデコードして利用する、というやり方をすることで、日本語でも問題なくクッキーに保管しておけるようになります。
この他、リクエストとレスポンスのそれぞれのテキストエンコード方式を設定するのに以下のような文を冒頭に実行していますね。
ここでは、簡単なメッセージとロード回数をクッキーに保管するサンプルを考えてみました。下のリストがそのJSPソースコードです。このJSPページにアクセスすると、入力フィールドが1つのフォームが表示されます。ここでテキストを書いて送信すると、そのメッセージがクッキーに保管され、アクセス時にページに表示されます。何度かリロードしてみると、送信したメッセージをちゃんと覚えていてページに表示されることがわかるでしょう。
またリロードする度に、カウンタの数が増えていきます。前回のカウンタ数がクッキーに保管されており、それに1足した値をクッキーに保存しなおして値を更新するようになっているのですね。これはメッセージを送信して変更すると初期化され、又ゼロからカウントし直します。
ここでは、名前を指定してCookieを取得するのに、getCookieというメソッドを定義しておきました。このメソッドでは、getCookiesで全Cookieの配列を取得し、繰り返しを使って名前をチェックしています。ここでちょっと注意しておきたいのは「暗黙オブジェクト」の扱いです。
このgetCookieメソッドではreq.getCookies();としてCookie配列を得ていますが、このreqは暗黙オブジェクトではありません。実をいえば、このようにメソッド定義の中では、暗黙オブジェクトは使えないのです。暗黙オブジェクトは、<% %>内に書かれたコード(一般に「スクリプトレット」と呼ばれます)内でしか使えないのです。ですから、ここではあらかじめグローバル変数を用意しておき、これにrequestを代入して利用しています。
また、もう1つ注意したいのは「クッキーに保管するテキスト」についてです。クッキーに保管できるのは、一般的なアスキーテキスト(半角英数字)だけです。日本語などはそのまま保管はできないのです。
では、日本語はどうやって保存すればいいのか。これは「アスキーテキストで表現できる形にエンコードする」ことになります。「URLエンコード」と呼ばれるもので、この形式にテキストを変換して保存し、取り出したら再びデコードしてテキストを取り戻すのです。
・テキストをURLエンコードする
String 変数 = URLEncoder.encode( 値 , エンコード名 );
・テキストをURLデコードする
String 変数 = URLDecoder.decode( 値 , エンコード名 );
URLEncoder.encodeは、テキストをURLエンコードしたものを返します。そしてURLDecoder.decodeはエンコードされたテキストを元のテキストに戻したものを返します。これらを利用し、テキストをエンコードしてクッキーに保存し、クッキーから取り出したら再びデコードして利用する、というやり方をすることで、日本語でも問題なくクッキーに保管しておけるようになります。
この他、リクエストとレスポンスのそれぞれのテキストエンコード方式を設定するのに以下のような文を冒頭に実行していますね。
request.setCharacterEncoding("utf-8");エンコードをきちんと設定しておくことで、日本語の文字化け等を予防することにつながります。前回、フォームの送信などの際にはやっていませんでしたが、日本語を利用する場合はこれらを設定しておいたほうがいいでしょう。ここで覚えておいてください。
response.setCharacterEncoding("utf-8");
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ page import="java.net.*" %> <% // エンコードを設定しておく request.setCharacterEncoding("utf-8"); response.setCharacterEncoding("utf-8"); req = request; // 入力フィールドの値を得る String input = request.getParameter("input"); if (input == null) input = ""; // messageとcountのクッキーを得る Cookie msg = getCookie("message"); Cookie count = getCookie("count"); // msgが空なら新たにクッキーを作る if (msg == null){ input = URLEncoder.encode(input,"utf-8"); msg = new Cookie("message",input); response.addCookie(msg); } // countが空なら新たにクッキーを作る if (count == null){ count = new Cookie("count", "0"); response.addCookie(count); } else { // 空でないなら、countの数字を1増やして設定する String num = count.getValue(); int n = Integer.parseInt(num); n++; count = new Cookie("count",String.valueOf(n)); response.addCookie(count); } // 入力フィールドに何か書かれていたらクッキーを新たに設定し直す if (!input.equals("")) { input = URLEncoder.encode(input,"utf-8"); msg = new Cookie("message",input); response.addCookie(msg); count = new Cookie("count","1"); response.addCookie(count); } %> <%! HttpServletRequest req; // 指定の名前のクッキーを取り出すメソッドの定義 Cookie getCookie(String s){ Cookie[] cookies = req.getCookies(); Cookie res = null; if (cookies != null){ for(Cookie c : cookies){ if (s.equals(c.getName())){ res = c; break; } } } return res; } %> <!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> <p><%=count.getValue() + ": " + URLDecoder.decode(msg.getValue(),"utf-8") %></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="submit" value="送信"> </td> </tr> </form> </table> </body> </html>
※関連コンテンツ