在struts1.x Action類的execute方法中,有四個(gè)參數(shù),其中兩個(gè)就是response和request。而在Struts2中,并沒有任何參數(shù),因此,就不能簡單地從execute方法獲得HttpServletResponse或HttpServletRequest對(duì)象了。
但在Struts2 Action類中仍然有很多方法可以獲得這些對(duì)象。下面就列出四種獲得這些對(duì)象的方法。
【方法1】使用Struts2 Aware攔截器
這種方法需要Action類實(shí)現(xiàn)相應(yīng)的攔截器接口。如我們要獲得HttpServletResponse對(duì)象,需要實(shí)現(xiàn)org.apache.struts2.interceptor.ServletResponseAware接口,代碼如下:
packageaction;
importcom.opensymphony.xwork2.ActionSupport;
importjavax.servlet.http.*;
importorg.apache.struts2.interceptor.*;
publicclassMyActionextendsActionSupportimplementsServletResponseAware
{
privatejavax.servlet.http.HttpServletResponseresponse;
//獲得HttpServletResponse對(duì)象
publicvoidsetServletResponse(HttpServletResponseresponse)
{
this.response=response;
}
publicStringexecute()throwsException
{
response.getWriter().write("實(shí)現(xiàn)ServletResponseAware接口");
}
}
在上面的代碼中,MyAction實(shí)現(xiàn)了一個(gè)ServletResponseAware接口,并且實(shí)現(xiàn)了setServletResponse方法。如果一個(gè)動(dòng)作類實(shí)現(xiàn)了ServletResponseAware接口,Struts2在調(diào)用execute方法之前,就會(huì)先調(diào)用setServletResponse方法,并將response參數(shù)傳入這個(gè)方法。如果想獲得HttpServletRequest、HttpSession和Cookie等對(duì)象,動(dòng)作類可以分別實(shí)現(xiàn)ServletRequestAware、SessionAware和CookiesAware等接口。這些接口都在org.apache.struts2.interceptor包中。
如果要獲得請(qǐng)求參數(shù),動(dòng)作類可以實(shí)現(xiàn)org.apache.struts2.interceptor. ParameterAware接口,但如果只想判斷某個(gè)參數(shù)是否存在,也可以實(shí)現(xiàn)com.opensymphony.xwork2.interceptor. ParameterNameAware接口。這個(gè)接口有一個(gè)acceptableParameterName方法,當(dāng)Struts2獲得一個(gè)請(qǐng)求參數(shù)時(shí),就會(huì)調(diào)用一次。讀者可以在這個(gè)方法中將所有的請(qǐng)求參數(shù)記錄下來,以便以后使用。這個(gè)方法的定義如下:
boolean acceptableParameterName(String parameterName);
【方法2】使用RequestAware攔截器
這種方法和第1種方法類似。動(dòng)作類需要實(shí)現(xiàn)一個(gè)org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware將獲得一個(gè)com.opensymphony.xwork2.util.OgnlValueStack對(duì)象,這個(gè)對(duì)象可以獲得response、request及其他的一些信息。代碼如下所示:
packageaction;importjava.util.Map;importorg.apache.struts2.*;importcom.opensymphony.xwork2.ActionSupport;importjavax.servlet.http.*;importcom.opensymphony.xwork2.util.*;importorg.apache.struts2.interceptor.*;publicclassFirstActionextendsActionSupportimplementsRequestAware{privateMaprequest;privateHttpServletResponseresponse;publicvoidsetRequest(Maprequest){this.request=request;}publicStringexecute()throwsException{java.util.Set<String>keys=request.keySet();//枚舉所有的key值。實(shí)際上只有一個(gè)key:struts.valueStackfor(Stringkey:keys)System.out.println(key);//獲得OgnlValueStack對(duì)象OgnlValueStackstack=(OgnlValueStack)myRequest.get("struts.valueStack");//獲得HttpServletResponse對(duì)象response= (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);response.getWriter().write("實(shí)現(xiàn)RequestAware接口");}}
我們也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT來獲得HttpServletRequest和PageContext對(duì)象。這種方法有些麻煩,一般很少用,讀者可以作為一個(gè)參考。
【方法3】使用ActionContext類
這種方法比較簡單,我們可以通過org.apache.struts2.ActionContext類的get方法獲得相應(yīng)的對(duì)象。代碼如下:
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及其他對(duì)象。這就是org.apache.struts2.ServletActionContext類。我們可以直接使用ServletActionContext類的getRequest、getResponse方法來獲得HttpServletRequest、HttpServletResponse對(duì)象。代碼如下:
HttpServletResponse response = ServletActionContext.getResponse()response.getWriter().write("hello world");
從這四種方法來看,最后一種是最簡單的,讀者可以根據(jù)自己的需要和要求來選擇使用哪一種方法來獲得這些對(duì)象。
但在Struts2 Action類中仍然有很多方法可以獲得這些對(duì)象。下面就列出四種獲得這些對(duì)象的方法。
【方法1】使用Struts2 Aware攔截器
這種方法需要Action類實(shí)現(xiàn)相應(yīng)的攔截器接口。如我們要獲得HttpServletResponse對(duì)象,需要實(shí)現(xiàn)org.apache.struts2.interceptor.ServletResponseAware接口,代碼如下:
packageaction;
importcom.opensymphony.xwork2.ActionSupport;
importjavax.servlet.http.*;
importorg.apache.struts2.interceptor.*;
publicclassMyActionextendsActionSupportimplementsServletResponseAware
{
privatejavax.servlet.http.HttpServletResponseresponse;
//獲得HttpServletResponse對(duì)象
publicvoidsetServletResponse(HttpServletResponseresponse)
{
this.response=response;
}
publicStringexecute()throwsException
{
response.getWriter().write("實(shí)現(xiàn)ServletResponseAware接口");
}
}
在上面的代碼中,MyAction實(shí)現(xiàn)了一個(gè)ServletResponseAware接口,并且實(shí)現(xiàn)了setServletResponse方法。如果一個(gè)動(dòng)作類實(shí)現(xiàn)了ServletResponseAware接口,Struts2在調(diào)用execute方法之前,就會(huì)先調(diào)用setServletResponse方法,并將response參數(shù)傳入這個(gè)方法。如果想獲得HttpServletRequest、HttpSession和Cookie等對(duì)象,動(dòng)作類可以分別實(shí)現(xiàn)ServletRequestAware、SessionAware和CookiesAware等接口。這些接口都在org.apache.struts2.interceptor包中。
如果要獲得請(qǐng)求參數(shù),動(dòng)作類可以實(shí)現(xiàn)org.apache.struts2.interceptor. ParameterAware接口,但如果只想判斷某個(gè)參數(shù)是否存在,也可以實(shí)現(xiàn)com.opensymphony.xwork2.interceptor. ParameterNameAware接口。這個(gè)接口有一個(gè)acceptableParameterName方法,當(dāng)Struts2獲得一個(gè)請(qǐng)求參數(shù)時(shí),就會(huì)調(diào)用一次。讀者可以在這個(gè)方法中將所有的請(qǐng)求參數(shù)記錄下來,以便以后使用。這個(gè)方法的定義如下:
boolean acceptableParameterName(String parameterName);
【方法2】使用RequestAware攔截器
這種方法和第1種方法類似。動(dòng)作類需要實(shí)現(xiàn)一個(gè)org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware將獲得一個(gè)com.opensymphony.xwork2.util.OgnlValueStack對(duì)象,這個(gè)對(duì)象可以獲得response、request及其他的一些信息。代碼如下所示:
packageaction;importjava.util.Map;importorg.apache.struts2.*;importcom.opensymphony.xwork2.ActionSupport;importjavax.servlet.http.*;importcom.opensymphony.xwork2.util.*;importorg.apache.struts2.interceptor.*;publicclassFirstActionextendsActionSupportimplementsRequestAware{privateMaprequest;privateHttpServletResponseresponse;publicvoidsetRequest(Maprequest){this.request=request;}publicStringexecute()throwsException{java.util.Set<String>keys=request.keySet();//枚舉所有的key值。實(shí)際上只有一個(gè)key:struts.valueStackfor(Stringkey:keys)System.out.println(key);//獲得OgnlValueStack對(duì)象OgnlValueStackstack=(OgnlValueStack)myRequest.get("struts.valueStack");//獲得HttpServletResponse對(duì)象response= (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);response.getWriter().write("實(shí)現(xiàn)RequestAware接口");}}
我們也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT來獲得HttpServletRequest和PageContext對(duì)象。這種方法有些麻煩,一般很少用,讀者可以作為一個(gè)參考。
【方法3】使用ActionContext類
這種方法比較簡單,我們可以通過org.apache.struts2.ActionContext類的get方法獲得相應(yīng)的對(duì)象。代碼如下:
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及其他對(duì)象。這就是org.apache.struts2.ServletActionContext類。我們可以直接使用ServletActionContext類的getRequest、getResponse方法來獲得HttpServletRequest、HttpServletResponse對(duì)象。代碼如下:
HttpServletResponse response = ServletActionContext.getResponse()response.getWriter().write("hello world");
從這四種方法來看,最后一種是最簡單的,讀者可以根據(jù)自己的需要和要求來選擇使用哪一種方法來獲得這些對(duì)象。

