標籤:blog http java 使用 io strong ar 資料 art
與Servlet API解耦的訪問方式
Structs2對HttpServletRequest,HttpSession,和ServletContext進行了封裝,構造了三個Map對象來替代這三種對象,在Action中,直接使用HttpServletRequest,Httpsession,ServletContext對應的Map對象來儲存和讀取資料。
要擷取這三個Map對象,可以使用com.opensymphony.xwork2.ActionContext類。
ActionContext是action執行的上下文,在ActionContext中儲存了action執行所需要的一組對象,包括parameters,request,session,application,locale等。
ActionContext類沒有提供類似getRequest()這樣的方法來擷取封裝了HttpServletRequest的Map對象。要請求Map對象,需要用get()方法傳遞參數"request"
[html] view plaincopy
- public Object get(Object key)
-
- public Map getSession()
-
- public Map getApplication()
Action:
[java] view plaincopy
- ActionContext context = ActionContext.getContext();
- Map request=(Map)context.get("request");
- Map session = context.getSession();
- Map application = context.getApplication();
-
- request.put("greeting" "hello request");
- session.put("user",user);
-
- Integer count = (Integer)application.get("counter");
-
-
- application.put("counter",count);
JSP:
[html] view plaincopy
- <h3>${sessionScope.user.username},${requestScope.greeting}。</h3><br />
- ${applicationScope.counter}
利用請求對象來傳遞資料還有一種方式,可以直接利用ActionContext類的put()方法將資料儲存到ActionContext中
[java] view plaincopy
- Actioncontext.getContext().put("greeting","hello ");
然後在結果頁面中,從請求對象中取出greeting屬性
[java] view plaincopy
- $(requestScope.greeting)或者<%=request.getAttribute("greeting")%>
ActionContext中儲存的資料能夠從請求對象中得到,其中的奧妙就在於Struct2中的org.apache.struts2.dispatcher.StrutsRequestWrapper類,這個類是HttpServletRequest的封裝類,它重寫了getAttribute()方法,在這個方法中,先請求對象中尋找屬性,如果沒有,就從ActionContext中尋找。這就是為什麼ActionContext中儲存的資料能夠從請求對象中得到的原因。
除了ActionContext來擷取request,session和application對象這種方式外,Action類還可以實現某些特定介面,讓Structs2在運行時向Action執行個體注入request,session,application對象。與之對應的三個介面和他們的方法:
[java] view plaincopy
- org.apache.struts2.interceptor.RequestAware
- org.apache.struts2.interceptor.SessionAware
- org.apache.struts2.interceptor.ApplicationAware
[java] view plaincopy
- public class LoginAction implements Action,RequestAware,SessionAware,ApplicationAware{
- private Map request;
- private Map session;
- private Map application;
-
- // ......
-
- @override
- public void setRequest(Map request){
- this.request=request;
- }
- @override
- public void setSession(Map session){
- this.session=session;
- }
- @override
- public void setApplication(Map application){
- this.application=application;
- }
-
- }
與Servlet API耦合的訪問方式
要直接擷取HttpServletRequest和ServletContext對象,可以使用org.apache.struts2.ServletActionContext類,在這個類中,定義了兩個靜態方法
[java] view plaincopy
- public static HttpserlvetRequest getRequest()
-
- public static HttpservletResponse getResponse()
-
- pubolic static ServletContext getServletContext()
HttpSession對象可以通過HttpServletRequest對象來取到
還可以調用ActionContext對象的get()方法,傳遞ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT索引值來得到HttpServletRequest和ServletContext對象,如下:
[java] view plaincopy
- ActionContext.getcontext().get(ServletActionContext.HTTP_REQUEST);
- ActionContext.getcontext().get(ServletActionContext.HTTP_RESPONSE);
- ActionContext.getcontext().get(ServletActionContext.SERVLET_CONTEXT);
[java] view plaincopy
- HttpServletResquest request = ServletActionContext.getRequest();
- HttpSession session = request.getSession();
- ServletContext context = ServletActionContext.getServletContext();
- //application中儲存資料
- Integer count = (Integer)context.getAttribute("counter");
除了利用ServletActionContext來擷取HttpServletRequest對象和ServletContext對象這種方式外,Action類還可以實現ServletRequestAware和ServletContextAware介面,由Struts2向Action執行個體注入HttpServletRequest和ServletContext對象
ServeletRequestAware介面和ServletContextAware介面不在同一個包,前者在org.apache.structs2.interceptor包中,後者在org.apache.struts2.util包中。
[java] view plaincopy
- public class LoginAction implements Action,ServletRequestAware,ServletContextAware{
- private HttpServletRequest request;
- private ServletContext context;
-
- //......
-
- @override
- public void setServletRequest(...){
- //...
- }
-
- @override
- public void setServletContext(...){
- //...
- }
- }
[Struts2]訪問request,session和application對象(轉)