在Action類中獲得HttpServletResponse對象的四種方法


Struts2:在Action類中獲得HttpServletResponse對象的四種方法

 

 

    在struts1.x Action類的execute方法中,有四個參數,其中兩個就是response和request。而在Struts2中,並沒有任何參數,因此,就不能簡單地從execute方法獲得HttpServletResponse或HttpServletRequest對象了。

    但在Struts2 Action類中仍然有很多方法可以獲得這些對象。下面就列出四種獲得這些對象的方法。

【方法1】使用Struts2 Aware攔截器

 

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

Java代碼 復制代碼  收藏代碼
  1. package action;   
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;   
  • import javax.servlet.http.*;   
  • import org.apache.struts2.interceptor.*;   
  •   
  • public class MyAction extends ActionSupport implements ServletResponseAware   
  • {   
  •     private javax.servlet.http.HttpServletResponse response;   
  •     // 獲得HttpServletResponse對象   
  •     public void setServletResponse(HttpServletResponse response)   
  •     {   
  •         this.response = response;   
  •     }       
  •     public String execute() throws Exception   
  •     {       
  •         response.getWriter().write("實現ServletResponseAware接口");   
  •     }   
  • }  
package action;

import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import org.apache.struts2.interceptor.*;

public class MyAction extends ActionSupport implements ServletResponseAware
{
    private javax.servlet.http.HttpServletResponse response;
    // 獲得HttpServletResponse對象
    public void setServletResponse(HttpServletResponse response)
    {
        this.response = response;
    }    
    public String execute() throws Exception
    {    
        response.getWriter().write("實現ServletResponseAware接口");
    }
}

 

 

 

在上面的代碼中,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);

【方法2】使用RequestAware攔截器

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

 

Java代碼 復制代碼  收藏代碼
  1. package action;   
  2.   
  3. import java.util.Map;   
  4. import org.apache.struts2.*;   
  5. import com.opensymphony.xwork2.ActionSupport;   
  6. import javax.servlet.http.*;   
  7. import com.opensymphony.xwork2.util.*;   
  8. import org.apache.struts2.interceptor.*;   
  9.   
  10. public class FirstAction extends ActionSupport implements RequestAware   
  11. {   
  12.     private Map request;   
  13. private HttpServletResponse response;   
  14.        
  15.     public void setRequest(Map request)   
  16.     {   
  17.         this.request = request;           
  18.     }       
  19.     public String execute() throws Exception   
  20.     {       
  21.         java.util.Set<String> keys = request.keySet();   
  22.         // 枚舉所有的key值。實際上只有一個key:struts.valueStack   
  23.         for(String key: keys)   
  24.             System.out.println(key);   
  25.         // 獲得OgnlValueStack 對象   
  26.         OgnlValueStack stack = (OgnlValueStack)request.get("struts.valueStack");   
  27.         // 獲得HttpServletResponse對象   
  28.         response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);   
  29.         response.getWriter().write("實現RequestAware 接口");   
  30.     }   
  31. }  
package action;

import java.util.Map;
import org.apache.struts2.*;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import com.opensymphony.xwork2.util.*;
import org.apache.struts2.interceptor.*;

public class FirstAction extends ActionSupport implements RequestAware
{
    private Map request;
private HttpServletResponse response;
    
    public void setRequest(Map request)
    {
        this.request = request;        
    }    
    public String execute() throws Exception
    {    
        java.util.Set<String> keys = request.keySet();
        // 枚舉所有的key值。實際上只有一個key:struts.valueStack
        for(String key: keys)
            System.out.println(key);
        // 獲得OgnlValueStack 對象
        OgnlValueStack stack = (OgnlValueStack)request.get("struts.valueStack");
        // 獲得HttpServletResponse對象
        response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);
        response.getWriter().write("實現RequestAware 接口");
    }
}

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

 

【方法3】使用ActionContext類

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


   

Java代碼 復制代碼  收藏代碼
  1. HttpServletResponse response = (HttpServletResponse)   
  2.   
  3. ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);   
  4.   
  5. HttpServletRequest request = (HttpServletRequest)   
  6.   
  7. ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);  
HttpServletResponse response = (HttpServletResponse)

ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

HttpServletRequest request = (HttpServletRequest)

ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);

 
【方法4】使用ServletActionContext類

 

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

Java代碼 復制代碼  收藏代碼
  1. HttpServletResponse response = ServletActionContext.getResponse()   
  2.   
  3. response.getWriter().write("hello world");  
    HttpServletResponse response = ServletActionContext.getResponse()

    response.getWriter().write("hello world");

 

 

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

http://lzwdq.iteye.com/blog/550675


免責聲明!

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



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