关于java:为什么未实例化SessionMap?

Why SessionMap is not instantiated?

成员首次注册时,需要设置会话,这通常是在登录时发生的,所以我认为我会重用LoginAction而不路由到它。
但是sessionmap未被实例化。

1
2
member logging in is: model.hibernate.Member@549c8a8c
session map not instantiated

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");
}

您需要在操作配置中引用servletConfig拦截器。

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的能力。

注意,此拦截器包含在defaultStack中,如果您未引用任何拦截器,则默认使用该拦截器。如果您在操作配置中覆盖了拦截器,则defaultStack会消失。


RegisterAction

1
2
3
4
Member newMember = new Member(username, password);//newMember having username,password object
Member member = new Member();
LoginAction firstLogin = new LoginAction(member);
firstLogin.execute();

在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());


}