参考自: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对象,则代码如下:
代码语言:javascript复制 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拦截器
代码语言:javascript复制 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方法获得相应的对象。代码如下:
代码语言:javascript复制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对象。代码如下:
代码语言:javascript复制HttpServletResponse response = ServletActionContext. getResponse();
response.getWriter().write("hello world");
ServletContext servletContext = ServletActionContext.getServletContext();
利用ServletContext可以获取项目在磁盘的绝对路径,可以用于上传下载文件时的参数。
这种方式最简单,最好用,推荐!