0
点赞
收藏
分享

微信扫一扫

【Struts】Struts2在Action中获得Servlet对象(Request/Response/Session/ServletContext)的四种方法

非衣所思 2022-07-13 阅读 78


在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

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

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

【Struts】Struts2在Action中获得Servlet对象(Request/Response/Session/ServletContext)的四种方法_J2EE



举报

相关推荐

0 条评论