appfuse概述

Appfuse 顾名思义,application fuse,它就像一团胶水一样,将开发application各层面(web层,Logic层,persistence层)的零件粘在一起,从而形成一个application的模板和雏形。当中涉及到的技术和框架包括persistence的hibernate,logic层的springframework,web层的struts(webwork..),使用的到工具主要的有XDoclet和ant,还有很多提供测试的framework(个人不是很喜欢,觉的测试还是利用ide提供的集成junit测试足也,所以没做太多的研究)。

下面的文字将试图对appfuse做较全面的分析。

一.appfuse提供的application架构。

appfuse提供了从persistence到web的一整套templet code,以它们奠定了application的架构,下面将按照从persistence到jsp从后到前的顺序逐一阐述。

1.persistence层

这个层面中,appfuse首先提供了一个功能非常抽象的interface DAO,试图覆盖普通的CRUD操作,提供的方法都是针对Object进行操作,伴随这个interface,还提供了一个hibernate版本的implemention(BaseDAOHibernate)。这个非常抽象的interface究竟有什么实际作用,在appfuse的api中阐述的很清楚:to hold common methods that they might all use. Can be used for standard CRUD operations。但是在具体的application中,我想可能用到的机会不是很多(也许你要完成一个功能同样非常抽象的通用模块,可能会用到),因为我们根据application的需要编写的dao中,都提供了同样功能的针对具体类型的业务对象的CRUD操作。这个层面appfuse推荐的framework是hibernate,当然,我们完全可以对我们的XXXdao interface提供其他的implement,如ibatis,或者干脆jdbc,关于hibernate就不多说了,个人觉得这个冬冬不是很好用,虽然非常喜欢orm带来的更加oo的构架,但是看着短短的一行代码hibernate在后面干了若干事情,心里还是有点玄乎。

2.logic层

这个层面需要解决的重头问题是事务,可以担当这个层面重任的技术有很多,如ejb中的session bean,但是appfuse选择了springframework,具体这两种技术各有什么优劣,这里不作讨论,个人觉得ejb中的session bean也不错。
appfuse在这个层面同样提供了类似在persistence层提供的DAO一样巨抽象的一个interface,Manager,伴随这个interface,还提供了一个具体的implemention BaseManager,关于这个抽象的interface Manager的作用,前面在阐述interface DAO的时候已经提及,关于springframwork,这里就不多提及了。

3.web层

这个层面appfuse集成了几种当前常用的framework,struts是appfuse的首选,appfuse提供了一个BaseAction,其中提供了一些便利的方法,如从spring的applicationContext中根据XXXManager的name拿到XXXManager,从session拿到当前的user信息,以及对errrorMessage的处理,需要提及的是里面的execute方法,根据request中的method这个parameter去将request dispatch到相应的handler,具体细节可参考struts中的LookupDispatchAction(这个class好象是从struts-1.1后才有的)。
这个层面还提供了一个BaseForm作为一个Base FormBean,提供了一些较高抽象层次的便利方法,如equals和基本的validation。

这个层面appfuse还提供两个业务相关的jsp templet,一个是业务对象form page,一个是业务对象list page。
业务对象form是针对一个业务对象,完成新建,修改,删除等操作。这个page中涉及到的技术主要有jstl和struts的form taglib,这两中技术这里就不多讲了,需要提及的是appfuse提供的一个label tag,这个tag能够根据我们在validation中对formbean的validation配置,决定是否显示*号(表示必须填写)。业务对象list是针对一批业务对象,完成排序等操作。这个page中涉及到的技术主要有display tag,一个很不错的taglib。

appfuse考虑到jsp页面的表现和内容分开,引入了一个sitemesh作为整个页面表现的框架,这是一个open source的framework,主要的使用方法是定义一个decorator page,然后配上一个filter去decorator我们的
业务页面。

appfuse在jsp这个层面还引入了struts-menu,这是一个不错的开源的taglib,用来处理menu的,appfuse使用struts-menu的方式是通过静态的xml的配置,我们可能要更灵活一点(也许是根据user的权限动态的取menu list,关于user manager和权限,后面会提及到)。

appfuse还提供了对error和message的集中处理。

二.appfuse还给我们提供了一个user manager这样一个默认应用模块。

这个模块中主要完成对application中role,user进行管理,还有对login,logout,cookie的处理,其中过多的与tomcat的技术绑定了,而且业务模型也显得简单,所以可以考虑将这块东西剔除掉,不过里面还是有很多东西值得参考。

三.如何应用appfuse开发业务。

appfuse给我们提供了一个完整的架构,我们只需要向这个架构中填料就可以了,下面大概阐述如何利用appfuse进行实际的业务开发。
如appfuse的作者在wiki中推荐的那样,我们可以按照从后向前的顺序进行开发
1.分析业务模型,建立model

2.建立dao

3.建立manage

4.开发action和page

appfuse中提供了appgen代码生成工具,用来根据appfuse设定好的templet code,利用xdoclet自动生成各个层面的代码,足显了xdoclet的强大和无处不在。
不过生成的冬冬只能供参考,肯定还需要修改,而且有的冬冬是不能自动化产生的,举个例子,比如userForm.jsp中的对country和role的处理,因为不是简单的input,模板就傻眼了,所以说只能提供参考,appgen无非是让你少敲点字而已,不过从0开始和在生成的代码上做修改工作量还是有区别的。

四.实际利用appfuse碰到的问题。

1.中文问题

appfuse中利用utf-8编码解决国际化问题,得确是非常彻底的好方法,完全做到了国际化,但是注意一点的是,如果是用mysql的话,你需要改变mysql jdbc的url,
connectionURL="jdbc:mysql://localhost/test?autoReconnect=true&useUnicode=true&characterEncoding=utf-8"
需要改成
connectionURL="jdbc:mysql://localhost/test?autoReconnect=true&useUnicode=true&characterEncoding=gb2312"
这其实是mysql的问题,与appfuse没有直接的关系,在oracle中是不存在中文编码问题的。

2.ant脚本

appfuse提供了一大堆提供各种用途的ant target,其实很多target在建立环境的时候execute一次就可以了,如果在项目开发过程中执行还可能带来负面作用,比如对数据库操作的
target运行结果可能很危险,而且在idea中没有提供对target排序,每次你需要execute一个target都要费劲的找半天,所以个人觉得需要精简appfuse的脚本。

刚打算使用appfuse,所以对它做了一个粗糙的分析,可能有的地方理解的并不是很深入,权当抛砖引玉,希望大家多研究,多讨论。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值