struts2 的action中若希望通路session對象,可采用兩種方式:
1、從actioncontext中擷取;
2、實作sessionaware接口。
1、從actioncontext中擷取:

import java.util.map;
import com.opensymphony.xwork2.actioncontext;
import com.opensymphony.xwork2.actionsupport;
public class sessiontestaction extends actionsupport {
public string execute() {
actioncontext actioncontext = actioncontext.getcontext();
map session = actioncontext.getsession();
session.put("user_name", "test user");
return success;
}
import java.util.map; import com.opensymphony.xwork2.actioncontext; import com.opensymphony.xwork2.actionsupport; public class sessiontestaction extends actionsupport { public string execute() { actioncontext actioncontext = actioncontext.getcontext(); map session = actioncontext.getsession(); session.put("user_name", "test user"); return success; } }
2、實作sessionaware接口:
[java] view plaincopyprint?
import org.apache.struts2.interceptor.sessionaware;
public class sessiontest1action extends actionsupport implements sessionaware {
private map session;
public void setsession(map session) {
this.session = session;
this.session.put("user_name", "test user 1");
import java.util.map; import org.apache.struts2.interceptor.sessionaware; import com.opensymphony.xwork2.actionsupport; public class sessiontest1action extends actionsupport implements sessionaware { private map session; public void setsession(map session) { this.session = session; } public string execute() { this.session.put("user_name", "test user 1"); return success; } }
進一步閱讀struts2.1.8.1源碼,sessionaware接口的實作方式如下:
struts-default.xml配置:
<interceptors>
…
<interceptor name="servletconfig" class="org.apache.struts2.interceptor.servletconfiginterceptor"/>
</interceptors>
<interceptor-stack name="defaultstack">
<interceptor-ref name="servletconfig"/>
</interceptor-stack>
<interceptors> … <interceptor name="servletconfig" class="org.apache.struts2.interceptor.servletconfiginterceptor"/> … </interceptors> <interceptor-stack name="defaultstack"> … <interceptor-ref name="servletconfig"/> … </interceptor-stack>
打開servletconfiginterceptor.java源碼:
public string intercept(actioninvocation invocation) throws exception {
final object action = invocation.getaction();
final actioncontext context = invocation.getinvocationcontext();
if (action instanceof sessionaware) {
((sessionaware) action)。setsession(context.getsession());
return invocation.invoke();
public string intercept(actioninvocation invocation) throws exception { final object action = invocation.getaction(); final actioncontext context = invocation.getinvocationcontext(); … if (action instanceof sessionaware) { ((sessionaware) action)。setsession(context.getsession()); } … return invocation.invoke(); }
即在攔截器處理過程中發現目标action實作了sessionaware接口,便會調用action中已經實作的setsession(…) 方法,将actioncontext中包裝的session注入目标action中。目标action也就可以進一步對session進行操作了。