AppFuse简介/安装指南/开发总结--【虎.无名】学习Blog

来源:百度文库 编辑:神马文学网 时间:2024/07/08 21:40:12
【虎.无名】学习Blog

AppFuse简介/安装指南/开发总结- -
appfuse简介
Appfuse是Matt Raible 开发的一个指导性的入门级J2EE框架,它继承了流行的Spring、Hibernate、ibatis、struts、Xdcolet、junit等基础框架,最新的1.7版更是提供了对Taperstry和JSF的支持。在持久层,AppFuse采用了Hibernate O/R映射工具(http://www.hibernate.org);在容器方面,它采用了Spring Framework(http://www.springframework.org)。用户可以自由选择Struts、Spring/MVC,Webwork,Taperstry、JSF这几个web框架。采用TDD的开发方式,使用JUnit测试各层,甚至测试 jsp 输出的 w/o 错误。为了简化开发,预定义好了一套目录结构、基类、用来创建数据库、配置Tomcat、测试部署应用的 Ant 任务,帮助快速自动生成源程序和自动维护部分配置文件。
参考资料:
在https://appfuse.dev.java.net/ 下载Appfuse。
Appfuse的参考资料和文档可以在http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse 查看。
AppFuse 1.7版本的最大改进在于支持JSF和Tapestry两个基于组件的web框架,此前它使用的web框架是时下应用最广泛的Struts和WebWork。此外,在持久层,AppFuse采用了Hibernate O/R映射工具(http://www.hibernate.org);在容器方面,它采用了Spring Framework(http://www.springframework.org)。这两个框架代表了目前最流行的新兴技术,很多J2EE开发者希望通过一个范例应用来学习它们的使用,AppFuse正好满足他们的这个需求。
http://www.blog.com.cn/user2/8735/archives/2005/136410.shtml
AppFuse安装指南
一、系统路径的设置:
1、  JAVA_HOME:安装jdk,设定JAVA_HOME。
2、  J2EE_HOME:安装J2EE SDK,设定J2EE_HOME,例如:c:\sun\appserver。
3、  ANT_HOME:下载解压Ant,设定ANT_HOME。
4、  CATALINA_HOME:安装tomcat,设定CATALINA_HOME。
5、  classpath:指定  .;%JAVA_HOME%/lib/tools.jar;%JAVA_HOME%/lib/dt.jar; %J2EE_HOME%/lib/j2ee.jar
6、  path:指定 %JAVA_HOME%/bin; %ANT_HOME%/bin
二、类的设置:
下载junit的jar包,拷贝到%ANT_HOME%/lib目录下。
三、生成新的项目:
1、  下载解压AppFuse1.4,解压到一目录appfuse。
2、  修改文件database.properties.reference为database.properties,并去掉你不用的数据库的设置,保留你所使用的数据库,并设置连接地址,用户名和密码等信息。
3、  运行数据库。
4、  进入appfuse目录,运行ant setup-db。
5、  成功后,运行ant new ?Dapp.name=your_project_name ?Ddb.name=your_project_db_name。
6、  成功后,会在appfuse的上一级目录生成一个以你的项目命名的目录,假设为app。
四、导入到Eclipse:
1、  打开Eclipse,选择文件(File)?导入(import),出现的页面里选择Exist Project into WorkSpace,选择app目录,单击确定,则项目导入。
2、  选择window?preference,在出现的页面里,选择ant---runtime?Ant Home Entries,单击右边的add external jar,选择junit的jar包,单击确定。
3、  属性设置页面,选择java--Buil Path?classpath valiables,单击右边的new按钮,加入J2EE_HOME的路径变量,并指定路径。
4、  打开项目目录下的build.xml文件,在ant的view窗口可以看到很多的任务,选择compile运行。
五、运行项目:
1、  运行ant任务列表中的start.tomcat,会在eclipse的console运行tomcat。
2、  打开浏览器,输入http://localhost:8080/app,会看到登录页面。
.Appfuse1.7,JDK1.4.2_05,ANT1.6.2,Mysql4.1,Tomcat5.0.28
拷贝appfuse lib/junit3.8.1/junit.jar 到 %ANT_HOME%/lib.
2.设置环境变量
ANT_HOME,
JAVA_HOME,
CATALINA_HOME,
MYSQL_HOME
Path中加入
%JAVA_HOME%bin;%ANT_HOME%bin;%CATALINA_HOME%bin;%MYSQL_HOME%bin;
3.运行Ant建立临时发布环境
先启动Mysql,建立数据库YOURDBNAME
ant new -Dapp.name=YOURAPPNAME -Ddb.name=YOURDBNAME
YOURAPPNAME指你要建立的临时appfuse目录,与当前appfuse同级或可以设置路径
YOURDBNAME默认为Mysql的数据库名,并且root用户的密码为空。
如果需要改变数据库可以修改build.properties文件中这部分的参数:
#database.jar=${postgresql.jar}
#database.type=postgresql
#database.name=myApp
#database.host=localhost
#database URL for creating other databases (doesn't work with pgsql)
#database.admin.url=jdbc:${database.type}://${database.host}/template1
#database.admin.username=postgres
#database.admin.password=postgres
#hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect
#database.driver_class=org.postgresql.Driver
#database.url=jdbc:${database.type}://${database.host}/${database.name}
建立数据库database, 在tomcat上发布应用
运行
ant setup
如果数据库出现错误,修改后可重新输入:ant setup-db
输入:http://localhost:8080/myApp登录失败!
运行任务
ant install
没有成功!出错信息如下:
BUILD FAILED: D:\myfile\myApp\build.xml:1286: java.io.IOException: Server returned HTTP response code: 401 for URL: http://localhost:8080/manager/deploy?path=%2FmyApp
直接在浏览器中输入http://localhost:8080/manager/deploy?path=%2FmyApp
出现窗口要求输入用户名和密码
查看myApp\tomcat.properties 管理员用户密码为admin,admin
修改 tomcat\conf\tomcat-users.xml
admin" roles="admin,manager"/>
删除tomcat\webapp下面myApp目录和conf\Catalina\localhost下的myApp.xml文件,重新启动tomcat
运行ant install
成功!
输入 http://127.0.0.1:8080/myApp。成功了!
输入用户名mraible
密码tomcat
OK!!进入主界面
---------------------------------------------------------------------------
测试报告
ant test-reports
导入到Eclipse:
1、  打开Eclipse,选择文件(File)?导入(import),出现的页面里选择Exist Project into WorkSpace,选择app目录,单击确定,则项目导入。
2、  选择window?preference,在出现的页面里,选择ant---runtime?Ant Home Entries,单击右边的add external jar,选择junit的jar包,单击确定。
3、  属性设置页面,选择java--Buil Path?classpath valiables,单击右边的new按钮,加入J2EE_HOME的路径变量,并指定路径。
4、  打开项目目录下的build.xml文件,在ant的view窗口可以看到很多的任务,选择compile运行。
运行项目:
1、  运行ant任务列表中的start.tomcat,会在eclipse的console运行tomcat。
2、  打开浏览器,输入http://127.0.0.1:8080/myApp,会看到登录页面。
---------------------------------------------------------------------------
使用AppFuse进行开发的总结 [冷月宫主 发表于 2005-9-19 16:39:06]
AppFuse是一个集成了当前最流行的Web应用框架的一个更高层次的Web开发框架,也可以说是一个Web开发基础平台,它与它所集成的各种框架相比,它提供了一部分所有Web系统开发过程中都需要开发的一些功能,如登陆、用户密码加密,用户管理、根据不同的用户可以展现不同的菜单,可以自动生成40%-60%左右的代码,自带了默认的一些在CSS中设定的样式,使用这些样式能很快的改变整个系统的外观,还有自动化测试的功能。
它最大的价值就是为我们提供了一个Web开发的新的方式和思路,尽管这些技术在国外都已进很流行了,但在国内能够将Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWork这些技术集成到一个框架中的还不多见,所以即使不使用它的全部功能,它也给我们提供了一个很好的借鉴、学习的机会。
通过关注AppFuse,我们可以看到目前国外的主流开发都使用了哪些技术,开发方式是什么样的,可能达到什么样的结果,而在以前,是很少能够看到这样完整的例子的。
AppFuse的另一个启示是:我们可以依靠开源软件的功能降低开发成本,而且可以阅读开源软件的代码提高所在团队的整体实力。
AppFuse的作者 matt raible是当今开源世界一个比较活跃的开发者,它是AppFuse、Struts Menu的作者,也是XDoclet、DisplayTag等一些著名开源项目的积极参与者,《Hibernate In Action》的作者就在感谢的名单里面提到他,XDoclet的下载版本中所带的Hibernate标签部分的例子就是他写的,他还是2004年Apache技术年会的主讲人之一。(这些都是我这2个多月来搜集到的,呵呵)
但是通过2个月的实际学习和使用,我也遇到一系列的问题,因为AppFuse是将其他的一些类库或者框架集成在一起的,集成的技术众多,而且有一些技术在国内甚至很少有人知道,资料也比较少,所以虽然作者经过了一些测试,但都是基于英文编码的,而对于中文编码来说,还潜在的存在着一些问题,虽然不是AppFuse的问题,但却降低了开发速度,下面是我在开发过程中遇到过的问题,有些解决了,有些还没有解决:
一.Struts
1. AppFuse中默认的MVC框架是Struts,而且使用的是LookupDispatchAction,并且使用的是按钮(button),在XP下用IE浏览效果还可以,但如果在2000或者98下,就使外观很难看,而且当时我还遇到一个问题:如果按钮显示中文,则在DisplayTag中翻页失灵,而且报错,后来我把BaseAction的相关方法改变了,才可以使用,因为国内的客户都比较重视界面,所以后来我将那些按钮都改成图片了,当然也要添加一些方法了,有点麻烦!
2. Struts中的标签如今推荐使用的只有html部分的标签了,其他的标签或者可以使用JSTL替代,或者已经不推荐使用了,而且AppFuse中推荐使用JSTL,而JSTL和struts的标签的联合使用时,需要的不是<标签>,而是<标签>,这个问题曾经困扰了我整整2天。
3. Struts的Validation的校验规则并不完善,比如如果使用客户端的javascript校验,则在邮箱中输入汉字根本校验不出来,到了服务器端报错。
4. 最严重的问题是AppFuse生成的Struts的validation.xml文件中有许多多余的“.”,如果你去掉了,常常在执行ant的deploy任务时又恢复原样。这样是提交表单的时候经常会报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的访问量来看,它是很活跃的项目,仅次于Ant、Hibernate、Xdoclet等几个著名的项目,我总结,它的主要功能有4项:显示、分页、排序、将显示的数据写入指定类型的文件中,然后下载。
1. 据我使用的情况看,我只使用了分页和显示的功能,因为当时我没有很好的解决中文编码的问题,所以排序会有问题,直到昨天,我在朋友的帮助下解决了这个问题,至此我可以放心使用的功能又增加了排序(我昨天简单的测试了一下是可以的)。
2. 但对于将显示的内容生成到一个指定格式的文件中的功能却有着很多缺陷,如:
(1) 生成的文件中只有显示的数据,那些没有显示在界面上的的数据,则不会被写到文件中。
(2) 如果修改了DisplayTag的显示的内容,比如添加一列,在这列中的内容不是字符,而是HTML的标签,则生成的文件只有这些HTML标签,而没有数据。
(3) 即使DisplayTag中没有我们定制的HTML脚本,生成的文件偶尔也有问题,比如:它会把“007”生成为“7”,把字符串自动的转换为整型值。有时候还生成空白内容的文件。
(4) DisplayTag生成的Excel文件兼容性不好,有时在Excel2003中不能正常打开,或者在XP下打开报错。
后来,我看了作者写的《Spring Live》,书中说如果想实现稳定的Excel,推荐使用POI,于是我使用POI生成Excel,稳定性和兼容性都不错。
六.DBUnit
DBUnit是一个可以被Ant集成的向数据库中添加数据和备份数据的一个类库,配置很方便,因为AppFuse已经集成好了,所以使用也很容易。
但是如果你使用EditPlus之类的工具手工修改了AppFuse生成的内容,则执行Ant的setup、setup-db或者deploy的任务时,常常报错,说无效的格式,这是因为这个被手工修改的文件再次被AppFuse执行后,它的第一行的文件声明的前几个字母是无效的,是因为本地的字符集编码的原因而引起了乱码,如果把这几个无效的字母去掉,问题就解决了。
七.Struts Menu
Struts Menu也是AppFuse的作者开发的一个开源软件,它可以根据配置文件读取当前用户可以使用的功能菜单,这个功能是我一直以来都想要的,我也找到了一些代码,但实现的都不如这个完善,没什么好说的,使用简单,配置容易,很好的解决了我的问题。
问题是我只使用了AppFuse提供的2个角色,对于多个角色的实验我还没有做。
八.XDoclet
在AppFuse中,使用Xdoclet生成了几乎一切的配置文件:Struts-config.xml、web.xml、validation.xml、*.hbm.xml等文件,如果使用AppGen的话,还会生成更多的文件,这一切都是使用Xdoclet实现的。
问题是我在Struts部分提到的,生成的Validation.xml文件中会多生成一个“.”,另外在生成资源文件时也会多生成一个“.”,目前我没有很好的阅读这段代码,不知道是不是Xdoclet的问题。
九.Ant
Ant并没有什么问题,但在执行作者写的Ant任务的时候,有一些任务不能正常执行,比如,运行模拟对象测试的任务,作者也在1.7版本的修复列表中提到以前版本有些ant任务不能执行,在1.7中修改了一些ant任务,使他们能够正常的执行了。
实际上,我们如果使用AppGen进行开发的话,使用的任务一般不超过8个。
十.JSTL
JSTL是个好东西,我常用的有和部分的标签,但是如果使用JSTL进行逻辑判断,我并没有感觉比使用JSP的代码块优雅多少。另外,熟悉JSTL也需要一段时间,我就经历了面对着JSP页面不知道该怎么写JSTL语法的困境。当然,AppFuse中使用的基本都是JSTL,包括向DisplayTag传递显示的数据,使用的都是JSTL语法,这方面的资料挺多,我参考的是电子工业出版社出的《JSP2.0技术》,说的很详细。
十一.Tomcat
你也许会说:“Tomcat就不用说了吧?”,是的,Tomcat一般都会使用,但是—————————————Tomcat5和Tomcat4.X对于中文编码使用了不同的机制,这个问题困扰了我好久,我解决了页面上写入汉字显示乱码的问题,我也曾经以为DisplayTag对汉字不能排序,也不能正常分页是因为DisplayTag的开发者都是老外,是因为他们没有考虑中文的关系的原因。
直到昨天,我才知道这一切都是因为Tomcat5对汉字编码的实现的方式和Tomcat4不一样的原因,如果感兴趣,可以看看这个帖子:http://www.javaworld.com.tw/jute/post/view?bid=9&id=44042&sty=1&tpg=1&age=0
十二.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(或者WebWork、Spring及其他的已经整合进来的MVC框架)、Hibernate(或者ibatis)、JSTL,当然其他的技术至少也要知道一点,否则遇到问题都不知道出在哪里。
目前我还没有解决的问题有:
1. 如何在翻页的时候才读取下面的数据?
2. 怎样对使用同一个FormBean的多个Form进行客户端校验?
3. 怎样优化Hibernate的效率?《Hibernate In Action》中提供了多种策略,有些时候应该使用lazy,有些时候应该使用outer-join。
4. 在什么时机生成导出文件?目前我是在查询的Action中同时生成了导出文件,否则,到了下一页,我就不知道查询条件了,当然,如果把拼装后的HQL存储在Session或者Hidden中也可以解决这个问题,但是这样就破坏了DAO的封装,要把DAO封装后的HQL发送给Action,然后发送的到Web界面层,所以目前我还在犹豫生成导出文件的时机选择在哪里?
5. 什么时候应该自己获取数据库连接,执行native SQL?具体需要注意些什么?
6. SiteMesh的模板优化?
7. DisplayTag的底层实现?
每个问题都比较棘手,要一个一个解决!
这个框架的优点是:如果熟悉了开发流程,可以大幅度的提高开发速度,如果业务不是很复杂,使用AppGen可以生成60%左右的代码,而且程序可维护性好,因为作者使用了多个设计模式对各个层面进行了封装,所以不同的模块代码风格出奇的一致,有利于开发人员快速上手,也有利于接收其他开发人员遗留的代码。
<标签><标签 />
<标签><标签 />
<标签><标签>http://blog.csdn.net/clearwater21cn/category/107237.aspx
AppFuse:
使用Struts Menu构造动态树
摘要:基于数据库构造动态菜单树    (全文共2736字)??点击此处阅读全文
发表于 @2005年11月28日 7:37 PM |评论 (0)
修改AppFuse
摘要:让AppFuse为我所用    (全文共1505字)??点击此处阅读全文
发表于 @2005年11月18日 11:18 AM |评论 (2)
AppFuse学习笔记-单元测试
摘要:AppFuse是怎样使用单元测试的?很有启发性哦。    (全文共3400字)??点击此处阅读全文
发表于 @2005年03月28日 10:03 PM |评论 (0)
AppFuse学习笔记-视图层
摘要:介绍AppFuse的视图层,告诉你每个标签的含义。    (全文共5784字)??点击此处阅读全文
发表于 @2005年03月28日 8:37 PM |评论 (0)
AppFuse学习笔记-模型层
摘要:模型层是整个系统的核心,在本篇我们详细介绍Spring在AppFuse里的作用    (全文共11660字)??点击此处阅读全文
发表于 @2005年03月21日 8:30 PM |评论 (0)
AppFuse学习笔记-控制层
摘要:解读AppFuse控制层实现    (全文共4522字)??点击此处阅读全文
发表于 @2005年03月19日 7:38 PM |评论 (0)
AppFuse学习笔记-组件和工具
摘要:介绍AppFuse里使用的组件和工具,非常实用    (全文共5403字)??点击此处阅读全文
发表于 @2005年03月19日 7:36 PM |评论 (0)
AppFuse学习笔记-框架总揽
摘要:对AppFuse框架做一个总体的介绍    (全文共1878字)??点击此处阅读全文
发表于 @2005年03月19日 7:32 PM |评论 (0)
AppFuse学习笔记-简介
摘要:介绍AppFuse,并详述其安装过程    (全文共3540字)??点击此处阅读全文
发表于 @2005年03月19日 7:17 PM |评论 (0)
AppFuse学习笔记-框架总揽
安装好了系统,我先来对它做一个总体介绍。
Raible给AppFuse这个Web应用写了好几种实现方式,有Struts + Spring + Hibernate、Spring + iBATIS、WebWork + Spring + Hibernate、JSF + Spring + Hibernate、Tapestry + Spring + Hibernate 等等。目前在国内最流行的应该就是Struts + Spring + Hibernate了,就以这种框架为例介绍AppFuse吧。
Struts + Spring + Hibernate使用了基于MVC模式的struts的框架,并使用hibernate进行持久层操作,使用Spring对各个组件进行“依赖注射”。通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用,具有组件化的优点从而更易于实现对大规模系统的开发和管理。使用AppFuse,你应该对Struts和Hibernate有一定的了解。
下面分别介绍各层的功能:
1. Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。Controller功能核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Action控制器对象之间的映射。所有的Action对象都是从Struts的Action类派生的子类。Action对象封装了具体的控制逻辑,调用Model层的业务逻辑模块,并且把响应提交到合适的View组件以产生响应。Struts提供的ActionForm组件对象为显示提供一个模型,可以通过定义属性描述客户端表单数据。从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的表单数据的良好封装和支持。通过ActionForm组件对象实现了对View和Model之间交互的支持。同时,控制器会负责处理异常及UI验证
2. Model:代表的是应用的业务逻辑。Model分为两层:持久层和业务层,用这种模式将底层数据访问操作与高层业务逻辑分离开。持久层使用ORM开源框架:Hibernate。 Hibernate为java提供了OR持久化机制和查询服务。业务层框架使用Spring。Spring着手于“依赖注入”这样的概念。Spring把程序中所涉及到包含业务逻辑和Dao的Objects??例如transaction management handler(事物管理控制)、Object Factoris(对象工厂)、service objects(服务组件)??都通过XML来配置联系起来,降低了各个组件的耦合度。
3. View:View是应用的表示面,通过JSP技术实现。Struts提供了自定义的标记库可以使用,通过这些自定义标记可以非常好地和系统的Model部分交互,通过使用这些自定义标记创建的JSP表单,可以实现和ActionForm的映射,完成对用户数据的封装。
Action调用Model层方法时通过读取Spring框架配置文件来创建实例。Spring框架控制主体公共部分,而把用户要使用的部分定义了接口,然后用Spring框架调用这个接口,实现回调。Model层分为两层:业务层(Manager)和持久层(DAO),每一层又分接口和实现两部分。Action调用Manager层的接口,Manager的Implement实现高层业务逻辑并调用DAO接口实现对数据库的操作。这三层之间的调用均通过Spring的“依赖注入”机制实现。
AppFuse学习笔记-组件和工具
使用大量的第三方组件是Appfuse的主要特点,接下来我们就看看他都使用了什么组件。
1. DisplayTag:自我觉得是AppFuse里降低编码量最大的组件,我专门写了一篇使用DisplayTag的文章,http://blog.csdn.net/clearwater21cn/archive/2005/02/21/296316.aspx,这里就不说了。
2. JSTL:JSP Standard Tag Library是建立在JSP上的某种custom actions(自定操作)或custom tags(自定标签),类似于html语法中的标记。JSTL提供了诸如循环、条件、数据库访问、XML处理、国际化(i18n)等开发上的工具和流程。本系统中主要使用JSTL的核心标记库及格式化标记库标签实现动态的Web页和国际化支持。
3. Sitemesh:用于建立复合视图。旨在提高页面的可维护性和复用性。sitemesh应用Decorator模式,用filter截取request和response,把页面组件head,content,banner结合为一个完整的视图,可方便的建立复合视图模式。
4. Struts Menu:AppFuse作者写的基于JSP和Struts的应用程序的Web菜单框架。利用它可以很方便的通过XML定义及JSP标签构建树形菜单。
5. OSCache:OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件。通过缓存页面的输出结果,可以很显著的改善系统运行性能。并能够改善系统的稳定性。
6. UrlRewrite:地址变换技术,可以将应用中的url变换成自定义样式。
7. Acegi:1.8加入的新组件,属于Spring的子项目。它使用Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。AppFuse用它实现了用户的认证和授权管理。
8. Quartz:AppFuse中没有使用这一组件,但我觉得它提供的功能很常用,并实现的很好,因此顺带提一下。Quartz是一个实现任务定时调度的框架,它提供了简单易用的接口,实现了可调度任务的接口,并实现了强大的任务调度运行时(可以独立运行、可以作为EJB部署于容器中、本身支持cluster,等等),这一组件由Spring提供。
AppFuse还给我们提供或介绍了很多好用的工具,能大大加快我们的开发速度。如果能够很好的使用这些工具,我们可以只给出一个表的POJO,它们就能够自动生成所有的操作该POJO对应的数据表通常需要的增、删、改、查功能的模型层、控制层、视图层文件,几乎不用再修改就可以完成对这张表的所有基本操作。
1. AppGen
AppFuse给我们提供了一个通过xdoclet生成代码的工具??AppGen,我们来看看它怎么用。
POJO(Plain Old Java Object)代表一个存储在持久性存储器(如数据库)中的实体的对象视图。它通过hbm.xml配置文件与存储器中的数据相映射。
首先,你需要有这个表的POJO,放在src\dao\org\appfuse\model中。
在控制台中进入项目下的extras\appgen路径,键入ant -Dmodel.name=XXX -Dmodel.name.lowercase=xxx,第一个XXX处写你的POJO类名,第二个xxx处写这个对象在小写时的名字。当控制台出现BUILD SUCCESSFUL时,代码就生成了。代码在extras\appgen\build\gen文件夹下,包括java源代码(DAO、Service、Action)、单元测试、JSP、资源文件、xml配置文件、源数据等,目录结构与原项目一致,你只要把需要的目录拖到相应的项目根目录下就可以了,当然了,有的代码是需要在已有的文件上进行修改的,主要是属性文件和xml文件,这时需要你把新的代码手动转移到原来的文件中。
AppGen也可以为你省去这个麻烦,只要在前面的那段命令中加一个install,即ant install -Dmodel.name=XXX -Dmodel.name.lowercase=xxx,AppGen会直接把代码生成到你的项目中去,包括修改已存在的文件。这时为了保险起见,最好先备份一下代码。
2. xdoclet注释
AppGen生成的文件缺少了hbm.xml和Action Form Bean,难道我们要自己写吗?不是的。仔细察看build.xml文件就会发现实际上我们下载的AppFuse最初的源代码中并没有hbm.xml、FormBean,甚至连web.xml、struts-config.xml、validation.xml都没有,这些文件都是在我们执行ant setup时build.xml使用xdoclet自动生成的。 甚至连数据库和表、表里的数据也可以自动生成。奥秘都在POJO中。
查看User.java这个POJO你会发现里面除了java代码,还有很多注释,有@hibernate开头的,@struts开头的,这些都是xdoctlet的标签。我们大致讲解一下:
@struts.form:用来生成Form Bean,如User.java中写了@struts.form include-all="true" extends="BaseForm",意思是该POJO中每一个属性在Form Bean中都要有,并且生成的Form Bean文件要继承BaseForm。如果不希望生成的FormBean包含POJO的所有属性,可以在相关的属性get方法前填写注释@struts.form-field,意思是该属性要在FormBean中生成。那么如果我们要在FormBean中添加一些POJO没有的属性或方法怎么做呢?打开metadata\web文件夹,可以看到有一个xdoclet-UserForm.java文件,里面是User.java在生成Form Bean时新加入的代码,我们同样可以把我们自己在FormBean中增加的代码新建到一个xdoclet-POJOFrom.java文件中就好了。
@struts.validator:用来生成validation.xml文件。最常用的如@struts.validator type="required",意为该属性在表单中需要有必填的验证。当然前提是这个属性也在FormBean中。validation还有一项配置是自定义的校验规则,使用正则表达式表示。metadata\web中有一个文件validation-global.xml,里面就有邮编等规则的配置。
@hibernate:这个是比较复杂的,用来生成hbm.xml文件。其实内容与hbm.xml基本一致,所以如果会写hbm.xml,这个也就会写了。初学者可以先建表,使用工具生成hbm.xml,再仿照生成的hbm.xml内容写这个标签。一旦标签写好了,不光可以生成hbm.xml,build.xml还可以自动在数据库中建表。
@struts.action/@struts.action-forward:POJO不能生成struts-config.xml,这个标签是要写到Action中的。如果使用AppGen生成Action,你会看到@struts.action已经写好了,这个标签的作用就是生成当前Action在struts-config.xml中的映射代码,写法与struts-config.xml中一致,其实就是把xml中的配置移植到Action中。还有一个问题,如果我们要在struts-config.xml中进行与Action无关的全局的配置,如global-forwards呢?浏览metadata\web文件夹你会发现里面有多个xml文件,其中以global和struts开头的文件就是写这些配置的。build.xml在setup时会自动将这些文件联合Action中的注释生成一个完整的struts-config.xml文件。
接下来还有web.xml文件,你一定猜到了同样需要在metadata\web中配置。除了刚才提到的那些xml文件,剩下的基本都是用于配置web.xml的了。我们自定义的filter和listener是有具体类的,所以我们同样可以在这些filter和listener类中添加注释,具体例子参考AppFuse中的filter吧,很简单的。
进行了所有配置后,运行ant setup,build.xml会根据POJO、Action等自动生成FormBean、hbm.xml、struts-config.xml、validation.xml、web.xml,并在数据库中创建相应的表。看起来可能有点复杂,但如无特殊要求,对数据表的增、删、改、查,只需要写好POJO,一切都可以搞定。
3. Commonclipse
org.appfuse.model中有一个抽象类BaseObject,定义了三个抽象方法:hashCode()、equals()和toString(),其中前两个是Hibernate要求POJO必须实现的方法。所有的POJO都继承自这个类,当然也要实现这三个方法,这个工具可以帮助你实现这三个方法。
我们可以使用Eclipse在线获得这个工具。步骤:依次点击"Help" -> "Software updates" -> "Find and Install" -> "Search for new features to install",点击"add update site",输入http://commonclipse.sourceforge.net,OK。
接下来需要对Commonclipse进行一些配置。点击"Window"->"Preferences",选择"Java",你会在菜单中看到Commonclipse。点击General标签,将复选框全部钩掉(全不选)。点击"OK"。
选中一个类,右击,你会在菜单中看到Commonclipse。选择要生成的方法,就这么简单。
 
- 作者:nike_liu 2005年12月13日, 星期二 17:11
你可以使用这个链接引用该篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=1089878