Struts2把session、request這些web對象封裝起來

想要尋摸個自己慣用的、比較完善的框架出來。Struts2把session、request這些web對象封裝起來,固然帶來了很多便利,但有時也是個麻煩。用這個方法可以在自己的Action裏獲取到這些對象,並進行操作。

from:http://blog.csdn.net/puffCN/archive/2010/05/19/5607557.aspx

Struts2 的Action中若希望訪問Session對象,可採用兩種方式:

1、從ActionContext中獲取;

2、實現SessionAware接口。

1、從ActionContext中獲取:

view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
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接口:

view plaincopy to clipboardprint?
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接口的實現方式如下:

struts-default.xml配置:

view plaincopy to clipboardprint?
<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源碼:

view plaincopy to clipboardprint?
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進行操作了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章