在 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.valueStackfor ( String key: keys )System . out . println ( key );// 获得OgnlValueStack 对象OgnlValueStack stack = ( OgnlValueStack ) request . 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" );从这四种方法来看,最后一种是最简单的,读者可以根据自己的需要和要求来选择使用哪一种方法来获得这些对象。
struts2 获取request response
最新推荐文章于 2023-08-05 18:13:37 发布