Struts2中獲得Request,Response的幾種方法


在Struts2中的沒有像Struts1那樣必須要在Action類中寫個execute()方法,只需要是個返回字符串的方法即可(有時候也不需要返回值),在struts2中經將原有的servlet中request參數和response參數封裝在攔截器中,可是有時候編程的時候仍然需要用到這兩個參數。以下是獲得該參數的幾種方法:

方法一:使用Struts2 Aware攔截器

這種方法需要Action類實現相應的攔截器接口。如我們要獲得HttpServletResponse對象,需要現org.apache.struts2.interceptor.ServletResponseAware接口,代碼如下:

 

[java]  view plaincopy
  1. public class MyAction extends ActionSupport implements ServletResponseAware  
  2. {  
  3.     private javax.servlet.http.HttpServletResponse response;  
  4.     // 獲得HttpServletResponse對象  
  5.     @Override  
  6.     public void setServletResponse(HttpServletResponse response)  
  7.     {  
  8.         this.response = response;  
  9.     }      
  10.     public String execute() throws Exception  
  11.     {      
  12.         response.getWriter().write("實現ServletResponseAware接口");  
  13.     }  
  14. }  

 

 

在上面的代碼中,MyAction實現了一個ServletResponseAware接口,並且實現了setServletResponse方法。如果一個動作類實現了ServletResponseAware接口,Struts2在調用execute方法之前,就會先調用setServletResponse方法,並將response參數傳入這個方法。如果想獲得HttpServletRequest、HttpSession和Cookie等對象,動作類可以分別實現ServletRequestAware、SessionAware和CookiesAware等接口。這些接口都在org.apache.struts2.interceptor包中。

如果要獲得請求參數,動作類可以實現org.apache.struts2.interceptor. ParameterAware接口,但如果只想判斷某個參數是否存在,也可以實現com.opensymphony.xwork2.interceptor. ParameterNameAware接口。這個接口有一個acceptableParameterName方法,當Struts2獲得一個請求參數時,就會調用一次。讀者可以在這個方法中將所有的請求參數記錄下來,以便以后使用。這個方法的定義如下:

boolean acceptableParameterName(String parameterName);

方法二、使用RequestAware攔截器

這種方法和第1種方法類似。動作類需要實現一個org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware將獲得一個com.opensymphony.xwork2.util.OgnlValueStack對象,這個對象可以獲得response、request及其他的一些信息。代碼如下所示:

 

[java]  view plaincopy
  1. public class FirstAction extends ActionSupport implements RequestAware {  
  2.     private Map request;  
  3.     private HttpServletResponse response;  
  4.   
  5.     public void setRequest(Map request) {  
  6.         this.request = request;  
  7.     }  
  8.   
  9.     public String execute() throws Exception {  
  10.         java.util.Set<String> keys = request.keySet();  
  11.         // 枚舉所有的key值。實際上只有一個key:struts.valueStack  
  12.         for (String key : keys)  
  13.             System.out.println(key);  
  14.         // 獲得OgnlValueStack 對象  
  15.         OgnlValueStack stack = (OgnlValueStack) request  
  16.                 .get("struts.valueStack");  
  17.         // 獲得HttpServletResponse對象  
  18.         response = (HttpServletResponse) stack.getContext().get(  
  19.                 StrutsStatics.HTTP_RESPONSE);  
  20.         response.getWriter().write("實現RequestAware 接口");  
  21.     }  
  22. }  

我們也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT來獲得HttpServletRequest和PageContext對象。這種方法有些麻煩,一般很少用,讀者可以作為一個參考。
方法三、使用ActionContext類

 

這種方法比較簡單,我們可以通過org.apache.struts2.ActionContext類的get方法獲得相應的對象。代碼如下:

 

[java]  view plaincopy
  1. ActionContext ctx = ActionContext.getContext();       
  2. HttpServletRequest request =(HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);    
  3. HttpServletResponse response = (HttpServletResponse)  
  4. ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);  


方法四、使用ServletActionContext類

 

Struts2為我們提供了一種最簡單的方法獲得HttpServletResponse及其他對象。這就是org.apache.struts2.ServletActionContext類。我們可以直接使用ServletActionContext類的getRequest、getResponse方法來獲得HttpServletRequest、HttpServletResponse對象。代碼如下:

 

[java]  view plaincopy
  1. HttpServletRequest request = ServletActionContext.getRequest();  
  2. HttpServletResponse response = ServletActionContext.getResponse();  

從這四種方法來看,最后一種是最簡單的,讀者可以根據自己的需要和要求來選擇使用哪一種方法來獲得這些對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM