Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SessionMap没有实例化?_Java_Session_Struts2_Struts2 Interceptors - Fatal编程技术网

Java 为什么SessionMap没有实例化?

Java 为什么SessionMap没有实例化?,java,session,struts2,struts2-interceptors,Java,Session,Struts2,Struts2 Interceptors,成员第一次注册时,需要设置会话,这通常发生在登录中,因此我想我应该重用LoginAction,而不必路由到它。 但是,sessionmap没有被实例化 member logging in is: model.hibernate.Member@549c8a8c session map not instantiated 注册作用 public class RegisterAction extends ActionSupport implements SessionAware{ privat

成员第一次注册时,需要设置会话,这通常发生在登录中,因此我想我应该重用
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;  
    }
}
公共类RegisterAction扩展ActionSupport实现SessionAware{
私有字符串用户名、密码、电子邮件;
SessionMap SessionMap;
MemberDAO mdao=新的MemberDAO();
UsersDAO udao=新UsersDAO();
用户=新用户();
成员=新成员();
公共注册操作(){
this.email=“”;
此密码为“”;
this.username=“”;
}
//…二传手/接球手。。。
公共字符串execute(){
udao.addUserToDatabase(newUser);
成员newMember=新成员(用户名、密码);
mdao.addMemberToDatabase(新成员);
成员=新成员;
//执行第一次登录(以设置会话成员和角色)。
//这可以通过发送到登录操作来完成。
//但随后必须跟踪这是第一次登录。这是快速修复。
LoginAction firstLogin=新登录(成员);
firstLogin.setSession(sessionmap);
字符串firstLoginAttent=firstLogin.execute();
字符串resultString=“”;
如果(firstLoginAttest.equals(SUCCESS)){resultString=SUCCESS;}
否则{
addActionError(“首次登录尝试无效”);
结果字符串=错误;
}
return resultString;//将用户发送到测验或显示错误
}否则{
//无法添加用户
addActionError(“用户名已被使用。请选择其他名称”);
返回误差;
}
}
公共无效设置会话(映射){
sessionmap=(sessionmap)映射;
}
}
登录

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");
}
公共类LoginAction扩展了ActionSupport实现了SessionAware{
私有字符串用户名、密码;
MemberDAO mdao=新的MemberDAO();
成员=新成员();
SessionMap SessionMap;
公共登录(){
此密码为“”;
this.username=“”;
}
公共登录(成员m){
该成员=m;
this.password=member.getPassword();
this.username=member.getUsername();
}
public void setUsername(字符串用户名){
this.username=用户名;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getUsername(){
返回用户名;
}
公共字符串getPassword(){
返回密码;
}
公共字符串execute(){
//检查凭据是否与数据库匹配
setLoggedInMember(成员);
setLoggedInRole(成员);
}
公共字符串注销(){
如果(sessionmap!=null){
sessionmap.invalidate();
}  
返回“成功”;
}  
公共无效设置会话(映射){
sessionmap=(sessionmap)映射;
}
受保护的无效setLoggedInMember(成员m){
System.out.println(“成员登录为:+m.toString());
试一试{
if(sessionmap!=null){
sessionmap.put(“成员”,m.toString());
}
else{System.out.println(“会话映射未实例化”);}
}catch(异常e){System.out.println(e);}
}
公共成员getLoggedInMember(){
return(Member)sessionmap.get(“Member”);
}
受保护的void setLoggedInRole(成员){
if(member.getAdmin()!=null)
sessionmap.put(“角色”、“管理”);
else if(member.getAgent()!=null)
sessionmap.put(“角色”、“代理”);
else if(member.getUsers()!=null)
sessionmap.put(“角色”、“用户”);
其他的
addActionError(“未知成员角色”);
}
公共字符串getLoggedInRole(){
返回(字符串)sessionmap.get(“角色”);
}
注册表操作

Member newMember = new Member(username, password);//newMember having username,password object
Member member = new Member();
LoginAction firstLogin = new LoginAction(member);
firstLogin.execute();
在RegisterAction中,您传递了成员对象(如成员

逻辑类

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


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

基于接口设置操作属性的拦截器 操作实现。例如,如果操作实现
ParameterAware
则操作上下文的参数映射将被设置为 它

此拦截器设计用于在以下情况下设置操作所需的所有属性: 它知道servlet参数、servlet上下文、会话、, 它支持的接口包括:

ServletContextAware

ServletRequestAware

ServletResponseAware

ParameterAware

RequestAware

SessionAware

ApplicationAware

PrincipalAware

这个拦截器将servlet stuff对象注入ActionBean的能力


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

我还没有覆盖任何拦截器。因此,默认堆栈应能正常工作。但现在,我有我只需要重新实现登录时的会话管理就可以了。或者我也可以像这样获得会话映射
map session=ActionContext.getContext().getSession();
,这在其他地方对我有效。这也是获取会话映射的一种方法,但实现
SessionAware
更可取。