频 道 直 达 - 新闻 - 培训 - 软件 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 读书 - 博客 - BBS
51CTO.COM_中国最大的网络技术网站
找资料:

3.4.2 与Servlet API耦合的访问方式

作者: 孙鑫著 出处:电子工业出版社  2008-06-23 16:21    砖    好    评论   进入论坛
阅读提示:《Struts 2深入详解》第3章是由"登录"开始,Struts 2框架为你提供了多种方式用于接收用户输入的数据,本节为您介绍与Servlet API耦合的访问方式。

3.4.2  与Servlet API耦合的访问方式

直接访问Servlet API将使你的Action与Servlet环境耦合在一起,我们知道对于HttpServletRequest、HttpServletResponse和ServletContext这些对象,它们都是由Servlet容器来构造的,与这些对象绑定在一起,测试时就需要有Servlet容器,不便于Action的单元测试。但有时候,我们又确实需要直接访问这些对象,那么当然是以完成任务需求为主。

要直接获取HttpServletRequest和ServletContext对象,可以使用org.apache.struts2. ServletActionContext类,该类是ActionContext的子类,在这个类中定义下面两个静态方法:

 public static HttpServletRequest getRequest()
得到HttpServletRequest对象。
public static ServletContext getServletContext()

得到ServletContext对象。

此外,ServletActionContext类还给出了获取HttpServletResponse对象的方法,如下:

public static HttpServletResponse getResponse()

ServletActionContext类并没有给出直接得到HttpSession对象的方法,HttpSession对象可以通过HttpServletRequest对象来得到。

除了上述的方法调用得到HttpServletRequest和ServletContext对象外,还可以调用ActionContext对象的get()方法,传递ServletActionContext.HTTP_REQUEST和ServletActionContext.SERVLET_CONTEXT键值来得到HttpServletRequest和ServletContext对象,如下所示:

ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
得到与ServletActionContext.HTTP_REQUEST键值绑定的HttpServletRequest对象。
ActionContext.getContext().get(ServletActionContext.SERVLET_CONTEXT);

得到与ServletActionContext.SERVLET_CONTEXT键值绑定的ServletContext对象。

同样的,也可以向ActionContext的get()方法传递ServletActionContext.HTTP_ RESPONSE键值来得到HttpServletResponse对象,如下:

 ActionContext.getContext().get(ServletActionContext.HTTP_RESPONSE);

建议读者采用第一种方式来获取HttpServletRequest和ServletContext对象,这样简单而又清晰。

我们看例3-14。

例3-14  通过ServletActionContext来获取HttpServletRequest和ServletContext对象的LoginAction3

package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.sunxin.struts2.ch03.model.User;

import com.opensymphony.xwork2.Action;

public class LoginAction3 implements Action

...

@Override
public String execute() throws Exception
{
if("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword()))
{
HttpServletRequest request = ServletActionContext.getRequest();      
HttpSession session = request.getSession();
ServletContext context = ServletActionContext.getServletContext();

/*ActionContext ctx = ActionContext.getContext();
HttpServletRequest request = (HttpServletRequest)ctx.get(Servlet ActionContext.HTTP_REQUEST);       
HttpSession session = request.getSession();
ServletContext context = (ServletContext)ctx.get(ServletAction Context.SERVLET_CONTEXT);*/

//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");

//在session中保存user对象
session.setAttribute("user", user);

//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer)context.getAttribute("counter");
if(null == count)
count=1;
else
count++;
context.setAttribute("counter", count);

return SUCCESS;
}
else
{
return ERROR;
}
}
}

完整的代码请参看本书配套光盘中的ch03_4目录,测试时,输入URL:
 http://localhost:8080/ch03_4/login3.jsp

除了利用ServletActionContext来获取HttpServletRequest对象和ServletContext对象这种方式外,Action类还可以实现ServletRequestAware和ServletContextAware接口,由Struts 2框架向Action实例注入HttpServletRequest和ServletContext对象。

org.apache.struts2.interceptor.ServletRequestAware接口只有一个方法,如下所示:

void setServletRequest(HttpServletRequest request)
org.apache.struts2.util.ServletContextAware接口也只有一个方法,如下所示:
void setServletContext(ServletContext context)

ServletRequestAware接口和ServletContextAware接口不属于同一个包,前者在org.apache.struts2.interceptor包中,后者在org.apache.struts2.util包中,这很让人迷惑。

我们看例3-15。

例3-15  通过接口注入来获取HttpServletRequest和ServletContext对象的LoginAction4

 package org.sunxin.struts2.ch03.action.way2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import org.sunxin.struts2.ch03.model.User;

import com.opensymphony.xwork2.Action;

public class LoginAction4 implements Action, ServletRequestAware, ServletContextAware
{
private HttpServletRequest request;
private ServletContext context;

@Override
public String execute() throws Exception
{
if ("zhangsan".equals(user.getUsername())
&& "1234".equals(user.getPassword()))
{
HttpSession session = request.getSession();

//在请求中放置欢迎信息。
request.setAttribute("greeting", "欢迎您来到程序员之家");

//在session中保存user对象
session.setAttribute("user", user);

//统计用户访问量,在application中保存用户访问量数据
Integer count = (Integer) context.getAttribute("counter");
if (null == count)
count = 1;
else
count++;
context.setAttribute("counter", count);

return SUCCESS;
}
else
{
return ERROR;
}
}

@Override
public void setServletRequest(HttpServletRequest request)
{
this.request = request;
}

@Override
public void setServletContext(ServletContext context)
{
this.context = context;
}
}

LoginAction4类实现了ServletRequestAware和ServletContextAware接口,框架在运行时会调用这两个接口中的方法,向LoginAction4注入HttpServletRequest和ServletContext对象。在execute()方法中不再需要访问ServletActionContext,因此我们删除了与之相关的代码。
完整的代码请参看本书配套光盘中的ch03_4目录,测试时,输入URL:
http://localhost:8080/ch03_4/login4.jsp
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
专题
企业Web安全威胁在线评估系统
Java实用开发全集
Java类的基础教程专题
Java发展动态专题
Web 2.0基础知识大全
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 最 大 的 网 络 技 术 网 站 ·
技 术 成 就 梦 想
订阅技术快讯
电子杂志下载
名称:SQL Server数据库管理精品黄皮书
简介:书中文章经过精挑细选,便于用户能根据自己的实际工作和学习,快速在本书寻找到相关资料。内容涵盖了SQL Server的安装与升级、语句查询、数据备份和恢复、自动化任务、数据同步、数据字典、安全和预防、性能和优化、集群等各方面应用信息,以及DBA管理人员在数据库管理工作中
名称:2007路由技术大全
简介:《2007路由技术大全》由51CTO.com网站特别策划制作,该书包括路由器技术、路由器产品、路由器配置、安全设置、路由器故障处理、路由器密码恢复,以及广大网友在实践使用中的心得经验和技巧文章,内容注重实用性,适用于初学者入门,也适合多年从业者提高,是一本实践和理论完
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
Linux 集群技术专题
Linux 集群技术专题
Windows集群服务应用
Windows集群服务应用
CISSP认证成长之路
CISSP认证成长之路
· CISSP认证成长之路
· SQL Server 2008/2005..
· SQL Server入门到精通
· 网络工程师职业规划与..
· 浏览器的战国时代
· 运营商封堵ADSL共享 中..
· 微软出价446亿美元收购..
· 技术人求职简历完备手册
· 开源虚拟化技术Xen
· Windows Server 2008专..
· 隐私保护技术探讨
· 绿色IT人健康生存手册
· 杀毒软件评测专题
· 访问控制列表(ACL)介绍
· Vista SP1对决XP SP3
· 华为员工自杀频频拷问..
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SOA 面向服务架构
SOA 面向服务架构
· SOA 面向服务架构
· SQL Server 2008/2005..
· Apache技术专题
· 三层交换技术专题
· SQL Server入门到精通
· Apache技术专题
· Windows集群服务应用
· 国际文档格式标准开战
· 路由器设置与口令恢复
· Linux 集群技术专题
· PHP开发应用手册
· SOA 面向服务架构
· 企业数据恢复指南
· 了解统一威胁管理(UTM)..
· 专题:AIX操作系统管理..
· 访问控制列表(ACL)介绍
ARP攻击防范与解决方案
ARP攻击防范与解决方案
SQL Server 2008/2005全解
SQL Server 2008/2005全解
SQL Server入门到精通
SQL Server入门到精通
· SQL Server入门到精通
· SQL Server 2008/2005..
· SOA 面向服务架构
· Apache技术专题
· 三层交换技术专题
· Apache技术专题
· 企业数据恢复指南
· Windows集群服务应用
· 路由器设置与口令恢复
· Linux 集群技术专题
· SOA 面向服务架构
· 了解统一威胁管理(UTM)..
· 反垃圾邮件技术应用
· 访问控制列表(ACL)介绍
· PHP开发应用手册
· 专题:AIX操作系统管理..