Appfuse开发教程Word格式.docx
- 文档编号:6229463
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:47
- 大小:72.65KB
Appfuse开发教程Word格式.docx
《Appfuse开发教程Word格式.docx》由会员分享,可在线阅读,更多相关《Appfuse开发教程Word格式.docx(47页珍藏版)》请在冰点文库上搜索。
1、Person.java添加XDoclet的验证标签15
2、察看和测试添加了验证的JSP16
3、DAO和Manager的测试添加testGetPeople方法17
4、PersonDao和Manager添加getPeople方法17
5、Action添加testSearch方法18
6、Action添加search方法18
7、创建personList.jsp和Canoo测试19
8、菜单添加链接20
在AppFuse建立DAO和POJO
-讲述如何创建POJO(对应相应的数据表)和DAO(管理POJO持久化操作的对象)。
本教程将向你展示如何在一个数据库里创建表,以及如何完成访问这些表的Java代码。
我们将建立一个对象以及处理(保存/检索/删除)这些类到数据库的一些代码。
用Java术语,我们叫它PlainOldJavaObject(POJO)。
这个对象通常代表了数据库中的一个表,其他的类包括:
●一个数据访问对象DataAccessObject(DAO),一个Interface和一个Hibernate实现
●一个JUnit类来测试我们的DAO对象
AppFuse使用Hibernate作为持久化层,Hibernate是一套对象/关系Object/Relational(O/R)框架,他允许你把Java对象和数据库之间联系起来,它可以很方便的对你的对象执行CRUD(Create,Retrieve,Update,Delete)操作。
让我们继续在AppFuse项目的结构下创建一个新的对象、DAO和测试。
1、建立一个对象,并且作XDoclet标记
我们要做的第一件事情就是建立一个需要持久化的对象,我们要在src/dao/**/model目录下建立一个简单的Person对象,这个对象包括id、firstName和lastName属性。
packageorg.appfuse.model;
publicclassPersonextendsBaseObject{
privateLongid;
privateStringfirstName;
privateStringlastName;
/*
*GenerateyourgettersandsettersusingyourfavoriteIDE:
In
*Eclipse:
Right-click->
Source->
GenerateGettersandSetters
*/
}
这个类必须扩展BaseObject,而这个BaseObject有三个抽象方法(equals(),hashCode()和toString())需要你在Person类里实现,前两个是Hibernate的需要。
你可以使用Eclipse来完成。
现在我们已经创建了这个POJO对象,我们需要增加XDoclet标记来产生Hibernate的映射文件,这些文件用来映射对象→表和属性(变量)→字段。
首先,我们增加@hibernate.class来告诉Hibernate我们将要和那个表作关联:
/**
*@hibernate.classtable="
person"
我们也要增加主键的映射,否则XDoclet会在产生映射文件时出错,注意所有的@hibernate.*标签必须在getters'
的Javadocs里面。
*@returnReturnstheid.
*@hibernate.idcolumn="
id"
generator-class="
increment"
unsaved-value="
null"
publicLonggetId(){
returnthis.id;
我使用generator-class="
而不使用generate-class="
native"
是因为我对数据库使用"
时出现问题。
建议使用uuid.hex。
2、使用Ant根据对象产生数据库表
在这种情况下,你可以通过运行antsetup-db来建立person表,这个任务会产生文件Person.hbm.xml并且会建立叫做"
的表,从Ant的控制台窗口,你可以看到Hibernate为你建立的表结构的内容。
[schemaexport]createtableperson(
[schemaexport]idbigintnotnull,
[schemaexport]primarykey(id)
[schemaexport]);
如果你查看Hibernate生成的文件Person.hbm.xml,可以到build/dao/gen/**/model目录,这里是Person.hbm.xml的内容(目前的内容):
<
?
xmlversion="
1.0"
>
!
DOCTYPEhibernate-mappingPUBLIC
"
-//Hibernate/HibernateMappingDTD2.0//EN"
hibernate-mapping>
<
classname="
org.appfuse.model.Person"
table="
dynamic-update="
false"
dynamic-insert="
<
idname="
column="
type="
java.lang.Long"
<
generatorclass="
/generator>
/id>
--
ToaddnonXDocletpropertymappings,createafilenamed
hibernate-properties-Person.xml
containingtheadditionalpropertiesandplaceitinyourmergedir.
-->
/class>
/hibernate-mapping>
现在我们要为其它的字段(first_name,last_name)添加额外的@hibernate.property标签:
*@hibernate.propertycolumn="
first_name"
length="
50"
publicStringgetFirstName(){
returnthis.firstName;
last_name"
publicStringgetLastName(){
returnthis.lastName;
在这个例子里,添加column属性的唯一原因是因为这个字段名与它的属性名不相同,如果他们相同,你没有必要来指定column属性,关于其它可以使用的标签请看@hibernate.property。
再次运行antsetup-db把新加的属性加到数据库表里。
[schemaexport]first_namevarchar(50),
[schemaexport]last_namevarchar(50),
如果期望修改字段的长度,修改@hibernate.property标签的length属性,如果希望把字段改为必添字段(NOTNULL),可以增加属性not-null="
true"
。
3、建立新的DaoTest来对你的DAO运行JUnit测试
注意:
从Appfuse版本1.6.1+开始包括了一个AppGen工具,可以用来生成本教程余下的所有的类的代码,不过,我们最好还是先过一遍教程再使用这个工具产生代码。
现在,我们要创建一个DaoTest来测试我们的DAO的工作,“等会儿”,你说,“我们还不曾创建DAO呢!
”,你说得对。
无论如何,我发现先测试后编码大大的促进了软件质量,在许多年里我一直认为在写代码之前写测试是胡说八道,这看起来很愚蠢,但当我尝试之后我认为这样非常好,现在我按照测试驱动的方式工作完全因为我发现这样可以大大提高我软件开发的效率。
开始,我们在test/dao/**/dao目录下建立类PersonDaoTest.java,这个类必须扩展BaseDaoTestCase,而BaseDAOTestCase这个类是JUnit类TestCase的子类,这个类用来加载Spring的ApplicationContext(因为Spring把各个层绑定)和单元测试类同一目录下同你的测试类文件同名的.properties文件(ResourceBundle),这个属性文件的属性可以通过“rb”属性来访问。
我经常拷贝(打开→另存为)一个已存在的测试(如UserDaoTest.java),然后查找/替换[Uu]ser为[Pp]erson,或者任何其它需要替换的内容。
packageorg.appfuse.dao;
importorg.appfuse.model.Person;
importorg.springframework.dao.DataAccessException;
publicclassPersonDaoTestextendsBaseDaoTestCase{
privatePersonperson=null;
privatePersonDaodao=null;
publicvoidsetPersonDao(PersonDaodao){
this.dao=dao;
}
以上是我们使用JUnit测试而初始化和销毁PersonDao的基本代码,对象“ctx”引用了Spring的ApplicationContext,它在BaseDaoTestCase类的静态代码区里被初始化。
现在我们需要实际测试DAO中的CRUD(create,retrieve,update,delete)方法,为此我们需要为每个方法建立以test(全部小写)开头的测试方法,只要这个方法是公共的,返回类型是void,它们就会被我们build.xml中的Ant的<
junit>
任务调用,如下是一些简单的CRUD测试,需要注意的一点是所有的方法(或者叫做测试)必须是自治的,添加如下代码到文件PersonDaoTest.java:
publicvoidtestGetPerson()throwsException{
person=newPerson();
person.setFirstName("
Matt"
);
person.setLastName("
Raible"
dao.savePerson(person);
assertNotNull(person.getId());
person=dao.getPerson(person.getId());
assertEquals(person.getFirstName(),"
publicvoidtestSavePerson()throwsException{
person=dao.getPerson(newLong
(1));
LastNameUpdated"
if(log.isDebugEnabled()){
log.debug("
updatedPerson:
"
+person);
}
assertEquals(person.getLastName(),"
publicvoidtestAddAndRemovePerson()throwsException{
Bill"
Joy"
removingperson..."
dao.removePerson(person.getId());
try{
person=dao.getPerson(person.getId());
fail("
Personfoundindatabase"
}catch(DataAccessExceptiondae){
Expectedexception:
+dae.getMessage());
assertNotNull(dae);
在testGetPerson方法,我们创建了一个person并且调用get方法,我通常会增加一条我所需要的记录到数据库,因为在测试运行之前DBUnit会为数据库准备测试数据,我们可以简单的在metadata/sql/sample-data.xml里添加测试所必须的记录
tablename='
person'
column>
id<
/column>
first_name<
last_name<
row>
value>
1<
/value>
Matt<
Raible<
/row>
/table>
通过这种方式你可以在testGetPerson方法里消除创建新纪录的动作,如果你愿意直接插入记录到数据库(使用SQL或者GUI),你可以用antdb-export和cpdb-export.xmlmetadata/sql/sample-data.xml重新构建你的sample-data.xml文件。
在上面的例子里,你可以看到我们调用person.set*(value)来准备我们需要保存的对象,在这个例子里很简单,但是当你要插入10条必添字段(not-null="
)时就比较麻烦了,这就是我为什么要在BaseDaoTestCase使用ResourceBundle文件,只要在PersonDaoTest.java同一个目录创建一个PersonDaoTest.properties并且在里面定义你的属性值:
我通常只是在Java里硬编码,但是这个.properties对于大对象很有用。
firstName=Matt
lastName=Raible
此时,你要通过调用BaseDaoTestCase.populate(java.lang.Object)方法来准备对象,而不是使用person.set*。
person=newPerson();
person=(Person)populate(person);
在目前情况下,还不可以编译PersonDaoTest,因为在类路径里还没有PersonDao.class,我们需要创建它。
PersonDao.java是一个接口,PersonDaoHibernate.java是它的Hibernate实现,让我们继续,开始创建。
4、创建一个对对象执行CRUD操作的新DAO
马上,在src/dao/**/dao目录里建立PersonDao.java接口,并且指定所有实现类要实现的基本CRUD操作,为了显示方便,我已经去掉了所有JavaDocs。
publicinterfacePersonDaoextendsDao{
publicPersongetPerson(LongpersonId);
publicvoidsavePerson(Personperson);
publicvoidremovePerson(LongpersonId);
注意,在以上的方法声明上并没有exceptions说明,这是因为Spring使用RuntimeExceptions来包裹Exceptions的方式,此时,你已经可以使用antcompile-dao来编译src/dao和test/dao下的所有源文件,然而当你运行anttest-dao-Dtestcase=PersonDao进行测试时,你会得到一个错误:
Nobeannamed'
personDao'
isdefined,这是一个Spring的错误,说明你必须在applicationContext-hibernate.xml指定一个名字为personDAO的bean,在此之前我们需要创建PersonDao的实现类。
运行dao测试的ant任务叫做test-dao,如果你传递testcase参数(用-Dtestcase=name),它会查看**/*${testcase}*允许我们传递Person、PersonDao、或者PersonDaoTest以及所有会执行PersonDaoTest的类。
让我们创建一个实现PersonDao的类PersonDaoHibernate并使用Hibernate来get/save/delete这个Person对象,为此,我们在src/dao/**/dao/hibernate创建一个新类PersonDaoHibernate.java,它应该扩展BaseDaoHibernate,并且实现PersonDao。
为了简洁,省略Javadocs。
packageorg.appfuse.dao.hibernate;
importorg.appfuse.dao.PersonDao;
importorg.springframework.orm.ObjectRetrievalFailureException;
publicclassPersonDaoHibernateextendsBaseDaoHibernateimplementsPersonDao{
publicPersongetPerson(Longid){
Personperson=(Person)getHibernateTemplate().get(Person.class,id);
if(person==null){
thrownewObjectRetrievalFailureException(Person.class,id);
returnperson;
publicvoidsavePerson(Personperson){
getHibernateTemplate().saveOrUpdate(person);
publicvoidremovePerson(Longid){
//objectmustbeloadedbeforeitcanbedeleted
getHibernateTemplate().delete(getPerson(id));
现在,如果你运行anttest-dao-Dtestcase=PersonDao,你会得到同样的错误,我们必须配置Spring来让它知道PersonDaoHibernate是PersonDao的实现,同样的,我们也要告诉它还有个Person对象。
5、配置Spring中的Person和PersonDao
首先我们要告诉Spring所有Hibernate文件的位置,为此,打开src/dao/**/dao/hibernate/applicationContext-hibernate.xml,在以下代码块添加"
Person.hbm.xml"
propertyname="
mappingResources"
list>
org/appfuse/model/Person.hbm.xml<
org/appfuse/model/Role.hbm.xml<
org/appfuse/model/User.hbm.xml<
/list>
/property>
现在我们需要添加一些XML数据来绑定PersonDaoHibernate到PersonDao,为此,添加如下代码到文件底部:
--PersonDao:
Hibernateimplementation-->
beanid="
personDao"
class="
org.appfuse.dao
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Appfuse 开发 教程