在使用struts2时,经常需要操作HttpServletRequest、HttpServletResponse、HttpSession对象,下面就说说几种获取这几种对象的方法。
1.使用ServletActionContext类
struts2为我们提供了一种最简单的方法获得以上三种对象及其他对象。这就是 org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的 getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象,进一步通过HttpServletRequest对象来获取HttpSession对象。代码如下:
package com.common.action;
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;
public class StrutsAction extends ActionSupport {
/**
* 序列号
*/
private static final long serialVersionUID = -6685470801863042575L;
protected HttpServletRequest request= ServletActionContext.getRequest();
protected HttpServletResponse response= ServletActionContext.getResponse();
protected HttpSession session=request.getSession();
}
2.实现struts2 Aware接口
这种方法需要action实现相应的拦截器接口,代码如下。
package com.common;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction extends ActionSupport
implements SessionAware, ServletRequestAware, ServletResponseAware
{
protected HttpServletRequest request=null;
protected HttpServletResponse response=null;
protected HttpSession session=null;
public void setServletRequest(HttpServletRequest arg0)
{
this.request=arg0;
this.session=this.request.getSession();
}
public void setServletResponse(HttpServletResponse arg0)
{
this.response=arg0;
}
public void setSession(Map arg0)
{
}
}
3.实现Request Aware接口
该方法与第二种类似,动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware将获得一个com.opensymphony.xwork2.util.OgnlValueStack对象,这个对象可以获得response、request及其他的一些信息。代码如下所示:
package com.common;
import java.util.Map;
import org.apache.struts2.*;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import com.opensymphony.xwork2.util.*;
import org.apache.struts2.interceptor.*;
public class StrutsAction extends ActionSupport implements RequestAware
{
private Map map;
private HttpServletResponse response;
private HttpServletRequest request;
private HttpSession session;
public void setRequest(Map map)
{
this.map = map;
}
public String execute() throws Exception
{
java.util.Set<String> keys = map.keySet();
//枚举所有的key值。实际上只有一个key:struts.valueStack
for(String key: keys)
System.out.println(key);
//获得OgnlValueStack 对象
OgnlValueStack stack =(OgnlValueStack)map.get("struts.valueStack");
//获得HttpServletResponse对象
response =(HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);
request =(HttpServletRequest)stack.getContext().get(StrutsStatics.HTTP_REQUEST);
session = request.getSession();
return null;
}
}
4. 使用ActionContext类
该方法与第1中类似,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:
package com.common;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class StrutsAction extends ActionSupport
{
private HttpServletResponse response;
private HttpServletRequest request;
private HttpSession session;
public String execute() throws Exception
{
ActionContext actionContext = ActionContext.getContext();
response =(HttpServletResponse) actionContext.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);
request =(HttpServletRequest)actionContext.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
session = request.getSession();
return null;
}
}
这4种方式,一般第1种、第2种用的比较多,也比较方便。具体怎么用还是需要根据项目实际情况选择。