struts2訪問servlet的API

來源:互聯網
上載者:User

標籤:struts訪問servlet的api

1.struts作為控制器,正常很多時候要訪問到servlet的API,常用功能:
  (1).擷取請求參數,控制介面跳轉
  (2).把共用資料存放區於request,session,servletContext中,擷取範圍中的資料

宏觀的來說,應該有三種訪問方式。

2.第一種:實現介面,訪問Action時完成注入
ServletContextAware
void setServletContext(javax.servlet.ServletContext context)

ServletRequestAware
void setServletRequest(javax.servlet.http.HttpServletRequest request)

ServletResponseAware
void setServletResponse(javax.servlet.http.HttpServletResponse response)

上述方式:Action和ServletAPI耦合太深了.

簡單的範例程式碼:

package cn.wwh.www.web.servletapi;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts2.interceptor.ServletRequestAware;import org.apache.struts2.interceptor.ServletResponseAware;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionSupport;/** *類的作用: *  *  *@author 一葉扁舟 *@version 1.0 *@建立時間: 2014-8-16 上午07:54:05 */public class ParamAction1 extends ActionSupport implements ServletRequestAware,ServletResponseAware {private static final long serialVersionUID = 1L;private HttpServletRequest request;private HttpServletResponse response;@Overridepublic String execute() throws Exception {String name = request.getParameter("name");String age = request.getParameter("age");System.out.println("name:" + name);System.out.println("age:" + age);response.getWriter().write(name + "<br/>");response.getWriter().write(age);// 沒有起到效果,很奇怪request.getRequestDispatcher("/views/servletapi/result.jsp").forward(request, response);return Action.NONE;}public void setServletRequest(HttpServletRequest request) {this.request = request;}public void setServletResponse(HttpServletResponse response) {this.response = response;}}



 

3.第二種:使用ServletActionContext(開發中使用的很多,因為簡單,直觀)ServletActionContext: 通過該類提供了ServletAPI的環境,可以擷取到Servlet的API資訊static PageContext getPageContext()static HttpServletRequest getRequest()static HttpServletResponse getResponse()static ServletContext getServletContext()

該方案可避免Action類實現XxxAware介面,但Action依然與Servlet API直接耦合但是該方式和ServletApi也有耦合.

簡單的執行個體代碼:

package cn.wwh.www.web.servletapi;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;/** *類的作用: *  *  *@author 一葉扁舟 *@version 1.0 *@建立時間: 2014-8-16 上午09:09:02 */public class ParamAction2 extends ActionSupport {private static final long serialVersionUID = 1L;public String execute() throws Exception {HttpServletRequest req = ServletActionContext.getRequest();String name = ServletActionContext.getRequest().getParameter("name");String age = ServletActionContext.getRequest().getParameter("age");HttpSession session = req.getSession();session.getServletContext();System.out.println(name);System.out.println(age);HttpServletResponse resp = ServletActionContext.getResponse();return NONE;}}

4.第三種方式:使用ActionContext類(沒有和ServletApi耦合,開發推薦使用方式)
   Action的上下文,該類提供了Action存在的環境. 也就是說通過該類可以擷取到Action相關的一切資料.

   ActionContext
   getContext() 返回ActionContext執行個體對象
   get(key) 相當於 HttpServletRequest的getAttribute(String name)方法
   put(String,Object) 相當於HttpServletRequest的setAttribute方法
   getApplication() 返回一個Map對象,存取ServletContext屬性
   getSession() 返回一個Map對象,存取HttpSession屬性
   getParameters() 類似調用HttpServletRequest的getParameterMap()方法 
   setApplication(Map) 將該Map執行個體裡key-value儲存為ServletContext的屬性名稱、屬性值
   setSession(Map) 將該Map執行個體裡key-value保持為HttpSession的屬性名稱、屬性值
   擷取ActionContext對象:  ActionContext context = ActionContext.getContext();

簡單的範例程式碼:

package cn.wwh.www.web.servletapi;import java.lang.reflect.Array;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;/** *類的作用: * * *@author 一葉扁舟 *@version 1.0 *@建立時間: 2014-8-16   上午09:31:42 */public class ParamAction3 extends ActionSupport {private static final long serialVersionUID = 1L;public String execute() throws Exception {ActionContext ctx = ActionContext.getContext();Map<String,Object> paramMap = ctx.getParameters();System.out.println(paramMap);//去paramMap.get("name")數組中索引為0的元素值System.out.println(Array.get(paramMap.get("name"), 0));//往request設定共用資料ctx.put("name", "一葉扁舟");//request.setAttribute(key,Object)Object requestValue  = ctx.get("name");System.out.println(requestValue);//往Session設定共用資料//Map<String,Object> getSession()Map<String,Object> sessionMap = ctx.getSession();sessionMap.put("sessionKey", "sessionValue");//往ServletContext中設定共用資料//.Map<String,Object> getContextMap()Map<String,Object> contextMap= ctx.getContextMap();contextMap.put("appKey", "appValue");return SUCCESS;}}
注意在jsp中讀取資料為:
        ${requestScope.name}<br />
        ${sessionScope.sessionKey}<br />
        ${appKey}


 5.通過ActionContext擷取request、session、application解耦Map

(1) 對request域的操作
actionContext.put("name", "一葉扁舟") --> 相等與request.setAttribute("name", "一葉扁舟");
Object o = actionContext.get("name"); --> 等同與Object o = request.getAttribute("name");
(2).對session域的操作
Map<String,Object> sessionMap = ActionContext.getContext().getSession();
sessionMap.put("name", "一葉扁舟") --> 等同與session.setAttribute("name", "一葉扁舟");
Object o = sessionMap.get("name") --> 等同與Object o = session.getAttribute("name");
(3).對application域的操作
Map<String,Object> appMap = ActionContext.getContext().getApplication();
appMap.put("name", "一葉扁舟") --> 等同與servletContext.setAttribute("name", "一葉扁舟");

Object o = appMap.get("name") --> 等同與Object o = servletContext.getAttribute("name");

(4). 對請求參數的操作
Map<String,Object> paramMap = ActionContext.getContext().getParameters();
Object o = paramMap.get("username");
String[] values = (String[])o;
String username = values[0];

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.