1. 程式人生 > >關於struts2開發Action獲取servletApi的三種方式

關於struts2開發Action獲取servletApi的三種方式

首先給大家說明一下servletApi:

    相關servletApi也就是指的是request、response、session以及cookie等值作用域


Action訪問servletApi的三種方式:

  1.       通過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耦合嚴重。