分享
 
 
 

appfuse文档(四)--创建Manager

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

创建Manager

本章将向你展示怎样创建能够同DAO层交互并能处理事务的业务Facade。

这部分内容依赖 Part I: 创建DAO.

关于本章

这部分将向你展示怎样创建同第一部分创建的DAO进行交互的Business Façade类(和一个JUnit Test)。

AppFuse中,它被称做Manager类。它的主要职责是充当持久层(DAO) 和Web层之间的桥梁。它也用于对表示层和数据库层进行解耦(de-coupling) (如:Swing程序)。Manager也是你放置业务逻辑(business logic)的地方。

让我们从创建一个ManagerTest和Manager开始吧!

内容

· [1] 创建一个ManagerTest,用来执行 Junit测试Manager

· [2] 创建一个调用DAO的Manager

· [3] 为Manager和Transactions配置Spring

· [4] 运行ManagerTest

创建一个ManagerTest,用来执行 Junit测试Manager

在第一部分,我们创建了一个Person对象和PersonDAO接口 – 我们这里将继续开发这个例子。首先,我们为PersonManager创建一个JUnit test。在test/service/**/service 目录中创建PersonManagerTest。我们想测试和DAO中一样的基本方法 (get, save, remove)。

这个类应该继承在servic包中已经存在的 BaseManagerTestCase ,父类(BaseManagerTestCase) 提供了和BaseDAOTestCase一样的功能 – 装载一个和你的*Test.class 同名的属性文件,同样也初始化Spring的ApplicationContext。

我常常复制 (打开 → 另存为)一个已经存在的测试 (如:UserManagerTest.java) ,然后 使用[Pp]erson查找/替换[Uu]ser。

下面的代码是我们的Manager需要的一个基本的Junit测试。这段代码将简单地创建、销毁PersonManager。"ctx" 对象是被 BaseManagerTestCase 初始化的。

package org.appfuse.service;

import org.appfuse.model.Person;

import org.springframework.dao.DataAccessException;

public class PersonManagerTest extends BaseManagerTestCase {

private Person person = null;

private PersonManager mgr = null;

protected void setUp() throws Exception {

super.setUp();

mgr = (PersonManager) ctx.getBean("personManager");

}

protected void tearDown() throws Exception {

super.tearDown();

mgr = null;

}

}

现在我们有了这个类的Junit测试框架,现在要添加内容: 确保Manager中的一切都正常运转的测试方法。这里有一个片断(snippet),它可以帮助你理解我们将要做什么。

..我们创建以"test"(全部小写)开头的方法. 这些方法是public, 返回void,没有参数。它们将被Ant build.xml文件的<junit>任务调用。这里是一些测试 CRUD的简单测试。需要牢记的是:每个方法都是自治的(autonomous)[就是每个方法都要自己获得Person].

在你的PersonManagerTest.java文件中添加下面的方法:

public void testGetPerson() throws Exception {

person = mgr.getPerson("1");

assertNotNull(person.getFirstName());

}

public void testSavePerson() throws Exception {

person = mgr.getPerson("1");

person.setFirstName("test");

mgr.savePerson(person);

assertEquals(person.getFirstName(), "test");

}

public void testAddAndRemovePerson() throws Exception {

person = new Person();

person = (Person) populate(person);

mgr.savePerson(person);

assertEquals(person.getFirstName(), "Bill");

assertNotNull(person.getId());

log.debug("removing person, personId: " + person.getId());

mgr.removePerson(person.getId().toString());

try {

person = mgr.getPerson(person.getId().toString());

fail("Person found in database");

} catch (DataAccessException dae) {

log.debug("Expected exception: " + dae.getMessage());

assertNotNull(dae);

}

}

此时,这个类不会编译成功,因为我们没有创建PersonManager接口。

为了使AppFuse框架的扩展性更强,我运用了许多设计模式,这很有趣。实际上,我在一年内学到了很多,以至于对于我以前参与的很多工程,我都不想再去扩展它们的架构了-我想重写一遍!

幸运的是,运用我的洞察力和经验,可以使AppFuse能够跟的上潮流,但不幸的是:我每年只能升级,而不能重写。;-)

创建一个调用DAO的Manager

我们将在src/service/**/service 目录中创建PersonManager.java接口,然后为实现这个接口的类指定CRUD方法。I've eliminated the JavaDocs in the class below for display purposes.

我通常复制[duplicate] (open → save as)一个已经存在的文件 (如:UserManager.java)。

package org.appfuse.service;

import org.appfuse.model.Person;

public interface PersonManager {

public Person getPerson(String id);

public void savePerson(Person person);

public void removePerson(String id);

}

现在让我们创建PersonManagerImpl类,它要实现接口PersonManager的方法。为了达到这个目的,我们在目录src/service/**/service/impl中创建一个新类PersonManagerImpl.java。它继承了BaseManager,并且实现PersonManager接口。

package org.appfuse.service.impl;

import org.appfuse.model.Person;

import org.appfuse.dao.PersonDAO;

import org.appfuse.service.PersonManager;

public class PersonManagerImpl extends BaseManager implements PersonManager {

private PersonDAO dao;

public void setPersonDAO(PersonDAO dao) {

this.dao = dao;

}

public Person getPerson(String id) {

return dao.getPerson(Long.valueOf(id));

}

public Person savePerson(Person person) {

dao.savePerson(person);

}

public void removePerson(String id) {

dao.removePerson(Long.valueOf(id));

}

}

需要注意的是setPersonDAO方法。为了使用Spring绑定PersonDAO到这个Manager,我们要配置applicationContext-service.xml文件。我们将在下面配置。现在运行"ant compile-service",你应该可以编译所有的东西了……

最终,我们要在目录test/service/**/service中创建PersonManagerTest.properties文件。这样person = (Person) populate(person);将会为我们的测试工作。

如果你已经在上面创建了PersonDAOTest.properties文件,那么复制,然后重命名是一个很好的办法。当然你也可以手工设置这些属性。

firstName=Bill

lastName=Joy

现在我们需要修改Spring的配置文件,让它知道我们的这个新的Manager。

为Manager和Transactions配置Spring

通知Spring,使它知道PersonManager接口和它的实现类。打开文件src/service/**/service/applicationContext-service.xml。这里,你应该可以看到为 "personManager" bean定义的注释。取消注释,或者添加如下内容到这个文件中:

<bean id="personManager" parent="txProxyTemplate">

<property name="target">

<bean class="org.appfuse.service.impl.PersonManagerImpl" autowire="byName"/>

</property>

</bean>

"parent" 属性涉及到一个Bean的定义 TransactionProxyFactoryBean (它拥有所有的基本事务属性集)

运行ManagerTest

保存所有修改过的文件,然后运行ant test-service -Dtestcase=PersonManager。

Yeah Baby, Yeah:

BUILD SUCCESSFUL

Total time: 9 seconds

The files that were modified and added to this point are available for download .

下一步: Part III: 创建Action和JSP – 讲述怎样创建Action和JSP.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有