2014-05-24 96 views
1

成員首次註冊時,會話需要設置,通常在登錄時發生,所以我想我會重用LoginAction而不路由到它。 但sessionmap沒有得到實例化。爲什麼SessionMap沒有實例化?

member logging in is: [email protected] 
session map not instantiated 

RegisterAction

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

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

回答

0

你需要有servletConfig攔截器在操作配置中引用。

根據接口 設置動作屬性的攔截器。例如,如果動作實施了 ParameterAware那麼動作上下文的參數圖將被設置爲 它。

這個攔截器是專門爲設置一個動作需要的所有屬性,如果 是知道的servlet的參數,servlet上下文,會話, 等接口,它支持有:

ServletContextAware 

ServletRequestAware 

ServletResponseAware 

ParameterAware 

RequestAware 

SessionAware 

ApplicationAware 

PrincipalAware 

此攔截器將servlet stuff對象注入到動作bean的功能。

注意,這個攔截包括在defaultStack,這是默認使用的,如果你不引用任何攔截。如果在操作配置中覆蓋攔截器,則defaultStack消失。

+0

好吧,我還沒有重寫任何攔截器呢。所以默認棧應該工作.. – jsky

+0

但現在,我已經解決了只是重新實現登錄的會話管理。 – jsky

+0

或者我可能也會得到像這樣的會話地圖 'Map session = ActionContext.getContext()。getSession();'在其他地方爲我工作。 – jsky

-1

RegisterAction

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

在RegisterAction你通過會員的物品(如爲會員<用戶名,密碼>)

LoginAction.class

public String execute() { 
    //if you received member object here. 
    //retrieve your username,password here like this 
    //Your mentioned [email protected] -->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()); 


} 
相關問題