posts - 22, comments - 17, trackbacks - 0, articles - 15
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
           

          struts1.x Action類的execute方法中,有四個參數(shù),其中兩個就是responserequest。而在Struts2中,并沒有任何參數(shù),因此,就不能簡單地從execute方法獲得HttpServletResponseHttpServletRequest對象了。

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

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

               這種方法需要Action類實(shí)現(xiàn)相應(yīng)的攔截器接口。如我們要獲得HttpServletResponse對象,需要實(shí)現(xiàn)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(
          "實(shí)現(xiàn)ServletResponseAware接口");
              }
          }

          在上面的代碼中,MyAction實(shí)現(xiàn)了一個ServletResponseAware接口,并且實(shí)現(xiàn)了setServletResponse方法。如果一個動作類實(shí)現(xiàn)了ServletResponseAware接口,Struts2在調(diào)用execute方法之前,就會先調(diào)用setServletResponse方法,并將response參數(shù)傳入這個方法。如果想獲得HttpServletRequestHttpSessionCookie等對象,動作類可以分別實(shí)現(xiàn)ServletRequestAwareSessionAwareCookiesAware等接口。這些接口都在org.apache.struts2.interceptor包中。

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

          boolean acceptableParameterName(String parameterName);

          【方法2】使用RequestAware攔截器

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


          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值。實(shí)際上只有一個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("實(shí)現(xiàn)RequestAware 接口");
              }
          }

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

          【方法3】使用ActionContext

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

              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類的getRequestgetResponse方法來獲得HttpServletRequestHttpServletResponse對象。代碼如下:

              HttpServletResponse response = ServletActionContext.getResponse()

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

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


          評論

          # re: Struts2 在Action類中獲得HttpServletResponse對象的四種方法  回復(fù)  更多評論   

          2008-05-15 14:42 by yxc
          正在研究這方面的東西,謝謝!

          # re: Struts2 在Action類中獲得HttpServletResponse對象的四種方法[未登錄]  回復(fù)  更多評論   

          2008-09-15 21:03 by BOBO
          非常好,謝謝樓主咯!

          # re: Struts2 在Action類中獲得HttpServletResponse對象的四種方法  回復(fù)  更多評論   

          2009-02-04 11:20 by ldd
          剛接觸不久,謝啦。
          主站蜘蛛池模板: 梅河口市| 靖安县| 滨海县| 宣汉县| 锡林郭勒盟| 永吉县| 盐边县| 民和| 普陀区| 乐安县| 内江市| 蒙自县| 白城市| 富阳市| 望江县| 平舆县| 若尔盖县| 曲靖市| 南岸区| 沂源县| 南通市| 涿州市| 子洲县| 罗田县| 平陆县| 永昌县| 瑞昌市| 昆明市| 莱西市| 和田市| 阜南县| 施秉县| 晋江市| 昆明市| 台东市| 德兴市| 宁陵县| 西畴县| 班玛县| 洪洞县| 吴江市|