前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Struts】Struts2在Action中获得Servlet对象(Request/Response/Session/ServletContext)的四种方法

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

作者头像
陈树义
发布2022-04-29 10:45:27
3670
发布2022-04-29 10:45:27
举报
文章被收录于专栏:陈树义陈树义

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档