1. 程式人生 > >struts2 獲取web資源

struts2 獲取web資源

我們知道struts2接受客戶端請求,在Action中進行處理後,將檢視結果返回。struts2容器自身不依賴於web容器,不用和servlet物件中的請求(request)、響應(response)進行關聯,對於請求的引數,通過paramerInterceptor將引數封裝在Action中,然後通過呼叫get、set方法將引數值設定進Action之中。如果僅僅獲取引數,可能有時候滿足不了開發的需求,有時我們要獲取request或者response中的資訊,要對其進行設定、處理。

一、ActionContext

    是Action執行的上下文,Action的上下文可以看作是一個容器,裡面封裝了請求(Request)、會話(Session)、Application等,這裡面的Request、Session、Application是Map型別的,往裡面封裝的是鍵值對,所以這就體現了struts2不與底層servlet Api打交道,那麼對很多web的相關物件

進行封裝,這樣可以達到Action與web層解耦。

用ActionContext得到Map型別的Request、Session、Application。

例子:

    獲取request:

     Map request = ActionContext.getContext().get("request");

    往request裡封裝資料

    request.put("name", value);

    在前臺就可以用request.getAttribute("name");

    獲取session

    Map session = ActionContext.getContext().getSession();

    將資料封裝到session中

    session.put("name", value);

    在前臺頁面上用sessionScope.getAttribute("name");得到session裡面封裝的值。

得到session、request有點區別,得到request用的是get("reqeust"),得到session用的是getSession()

也可以直接對Java Servlet Http的請求(HttpServletRequest)、響應(HttpServletResponse)操作,和上面的例子有點區別,注意區別

ActionContext ctx = ActionContext.getContext();       
      
  HttpServletRequest request = (HttpServletRequest)ctx.get(ServletActionContext.HTTP_REQUEST);
  HttpServletResponse response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE);

用法就和Servlet中的request、response用法一樣

二、ServletActionContext

它繼承ActionContext,所以ServletActionContext也可以得到HttpServetRequest、HttpServletResponse,,它也提供了直接與Servlet相關物件訪問的功能,它可以取得的物件有:

(1)javax.servlet.http.HttpServletRequest : HTTPservlet請求物件

(2)javax.servlet.http.HttpServletResponse : HTTPservlet相應物件

(3)javax.servlet.ServletContext : Servlet上下文資訊

(4)javax.servlet.ServletConfig : Servlet配置物件

(5)javax.servlet.jsp.PageContext : Http頁面上下文

如何獲取HttpRequest、HttpResponse

例子

  HttpServletRequest request = ServletActionContext.getRequest();

  HttpServletResponse response = ServletActionContext.getResponse();

然後就可以用request.setAttribute("name", value)方法了。

總結:不難看出,兩者之間還是存在很多共同功能,那麼我們還是根據自己的需求進行選擇,能用ActionContext物件滿足就儘量使用ActionContext,避免讓我們直接去訪問Servlet物件。另外,不要在Action還沒例項化的時候去通過ActionContext呼叫方法,因為Action例項在ActionContext例項之前建立,ActionContext中一些值還沒有設定,會返回null。