Why SessionMap is not instantiated?
成员首次注册时,需要设置会话,这通常是在登录时发生的,所以我认为我会重用
但是
1 2 |
RegisterAction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | public class RegisterAction extends ActionSupport implements SessionAware{ private String username, password, email; SessionMap<String,Object> sessionmap; MemberDAO mdao = new MemberDAO(); UsersDAO udao = new UsersDAO(); Users user = new Users(); Member member = new Member(); public RegisterAction() { this.email =""; this.password =""; this.username =""; } // ...setters/getters... public String execute() { udao.addUserToDatabase(newUser); Member newMember = new Member(username, password); mdao.addMemberToDatabase(newMember); member = newMember; // perform first login (to set session member and role). // this could be done by sending to login action. // but then would have to track that it was first login. this is quick fix. LoginAction firstLogin = new LoginAction(member); firstLogin.setSession(sessionmap); String firstLoginAttempt = firstLogin.execute(); String resultString =""; if(firstLoginAttempt.equals(SUCCESS)){resultString = SUCCESS;} else{ addActionError("First login attempt didnt work"); resultString = ERROR; } return resultString; // send user to quiz or show error }else { // cant add user addActionError("Username already taken. Please choose another."); return ERROR; } } public void setSession(Map<String, Object> map) { sessionmap=(SessionMap) map; } } |
LoginAction
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | public class LoginAction extends ActionSupport implements SessionAware{ private String username, password; MemberDAO mdao = new MemberDAO(); Member member = new Member(); SessionMap<String,Object> sessionmap; public LoginAction() { this.password =""; this.username =""; } public LoginAction(Member m) { this.member = m; this.password = member.getPassword(); this.username = member.getUsername(); } public void setUsername(String username) { this.username = username; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public String getPassword() { return password; } public String execute() { // checks that credentials match db setLoggedInMember(member); setLoggedInRole(member); } public String logout(){ if(sessionmap!=null){ sessionmap.invalidate(); } return"success"; } public void setSession(Map<String, Object> map) { sessionmap=(SessionMap) map; } protected void setLoggedInMember(Member m){ System.out.println("member logging in is:"+m.toString()); try{ if(sessionmap!=null){ sessionmap.put("member",m.toString()); } else{System.out.println("session map not instantiated");} }catch(Exception e){System.out.println(e);} } public Member getLoggedInMember(){ return (Member) sessionmap.get("member"); } protected void setLoggedInRole(Member member) { if(member.getAdmin() != null) sessionmap.put("role","admin"); else if(member.getAgent()!=null) sessionmap.put("role","agent"); else if(member.getUsers()!=null) sessionmap.put("role","user"); else addActionError("Unknown member role"); } public String getLoggedInRole(){ return (String) sessionmap.get("role"); } |
您需要在操作配置中引用
An interceptor which sets action properties based on the interfaces
an action implements. For example, if the action implements
ParameterAware then the action context's parameter map will be set on
it.This interceptor is designed to set all properties an action needs if
it's aware of servlet parameters, the servlet context, the session,
etc. Interfaces that it supports are:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 ServletContextAware
ServletRequestAware
ServletResponseAware
ParameterAware
RequestAware
SessionAware
ApplicationAware
PrincipalAware
此拦截器将servlet填充对象注入到动作bean的能力。
注意,此拦截器包含在
RegisterAction
1 2 3 4 |
在RegisterAction中,您传递了Member对象(如Member <用户名,密码>)
LoginAction.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public String execute() { //if you received member object here. //retrieve your username,password here like this //Your mentioned model.hibernate.Member@549c8a8c -->Object Reference value member.getUsername(); member.getPassword(); setLoggedInMember(member); setLoggedInRole(member); } protected void setLoggedInMember(Member m){ System.out.println("member logging in is:"+m.getUsername()); } |