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
更可取。