【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可以获取项目在磁盘的绝对路径,可以用于上传下载文件时的参数。

这种方式最简单,最好用,推荐!

posted @ 2014-07-16 17:55  陈树义  阅读(464)  评论(0编辑  收藏  举报