您的位置:首页 > 编程语言 > Java开发

Struts2的Action访问ServletAPI的方式

2017-03-24 18:42 369 查看
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);
...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: