在struts1.x Action类的execute方法中,有四个参数,其中两个就是response和request。而在Struts2中,并没有任何参数,因此,就不能简单地从execute方法获得HttpServletResponse或HttpServletRequest对象了。
但在Struts2 Action类中仍然有很多方法可以获得这些对象。下面就列出四种获得这些对象的方法。
【方法1】使用Struts2 Aware拦截器
这种方法需要Action类实现相应的拦截器接口。如我们要获得HttpServletResponse对象,需要实现org.apache.struts2.interceptor.ServletResponseAware接口,代码如下:
package action;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import org.apache.struts2.interceptor.*;
public class MyAction extends ActionSupport implements ServletResponseAware
{
private javax.servlet.http.HttpServletResponse response;
// 获得HttpServletResponse对象
public void setServletResponse(HttpServletResponse response)
{
this.response = response;
}
public String execute() throws Exception
{
response.getWriter().write("实现ServletResponseAware接口");
}
}
在上面的代码中,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及其他的一些信息。代码如下所示:
package action;
import java.util.Map;
import org.apache.struts2.*;
import com.opensymphony.xwork2.ActionSupport;
import javax.servlet.http.*;
import com.opensymphony.xwork2.util.*;
import org.apache.struts2.interceptor.*;
public class FirstAction extends ActionSupport implements RequestAware
{
private Map request;
private HttpServletResponse response;
public void setRequest(Map request)
{
this.request = request;
}
public String execute() throws Exception
{
java.util.Set<String> keys = request.keySet();
// 枚举所有的key值。实际上只有一个key:struts.valueStack
for(String key: keys)
System.out.println(key);
// 获得OgnlValueStack 对象
OgnlValueStack stack = (OgnlValueStack)myRequest.get("struts.valueStack");
// 获得HttpServletResponse对象
response = (HttpServletResponse)stack.getContext().get(StrutsStatics.HTTP_RESPONSE);
response.getWriter().write("实现RequestAware 接口");
}
}
我们也可以使用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");
从这四种方法来看,最后一种是最简单的,读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。
ServletAciontContext.getXXXX 静态方法
最简单的方法,在你的Interceptor中加入以下代码段即可:
Java代码
private ServletContext servletContext;
@Inject
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
struts2获取ServletContext的方法:
Java代码
ServletContext servletContext = (ServletContext) ActionContext.getContext().get(StrutsStatics.SERVLET_CONTEXT);
但Struts2的Interceptor的init方法执行时ServletContext还是null值,
当然,如过action中要使用ServletContext,action实现struts2的ServletContextAware接口是最便捷的方式
分享到:
相关推荐
Struts2 Interceptor详解 Struts2作为一款流行的Java Web框架,其强大的功能之一就是拦截器(Interceptor)。拦截器在MVC模式中扮演着重要角色,它可以对请求进行预处理和后处理,提供了灵活的扩展机制,使得业务...
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
标题和描述均聚焦于“Struts2_interceptor_和_filter区别”,这暗示着对比和解析Struts2框架中拦截器(Interceptor)与过滤器(Filter)的差异是本文的核心议题。接下来,我们将深入探讨这两者在功能、实现方式以及...
在Struts2框架中,**Interceptor(拦截器)**是一个关键组件,它允许开发者在特定的动作(Action)执行前后添加自定义的处理逻辑,极大地增强了应用程序的灵活性。 #### 二、Interceptor 概念与作用 Interceptor ...
在Struts2框架中,拦截器(Interceptor)是一种非常重要的机制,它能够帮助开发者实现诸如权限控制、事务管理、日志记录等跨切关注点的功能。通过定义不同的拦截器栈,可以灵活地组合各种功能,从而达到复用代码的...
然而,在Struts1的原生设计中,并没有内置拦截器(Interceptor)这一概念,这与后来的Struts2框架有所不同。Struts2引入了拦截器,极大地增强了框架的灵活性和可扩展性。但是,由于Struts1的流行和项目需求,"saif...
STRUTS2:拦截器Interceptor
在Struts2中,拦截器(Interceptor)是核心组件之一,它们在Action执行前后进行拦截,实现了如日志记录、权限检查、数据验证等业务逻辑。而"struts2 interceptor annotation plugin"则是Struts2框架提供的一种使用...
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.
这种方法利用了Struts2中的ActionContext对象,它包含了当前执行环境的信息,可以通过它来获取request对象。 2. **使用`ServletActionContext`**: ```java HttpServletRequest request = ServletActionContext....
3. **拦截器执行顺序**:Struts2按照拦截器在配置文件中定义的顺序执行,从上到下,每个Interceptor的`intercept()`方法被调用。如果需要在Action执行后执行某些操作,可以将这些Interceptor放置在Action类下方。 4...
2. `getDefaultStack()`: 这是一个静态方法,用于获取默认的拦截器栈。默认拦截器栈包含了Struts2框架预定义的一些拦截器,如`ExceptionMappingInterceptor`用于处理异常,`PrepareInterceptor`用于准备Action,`...
以下是对"struts2获取response的方法"的详细说明。 1. **ActionSupport类的实现** Struts2中的Action类通常会继承自`org.apache.struts2.interceptor.StrutsPrepareAndExecuteInterceptor`或`...
以上四种方法可以根据实际需求灵活组合使用,确保在Struts2应用中对异常有全面的控制。同时,结合日志管理,可以更好地跟踪和诊断问题,提升应用的健壮性。在实践中,理解并熟练掌握这些异常处理方式,能帮助开发者...
Struts2 是一个基于MVC 模式的 Web 应用程序框架,它提供了多种方式来获取 Response 对象,以下是四种获得 Response 对象的方法: 方法 1:使用 Struts2 Aware 拦截器 在 Struts2 中,可以通过实现Aware接口来获取...
在Struts2的配置中,Struts.xml文件扮演着关键角色,它包含了Action、Result、Interceptor的配置信息。通过这个配置文件,开发者可以声明Action的映射、指定Result类型以及设置Interceptor链。 此外,Struts2还支持...
在Struts2中,经常需要从Action类中获取请求(Request)和响应(Response)对象来处理用户请求和传递数据。本文将详细解释Struts2中获取Request对象的四种不同方式。 1. **Servlet不相关的非IoC取得Request等对象的...
1. **struts2-core.jar**:这是Struts2的核心库,包含了框架的主要组件,如Action、Result、Interceptor等。它定义了请求处理的流程,提供了ActionContext、ValueStack等关键对象。 2. **xwork-core.jar**:XWork是...