
在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request。而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得HttpServletResponse或HttpServletRequest对象了。
但在Struts2 Action类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。
使用Struts2 Aware拦截器
这种方法需要Action类实现相应的拦截器接口。如我们要获得HttpServletResponse对象,需要实现org.apache.struts2.interceptor.ServletResponseAware接口,代码如下:
使用RequestAware拦截器
这种方法和第1种方法类似。动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware将获得一个com.opensymphony.xwork2.util.OgnlValueStack对象,这个对象可以获得response、request及其他的一些信息。代码如下所示:
使用ActionContext类
这种方法比较简单,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:
使用ServletActionContext类
Struts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。代码如下:
总结:从这四种方法来看,最后一种是最简单的,读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。
但在Struts2 Action类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。
使用Struts2 Aware拦截器
这种方法需要Action类实现相应的拦截器接口。如我们要获得HttpServletResponse对象,需要实现org.apache.struts2.interceptor.ServletResponseAware接口,代码如下:
01 | import com.opensymphony.xwork2.ActionSupport; |
02 | import javax.servlet.http.*; |
03 | import org.apache.struts2.interceptor.*; |
04 |
05 | public class MyAction extends ActionSupport implements ServletResponseAware |
06 | { |
07 | private javax.servlet.http.HttpServletResponse response; |
08 | // 获得HttpServletResponse对象 |
09 | public void setServletResponse(HttpServletResponse response) |
10 | { |
11 | this .response = response; |
12 | } |
13 | public String execute() throws Exception |
14 | { |
15 | response.getWriter().write( "实现ServletResponseAware接口" ); |
16 | } |
17 | } |
这种方法和第1种方法类似。动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware将获得一个com.opensymphony.xwork2.util.OgnlValueStack对象,这个对象可以获得response、request及其他的一些信息。代码如下所示:
01 | import java.util.Map; |
02 | import org.apache.struts2.*; |
03 | import com.opensymphony.xwork2.ActionSupport; |
04 | import javax.servlet.http.*; |
05 | import com.opensymphony.xwork2.util.*; |
06 | import org.apache.struts2.interceptor.*; |
07 |
08 | public class FirstAction extends ActionSupport implements RequestAware |
09 | { |
10 | private Map request; |
11 | private HttpServletResponse response; |
12 | |
13 | public void setRequest(Map request) |
14 | { |
15 | this .request = request; |
16 | } |
17 | public String execute() throws Exception |
18 | { |
19 | java.util.Set<String> keys = request.keySet(); |
20 | // 枚举所有的key值。实际上只有一个key:struts.valueStack |
21 | for (String key: keys) |
22 | System.out.println(key); |
23 | // 获得OgnlValueStack 对象 |
24 | OgnlValueStack stack = (OgnlValueStack)request.get( "struts.valueStack" ); |
25 | // 获得HttpServletResponse对象 |
26 | response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE); |
27 | response.getWriter().write( "实现RequestAware 接口" ); |
28 | } |
29 | } |
使用ActionContext类
这种方法比较简单,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:
1 | HttpServletResponse response = (HttpServletResponse)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); |
2 | HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); |
Struts2为我们提供了一种最简单的方法获得HttpServletResponse及其他对象。这就是org.apache.struts2.ServletActionContext类。我们可以直接使用ServletActionContext类的getRequest、getResponse方法来获得HttpServletRequest、HttpServletResponse对象。代码如下:
1 | HttpServletResponse response = ServletActionContext.getResponse(); |
2 | response.getWriter().write( "hello world" ); |