第一種:通過實現SessionAware接口來獲取action
@SuppressWarnings("serial")
public class SurveyAction extends BaseAction<Surveys> implements SessionAware {
@Resource
private SurveysService surveyService;
//接收session
private Map<String, Object> sessionMap;
//接收返回集合
private List<Surveys> mySurveys;
public List<Surveys> getMySurveys() {
return mySurveys;
}
public void setMySurveys(List<Surveys> mySurveys) {
this.mySurveys = mySurveys;
}
public void setSession(Map<String, Object> arg0) {
this.sessionMap=arg0;
}
public String mySurveys(){
Users user=(Users)sessionMap.get("users");
this.mySurveys=surveyService.findMySurveys(user);
return "toMySurveys";
}
}
---------------------------------------------------------------------------------------------------------------
第二種(轉):
添加屬性:ActionContext.getContext().getSession().put();
獲得request對象:
- HttpServletRequest request = ServletActionContext.getRequest ();
- ActionContext ct= ActionContext.getContext()
- HttpServletRequest request=
- (HttpServletRequest)ct.get(ServletActionContext.HTTP_REQUEST);
獲得session對象:
在Struts2中底層的session都被封裝成了Map類型,我們稱之爲SessionMap,而平常我們所說的session則是指HttpSession對象,具體的獲得方法如下所示。
- Map session=ActionContext.getSession();
- Map session=(Map)ActionContext.getContext().getActionContext.SESSION)
得到這個SessionMap之後我們就可以對session進行讀寫了,如果我們想得到原始的HttpSession可以首先得到HttpServletRequest對象,然後通過request.getSession()來取得原始的HttpSession對象。一般情況下SessionMap已經可以完成所有的工作,我們不必再去碰底層的session了。
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接口:
- 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;
- }
- }
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接口的實現方式如下:
- <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進行操作了。
來自:http://blog.csdn.net/puffcn/article/details/5607557