没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
21页
Appfuse是由Matt Raible开发的一个指导性的入门级J2EE框架,它对如何集成流行的Spring、Hibernate、iBatis、struts、Xdoclet、junit 等基础框架给出了示范。提供了对Taperstry和JSF的支持。 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的另一个启示是:我们可以依靠开源软件的功能降低开发成本,而且可以阅读开源软件的代码提高所在团队的整体实力。
资源推荐
资源详情
资源评论
1
APPFUSE 教程
2
Appfuse 开发教程
目 录
第一部分:
在 A
PP
F
USE
建立 DAO 和 POJO ........................................................................... 3
1
、建立一个对象,并且作
XDoclet
标记
.............................................................................. 3
2
、使用
Ant
根据对象产生数据库表
..................................................................................... 3
3
、建立新的
DaoTest
来对你的
DAO
运行
JUnit
测试
......................................................... 4
4
、创建一个对对象执行
CRUD
操作的新
DAO ................................................................... 6
5
、配置
Spring
中的
Person
和
PersonDao ............................................................................ 6
6
、运行
DaoTest ...................................................................................................................... 7
第二部分:
创建新的 M
ANAGER
............................................................................................... 7
1
、创建一个新的运行
JUnit
测试的
ManagerTest ................................................................ 7
2
、创建一个新的与
DAO
通讯的
Manager ........................................................................... 9
3
、为这个
Manager
和事务配置
Spring................................................................................. 9
4
、运行
ManagerTest ............................................................................................................... 9
第三部分:
(S
TRUTS
)
创建
S
TRUTS
A
CTIONS
和 JSP
S
............................................................ 10
1
、为创建
generate PersonForm
对
Person
添加
XDoclet Tags .......................................... 10
2
、使用
XDoclet
创建骨架
JSPs ........................................................................................... 10
3
、创建测试
PersonAction
的
PersonActionTest .................................................................. 11
4
、创建
PersonAction ............................................................................................................ 12
5
、运行
PersonActionTest ...................................................................................................... 14
6
、清理
JSP
来使它更好看
................................................................................................... 14
7
、
[
可选的
]
创建
Canoo WebTests
来测试模拟浏览器的
actions ..................................... 15
第四部分:
(S
TRUTS
)
增加校验功能和列表页面 ...................................................................... 16
1
、
Person.java
添加
XDoclet
的验证标签
............................................................................ 16
2
、察看和测试添加了验证的
JSP ........................................................................................ 17
3
、
DAO
和
Manager
的测试添加
testGetPeople
方法
......................................................... 18
4
、
PersonDao
和
Manager
添加
getPeople
方法
................................................................. 18
5
、
Action
添加
testSearch
方法
............................................................................................. 19
6
、
Action
添加
search
方法
................................................................................................... 19
7
、创建
personList.jsp
和
Canoo
测试
.................................................................................. 20
8
、菜单添加链接
................................................................................................................... 21
3
第一部分
第一部分第一部分
第一部分:
::
: 在
在在
在 AppFuse 建立
建立建立
建立 DAO 和
和和
和 POJO
- 讲述如何创建 POJO(对应相应的数据表)和 DAO(管理 POJO 持久化操作的对象)。
本教程将向你展示如何在一个数据库里创建表,以及如何完成访问这些表的 Java 代码。我们将建立一
个对象以及处理(保存/检索/删除)这些类到数据库的一些代码。用 Java 术语,我们叫它 Plain Old Java
Object(POJO)。这个对象通常代表了数据库中的一个表,其他的类包括:
一个数据访问对象 Data Access Object (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 属性。
package org.appfuse.model;
public class Person extends BaseObject {
private Long id;
private String firstName;
private String lastName;
/*
* Generate your getters and setters using your favorite IDE:In
* Eclipse:Right-click -> Source -> Generate Getters and Setters
*/
}
这个类必须扩展 BaseObject,而这个 BaseObject 有三个抽象方法(equals(), hashCode()和 toString())需要
你在 Person 类里实现,前两个是 Hibernate 的需要。你可以使用 Eclipse 来完成。
现在我们已经创建了这个 POJO 对象,我们需要增加 XDoclet 标记来产生 Hibernate 的映射文件,这些
文件用来映射对象→ 表和属性(变量) → 字段。
首先,我们增加@hibernate.class 来告诉 Hibernate 我们将要和那个表作关联:
/**
* @hibernate.class table="person"
*/
public class Person extends BaseObject {
我们也要增加主键的映射,否则 XDoclet 会在产生映射文件时出错,注意所有的@hibernate.*标签必须在
getters'的 Javadocs 里面。
/**
* @return Returns the id.
* @hibernate.id column="id" generator-class="increment" unsaved-value="null"
*/
public Long getId() {
return this.id;
}
我使用 generator-class="increment"而不使用 generate-class="native" 是因为我对数据库使用"native"时出
现问题。建议使用 uuid.hex。
2、
、、
、使用
使用使用
使用 Ant 根据对象产生数据库表
根据对象产生数据库表根据对象产生数据库表
根据对象产生数据库表
在这种情况下,你可以通过运行 ant setup-db 来建立 person 表,这个任务会产生文件 Person.hbm.xml 并
且会建立叫做"person"的表,从 Ant 的控制台窗口,你可以看到 Hibernate 为你建立的表结构的内容。
[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] primary key (id)
[schemaexport] );
如果你查看 Hibernate 生成的文件 Person.hbm.xml,可以到 build/dao/gen/**/model 目录,这里是
Person.hbm.xml 的内容(目前的内容):
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
4
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="org.appfuse.model.Person" table="person" dynamic-update="false"
dynamic-insert="false">
<id name="id" column="id" type="java.lang.Long" unsaved-value="null">
<generator class="increment"></generator>
</id>
<!--
To add non XDoclet property mappings, create a file named
hibernate-properties-Person.xml
containing the additional properties and place it in your merge dir.
-->
</class>
</hibernate-mapping>
现在我们要为其它的字段(first_name, last_name)添加额外的@hibernate.property 标签:
/**
* @hibernate.property column="first_name" length="50"
*/
public String getFirstName() {
return this.firstName;
}
/**
* @hibernate.property column="last_name" length="50"
*/
public String getLastName() {
return this.lastName;
}
在这个例子里,添加 column 属性的唯一原因是因为这个字段名与它的属性名不相同,如果他们相同,
你没有必要来指定 column 属性,关于其它可以使用的标签请看@hibernate.property。
再次运行 ant setup-db 把新加的属性加到数据库表里。
[schemaexport] create table person (
[schemaexport] id bigint not null,
[schemaexport] first_name varchar(50),
[schemaexport] last_name varchar(50),
[schemaexport] primary key (id)
[schemaexport] );
如果期望修改字段的长度,修改@hibernate.property 标签的 length 属性,如果希望把字段改为必添字段
(NOT NULL),可以增加属性 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,或者任何其它需要替换的内容。
package org.appfuse.dao;
import org.appfuse.model.Person;
import org.springframework.dao.DataAccessException;
public class PersonDaoTest extends BaseDaoTestCase {
private Person person = null;
private PersonDao dao = null;
public void setPersonDao(PersonDao dao) {
this.dao = dao;
}
}
5
以上是我们使用 JUnit 测试而初始化和销毁 PersonDao 的基本代码,对象“ctx”引用了 Spring 的
ApplicationContext,它在 BaseDaoTestCase 类的静态代码区里被初始化。
现在我们需要实际测试 DAO 中的 CRUD(create, retrieve, update, delete)方法,为此我们需要为每个方法
建立以 test(全部小写)开头的测试方法,只要这个方法是公共的,返回类型是 void,它们就会被我们 build.xml
中的 Ant 的<junit>任务调用,如下是一些简单的 CRUD 测试,需要注意的一点是所有的方法(或者叫做测
试)必须是自治的,添加如下代码到文件 PersonDaoTest.java:
public void testGetPerson() throws Exception {
person = new Person();
person.setFirstName("Matt");
person.setLastName("Raible");
dao.savePerson(person);
assertNotNull(person.getId());
person = dao.getPerson(person.getId());
assertEquals(person.getFirstName(), "Matt");
}
public void testSavePerson() throws Exception {
person = dao.getPerson(new Long(1));
person.setFirstName("Matt");
person.setLastName("Last Name Updated");
dao.savePerson(person);
if (log.isDebugEnabled()) {
log.debug("updated Person: " + person);
}
assertEquals(person.getLastName(), "Last Name Updated");
}
public void testAddAndRemovePerson() throws Exception {
person = new Person();
person.setFirstName("Bill");
person.setLastName("Joy");
dao.savePerson(person);
assertEquals(person.getFirstName(), "Bill");
assertNotNull(person.getId());
if (log.isDebugEnabled()) {
log.debug("removing person...");
}
dao.removePerson(person.getId());
try {
person = dao.getPerson(person.getId());
fail("Person found in database");
} catch (DataAccessException dae) {
log.debug("Expected exception: " + dae.getMessage());
assertNotNull(dae);
}
}
在 testGetPerson 方法,我们创建了一个 person 并且调用 get 方法,我通常会增加一条我所需要的记录
到 数 据 库 , 因 为 在 测 试 运 行 之 前 DBUnit 会 为 数 据 库 准 备 测 试 数 据 , 我 们 可 以 简 单 的 在
metadata/sql/sample-data.xml 里添加测试所必须的记录
<table name='person'>
<column>id</column>
<column>first_name</column>
<column>last_name</column>
<row>
<value>1</value>
<value>Matt</value>
<value>Raible</value>
</row>
</table>
通过这种方式你可以在 testGetPerson 方法里消除创建新纪录的动作,如果你愿意直接插入记录到数据
库(使用 SQL 或者 GUI),你可以用 ant db-export 和 cp db-export.xml metadata/sql/sample-data.xml 重新构建
你的 sample-data.xml 文件。
在上面的例子里,你可以看到我们调用 person.set*(value)来准备我们需要保存的对象,在这个例子里很
简 单 , 但 是 当 你 要 插 入 10 条 必 添 字 段 (not-null="true") 时 就 比 较 麻 烦 了 , 这 就 是 我 为 什 么 要 在
BaseDaoTestCase 使 用 ResourceBundle 文 件 , 只 要 在 PersonDaoTest.java 同 一 个 目 录 创 建 一 个
PersonDaoTest.properties 并且在里面定义你的属性值:
剩余20页未读,继续阅读
wuDaSong_
- 粉丝: 4
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页