- 使用ActionContest
ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,
比如session, parameters, locale等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,
即一个线程有一个唯一的ActionContext。因此,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext,
也正是由于这个原因,使用者不用去操心让Action是线程安全的。
ActionContext需要使用时,每个类都需要将其put到Map中。
// 本类将演示在Action中对ActionContext进行操作 publicclass MyAction extends ActionSupport { @Override public String execute() throws Exception { // 获得值栈 ActionContext actionContext = ActionContext.getContext(); // 存入值 Person person = new Person();// 这是之前例子中定义的类 actionContext.put("person", person); // 获取值 Object object = actionContext.get("person"); // 其他代码 // ...... return SUCCESS; } }
- 实现xxxAware 接口
struts 2 还提供一种简单的方式,使用sessionAware借口来访问存储于ActionContext中的数据,该接口通过使用 IOC/DI注入sessionMap,就可以在程序中直接使用这个Map来操作数据了。
package com.xujun.webwork.action;
import com.opensymphony.xwork.Action;
import com.opensymphony.webwork.interceptor.SessionAware;
import java.util.Map;
public class LoginAction implements Action,SessionAware{
private Map mySession;
public String execute() throws Exception
{
mySession.put("username", "xujunSessionAware");
return this.SUCCESS;
}
public void setSession(Map session) {
this.mySession = session;
}
}
3. 调用invalidate()使session失效
// 使server上的sessionMap 失效,清空session
if(sessionMap instanceof SessionMap){
SessionMap sm=(SessionMap) sessionMap;
sm.invalifate();
}
选用的建议:
若一个Action中,需要对某个实现对象进行多次调用,那么选择实现Aware接口的方式。
package com.xujun.webwork.action;
import com.opensymphony.xwork.Action;
import com.opensymphony.webwork.interceptor.SessionAware;
import java.util.Map;
public class LoginAction implements Action,SessionAware{
private Map mySession;
public String execute() throws Exception
{
mySession.put("username", "xujunSessionAware");
return this.SUCCESS;
}
public void setSession(Map session) {
this.mySession = session;
}
}
// 使server上的sessionMap 失效,清空session
if(sessionMap instanceof SessionMap){
SessionMap sm=(SessionMap) sessionMap;
sm.invalifate();
}