Struts2的Action没有与任何的ServletAPI耦合,增强了Action的可测试性
但是不访问ServletAPI是不可能的,所以Struts2提供了几种访问ServletAPI的方式
Action访问ServletAPI的方式大致有三种:
1:通过Struts2提供的ActionContext类
2:直接通过XxxAware接口来访问
3:使用ServletActionAPI工具类
一、ActionContext类
常用方法包括:
Object get(Object key) 类似于HttpServletRequest的getAttribute(String name)方法
Map getApplication() 返回一个Map对象,该对象模拟了该应用的ServletContext实例
static ActionContext getContext() 静态方法,获取系统的ActionContext实例
Map getParameters() 获取所有的请求参数,类似于HttpServletRequest对象的getParameterMap()方法
Map getSession() 返回一个Map对象,该对象模拟了HttpSession对象
void setApplication(Map application) 直接传入一个Map实例,将Map实例里的Key-Value对转换成Application的属性名和属性值
void setSession(Map Session) 直接传入一个Map实例,将Map实例里的Key-Value对转换成Session的属性名和属性值
代码演示如下:
ActionContext atx = ActionContext.getContext();
// 通过ActionContext设置application范围的属性
atx.getApplication().put();
// 通过ActionContext设置session范围的属性值
atx.getSession().put();
二、XxxAware接口
为了在Action中直接访问ServletAPI,struts2还提供了如下接口:
ServletContextAware:直接访问ServetContext
ServletRequestAware:直接访问HttpServletRequest
ServletResponseAware:直接访问HttpServletResponse
一定要注意的是:
虽然在action中获取了HttpServletResponse,但是如果想要使用HttpServletResponse直接来生成相应是不可能的,因为Acion只是业务控制器,并不是标准的servlet,所以一定不要尝试在Action中直接对客户端生成响应!
代码演示如下:
public class LoginAction1 implements Action,ServletResponseAware
{
@Override
public void setServletResponse(HttpServletResponse response)
{
this.response = response;
}
@Override
public String execute() throws Exception {
...
// 通过response添加cookie
Cookie cookie = new Cookie(.....);
cookie.setMaxAge(60*60);
response.addCookie(cookie);
...
}
}
三、使用ServletActionAPI工具类
该工具类包含如下几个静态方法:
static PageContext getPageContext() 取得web应用的PageContext实例
static HttpServletRequest getRequest() 取得web应用的HttpServletRequest实例
static HttpServletResponse getResponse() 取得web应用的HttpServletResponse实例
static ServletContext getServletContext() 取得web应用的ServletContext实例
这种方式虽然简单,但是不利于高层次的解耦!
代码演示如下:
...
Cookie c = new Cookie(...);
c.setMaxAge(60*60);
ServletActionContext.getResponse().addCookie(c);
...
本文介绍了Struts2框架中Action访问ServletAPI的三种方式:通过ActionContext类、实现特定的Aware接口以及使用ServletActionContext工具类。这些方法使得开发者能够在保持业务逻辑的同时灵活地与Web容器交互。

799

被折叠的 条评论
为什么被折叠?



