`

在Action类中获得HttpServletResponse对象

阅读更多

在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request。而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得HttpServletResponse或HttpServletRequest对象了。

但在Struts2 Action类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。

【方法1】使用Struts2 Aware拦截器

这种方法需要Action类实现相应的拦截器接口。如我们要获得HttpServletResponse对象,需要实现org.apache.struts2.interceptor.ServletResponseAware接口,代码如下:

  1. package action;  
  2.  
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. import javax.servlet.http.*;  
  5. import org.apache.struts2.interceptor.*;  
  6.  
  7. public class MyAction extends ActionSupport implements ServletResponseAware  
  8. {  
  9.     private javax.servlet.http.HttpServletResponse response;  
  10.     // 获得HttpServletResponse对象  
  11.     public void setServletResponse(HttpServletResponse response)  
  12.     {  
  13.         this.response = response;  
  14.     }      
  15.     public String execute() throws Exception  
  16.     {      
  17.         response.getWriter().write("实现ServletResponseAware接口");  
  18.     }  
  19. }  

在上面的代码中,MyAction实现了一个ServletResponseAware接口,并且实现了setServletResponse方法。如果一个动作类实现了ServletResponseAware接口,Struts2在调用execute方法之前,就会先调用setServletResponse方法,并将response参数传入这个方法。如果想获得HttpServletRequest、HttpSession和Cookie等对象,动作类可以分别实现ServletRequestAware、SessionAware和CookiesAware等接口。这些接口都在org.apache.struts2.interceptor包中。

如果要获得请求参数,动作类可以实现org.apache.struts2.interceptor. ParameterAware接口,但如果只想判断某个参数是否存在,也可以实现com.opensymphony.xwork2.interceptor. ParameterNameAware接口。这个接口有一个acceptableParameterName方法,当Struts2获得一个请求参数时,就会调用一次。读者可以在这个方法中将所有的请求参数记录下来,以便以后使用。这个方法的定义如下:

boolean acceptableParameterName(String parameterName);

【方法2】使用RequestAware拦截器

这种方法和第1种方法类似。动作类需要实现一个org.apache.struts2.interceptor.RequestAware接口。所不同的是RequestAware将获得一个com.opensymphony.xwork2.util.OgnlValueStack对象,这个对象可以获得response、request及其他的一些信息。代码如下所示:

  1. package action;  
  2.  
  3. import java.util.Map;  
  4. import org.apache.struts2.*;  
  5. import com.opensymphony.xwork2.ActionSupport;  
  6. import javax.servlet.http.*;  
  7. import com.opensymphony.xwork2.util.*;  
  8. import org.apache.struts2.interceptor.*;  
  9.  
  10. public class FirstAction extends ActionSupport implements RequestAware  
  11. {  
  12.     private Map request;  
  13. private HttpServletResponse response;  
  14.       
  15.     public void setRequest(Map request)  
  16.     {  
  17.         this.request = request;          
  18.     }      
  19.     public String execute() throws Exception  
  20.     {      
  21.         java.util.Set< String> keys = request.keySet();  
  22.         // 枚举所有的key值。实际上只有一个key:struts.valueStack  
  23.         for(String key: keys)  
  24.             System.out.println(key);  
  25.         // 获得OgnlValueStack 对象  
  26.         OgnlValueStack stack = (OgnlValueStack)request.get("struts.valueStack");  
  27.         // 获得HttpServletResponse对象  
  28.         response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);  
  29.         response.getWriter().write("实现RequestAware 接口");  
  30.     }  
  31. }  

我们也可以使用StrutsStatics.HTTP_REQUEST、StrutsStatics.PAGE_CONTEXT来获得HttpServletRequest和PageContext对象。这种方法有些麻烦,一般很少用,读者可以作为一个参考。

【方法3】使用ActionContext类

这种方法比较简单,我们可以通过org.apache.struts2.ActionContext类的get方法获得相应的对象。代码如下:

HttpServletResponse response = (HttpServletResponse)

ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

HttpServletRequest request = (HttpServletRequest)

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");

从这四种方法来看,最后一种是最简单的,读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。

分享到:
评论

相关推荐

    Struts2教程:获得HttpServletResponse对象

    ### Struts2教程:获得HttpServletResponse对象 在深入探讨如何在Struts2框架中获取`HttpServletResponse`对象之前,我们先来简要回顾一下Struts2框架的基本概念及其与传统Struts1.x的区别。 #### Struts2框架简介...

    Struts2在Action中获得Response对象的四种方法

    通过这个接口,Struts2框架会在执行execute方法前自动将HttpServletResponse对象注入到Action类的成员变量中。例如: ```java public class MyAction extends ActionSupport implements ServletResponseAware { ...

    struts2学习教程

    struts2学习教程包括:第一个Struts2程序,处理一个form多个submit,struts.xml常用配置解析,使用validate方法验证数据,使用Validation框架验证数据,在Action类中获得HttpServletResponse对象的四种方法,上传...

    Struts2.0框架技术详解

    #### 七、在Action类中获得HttpServletResponse对象的四种方法 1. **通过ActionContext**:使用`ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE)`。 2. **通过ServletActionContext**:直接...

    Struts2的Action中获得request response session几种方法

    在Struts2框架中,Action类是处理用户请求的核心组件,它负责业务逻辑的执行以及与视图层的交互。为了使Action能够访问到HTTP请求(HttpServletRequest)、响应(HttpServletResponse)、会话(HttpSession)等关键...

    struts2中action如何获取jsp页面参数1.pdf

    在Struts2中,Action类是业务逻辑的核心,它负责处理来自客户端(通常是一个JSP页面)的请求,并返回响应。本文将详细讨论如何在Struts2的Action中获取JSP页面的参数,以及相关的上下文类ActionContext和...

    struts2的API耦合与动态方法调用

    3. **实现ServletAware接口**:为了进一步解耦,Struts2允许开发者通过实现ServletRequestAware或ServletResponseAware接口,让Action类自动注入HttpServletRequest和HttpServletResponse对象。这样,无需在Action类...

    Struts1与Struts2的12点区别

    这样,即使Action类需要访问`HttpServletRequest`和`HttpServletResponse`,也可以通过注入方式获得。这种方式提高了Action类的可测试性和可移植性。 #### 4. 可测性的对比 - **Struts1**:测试Action类较为困难,...

    超级有影响力霸气的Java面试题大全文档

    知道其行为的其它类可以在类中实现这些方法。  接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以...

    strut2 servletapi

    1. **HttpServletRequest对象**:在Struts2中,我们可以从Action上下文(`ActionContext`)获取到`ServletActionContext`,然后通过`ServletActionContext.getRequest()`方法获得`HttpServletRequest`对象。...

    struts1与struct2的不同

    - **Struts2**:Action类可以实现`Action`接口,也可以实现其他接口以获得定制服务。它提供了`ActionSupport`基类,但Action接口并非强制要求。任何具有`execute`方法的POJO(Plain Old Java Object)都可作为...

    在Action中以Struts2的方式输出JSON数据的实例

    在本实例中,Action类为UserAction,它继承自ActionSupport,这意味着它已经具备了基本的Action功能,同时还可以获得ActionSupport提供的各种工具方法,例如国际化、输入校验等。 在UserAction类中定义了几个方法,...

    struts1和struts2的对比

    - Struts1的Action通常需要直接处理HTTPServletRequest和HTTPServletResponse对象,这增加了代码的耦合性。 - Action的生命周期由容器管理,且执行方法为`execute()`。 - 测试Struts1的Action时,通常需要模拟...

    用Servlet获得界面中用户填写的信息

    在`YourServlet`类中,我们需要重写`doPost`方法,这是处理POST请求的地方。`HttpServletRequest`对象用于获取请求参数,而`HttpServletResponse`对象用于向客户端发送响应。 ```java @Override protected void...

    Struts2课后练习答案.docx

    - **实现RequestAware、SessionAware和ApplicationAware接口**:通过这些接口,Action类可以直接获得Servlet API中的请求、会话和应用程序上下文对象。 - **ServletActionContext**:提供对Servlet API的直接访问...

    Spring MVC面试题(2022最新版)

    (6)此ModelAndView对象包含模型数据(Model)与视图信息(ViewName),视图信息可在配置文件中配置多个视图解析器(ViewResolver)找到真正的视图对象(View); (7)视图解析器对视图名称进行解析,返回具体的...

    struts2获取response的方法

    Struts2支持使用OGNL(Object-Graph Navigation Language)表达式在JSP或Freemarker模板中直接访问Response对象,虽然这并不常见,但在某些场景下可能有用。 ```jsp 示例 --%&gt; ((javax.servlet....

    spring3 mvc 注解action dao service 实例教程

    它可以在类级别和方法级别使用,以实现灵活的请求映射规则。 ```java @Controller public class AccountsController { @Autowired private AccountRepository accountRepository; @RequestMapping("/accounts...

    ssh(structs,spring,hibernate)框架中的上传下载

    首先数据表中的Blob字段在Java领域对象中声明为byte[]类型,而非java.sql.Blob类型。  2.数据表Blob字段在Hibernate持久化映射文件中的type为org.springframework.orm.hibernate3.support.BlobByteArrayType,即...

Global site tag (gtag.js) - Google Analytics