Teedaでログイン管理(2)
id:higayasuoさんに教わった通り、Map sessionScope を使って、セッション管理は上手くいきました。
やってみたこと。
- セッション管理の検証として、表示回数countプロパティを追加。
- メソッド起動検証用として、prerender, doLogin中にsysoutにてログを吐かせてみる。
- loginMessageプロパティに初期メッセージを入れてみた。
で、以下結果。意図通りの動きは緑、意図通りでない動きは赤で書いてみました。
test.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:te="http://www.seasar.org/teeda/extension" xml:lang="ja" lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>login test</title> </head> <body> <p><span id="count">n</span>回目の表示</p> <div id="isLoggedin"> <p><span id="userId">ユーザ名</span>さんではない場合は、 <a href="?doLogout">ログアウト</a>してください。</p> </div> <div id="isNotLoggedin"> <form class="loginForm" method="POST"> ユーザID <input id="userId" type="text"/><br/> パスワード <input id="password" type="password"/><br/> <input id="doLogin" type="submit" value="login"/> </form> <p><span id="loginMessage">ログイン成否表示場所</span></p> </div> </body> </html>
TestPage.class
package jp.xet.test.web.home; import java.util.Map; public class TestPage { private String userId; private String password; private String loginMessage = "初期メッセージ"; private boolean loggedin; private int count; private Map sessionScope; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getLoginMessage() { return loginMessage; } public void setLoginMessage(String loginMessage) { this.loginMessage = loginMessage; } public boolean isLoggedin() { return loggedin; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public void setSessionScope(Map sessionScope) { this.sessionScope = sessionScope; } @SuppressWarnings("unchecked") public String doLogin() { System.out.println("#### start doLogin() ####"); if(userId.equals("cepoc") && password.equals("pass")) { sessionScope.put("loggedin", true); loginMessage = "ログイン成功"; } else { sessionScope.put("loggedin", false); loginMessage = "ログイン失敗"; } return null; } @SuppressWarnings("unchecked") public String doLogout() { sessionScope.put("loggedin", false); return null; } public String initialize() { return null; } @SuppressWarnings("unchecked") public String prerender() { System.out.println("#### start prerender() ####"); if(sessionScope.get("loggedin") == null) { loggedin = false; } else { loggedin = (Boolean) sessionScope.get("loggedin"); } if(sessionScope.get("count") == null) { sessionScope.put("count", 1); } else { sessionScope.put("count", (Integer)sessionScope.get("count")+1); } count = (Integer) sessionScope.get("count"); return null; } }
以上で、まずページにアクセスしてみる。
DEBUG 2007-03-16 22:08:12,500 [http-8080-Processor25] HOT deployを開始します
DEBUG 2007-03-16 22:08:12,593 [http-8080-Processor25] クラス(jp.xet.test.web.home.TestPage[home_testPage])のコンポーネント定義を登録します
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] BEGIN jp.xet.test.web.home.TestPage#initialize()
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] トランザクションを開始しました
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] トランザクションをコミットしました
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] END jp.xet.test.web.home.TestPage#initialize() : null
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] BEGIN jp.xet.test.web.home.TestPage#prerender()
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] トランザクションを開始しました
#### start prerender() ####
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] トランザクションをコミットしました
DEBUG 2007-03-16 22:08:12,656 [http-8080-Processor25] END jp.xet.test.web.home.TestPage#prerender() : null
DEBUG 2007-03-16 22:08:12,671 [http-8080-Processor25] [HtmlMessage] forComponent [login] is null. [id=loginMessage]
DEBUG 2007-03-16 22:08:12,671 [http-8080-Processor25] HOT deployを終了しました
何度かリロードして、カウントが増えることを確認。
しかし、ログイン成否表示場所には何も表示されず。「初期メッセージ」と出て欲しいところなんですが。
まぁ、ここで user:aaaa pass:bbbb で submit してみる。
DEBUG 2007-03-16 22:14:10,359 [http-8080-Processor24] HOT deployを開始します
DEBUG 2007-03-16 22:14:10,437 [http-8080-Processor24] クラス(jp.xet.test.web.home.TestPage[home_testPage])のコンポーネント定義を登録します
DEBUG 2007-03-16 22:14:10,453 [http-8080-Processor24] BEGIN jp.xet.test.web.home.TestPage#prerender()
DEBUG 2007-03-16 22:14:10,453 [http-8080-Processor24] トランザクションを開始しました
#### start prerender() ####
DEBUG 2007-03-16 22:14:10,453 [http-8080-Processor24] トランザクションをコミットしました
DEBUG 2007-03-16 22:14:10,453 [http-8080-Processor24] END jp.xet.test.web.home.TestPage#prerender() : null
DEBUG 2007-03-16 22:14:10,468 [http-8080-Processor24] [HtmlMessage] forComponent [login] is null. [id=loginMessage]
DEBUG 2007-03-16 22:14:10,468 [http-8080-Processor24] HOT deployを終了しました
「#### start doLogin() ####」がログに表示されない。
当然 loginMessage も無言。