【Struts】Struts2在Action中获得Servlet对象(Request/Response/Session/ServletContext)的四种方法
参考自:http://blog.csdn.net/softimes/article/details/7084984
在struts1.x Action 类的execute方法中,有四个参数,其中两个就是response和request。而在Struts2中,并没有任何参数。
因此,就不能简单地从execute方法获得HttpServletResponse或HttpServletRequest对象了。但在Struts2 Action类中仍然有很多方法可以获得这些对象。
下面就列出四种获得这些对象的方法。
1、Action继承Struts2 的Servlet*Aware 拦截器
这种方式要求Action继承org.apache.struts2.interceptor中对应的对象,如:HttpServletResponse对象、ServletRequestAware对象、SessionAware对象、CookiesAware等接口。
例如我们希望使用在MyAction类中HttpServletResponse对象,则代码如下:
1 import com.opensymphony.xwork2.ActionSupport; 2 import javax.servlet.http.*; 3 import org.apache.struts2.interceptor.*; 4 public class MyAction extends ActionSupport implements ServletResponseAware 5 { 6 privatejavax.servlet.http.HttpServletResponseresponse; 7 //获得HttpServletResponse对象 8 public void setServlet Response(HttpServletResponseresponse) 9 { 10 this.response=response; 11 } 12 public String execute() throws Exception 13 { 14 response.getWriter().write("实现ServletResponseAware接口"); 15 } 16 }
如果要获取多个Servlet对象,那么这种方式就过太复杂了,不方便使用。
2、Action继承RequestAware拦截器
1 package com.chanshuyi.download; 2 3 import java.util.Map; 4 import javax.servlet.http.HttpServletResponse; 5 import org.apache.struts2.StrutsStatics; 6 import org.apache.struts2.interceptor.RequestAware; 7 import com.opensymphony.xwork2.ActionSupport; 8 import com.opensymphony.xwork2.ognl.OgnlValueStack; 9 10 public class RequestUtil extends ActionSupport implements RequestAware{ 11 12 private Map<String, Object> request; 13 private HttpServletResponse response; 14 15 public void setRequest(Map<String, Object> arg0) { 16 this.request = arg0; 17 } 18 19 public String execute() 20 { 21 java.util.Set<String> keys = request.keySet(); 22 for(String key : keys) 23 { 24 System.out.println(key); 25 } 26 //获得OgnlValueStack对象 27 OgnlValueStack stack = (OgnlValueStack)request.get("struts.valueStack"); 28 //获得HttpServletResponse对象 29 response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE); 31 return null; 32 } 33 }
我们也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT来获得HttpServletRequest和PageContext对象。
这种方法有些麻烦,一般很少用,读者可以作为一个参考。
3、使用ActionContext类
这种方法比较简单,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:
1 HttpServletResponse response = (HttpServletResponse) 2 ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); 3 HttpServletRequest request = (HttpServletRequest) 4 ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
4、【推荐】使用ServletActionContext类
Struts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。
我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。代码如下:
HttpServletResponse response = ServletActionContext. getResponse(); response.getWriter().write("hello world"); ServletContext servletContext = ServletActionContext.getServletContext();
利用ServletContext可以获取项目在磁盘的绝对路径,可以用于上传下载文件时的参数。
这种方式最简单,最好用,推荐!