1

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

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

注册动作

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

登录动作

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

2 回答 2

0

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

一个拦截器,它根据动作实现的接口设置动作属性。例如,如果动作实现 了,ParameterAware那么动作上下文的参数映射将被设置在它上面。

这个拦截器旨在设置一个动作需要的所有属性,如果它知道 servlet 参数、servlet 上下文、会话等。它支持的接口是:

ServletContextAware

ServletRequestAware

ServletResponseAware

ParameterAware

RequestAware

SessionAware

ApplicationAware

PrincipalAware

此拦截器将 servlet 东西对象注入操作 bean 的能力。

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

于 2014-05-24T07:07:55.560 回答
-1

注册动作

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

在 RegisterAction 中,您传递了成员对象(如 Member < username , password > )

LoginAction.class

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


}
于 2014-05-24T03:43:09.353 回答