password="${tomcat.manager.password}"path="/${webapp.name}"/>
在上面列出的target中,必须定义一些${tomcat.*}变量。
在根目录下有一个
build.properties默认定义如下:
#PropertiesforTomcatServertomcat.manager.url=http:
//localhost:
8080/managertomcat.manager.username=admintomcat.manager.password=admin
确保admin用户可以访问Manager应用,打开$CATALINA_HOME/conf/tomcat-users.xml中是否存在下面一行。
如果不存在,请自己添加。
注意,roles属性可能是一个以逗号(“,”)隔开的系列。
为了测试所有修改,保存所有文件,启动tomcat。
从命令行中进行myusers目录,运
行antlist,可以看到tomcatserver上运行的应用程序。
好了,现在运行antdeploy来安装MyUsers。
打开浏览器,在地址栏中输入
http:
//localhost:
8080/myusers,出现如图2.4的“EquinoxWelcome”画面。
下一节,将写一个User对象和一个维护其持久性的HibernateDAO对象。
用Sping来
管理DAO类及其依赖性。
最会写一个业务代理,用到AOP和声明式事务处理。
为持久层编写单元测试
在myUsers程序,使用Hibernat作为持久层。
Hinbernate是一个O/R映像框架,用来关联java对象和数据库中的表(tables)。
它使得对象的CRUD操作变得非常简单,Spring结合了Hibernate变得更加容易。
从Hibernate转向Spring+Hibernate会减少75%的代码。
这主要是因为,ServiceLocater和一些DAOFactory类的废弃,spring的实时异常代替了Hibernate的检测式的异常。
写一个单元测试有助于规范UserDAO接口。
为UserDAO写一个JUint测试程序,要完成以下几步:
1.在test/org/appfuse/dao下新建一个UserDAOTest.java类。
它继承了同一个包中的BaseDAOTestCase,其父类初始化了Spring的ApplictionContext(来自web/WEB-INF/applictionContext.xml),以下是JUnit测试的代码。
packageorg.appfuse.dao;
//useyourIDEtohandleimports
publicclassUserDAOTestextendsBaseDAOTestCase{
privateUseruser=null;
privateUserDAOdao=null;
protectedvoidsetUp()throwsException{
log=LogFactory.getLog(UserDAOTest.class);
dao=(UserDAO)ctx.getBean("userDAO");
}
protectedvoidtearDown()throwsException{
dao=null;
}
publicstaticvoidmain(String[]args){
junit.textui.TestRunner.run(UserDAOTest.class);
}
}
这个类还不能编译,因为还没有UserDAO接口。
在这之前,来写一些来验证User的
CRUD操作。
2.为UserDAOTest类添加testSave和testAddAndRemove方法,如下:
publicvoidtestSaveUser()throwsException{
user=newUser();user.setFirstName("Rod");user.setLastName("Johnson");dao.saveUser(user);
assertTrue("primarykeyassigned",user.getId()!
=null);
log.info(user);
assertTrue(user.getFirstName()!
=null);
}
publicvoidtestAddAndRemoveUser()throwsException{
user=newUser();user.setFirstName("Bill");user.setLastName("Joy");dao.saveUser(user);assertTrue(user.getId()!
=null);
assertTrue(user.getFirstName().equals("Bill"));
if(log.isDebugEnabled()){
log.debug("removinguser...");
}dao.removeUser(user.getId());assertNull(dao.getUser(user.getId()));
}
从这些方法中可以看到,你需要在UserDAO创建以下方法:
saveUser(User)removeUser(Long)getUser(Long)
getUsers()(返回数据库的所有用户)
3.在src/org/appfuse/dao目录下建一个名为UserDAO.java类的,输入以下代码:
tips:
如果你使用eclipse,idea之类的IDE,左边会出现在一个灯泡,提示类不存在,可以
即时创建。
packageorg.appfuse.dao;
//useyourIDEtohandleimports
publicinterfaceUserDAOextendsDAO{
publicListgetUsers();
publicUsergetUser(LonguserId);
publicvoidsaveUser(Useruser);
publicvoidremoveUser(LonguserId);
}
为了UserDAO.java,UserDAOTest.java编译通过,还要建一个User.java类。
4.在src/org/appfuse/model下建一个User.java文件,添加几个成员变量:
id,firstName,lastName,如下。
packageorg.appfuse.model;
publicclassUserextendsBaseObject{
privateLongid;
privateStringfirstName;
privateStringlastName;
/*用你熟悉的IDE来生成getters和setters,Eclipse中右击>Source->GenerateGettersandSetters*/
}
注意,你继承了BaseObject类,它包含几个有用的方法:
toString(),equlas(),hasCode(),后两个是Hibernate必须的。
建好User后,用IDE打开UserDAO和UserDAOTest两个类,优化导入。
配置Hibernate和Spring
现在已经有了POJO(PlainOldJavaObject),写一个映像文件Hibernate就可能维护它。
1.在org/appfuse/model中新建一个名为User.hbm.xml文件,内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD2.0//EN""
2.在web/WEB-INF/下的applictionContext.xml中添加映像。
打开文件,找到,改成如下:
org/appfuse/model/User.hbm.xml
在applictionContext.xml中,你可以看到数据库是怎幺工作的,Hibernate和Spring是如何协作的。
Eqinox会使用名为db/appfuse的HSQL数据库。
它将在你的ant“db”目录下创建,详细配置在“HowSpringIsConfiguredinEquinox”一节中描述。
3.运行antdeployreload(Tomcat正在运行),在Tomcat控制台的日志中可以看到,数据表正在创建。
INFO-SchemaExport.execute(98)|Runninghbm2ddlschemaexport
INFO-SchemaExport.execute(117)|exportinggeneratedschematodatabase
INFO-ConnectionProviderFactory.newConnectionProvider(53)|Initializingconnection
provider:
org.springframework.orm.hibernate.LocalDataSourceConnectionProvider
INFO-DriverManagerDataSource.ge