關於struts2開發Action獲取servletApi的三種方式
首先給大家說明一下servletApi:
相關servletApi也就是指的是request、response、session以及cookie等值作用域
Action訪問servletApi的三種方式:
- 通過Action類去實現感知介面(也稱攔截器介面)
如下圖程式碼所示:我們想獲取到HttpServletRequest物件和HttpServletResponse物件,可以實現相應的攔截器口,通過介面內的setServletApi()方法獲取到該物件,進行下一步的訪問操作
package com.practice.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.ActionSupport; /** * 通過感知介面來獲取servletApi * * @author Administrator * */ public class ServletApiAction extends ActionSupport implements ServletRequestAware,ServletResponseAware { private static final long serialVersionUID = -7576282176546939431L; private HttpServletRequest request; private HttpServletResponse response; public String execute() throws Exception { //獲取瀏覽器傳過來引數名為name的引數 System.out.println("servletApi......" + request.getParameter("name")); //獲取編碼方式 System.out.println("servletApi......" + response.getCharacterEncoding()); return NONE; } /** * servletRequestAware感知介面獲取servletApi-request */ public void setServletRequest(HttpServletRequest request) { this.request = request; } /** * servletResponseAware感知介面獲取servletApi-response */ public void setServletResponse(HttpServletResponse response) { this.response = response; } }
當然如果你需要獲取其它的servletApi物件,也是可以通過類去實現相應的感知介面獲取servletApi物件。
2. 使用servletActionContext類,該類提供了相關靜態方法可以返回相關servletApi物件
package com.practice.servletApi; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /** * 通過servletActionContext來獲取返回的servletApi * * @author Administrator * */ public class ServletApiAction2 extends ActionSupport { private static final long serialVersionUID = -7576282176546939431L; public String execute() throws Exception { //呼叫ServletActionContext類中的靜態方法 HttpServletRequest request = ServletActionContext.getRequest(); System.out.println("servletApi......" + request.getParameter("name")); request.setAttribute("requestName", "xixi"); // request.getSession().setAttribute("sessionName", "hihi"); System.out.println(request.getAttribute("requestName")); // System.out.println(request.getSession().getAttribute("sessionName")); return SUCCESS; } }
3. 使用ActionContext類,該類本身就是struts2對servletApi的封裝
關於ActionContext上下文 :
ActionContext是Action的環境物件,每一次請求都是一個新的Action物件,一個ActionContext物件封裝了這一次請求的相關資料。
建立ActionContext : ActionContext ctx = ActionContext.getContext();
關於 ActionContext 訪問ServletApi : ActionContext在操作各作用域物件時,將各物件看成一個Map,實際操作Map
package com.practice.servletApi;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* 通過servletActionContext來獲取返回的servletApi
*
* @author Administrator
*
*/
public class ServletApiAction3 extends ActionSupport {
private static final long serialVersionUID = -7576282176546939431L;
public String execute() throws Exception {
//建立ActionContext物件
ActionContext actionContext = ActionContext.getContext();
//呼叫ActionContext類中的方法
//獲取請求引數,
Map<String, Object> mapContext = actionContext.getParameters();
// request作用域設定共享資料
String[] arr = (String[]) mapContext.get("name");
System.out.println(arr[0]+"....");
actionContext.put("requestName", "requestValue");
Map<String, Object> mapSession = actionContext.getSession();
mapSession.put("sessionName", "sessionValue");
return SUCCESS;
}
}
最後,注:一,為什麼是關於struts2訪問servletApi :在struts2中他不像struts1一樣有著方法自帶的servletApi引數
二,在struts2的Action訪問servletApi時關於實現感知介面獲取servletApi的問題 :與servletApi耦合嚴重。