Java - セッション・オブジェクト


■ページ目次

Top

セッション管理

HttpServletRequest インターフェース
HttpServletResponse インターフェース
HttpSession インターフェース
Top

セッション・オブジェクト

Top
セッション情報の取得と設定
Top
セッション・オブジェクトの属性
Top
例題
  1. クエリーから受け取った値をセッション・オブジェクトに設定するサーブレット"SessionObject41.java"を作成してください。
    このとき、"Query21.java"をコピーして作成してください。
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import java.util.*;
    5. public class SessionObject41 extends HttpServlet {
    6. public void doGet(HttpServletRequest request, HttpServletResponse response)
    7. throws ServletException, IOException {
    8. // out オブジェクトを取得する
    9. response.setContentType("text/html;charset=iso-2022-jp");
    10. PrintWriter out = response.getWriter();
    11. // セッションオブジェクトを取得する
    12. HttpSession session = request.getSession();
    13. out.println("<html>");
    14. out.println("<head><title>Session Object</title></head>");
    15. out.println("<body>");
    16. out.println("セッションオブジェクトに以下の値を設定しました。");
    17. out.println("<hr/>");
    18. out.println("<table>");
    19. out.print("<tr>");
    20. out.print("<th>name</th>");
    21. out.print("<th>value</th>");
    22. out.print("</tr>");
    23. Enumeration names = request.getParameterNames();
    24. while (names.hasMoreElements()) {
    25. String name = (String)names.nextElement();
    26. String value = request.getParameter(name);
    27. session.setAttribute(name, value);
    28. out.print("<tr>");
    29. out.print("<td>" + name + "</td>");
    30. out.print("<td>" + value + "</td>");
    31. out.print("</tr>");
    32. }
    33. out.println("</table>");
    34. out.println("</body>");
    35. out.println("</html>");
    36. }
    37. }

    □ 実行結果

     http://localhost:8080/jmwapp/servlet/SessionObject41?id=A123&name=maruno
    
    
  2. セッション・オブジェクトから受け取った値を表示するサーブレット"SessionObject42.java"を作成してください。
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. import java.util.*;
    5. public class SessionObject42 extends HttpServlet {
    6. public void doGet(HttpServletRequest request, HttpServletResponse response)
    7. throws ServletException, IOException {
    8. // out オブジェクトを取得する
    9. response.setContentType("text/html;charset=iso-2022-jp");
    10. PrintWriter out = response.getWriter();
    11. // セッションオブジェクトを取得する
    12. HttpSession session = request.getSession(false);
    13. if (session == null) {
    14. throw new ServletException("The session object was not found.");
    15. }
    16. out.println("<html>");
    17. out.println("<head><title>Session Object</title></head>");
    18. out.println("<body>");
    19. out.println("セッションオブジェクトから以下の値を取得しました。");
    20. out.println("<hr/>");
    21. out.println("<table>");
    22. out.print("<tr>");
    23. out.print("<th>name</th>");
    24. out.print("<th>value</th>");
    25. out.print("</tr>");
    26. Enumeration names = session.getAttributeNames();
    27. while (names.hasMoreElements()) {
    28. String name = (String)names.nextElement();
    29. Object value = session.getAttribute(name);
    30. out.print("<tr>");
    31. out.print("<td>" + name + "</td>");
    32. out.print("<td>" + value.toString() + "</td>");
    33. out.print("</tr>");
    34. }
    35. out.println("</table>");
    36. out.println("</body>");
    37. out.println("</html>");
    38. }
    39. }

    □ 実行結果

     http://localhost:8080/jmwapp/servlet/SessionObject42
    

    セッション・オブジェクトがない場合

  3. loginフォーム"login41.html"からログインするサーブレット"LoginServlet41.java"を作成し、そこからペットのリストを表示するサーブレット"PetServlet41.java"を作成してください。また、ここから、それを発注するサーブレット"OrderServlet41.java"もあわせて作成してください。

    Login Form
    login form
    |
    V
    Login 失敗メッセージ
    login fail message
    Welcome メッセージ
    welcome message -->
    ペット・リスト
    pets list -->
    発注リスト
    ordered list

    "web.xml"

    1. <?xml version="1.0" encoding="Shift_JIS" ?>
    2. <!DOCTYPE web-app
    3. PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    4. "http://java.sun.com/dtd/web-app_2_3.dtd">
    5. <!-- jmwappアプリケーションの振る舞いを定義する -->
    6. <web-app>
    7. <context-param>
    8. <param-name>username</param-name>
    9. <param-value>maruno</param-value>
    10. </context-param>
    11. <context-param>
    12. <param-name>password</param-name>
    13. <param-value>marunopass</param-value>
    14. </context-param>
    15. :
    16. (その他の要素)
    17. :
    18. </web-app>

    "login41.html"

    1. <!-- login41.html -->
    2. <html>
    3. <head>
    4. <title>Pet Shop</title>
    5. </head>
    6. <body>
    7. <h1>Pet Shop Login</h1>
    8. <hr/><p>
    9. <form method="post" action="/jmwapp/servlet/LoginServlet41">
    10. <p>ユーザー名: <input type="text" name="username"></p>
    11. <p>パスワード: <input type="password" name="password"></p>
    12. <p><input type="submit" value="login">
    13. <input type="reset" value="reset">
    14. </p>
    15. </form>
    16. </p>
    17. </body>
    18. </html>

    "LoginServlet41.java"

    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. public class LoginServlet41 extends HttpServlet {
    5. // コンテキスト初期化パラメータ用変数
    6. private String userName = null;
    7. private String password = null;
    8. // リンク先のURL
    9. private static final String PET_SERVLET_URL = "/jmwapp/servlet/PetServlet41";
    10. private static final String LOGIN_FORM_URL = "/jmwapp/html/login41.html";
    11. public void init(){
    12. // ユーザ名とパスワードをコンテキスト初期化パラメータから受け取る
    13. ServletContext context = getServletContext();
    14. userName = context.getInitParameter("username");
    15. password = context.getInitParameter("password");
    16. }
    17. // FORM 情報を受け取って認証し、セッションオブジェクトを作成する
    18. public void doPost(HttpServletRequest request, HttpServletResponse response)
    19. throws ServletException, IOException {
    20. // FORM 情報を受け取る
    21. String inputUserName = request.getParameter("username");
    22. String inputPassword = request.getParameter("password");
    23. // セッション・オブジェクトを破棄する
    24. HttpSession session = request.getSession(false);
    25. if (session != null) {
    26. session.invalidate();
    27. }
    28. response.setContentType("text/html; charset=iso-2022-jp");
    29. PrintWriter out = response.getWriter();
    30. out.println("<html>");
    31. out.println("<head>");
    32. out.println("<title>Pet Shop</title>");
    33. out.println("</head>");
    34. out.println("<body>");
    35. out.println("<h1>Login Servlet</h1>");
    36. out.println("<hr/>");
    37. // FORM 情報が入力されているか確認
    38. if (inputUserName.equals("") || inputPassword.equals("")) {
    39. out.println("<p><font size=\"+1\" color=\"red\">" + "<b>ユーザー名とパスワードを入力してください。 </b></font></p>");
    40. // FORM 情報の認証を行い、認証された場合
    41. } else if (inputUserName.equals(userName) &&
    42. inputPassword.equals(password)) {
    43. // セッション・オブジェクトを作成しユーザ情報を格納する
    44. session = request.getSession(true);
    45. session.setAttribute("username", inputUserName);
    46. out.println("<p><font size=\"+1\" color=\"blue\"><b>ようこそ " +
    47. inputUserName + " さん!</b></font>");
    48. out.println("<br/>下のリストから選んでください。</P> ");
    49. out.println("<p><a href=\"" +
    50. PET_SERVLET_URL +
    51. "\">" + "Pet List</a></p>");
    52. // 認証されなかった場合
    53. }else {
    54. out.println("<p><font size=\"+1\" color=\"red\">" + "<b>正しいユーザー名とパスワードを入力してください。</b></font></p>");
    55. }
    56. out.println("<p><a href=\"" +
    57. LOGIN_FORM_URL +
    58. "\">" + "Login Form に戻る</a></p>");
    59. out.println("</body>");
    60. out.println("</html>");
    61. out.close();
    62. }
    63. }

    "PetServlet41.java"

    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. public class PetServlet41 extends HttpServlet {
    5. // リンク先のURL
    6. private static final String ORDER_SERVLET_URL = "/jmwapp/servlet/OrderServlet41";
    7. private static final String LOGIN_FORM_URL = "/jmwapp/html/login41.html";
    8. // ログインされたユーザに対して商品一覧を表示する
    9. public void doGet(HttpServletRequest request, HttpServletResponse response)
    10. throws ServletException, IOException {
    11. final String[][] PET_LIST = {{"dog", "いぬ"}
    12. , {"cat", "ねこ"}
    13. , {"ferret", "フェレット"}
    14. , {"rabbit", "うさぎ"}
    15. , {"turtle", "かめ"}
    16. };
    17. response.setContentType("text/html; charset=iso-2022-jp");
    18. PrintWriter out = response.getWriter();
    19. out.println("<html>");
    20. out.println("<head>");
    21. out.println("<title>Pets Online</title>");
    22. out.println("</head>");
    23. out.println("<body>");
    24. out.println("<h1>Pets List</h1>");
    25. out.println("<hr/>");
    26. // セッション・オブジェクトの獲得
    27. HttpSession session = request.getSession(false);
    28. // セッション・オブジェクトが獲得できなかった場合
    29. if (session == null){
    30. out.println("<p><font size=\"+2\" color=\"red\"><b>" +
    31. "login してください。</b></font></p>");
    32. // セッション・オブジェクトが獲得できた場合
    33. } else {
    34. // セッション・オブジェクトからユーザ名を獲得
    35. String userName = (String)session.getAttribute("username");
    36. out.println("<h2>こんにちは! " + userName + " さん、</h2>");
    37. out.println("<p>つぎのリストから選んでください。</p>");
    38. out.println("<hr/>");
    39. // 商品一覧を表示する
    40. out.println("<form method=\"post\" action=\"" +
    41. ORDER_SERVLET_URL +
    42. "\">");
    43. for (int i = 0; i < PET_LIST.length; i++) {
    44. out.println("<input type=\"checkbox\" " +
    45. "name=\"product\" value=\"" +
    46. PET_LIST[i][0] +
    47. "\" >");
    48. out.println(PET_LIST[i][1] + "<br/>");
    49. }
    50. out.println("<hr/>");
    51. out.println("<input type=\"submit\" value=\"発注\">");
    52. out.println("<input type=\"reset\" value=\"reset\">");
    53. out.println("</form>");
    54. }
    55. out.println("<p><a href=\"" +
    56. LOGIN_FORM_URL +
    57. "\">" + "Login Form に戻る</a></p>");
    58. out.println("</body>");
    59. out.println("</html>");
    60. out.close();
    61. }
    62. }

    "OrderServlet41.java"

    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. public class OrderServlet41 extends HttpServlet {
    5. // リンク先のURL
    6. private static final String LOGIN_FORM_URL = "/jmwapp/html/login41.html";
    7. // 商品一覧から選択された FORM 情報をもとに一覧で表示する
    8. public void doPost(HttpServletRequest request, HttpServletResponse response)
    9. throws ServletException, IOException {
    10. response.setContentType("text/html; charset=iso-2022-jp");
    11. PrintWriter out = response.getWriter();
    12. out.println("<html>");
    13. out.println("<head>");
    14. out.println("<title>Pet Shop</title>");
    15. out.println("</head>");
    16. out.println("<body>");
    17. out.println("<h1>注文の受け付け</h1>");
    18. out.println("<hr/><br/>");
    19. // セッション・オブジェクトの獲得
    20. HttpSession session = request.getSession(false);
    21. // セッション・オブジェクトが獲得できないとき
    22. if (session == null){
    23. out.println("<p><font size=\"+2\" color=\"red\"><b>" +
    24. "login してください。</b></font></p>");
    25. // セッション・オブジェクトが獲得できたとき
    26. } else {
    27. // セッション・オブジェクトからユーザ名を獲得
    28. String userName = (String)session.getAttribute("username");
    29. // 選択された商品情報を獲得
    30. String product[] = request.getParameterValues("product");
    31. // FORM 情報が入力されているか確認
    32. if (product == null) {
    33. product = new String[0];
    34. }
    35. // 選択一覧を表示する
    36. out.println("<table align=\"center\" " +
    37. "border=\"1\" width=\"200\">");
    38. out.println("<caption align=\"top\"> " +
    39. userName + " さんの 発注リスト</caption>");
    40. out.println("<tr><th>Name</th></tr>");
    41. for (int i = 0; i < product.length; i++){
    42. out.println("<tr><td>" + product[i] + "</td></tr>");
    43. }
    44. out.println("</table>");
    45. }
    46. out.println("<p><a href=\"" +
    47. LOGIN_FORM_URL +
    48. "\">" + "Login Form に戻る</a></p>");
    49. out.println("</body>");
    50. out.println("</html>");
    51. out.close();
    52. }
    53. }

    □ 実行結果

     http://localhost:8080/jmwapp/html/login41.html
    

    login form

    welcome message

    pet list

    ordered list

    login fail message

Top
実習
  1. 「Form」の実習で行ったじゃんけんを行うサーブレット"Janken21.java", "janken21.html"
  2. を、つぎのようにセッションの考えを導入したサーブレット"Janken41.java", "janken41.html"にしてください。
    すなわち、何回か勝負して、何勝何敗何分かを表示するようにします。
    なお、今回のサンプル解答では、URLリライティングを使っていないので、Cookieを有効にしてください。

    1. <html>
    2. <head>
    3. <title>じゃんけん </title>
    4. </head>
    5. <body>
    6. <form method="get" action="../servlet/Janken41">
    7. ●何を出しますか?<br/>
    8.   <input type="radio" name="janken" value="0" checked/>ぐー
    9. <br/>
    10.   <input type="radio" name="janken" value="1" />ちょき
    11. <br/>
    12.   <input type="radio" name="janken" value="2" />ぱー
    13. <br/><br/>
    14. ●最初から勝負する?
    15.   <input type="checkbox" name="reset" value="true" />
    16. <br/><br/>
    17. <input type="submit" value="勝負" />
    18. </form>
    19. </body>
    20. </html>
    1. import java.io.*;
    2. import javax.servlet.*;
    3. import javax.servlet.http.*;
    4. public class Janken41 extends HttpServlet {
    5. public void doGet(HttpServletRequest request, HttpServletResponse response)
    6. throws ServletException,IOException {
    7. String[] te = {"ぐー", "ちょき", "ぱー"};
    8. char[][] kekka = {{'分', '勝', '負'} // ぐー
    9. , {'負', '分', '勝'} // ちょき
    10. , {'勝', '負', '分'}}; // ぱー
    11. //コンピューター ぐー ちょき ぱー
    12. int user = 0;
    13. try {
    14. user = Integer.parseInt(request.getParameter("janken"));
    15. } catch (NumberFormatException e) {
    16. }
    17. int computer = (int)(Math.random() * 3);
    18. int win = 0; // 勝カウンター
    19. int lose = 0; // 負カウンター
    20. int draw = 0; // 分カウンター
    21. // ここにコードを記述してください。
    22. // 表示
    23. response.setContentType("text/html;charset=iso-2022-jp");
    24. PrintWriter out = response.getWriter();
    25. out.println("<html>");
    26. out.println("<head>");
    27. out.println("<title>勝負結果</title>");
    28. out.println("</head><body>");
    29. out.println("<h1>");
    30. // ここにコードを記述してください。
    31. out.println("</h1>");
    32. getServletContext().getRequestDispatcher("/html/janken41.html").include(request, response);
    33. out.println("</body>");
    34. out.println("</html>");
    35. out.close();
    36. }
    37. public void doPost(HttpServletRequest request, HttpServletResponse response)
    38. throws ServletException, IOException {
    39. doGet(request, response);
    40. }
    41. }

    □ 実行結果

     http://localhost:8080/jmwapp/html/janken41.html
    
    -->
Top
セッションのタイムアウト
Web アプリケーション全体
セッション毎
Top

inserted by FC2 system