原文:http://www.blogjava.net/nokiaguy/archive/2008/04/22/194846.htmlhtml
在struts1.x Action類的execute方法中,有四個參數,其中兩個就是response和request。而在Struts2中,並無任何參數,所以,就不能簡單地從execute方法得到HttpServletResponse或HttpServletRequest對象了。java
但在Struts2 Action類中仍然有不少方法能夠得到這些對象。下面就列出四種得到這些對象的方法。apache
【方法1】使用Struts2 Aware攔截器this
這種方法須要Action類實現相應的攔截器接口。如咱們要得到HttpServletResponse對象,須要實現org.apache.struts2.interceptor.ServletResponseAware接口,代碼以下:
spa
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接口");
}
}
.net
在上面的代碼中,MyAction實現了一個ServletResponseAware接口,而且實現了setServletResponse方法。若是一個動做類實現了ServletResponseAware接口,Struts2在調用execute方法以前,就會先調用setServletResponse方法,並將response參數傳入這個方法。若是想得到HttpServletRequest、HttpSession和Cookie等對象,動做類能夠分別實現ServletRequestAware、SessionAware和CookiesAware等接口。這些接口都在org.apache.struts2.interceptor包中。htm
若是要得到請求參數,動做類能夠實現org.apache.struts2.interceptor. ParameterAware接口,但若是隻想判斷某個參數是否存在,也能夠實現com.opensymphony.xwork2.interceptor. ParameterNameAware接口。這個接口有一個acceptableParameterName方法,當Struts2得到一個請求參數時,就會調用一次。讀者能夠在這個方法中將全部的請求參數記錄下來,以便之後使用。這個方法的定義以下:對象
boolean acceptableParameterName(String parameterName);blog
【方法2】使用RequestAware攔截器接口
這種方法和第1種方法相似。動做類須要實現一個org.apache.struts2.interceptor.RequestAware接口。所不一樣的是RequestAware將得到一個com.opensymphony.xwork2.util.OgnlValueStack對象,這個對象能夠得到response、request及其餘的一些信息。代碼以下所示:
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方法得到相應的對象。代碼以下:
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對象。代碼以下:
HttpServletResponse response = ServletActionContext.getResponse()
response.getWriter().write("hello world");
從這四種方法來看,最後一種是最簡單的,讀者能夠根據本身的須要和要求來選擇使用哪種方法來得到這些對象。