使用AppFuse进行开发的总结

翻译|其它|编辑:郝浩|2007-09-06 09:54:31.000|阅读 839 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

AppFuse  是一个集成了当前最流行的  Web  应用框架的一个更高层次的  Web  开发框架,也可以说是一个  Web  开发基础平台,它与它所集成的各种框架相比,它提供了一部分所有  Web  系统开发过程中都需要开发的一些功能,如登陆、用户密码加密,用户管理、根据不同的用户可以展现不同的菜单,可以自动生成40-60%左右的代码,自带了默认的一些在  CSS  中设定的样式,使用这些样式能很快的改变整个系统的外观,还有自动化测试的功能。

它最大的价值就是为我们提供了一个  Web  开发的新的方式和思路,尽管这些技术在国外都已进很流行了,但在国内能够将  HibernateStrutsSpringDBUnitAntLog4JStruts MenuXdocletSiteMeshVelocityJUnitJSTLWebWork  这些技术集成到一个框架中的还不多见,所以即使不使用它的全部功能,它也给我们提供了一个很好的借鉴、学习的机会。

通过关注  AppFuse,我们可以看到目前国外的主流开发都使用了哪些技术,开发方式是什么样的,可能达到什么样的结果,而在以前,是很少能够看到这样完整的例子的。

AppFuse  的另一个启示是:我们可以依靠开源软件的功能降低开发成本,而且可以阅读开源软件的代码提高所在团队的整体实力。

AppFuse  的作者  matt raible  是当今开源世界一个比较活跃的开发者,它是  AppFuseStruts Menu  的作者,也是  XDocletDisplayTag  等一些著名开源项目的积极参与者,《Hibernate In Action》的作者就在感谢的名单里面提到他,XDoclet  的下载版本中所带的  Hibernate  标签部分的例子就是他写的,他还是2004  Apache  技术年会的主讲人之一。

但是通过2个月的实际学习和使用,我也遇到一系列的问题,因为  AppFuse  是将其他的一些类库或者框架集成在一起的,集成的技术众多,而且有一些技术在国内甚至很少有人知道,资料也比较少,所以虽然作者经过了一些测试,但都是基于英文编码的,而对于中文编码来说,还潜在的存在着一些问题,虽然不是  AppFuse  的问题,但却降低了开发速度,下面是我在开发过程中遇到过的问题:

一.Struts

1 AppFuse  中默认的  MVC  框架是  Struts,而且使用的是  LookupDispatchAction,并且使用的是按钮(button),在  XP  下用IE浏览效果还可以,但如果在2000或者98下,就使外观很难看,而且当时我还遇到一个问题:如果按钮显示中文,则在  DisplayTag  中翻页失灵,而且报错,后来我把  BaseAction  的相关方法改变了,才可以使用,因为国内的客户都比较重视界面,所以后来我将那些按钮都改成图片了,当然也要添加一些方法了,有点麻烦!

2 Struts  中的标签如今推荐使用的只有  html  部分的标签了,其他的标签或者可以使用JSTL替代,或者已经不推荐使用了,而且  AppFuse  中推荐使用  JSTL,而  JSTL    struts  的标签的联合使用时,需要的不是<html:标签>,而是<html-el:标签>,这个问题曾经困扰了我整整2天。

3 Struts    Validation  的校验规则并不完善,比如如果使用客户端的  javascript  校验,则在邮箱中输入汉字根本校验不出来,到了服务器端报错。

4 最严重的问题是  AppFuse  生成的  Struts    validation.xml  文件中有许多多余的“.”,如果你去掉了,常常在执行  antdeploy  任务时又恢复原样。这样是提交表单的时候经常会报  javascript  的脚本错误或者缺少对象或者缺少  value,所以我会手工的修改这个文件,然后把修改后的文件备份,当重新生成有错误的文件时,我会用备份的没有错误的文件去覆盖。

5 Struts    validatioin  对于使用同一个  FormBean    Action  的校验方式比较复杂。(待解决)。

二.Hibernate

1 Hibernate  是现在受到越来越多的人推崇的一个  ORM  工具(框架、类库),它将我们从繁琐的使用  JDBC  的开发过程中解放出来,但同时也带来了新的问题,如学习曲线,执行效率,数据库设计优化,还有最重要的灵活性。Hibernate  不是一个很容易上手的东西,要完全驾驭它还需要读很多资料,但好的资料却很少。

2 使用  Xdoclet  可以很方便的生成  Hibernate  中的持久类的配置文件(*.hbm.xml,但对一些特殊的映射却无能为力,如使用序列的id生成规则,序列的名字没有地方写,所以也只好先利用它生成主要的内容,然后手工修改。

3 同样还是  id  的生成策略问题,如果使用序列、hilo  等需要一些数据库机制支持的策略时,schemaExport  并不能自动生成序列或者保存当前id的表,这项工作仍然要手工解决。

4 Hibernate  中提供了几种关联,一对一、一对多、多对多,但对于怎样调整效率却没有一个很明确的提示,还要根据情况判定,这就带来和一些弹性的设计。

5 Hibernate  中可以选择的操作数据库的方式有3种,其中  HQL  功能最强大,但有些功能使用标准查询可能会更方便,但会有一些限制,所以虽然它很灵活,但易用性不如  JDBC  好。

三.Spring

  AppFuse  的过程中,Spring  完全隐藏在幕后,除了一些配置外,几乎感觉不到它的存在,所以我在使用它的过程中并没有遇到什么麻烦,这里只是简单的介绍一下它在  AppFuse  中起到的作用。

1 Spring    AppFuse  中起到的主要作用是对  Hibernate    Session  和事务的管理,利用  Spring  封装的  Hibernate  模板类,我们大大地减少了实现  DAO  的代码行数。

2 Spring  还起到了连接映射文件和类之间的关联,及接口和实现类之间的关联,这些都依赖于Spring    IoC  的机制的实现。

3 对于字符进行编码和解码部分用到了  Spring  自带的  Filter,只需要在配置文件中配置就好了。

四.SiteMesh

SiteMesh  是一个基于  Decorator  模式的技术,它可以修饰返回的网页文件,它的工作方式受到越来越多的人的推崇,这点从  Manning  出版的一些技术书籍中可以看出来。

我在使用  SiteMesh  的过程中并不顺利,我参考了《Java Open Source Programming》,这本书中说  SiteMesh  在默认的情况下不对下载文件进行装饰,但我在下载文件时发现,我的文件内容被丢弃了,取而代之的是  SiteMesh  的模板的内容,后来我通过修改  SiteMesh  的配置文件解决了这个问题,但感觉还有一些不太清楚的地方需要学习。

五.DisplayTag

DisplayTag  是一个优秀的显示内容的标签,从  SourceForge  的访问量来看,它是很活跃的项目,仅次于  AntHibernateXdoclet  等几个著名的项目,我总结,它的主要功能有4项:显示、分页、排序、将显示的数据写入指定类型的文件中,然后下载。

1 据我使用的情况看,我只使用了分页和显示的功能,因为当时我没有很好的解决中文编码的问题,所以排序会有问题,直到昨天,我在朋友的帮助下解决了这个问题,至此我可以放心使用的功能又增加了排序(我昨天简单的测试了一下是可以的)

2 但对于将显示的内容生成到一个指定格式的文件中的功能却有着很多缺陷,如:

l          生成的文件中只有显示的数据,那些没有显示在界面上的的数据,则不会被写到文件中。

l          如果修改了  DisplayTag  的显示的内容,比如添加一列,在这列中的内容不是字符,而是HTML的标签,则生成的文件只有这些HTML标签,而没有数据。

l          即使  DisplayTag  中没有我们定制的HTML脚本,生成的文件偶尔也有问题,比如:它会把007”生成为7”,把字符串自动的转换为整型值。有时候还生成空白内容的文件。

l          DisplayTag  生成的  Excel  文件兼容性不好,有时在  Excel2003中不能正常打开,或者在XP下打开报错。

后来,我看了作者写的《Spring Live》,书中说如果想实现稳定的Excel,推荐使用  POI,于是我使用  POI  生成  Excel,稳定性和兼容性都不错。

六.DBUnit

DBUnit  是一个可以被Ant集成的向数据库中添加数据和备份数据的一个类库,配置很方便,因为AppFuse  已经集成好了,所以使用也很容易。

但是如果你使用  EditPlus  之类的工具手工修改了  AppFuse  生成的内容,则执行  Ant  setupsetup-db  或者  deploy  的任务时,常常报错,说无效的格式,这是因为这个被手工修改的文件再次被  AppFuse  执行后,它的第一行的文件声明的前几个字母是无效的,是因为本地的字符集编码的原因而引起了乱码,如果把这几个无效的字母去掉,问题就解决了。

七.Struts Menu

Struts Menu  也是  AppFuse  的作者开发的一个开源软件,它可以根据配置文件读取当前用户可以使用的功能菜单,这个功能是我一直以来都想要的,我也找到了一些代码,但实现的都不如这个完善,没什么好说的,使用简单,配置容易,很好的解决了我的问题。

问题是我只使用了  AppFuse  提供的2个角色,对于多个角色的实验我还没有做。

八.XDoclet

  AppFuse  中,使用  Xdoclet  生成了几乎一切的配置文件:Struts-config.xmlweb.xmlvalidation.xml*.hbm.xml  等文件,如果使用  AppGen  的话,还会生成更多的文件,这一切都是使用  Xdoclet  实现的。

问题是我在  Struts  部分提到的,生成的  Validation.xml  文件中会多生成一个“.”,另外在生成资源文件时也会多生成一个“.”,目前我没有很好的阅读这段代码,不知道是不是  Xdoclet  的问题。

九.Ant

Ant  并没有什么问题,但在执行作者写的  Ant  任务的时候,有一些任务不能正常执行,比如,运行模拟对象测试的任务,作者也在1.7版本的修复列表中提到以前版本有些ant任务不能执行,在1.7中修改了一些  ant  任务,使他们能够正常的执行了。

实际上,我们如果使用  AppGen  进行开发的话,使用的任务一般不超过8个。

十.JSTL

JSTL  是个好东西,我常用的有<c:><fmt:>部分的标签,但是如果使用  JSTL  进行逻辑判断,我并没有感觉比使用  JSP  的代码块优雅多少。另外,熟悉JSTL也需要一段时间,我就经历了面对着  JSP  页面不知道该怎么写JSTL语法的困境。当然,AppFuse  中使用的基本都是  JSTL,包括向  DisplayTag  传递显示的数据,使用的都是  JSTL  语法,这方面的资料挺多,我参考的是电子工业出版社出的《JSP2.0技术》,说的很详细。

十一.Tomcat

你也许会说:“Tomcat  就不用说了吧?,是的,Tomcat  一般都会使用,但是―――――――――――――Tomcat5  Tomcat4.X  对于中文编码使用了不同的机制,这个问题困扰了我好久,我解决了页面上写入汉字显示乱码的问题,我也曾经以为  DisplayTag  对汉字不能排序,也不能正常分页是因为  DisplayTag  的开发者都是老外,是因为他们没有考虑中文的关系的原因。

十二.JavaScript

JavaScript  简单易学,但想运用自如就不太容易了。AppFuse  中嵌入了几个  js  文件,里面包含了许多函数,值得我们好好的研究一下,比如,如果有一个必填字段没有填写,AppFuse  会自动的聚焦在那个  input  上,类似的小技巧有很多,你可以自己去翻看。

  AppFuse  自带的  JavaScript  脚本有一个  Bug,就是当  DisplatyTag  中没有可以显示的数据时,你用鼠标单击,它会报  JavaScript  错误,你仔细研究一下  function highlightTableRows(tableId) 就知道了:我的解决办法是在  location.href = link.getAttribute("href");前面添加一行判断:if (link != null)

十三.资源文件国际化

对于  Struts    DisplayTag  都涉及到资源文件国际化  AppFuse1.6.1很好的解决了 Struts  资源映射文件国际化的问题,你只需要在对应本国语言的资源文件中写入汉字,Ant  中有一项执行  native2ascii  的任务,AppFuse  自动的为你进行了资源文件的编码转换,而对于  DisplayTag  的资源文件问题,还要自己执行  native2ascii  命令,为了避免每次都输入一串命令,我用  Delphi  写了个小工具,可视化的选择资源文件,点击按钮自动执行该命令,底层依赖于  JDK

经过2个多月的学习,我感觉这个框架非常不错,它为我以后的项目开发指出了一个新的方向,但如果想很熟练的使用这个框架进行开发,至少要对以下几种技术比较熟练:Struts(或者  WebWorkSpring及其他的已经整合进来的  MVC  框架)Hibernate(或者  ibatis)、JSTL,当然其他的技术至少也要知道一点,否则遇到问题都不知道出在哪里。

这个框架的优点是:如果熟悉了开发流程,可以大幅度的提高开发速度,如果业务不是很复杂,使用AppGen  可以生成60%左右的代码,而且程序可维护性好,因为作者使用了多个设计模式对各个层面进行了封装,所以不同的模块代码风格出奇的一致,有利于开发人员快速上手,也有利于接收其他开发人员遗留的代码。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com

文章转载自:JavaEye

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP