??xml version="1.0" encoding="utf-8" standalone="yes"?> 2)M2_HOME讄为Maven的安装\?/p>
3)path 部分 dQ?M2_HOME%\bin;%JAVA_HOME%\bin
删除@GeneratedValue(strategy=IDENTITY)Q只剩下一个?br />
2.由model 生成CRUD q行mvn appfuse:gen -Dentity=Person?x)生成personList.jsp?br />
personForm.jsp、PersonAction.java 但是没有自动生成dao与service 而是采用?br />
GenericManager<Person, Long>中的Ҏ(gu)。如果想生成相应的service和dao需要修改pom.xml
配置文g。在目下的pom.xml中查找genericCoreQ大概在940?扑ֈ 属性true 改ؓ(f)false
像这?lt;amp.genericCore>false</amp.genericCore>Q重新运?mvn appfuse:gen -Dentity=Person
在eclipse中查看代?dao ?service也都生成了?br />
3.q问题
对于APPFUSE生成的工E运行时q是很常见的现象,造成该现象的原因也有几种Q?nbsp;
ZhQ这里引用一网上的文章Q?a style="color: #993300" href="http://www.aygfsteel.com/43880800/archive/2006/11/18/81892.html ">http://www.aygfsteel.com/43880800/archive/2006/11/18/81892.html
对于国际化文?.properties文g的编辑,有两个ECLIPSE插g可以推荐使用PropertiesEditor ?nbsp;
ResourceBundleEditor 再次h引用一网文:(x)http://blog.csdn.net/lmjq/archive/2007/06/21/1660137.aspx
]]>
1)JAVA_HOME 讄为刚才安装的JDK的安装\?/p>
关于maven的本C库和maven proxy讄详见【Maven安装和用?br />
mvn archetype:create -DarchetypeGroupId=org.appfuse.archetypes -DarchetypeArtifactId=appfuse-basic-struts - DremoteRepositories=http://static.appfuse.org/releases -DarchetypeVersion=2.0.2 -DgroupId=com.onet.bd - DartifactId=BDSystem
可以参考appfuse官方|站上的构徏命o(h)Q其中DgroupIdQ所构徏目的包名称QDartifactIdQ项目名U?br />
3:q行工程
mvn jetty:run-war
打开览器http:localhost:8080/卛_以看到生成的web目
4:获得源文?nbsp;
mvn appfuse:full-source
6:生成eclipse目文g
mvn install eclipse:eclipse
]]>
AppFuse是一个集成了当前最行的Web应用框架的一个更高层ơ的Web开发框Ӟ也可以说是一个Web开发基q_Q它与它所集成的各U框架相比,它提供了一部分所有Webpȝ开发过E中都需要开发的一些功能,如登陆、用户密码加密,用户理、根据不同的用户可以展现不同的菜单,可以自动生成40Q?60%左右的代码,自带了默认的一些在CSS中设定的样式Q用这些样式能很快的改变整个系l的外观Q还有自动化试的功能?nbsp;
它最大的价值就是ؓ(f)我们提供了一个Web开发的新的方式和思\Q尽这些技术在国外都已q很行了,但在国内能够Hibernate、Struts、Spring、DBUnit、Ant、Log4J、Struts Menu、Xdoclet、SiteMesh、Velocity、JUnit、JSTL、WebWorkq些技术集成到一个框架中的还不多见,所以即使不使用它的全部功能Q它也给我们提供了一个很好的借鉴、学?fn)的Z(x)?AppFuse的另一个启C是Q我们可以依靠开源Y件的功能降低开发成本,而且可以阅读开源Y件的代码提高所在团队的整体实力?
一QStruts
1Q?AppFuse中默认的MVC框架是StrutsQ而且使用的是LookupDispatchActionQƈ且用的是按钮(buttonQ,在XP下用IE览效果q可以,但如果在2000或?8下,׃外观很难看,而且当时我还遇到一个问题:(x)如果按钮昄中文Q则在DisplayTag中翻失灵,而且报错Q后来我把BaseAction的相x法改变了Q才可以使用Q因为国内的客户都比较重视界面,所以后来我那些按钮都Ҏ(gu)囄了,当然也要d一些方法了Q有炚w?ch)?
2Q?Struts中的标签如今推荐使用的只有html部分的标{了Q其他的标签或者可以用JSTL替代Q或者已l不推荐使用了,而且AppFuse中推荐用JSTLQ而JSTL和struts的标{联合使用Ӟ需要的不是<html:标签>Q而是<html-el:标签>Q这个问题曾l困C我整?天?
3Q?Struts的Validation的校验规则ƈ不完善,比如如果使用客户端的javascript校验Q则在邮׃输入汉字Ҏ(gu)校验不出来,C服务器端报错?
4Q?最严重的问题是AppFuse生成的Struts的validation.xml文g中有许多多余?#8220;.”Q如果你L了,常常在执行ant的deployd时又恢复原样。这h提交表单的时候经怼(x)报javascript的脚本错误或者缺对象或者缺valueQ所以我?x)手工的修改q个文gQ然后把修改后的文g备䆾Q当重新生成有错误的文gӞ我会(x)用备份的没有错误的文件去覆盖?
5Q?Struts的validatioin对于使用同一个FormBean的Action的校验方式比较复杂。(待解冻I?
二.Hibernate
1Q?Hibernate是现在受到越来越多的人推崇的一个ORM工具Q框架、类库)Q它?yu)我们从J琐的用JDBC的开发过E中解放出来Q但同时也带来了新的问题Q如学习(fn)曲线Q执行效率,数据库设计优化,q有最重要的灵zL。Hibernate不是一个很Ҏ(gu)上手的东西,要完全驾驭它q需要读很多资料Q但好的资料却很?
2Q?使用Xdoclet可以很方便的生成Hibernate中的持久cȝ配置文gQ?.hbm.xmlQ?但对一些特D的映射却无能ؓ(f)力,如用序列的id生成规则Q序列的名字没有地方写,所以也只好先利用它生成主要的内容,然后手工修改?
3Q?同样q是id的生成策略问题,如果使用序列、hilo{需要一些数据库机制支持的策略时QschemaExportq不能自动生成序列或者保存当前id的表Q这工作仍然要手工解决?
4Q?Hibernate中提供了几种兌Q一对一、一对多、多对多Q但对于怎样调整效率却没有一个很明确的提C,q要Ҏ(gu)情况判定Q这带来和一些弹性的设计?
5Q?Hibernate中可以选择的操作数据库的方式有3U,其中HQL功能最强大Q但有些功能使用标准查询可能?x)更方便Q但?x)有一些限Ӟ所以虽然它很灵z,但易用性不如JDBC好?
三.Spring
在AppFuse的过E中QSpring完全隐藏在幕后,除了一些配|外Q几乎感觉不到它的存在,所以我在用它的过E中q没有遇C么麻?ch),q里只是单的介绍一下它在AppFuse中v到的作用?
1Q?Spring在AppFuse中v到的主要作用是对Hibernate的Session和事务的理Q利用Spring装的Hibernate模板c,我们大大地减了实现DAO的代码行数?
2Q?SpringqvCq接映射文g和类之间的关联,?qing)接口和实现cM间的兌Q这些都依赖于Spring的IoC的机制的实现?
3Q?对于字符q行~码和解码部分用CSpring自带的FilterQ只需要在配置文g中配|就好了?
四.SiteMesh
SiteMesh是一个基于Decorator模式的技术,它可以修饰返回的|页文gQ它的工作方式受到越来越多的人的推崇Q这点从Manning出版的一些技术书c中可以看出来?
我在使用SiteMesh的过E中q不利Q我参考了《Java Open Source Programming》,q本书中说SiteMesh在默认的情况下不对下载文件进行装饎ͼ但我在下载文件时发现Q我的文件内容被丢弃了,取而代之的是SiteMesh的模板的内容Q后来我通过修改SiteMesh的配|文件解决了q个问题Q但感觉q有一些不太清楚的地方需要学?fn)?
五.DisplayTag
DisplayTag是一个优U的显C内容的标签Q从SourceForge的访问量来看Q它是很z跃的项目,仅次于Ant、Hibernate、Xdoclet{几个著名的目Q我ȝQ它的主要功能有4:(x)昄、分c(din)排序、将昄的数据写入指定类型的文g中,然后下蝲?
1Q?据我使用的情늜Q我只用了分页和显C的功能Q因为当时我没有很好的解决中文编码的问题Q所以排序会(x)有问题,直到昨天Q我在朋友的帮助下解决了q个问题Q至此我可以攑ֿ使用的功能又增加了排?我昨天简单的试了一下是可以??
2Q?但对于将昄的内容生成到一个指定格式的文g中的功能却有着很多~陷Q如Q?
Q?Q?生成的文件中只有昄的数据,那些没有昄在界面上的的数据Q则不会(x)被写到文件中?
Q?Q?如果修改了DisplayTag的显C的内容Q比如添加一列,在这列中的内容不是字W,而是HTML的标{,则生成的文g只有q些HTML标签Q而没有数据?
Q?Q?即DisplayTag中没有我们定制的HTML脚本Q生成的文g偶尔也有问题Q比如:(x)它会(x)?#8220;007”生成?#8220;7”Q把字符串自动的转换为整型倹{有时候还生成I白内容的文件?
Q?Q?DisplayTag生成的Excel文g兼容性不好,有时在Excel2003中不能正常打开Q或者在XP下打开报错?
后来Q我看了作者写的《Spring Live》,书中说如果想实现E_的ExcelQ推荐用POIQ于是我使用POI生成ExcelQ稳定性和兼容性都不错?
六.DBUnit
DBUnit是一个可以被Ant集成的向数据库中d数据和备份数据的一个类库,配置很方便,因ؓ(f)AppFuse已经集成好了Q所以用也很容易?
但是如果你用EditPlus之类的工h工修改了AppFuse生成的内容,则执行Ant的setup、setup-db或者deploy的Q务时Q常常报错,说无效的格式Q这是因个被手工修改的文件再ơ被AppFuse执行后,它的W一行的文g声明的前几个字母是无效的Q是因ؓ(f)本地的字W集~码的原因而引起了qQ如果把q几个无效的字母LQ问题就解决了?
七.Struts Menu
Struts Menu也是AppFuse的作者开发的一个开源YӞ它可以根据配|文件读取当前用户可以用的功能菜单Q这个功能是我一直以来都惌的,我也扑ֈ了一些代码,但实现的都不如这个完善,没什么好说的Q用简单,配置Ҏ(gu)Q很好的解决了我的问题?
问题是我只用了AppFuse提供?个角Ԍ对于多个角色的实验我q没有做?
八.XDoclet
在AppFuse中,使用Xdoclet生成了几乎一切的配置文gQStruts-config.xml、web.xml、validation.xml?.hbm.xml{文Ӟ如果使用AppGen的话Q还?x)生成更多的文gQ这一切都是用Xdoclet实现的?
问题是我在Struts部分提到的,生成的Validation.xml文g中会(x)多生成一?#8220;.”Q另外在生成资源文g时也?x)多生成一?#8220;.”Q目前我没有很好的阅读这D代码,不知道是不是Xdoclet的问题?
?ji).Ant
Antq没有什么问题,但在执行作者写的Antd的时候,有一些Q务不能正常执行,比如Q运行模拟对象测试的dQ作者也?.7版本的修复列表中提到以前版本有些antd不能执行Q在1.7中修改了一些antdQ他们能够正常的执行了?
实际上,我们如果使用AppGenq行开发的话,使用的Q务一般不过8个?
十.JSTL
JSTL是个好东西,我常用的?amp;lt;c:>?amp;lt;fmt:>部分的标{,但是如果使用JSTLq行逻辑判断Q我q没有感觉比使用JSP的代码块优雅多少。另外,熟?zhn)JSTL也需要一D|_(d)我就l历了面对着JSP面不知道该怎么写JSTL语法的困境。当?dng)AppFuse中用的基本都是JSTLQ包括向DisplayTag传递显C的数据Q用的都是JSTL语法Q这斚w的资料挺多,我参考的是电(sh)子工业出版社出的《JSP2.0技术》,说的很详l?
十一.Tomcat
你也怼(x)_(d)(x)“Tomcat׃用说了吧Q?#8221;Q是的,Tomcat一般都?x)用,但是―――――――――――――Tomcat5和Tomcat4.X对于中文~码使用了不同的机制Q这个问题困C我好久,我解决了面上写入汉字显CZؕ码的问题Q我也曾l以为DisplayTagҎ(gu)字不能排序,也不能正常分|因ؓ(f)DisplayTag的开发者都是老外Q是因ؓ(f)他们没有考虑中文的关pȝ原因?
直到昨天Q我才知道这一切都是因为Tomcat5Ҏ(gu)字编码的实现的方式和Tomcat4不一L(fng)原因Q如果感兴趣Q可以看看这个帖子:(x)http://www.javaworld.com.tw/jute/post/view?bid=9&id=44042&sty=1&tpg=1&age=0
十二.JavaScript
JavaScript单易学,但想q用自如׃太容易了。AppFuse中嵌入了几个js文gQ里面包含了许多函数Q值得我们好好的研I一下,比如Q如果有一个必填字D|有填写,AppFuse?x)自动的聚焦在那个input上,cM的小技巧有很多Q你可以自己ȝ看?
但AppFuse自带的JavaScript脚本有一个BugQ就是当DisplatyTag中没有可以显C的数据Ӟ你用鼠标单击Q它?x)报JavaScript错误Q你仔细研究一下function highlightTableRows(tableId) q道了Q我的解军_法是在location.href = link.getAttribute("href");前面d一行判断:(x)if (link != null)?
十三.资源文g国际?
对于Struts和DisplayTag都涉?qing)到资源文g国际化AppFuse1.6.1很好的解决了Struts资源映射文g国际化的问题Q你只需要在对应本国语言的资源文件中写入汉字QAnt中有一Ҏ(gu)行native2ascii的Q务,AppFuse自动的ؓ(f)你进行了资源文g的编码{换,而对于DisplayTag的资源文仉题,q要自己执行native2ascii命o(h)Qؓ(f)了避免每ơ都输入一串命令,我用Delphi写了个小工具Q可视化的选择资源文gQ点?yn)L钮自动执行该命o(h)Q底层依赖于JDK?
]]>
mvn appfuse:gen-model
Ҏ(gu)数据库的表生成javac?/td>
mvn appfuse:gen
Ҏ(gu) POJOs.生成q安装Tests, DAO, Managers, Controllers and Views
mvn appfuse:full-source
把运行所需要的org.appfuse中的依赖c{换成你的包名U?/td>
mvn eclipse:eclipse
生成eclipse的项目的配置文gQ用户可以直接把目导入到eclipse?/td>
mvn jetty:run-war
打包q且发布你的应用E序到Jetty, 查看?http://localhost:8080
mvn appfuse:install
把生成的源代码及(qing)配置文g写入到src?
mvn integration-test
启动TOMCAT(或别的服务器)q行试
mvn appfuse:remove
删除appfuse:gen.生成的代?
mvn appfuse:clean
清除target下的所有内?nbsp;