关于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耦合严重。

猜你喜欢

转载自blog.csdn.net/Giraffe_it/article/details/83829394