#進行状況
前回でようやく
login.jsp → LoginServlet.java → mypage.jsp
の遷移ができるようになりました。
ちなみに、mypage遷移時のURLは
http://localhost:8080/ServletApp/mypage.jsp
となりますが、もし最後の拡張子が気になる場合はweb.xmlに
<servlet>
<servlet-name>mypage</servlet-name>
<jsp-file>/mypage.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>mypage</servlet-name>
<url-pattern>/ServletApp/mypage</url-pattern>
</servlet-mapping>
を加えてあげると、遷移時のURLが
http://localhost:8080/ServletApp/mypage
になります。
##その他のデータの受け渡し方法
実は、サーブレット間のデータの受け渡しには、前回やったrequest.getParameter()
メソッドを利用する方法以外に、「クッキー」と「セッション」と呼ばれるものが存在します。
#クッキー作りましょう
クッキーとは、サーバからレスポンスが返ってくる際にクライアント側に保存される情報です。(よくサイトを閲覧していると「このサイトはCookieを使用しています」等ポップアップが出ることもありますね)
クライアント側でデータを保存しておくメリットとして、
- 会員制サイト → 次回からユーザ名の入力を省略する
- ショッピングサイト → カートに入れた商品を覚えておく
などが挙げられます。
それではクッキーを作っていきましょう。まずはLoginServlet.java
のdoPost()
メソッドを改造します。
protected void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String name=req.getParameter("name");
Cookie c[]=req.getCookies();
boolean CreatedCookie=false;
for(Cookie cookie:c) {
if(cookie.getName().equals("cookie_user")) {
CreatedCookie=true;
}
}
if(CreatedCookie==false) {
Cookie cookie=new Cookie("cookie_user",name);
res.addCookie(cookie);
}
// if(Arrays.stream(c)
// .filter(e->!e.getName().equals("cookie_user"))
// .count()==c.length) {
// Cookie cookie=new Cookie("cookie_user",name);
// res.addCookie(cookie);
// }
req.setAttribute("name",name);
req.getRequestDispatcher("/mypage.jsp").forward(req,res);
}
※6~15行目とコメントアウト行は書き方が違うだけでほぼ同じ動きになります。お好みで使い分けてください。
-
req.getCookies()
・・・クライアントが持っているクッキーを配列で取得(5行目) -
cookie.getName()
・・・クッキーの名前を取得(8行目) -
new Cookie(String name,String value)
・・・名前:値
のペアでクッキーを作成(13行目) -
res.addCookie(Cookie cookie)
・・・クッキーをレスポンスに設定(14行目)
これによって、ログイン時に入力したユーザ名をcookie_user
という名前で保存できます。
また、ここには出てきませんが、
-
cookie.setMaxAge(int seconds)
・・・クッキーの有効期限を秒数で指定(有効期限が切れるとクッキーが破棄されます) -
cookie.setValue(String value)
・・・クッキーに値を再設定
などもあります。
次にlogin.jsp
の<body>
タグ内を改造します。
<body>
<%
Cookie cookies[]=request.getCookies();
String username="";
for(Cookie c:cookies){
if(c.getName().equals("cookie_user"))username=c.getValue();
}
%>
<form action="/ServletApp/mypage" method="post">
name:<input type="text" name="name" value=<%=username%>><br>
password:<input type="text" name="password"><br>
<input type="submit" value="login">
</form>
</body>
ログイン画面表示時に、既にcookie_user
というクッキー名が存在する場合、その値をテキストフィールドに入力させておく、という処理になります。
#クッキー使いましょう
それではlogin.jsp
へアクセスします。
name
に「はと」と入力してログインします。
一見何も変化がないように見えますが、ここで再度login.jsp
にアクセスしてみましょう。
name
に、既に先ほど入力した「はと」が入力されているのが分かります。
#クッキー調べましょう
クッキー作りましょうで「クライアント側に保存される情報」と言いましたが、Google Chrome
で保存されたクッキーを調べる方法があります。
-
login.jsp
を開いた状態でF12
キーを押して「開発者ツール」を開く。 - メニューの
Application
タブをクリックする。
-
Cookies
をクリックする。
#セッション作りましょう
セッションとは、「ログインしてからログアウトするまで」や「ログイン後、放置してタイムアウトするまで」といった接続の開始~終了(もしくは破棄)までの一連の処理
の事を指します。
ただ、通常のWebページには「接続している状態」を受け渡す機能はないので、以下のようにサーバにアクセスするたび別の接続として扱われてしまいます。
この接続A~接続Cを一連の処理(セッション)にしていきましょう。
LoginServlet.javaに以下のコードを追加します。
HttpSession session=req.getSession();
Date date=new Date(session.getCreationTime());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
session.setAttribute("lastLoginDate", sdf.format(date));
session.setMaxInactiveInterval(20);
lastLoginDate
という名前でセッションの開始時刻を保存するコードです。
-
req.getSession()
・・・セッションを取得 -
session.getCreationTime()
・・・セッションが初めて作成された日時をlong型で取得 -
session.setAttribute(String name,Object value)
・・・名前:値
のペアでパラメータを格納 -
session.setMaxInactiveInterval(int s)
・・・セッションの有効期限を秒数
で指定(デフォルトは1800秒のはず)
mypage.jspも改造します。
<body>
<%
String name=request.getParameter("name");
String session_date=session.getAttribute("lastLoginDate").toString();
%>
<%=name%>さんのログイン日時は<%=session_date%>です。
</body>
-
session.getAttribute(String name)
・・・引数で指定した名前に対応する値をセッション内からObject型
で取得
また、今回は利用しませんが
-
session.getAttributeNames()
・・・そのセッションに格納されているパラメータ名をString型の配列
で取得 -
session.lastAccessedTime()
・・・そのセッションで最後に接続してきた時間を取得
などもあります。
#セッション使いましょう
では再びlogin.jsp
へアクセスします。
「はと」と入力してログイン。
ざっくり現在時刻が表示されていると思います。
それでは間髪入れずにF5
キーでページ更新(本物の入力フォームや商品ページではやらないでね)
時刻は変わりません。先ほど有効期限に設定した20秒の間は「同一の接続」とみなされます。
それでは時間をおいて再リロード。
セッションもクッキーの一種のため、クッキー調べましょうと同じようにセッションが確認できます。ただ、極力改変などができないよう難しい文字列になっています。
今回はここまでになります。もう少しでフレームワークに入れるかな・・・。