Struts2 - 在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接口,代碼如下:
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及其他的一些信息。代碼如下所示:
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");
?
總結
以上是生活随笔為你收集整理的Struts2 - 在Action类中获得HttpServletResponse对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML表单总结
- 下一篇: HTTP状态码和编程