- 使用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();
}