首先给大家说明一下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耦合严重。