if(info != null){
//将info存入session
// 获得session的方法
ActionContext ctx = ActionContext.getContext();
Map<String, Object> session = ctx.getSession();
session.put("user", info);
return "success";
}else{
return "login";
}
不推荐使用ActionContext访问Session的方式,因为这种方式的“侵入性”较强。ActionContext是Struts2的API,如果使用其他框架代替目前的Struts2框架,而我们实际项目中的Action的数量非常庞大,每个类都修改的话,会非常麻烦。
推荐通过实现SessionAware接口访问session。
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
public class BaseAction implements SessionAware{
//为了让子类也能使用,所以访问控制符为protected
protected Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
}
该类实现了SessionAware接口,表明Struts2在启动BaseAction时,首先,创建出该Action的对象,放入“栈顶”然后,会调用BaseAction的setSession方法,把session传入给BaseAction对象(注意:如果是普通的Action,Struts2在启动时仅创建出该Action的对象,然后放入“栈顶”)由此,我们定义了属性session,以便在之后其它的方法中使用。为了让子类也能使用,所以访问控制符为protected。
按照这样的机制,我们可以让所有的Action(如LoginAction)继承实现了SessionAware接口的BaseAction,当需要更换Struts2框架为其他框架时,只需要修改BaseAction即可(另外的 框架只要提供一个类似SessionAware接口的接口,由BaseAction继承)
修改LoginAction,继承BaseAction,注释掉获取session的过程。
import com.tarena.netctoss.dao.AdminInfoDAO;
import com.tarena.netctoss.pojo.AdminInfo;
public class LoginAction extends BaseAction{
private AdminInfo info;
public String execute() {
System.out.println("adminCode: " + info.getAdminCode());
System.out.println("password: " + info.getPassword());
AdminInfoDAO infoDao = new AdminInfoDAO();
info = infoDao.findByCodeAndPwd(info.getAdminCode(), info.getPassword());
if(info != null){
//将info存入session
// 获得session的方法
// ActionContext ctx = ActionContext.getContext();
// Map<String, Object> session = ctx.getSession();
session.put("user", info);
return "success";
}else{
return "login";
}
}
public AdminInfo getInfo() {
return info;
}
public void setInfo(AdminInfo info) {
this.info = info;
}
}