ブラウザに一時的にデータを保存するCookieを学ぼう。まずはControllerとviewを作成
●controller.Index.java
03 | import java.io.IOException; |
05 | import javax.servlet.RequestDispatcher; |
06 | import javax.servlet.ServletException; |
07 | import javax.servlet.annotation.WebServlet; |
08 | import javax.servlet.http.Cookie; |
09 | import javax.servlet.http.HttpServlet; |
10 | import javax.servlet.http.HttpServletRequest; |
11 | import javax.servlet.http.HttpServletResponse; |
14 | public class Index extends HttpServlet { |
15 | private static final long serialVersionUID = 1L; |
17 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
18 | boolean countExists= false ; |
21 | Cookie[] cookies=request.getCookies(); |
25 | for (Cookie c:cookies){ |
27 | if (c.getName().equals( "count" )){ |
29 | count=Integer.parseInt(c.getValue()) + 1 ; |
31 | cookie= new Cookie( "count" ,String.valueOf(count)); |
33 | cookie.setMaxAge( 60 * 60 * 24 * 90 ); |
35 | response.addCookie(cookie); |
46 | cookie= new Cookie( "count" , "1" ); |
47 | cookie.setMaxAge( 60 * 60 * 24 * 90 ); |
48 | response.addCookie(cookie); |
51 | request.setAttribute( "count" , String.valueOf(count)); |
53 | RequestDispatcher rd=request.getRequestDispatcher( "/WEB-INF/view/index.jsp" ); |
54 | rd.forward(request,response); |
●WEB-INF/view/index.jsp
01 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" |
02 | pageEncoding= "UTF-8" %> |
04 | String count=(String)request.getAttribute( "count" ); |
09 | <meta charset= "UTF-8" /> |
13 | <p>あなたは<%=count %>回目の訪問です。</p> |
実行してみて、以下のように表示されれば成功だ。

ブラウザをリロードしてみよう。訪問回数が一つずつ増えていくはずだ。
[クッキーとは]
一言でいうとブラウザにデータを保存する仕組みだ。サーバーからクライアントに対して任意のテキストデータを保存することができ、それをアプリ側から利用することができる。先程の例では訪問回数をブラウザに保存しそれを利用してアプリを作成した。
[クッキーの確認]
それでは保存されているデータを確認してみよう。
今回はChromeを使用する。
1.URLを入力し、さきほどの画面を表示させる。
2.デベロッパーツールを開く(Win:ctr+shift+i,Mac:command+option+i)
3.アプリケーションからホストを選択し、countというクッキーが保存されていることを確認する。

4.ブラウザをリロードするとこのクッキーの値も増えていくことを確認する。
[クッキーの利用]
このように、クッキーはデータの閲覧も改ざんも消去もとても簡単にできる。なので重要な情報などはやり取りできない。しかもあくまでもブラウザに保存しているので、他のWebブラウザを使用すると情報が維持されない点にも注意が必要だ。
[クーキー送受信の流れ]

クッキーの送受信はリクエスト、レスポンス間のヘッダーにて行われる。クッキーを利用する際はこの処理の流れを頭の中にイメージしながらやることが大切だ。
クッキーの基本を学んだところでさっそく練習問題をやってみよう。
Q1.クッキーを利用して、一度名前をe-mailを入力すると、以後は入力を省略できるアプリを作成せよ。
[実行例]
●スタート画面:最初は空白のフォームが表示される。

●情報を入力する

●送信ボタンを押す

●再びアクセスすると、名前とe-mailが入力済みとなっている。

[解答例]
●controller.CookieLesson.java
03 | import java.io.IOException; |
04 | import java.net.URLDecoder; |
05 | import java.net.URLEncoder; |
07 | import javax.servlet.RequestDispatcher; |
08 | import javax.servlet.ServletException; |
09 | import javax.servlet.annotation.WebServlet; |
10 | import javax.servlet.http.Cookie; |
11 | import javax.servlet.http.HttpServlet; |
12 | import javax.servlet.http.HttpServletRequest; |
13 | import javax.servlet.http.HttpServletResponse; |
16 | * Servlet implementation class CookieLesson |
19 | public class CookieLesson extends HttpServlet { |
20 | private static final long serialVersionUID = 1L; |
24 | * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) |
26 | protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
29 | Cookie[] cookies=request.getCookies(); |
31 | for (Cookie c:cookies) { |
32 | if (c.getName().equals( "name" )) { |
33 | name=URLDecoder.decode(c.getValue(), "UTF-8" ); |
35 | if (c.getName().equals( "email" )) { |
36 | email=URLDecoder.decode(c.getValue(), "UTF-8" ); |
38 | if (!name.isEmpty() && !email.isEmpty()) { |
43 | request.setAttribute( "name" , name); |
44 | request.setAttribute( "email" , email); |
45 | RequestDispatcher rd=request.getRequestDispatcher( "/WEB-INF/view/form.jsp" ); |
46 | rd.forward(request, response); |
50 | * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) |
52 | protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { |
53 | request.setCharacterEncoding( "UTF-8" ); |
54 | String name=request.getParameter( "name" ); |
55 | String email=request.getParameter( "email" ); |
56 | Cookie[] cookies= { new Cookie( "name" ,URLEncoder.encode(name, "UTF-8" )), new Cookie( "email" ,URLEncoder.encode(email, "UTF-8" ))}; |
57 | for (Cookie c:cookies) { |
58 | c.setMaxAge( 60 * 60 * 24 * 180 ); |
59 | response.addCookie(c); |
61 | RequestDispatcher rd=request.getRequestDispatcher( "/WEB-INF/view/result.jsp" ); |
62 | rd.forward(request, response); |
●WEB-INF/view/form.jsp
01 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" |
02 | pageEncoding= "UTF-8" %> |
04 | String name=(String)request.getAttribute( "name" ); |
05 | String email=(String)request.getAttribute( "email" ); |
10 | <meta charset= "UTF-8" /> |
11 | <title>Insert title here</title> |
14 | <form action= "/joytas5/sample" method= "post" > |
15 | 名前:<input type= "text" name= "name" value= "<%=name %>" ><br> |
16 | e-mail:<input type= "email" name= "email" value= "<%=email %>" ><br> |
17 | <input type= "submit" value= "送信" > |
●WEB-INF/view/result.jsp
01 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" |
02 | pageEncoding= "UTF-8" %> |
06 | <meta charset= "UTF-8" /> |
07 | <title>Insert title here</title> |
コメント