快速业务通道

将Struts应用迁移到Struts 2(二) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
urn (mapping.findForward("success")); } }

list action并不需要任何的用户输入,它只是简单地调用了业 务逻辑的无参方法,同时返回所有的Blog对象。

public class ListBlogsAction extends Action ... { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception ...{ BlogService service = new BlogService(); request.setAttribute("bloglist",service.list()); return (mapping.findForward("success")); } }

将Struts应用迁移到Struts 2(二)(4)

时间:2011-03-24

向 Struts2 迁移

在Struts2中,可选的实现方式有很多,可以像Struts那样每个 需求用例对应一个action,也可以用一个action对应所有需求用例 。但在我们的例子中,使用的方法是我认为最佳的解决方案 - 在一 个action类中实现整套CRUD功能。

也许你人为把list需求用例也同样地整合到同一个action类里 会比较好,而我认为把list的功能分到另外一个action中,会减少 容易产生的混淆,因为list用例中并不需要Blog这个类作为属性, 而在其他用例中则需要。

对于 Struts2的例子, 它的UML模型展示如下:

下图image2.jpg

每个用例在action中都有自己所对应的方法。从上图中我们可 以看到,在BlogAction 中我们有save, update 和 remove三个方 法。而ListBlogAction中,没有list这个方法,因为 ListBlogAction继承了ActionSupport 类,实际上就是在默认的 execute 方法中实现list功能。

为了更容易看,图中的BlogAction并没有画出它所实现了的三 个接口。它们分别是ServletRequestAware 接口, Prepareable 接口和 ModelDriven 接口。

首先回顾一下ServletRequestAware, 我们在第一篇文章中已经 详细介绍它了。这个ParametersInterceptor 拦截器提供了把 HttpServletRequest 自动set到action中的功能,让我们能通过 request, 把所需的值传回到JSPs。

接着看看Preparable 接口, 它会联合PrepareInterceptor拦 截器一起工作,让action在执行execute() 方法前, 执行一个 prepare()方法,实现在执行前设定,配置或预设一些值在action 中。 在我们的例子里,prepare方法会检查blogId 属性,如果为零 则这是一个新日志,非零则该日志已经存在,根据blogId取出日志 。

最后我们说说ModelDriven 接口,在上一篇文章中,我们已经 了解到 Struts action的很大的不同在于它是需要线程安全的,而 在Struts2中则没有这个限制,因为每次的请求都会有一次action 对象的初始化和调用。没有了这个限制,能允许Struts2使用类级 别的属性变量(特别是getters和setters),从而获得更多编码优势 。

和拦截器的功能结合起来, 把HttpServletRequest 中的 attribute 注入action中的流程如下所示:

循环读取HTTP request中的attribute

查找当前request attribute中是否有和action中的setter中的 属性匹配的

有则根据attribute从HttpServletRequest 里取出其值

把取出来的值由String转成setter中相应的类型

调用setter把该转换后的值注入action中

QUOTE:

提示: 当调用action时,如果发现不明原因使不能正确地通过 setter注入值情况下,第一步最好是先检查下各拦截器,确保它们 都已作用于该action。因为这些意外通常有时由拦截器设置不当形 成的,检查是否各个拦截器都已起作用,并看看它们作用的顺序, 因为有些情况下它们间会相互影响而产生错误。

现在我们已经有基于String类型的form bean中取值的方法或者 是自动把request的attributes 注入到action的方法,那下一步就 是如何把值传入 domain object 或 value / transfer object的 属性中去。其实这很

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号