Flex4使用Cairngorm2框架
来源:互联网 发布:网络摄像头水晶头接法 编辑:程序博客网 时间:2024/05/18 01:19
作者:准提道人 发表于: 2011-03-16 3:06 分类: FLex 虽然说Cairngorm框架已经出到3.0版本,但是3.0的Cairngorm已经不能被称为框架了,而称为软件开发的一种指导原则,其中包括了“指导原则”、“第三方类库”、“工具”组成,因此如果使用Cairngorm还是应该整合Cairngorm2版本的。 Cairngorm2有两个版本,即普通版和企业版,区别是企业版的数据服务使用的是高收费的 LiveCycle Data Services,而普通版的使用的是Blazeds。因此我们只要集成普通版的就可以了。 首先下载Cairngorm2普通版的SWC包,点击这里。 将下载下的SWF包引入到项目中,建立Cairngorm需要的包,Cairngorm需要7个包,分别是: 1. Business –》业务逻辑 Delegate类和ServiceLocator文件 2.Command -》命令逻辑 Command类 3. Event -》事件类 4. Vo -》放置ValueObject类 5. Model -》 放置Model类 6. View -》放置视图文件 7. Contorller -》放置Control类 Cairngorm 是事件驱动的,具体原理请参考官网文档,或者我以后有时间了也许会总结一下。 本文只介绍Flex整合Cairngorm框架,后台实现不再介绍。下面就开始写具体的代码了,首先我们先把视图创建出来,确定我们要做个什么东西。在view包里面创建一个组件文件,拖进来一个datagrid,几个按钮和label,最后创建出来的样式应该如下: 当然现在的视图只有一个样子,什么功能都没有,接下来我们要创建跟这个视图绑定的数据,即Model,在Model包里创建一个as文件,因为我们需要用到数据的分页,因此将这些数据都放到同一个Model里面。代码如下: 在Cairngorm里面,Model都是单例对象,所以这点要注意。 与视图绑定的数据已经创建好了,接下来要让视图能够工作了,又得提一下Cairngorm的事件驱动了,在Cairngorm里面,所有的操作数据传递等都是由事件进行驱动的,因此我们要创建一个要进行的操作的事件类,首先我希望能够在程序一打开的时候就把第一页的数据全部都取出,所以创建一个获取所有用户的事件类,代码如下: Cairngorm里的自定义事件都应该继承CairngormEvent类。这个事件被触发了之后要进行什么样的操作呢?这个时候我们要创建控制器了,在Control包里创建一个Contoller类,代码如下: 继承了Cairngorm的前端控制器,意思是监听这事件,如果这个事件被触发了,我们要执行一向操作,也就是Cairngorm的Command,这个时候我们可以创建Command类了,代码如下: 可以看出,Command类我们实现了两个接口,分别是ICommand和IResponder,前面一个是Cairngorm的接口,后面一个是Flex中的异同通讯接口。ICommand定义了一个方法execute,就是要执行的内容,这里我们可以看到我们执行的逻辑是什么,当然里面的业务逻辑类我们还没有创建,但是可以看出调用了远程的方法,IResponder有两个接口,分别是result和fault,分别是返回成功和失败后腰调用的方法。在result里,我们将后台返回的结果放入了model里面,这样通过Flex的数据绑定,就可以自动的更新视图的内容了。 现在就只差业务逻辑还没有创建了,在Business包里面包括两方面的内容,一个是要进行的业务逻辑操作即Delegate,一个是ServiceLocator,即远程访问的地址。首先创建ServiceLocator,创建一个mxml文件,内容如下: 这里我们创建了一个id为flexServ的RemoteObject,他的Destination为flexServlet。然后我们要创建它的逻辑了,代码: 在构造函数里,我们就调用了这个service,这里面有两个方法,一个是获取所有用户,一个是根据页面查找用户,我们现在用的是前面一个方法,后面一个方法在后面的翻页功能时才能用到。 到现在为止,Cairngorm所需的所有类都已经创建完毕,但是不是就能够使用了呢?当然不是,没说嘛,刚开始创建视图的时候我们只拉好了界面,其余什么都没做,现在我们要把这些类串联起来,让Cairngorm能够将数据取出来,首先我们想要在程序一打开的时候就把第一页的所有用户取出,则要在createComplete里添加如下方法: 我们直接在程序打开的的时候就触发了获取所有用户的事件,这是Controller监听了这个事件,发现被这个事件被触发了,马上调用了获取所有对象的command,command就去调用获取所有对象的业务逻辑Delegate,Delegate返回了结果,把结果放入了Model,这个时候,我们就需要把视图与Model进行绑定,让数据自动更新到视图中,我们需要在datagrid中添加: 这样应该可以了吧?其实还不行,为虾米呢?虽然我们在后台调用业务逻辑的时候调用了id为flexServ的remoteObject,但是他怎么知道这个flexServ在哪里呢?所以我们还要把他引入才行,在组件里添加如下: 现在程序已经完全串联起来,可以使用了。其中还有分页的内容现在就不贴代码了。 现在是不是觉得使用Cairngorm太麻烦了,要建这么多的类行,这么个小功能自己写很简单就写好了,当然,这只是一个小demo,小的演示程序根本不必使用Cairngorm,真正使用时要在大型的项目中,这样才能使程序开发起来更加清晰明了,加快开发速度。Flex4使用Cairngorm2框架
01
[Bindable]
02
public class UserPageModelLocator implements ModelLocator
03
{
04
private static
var
_instance:UserPageModelLocator;
05
06
public
var
pageSize:int;
07
public
var
pageNo:int;
08
public
var
pageCount:String;
09
public
var
prevPage:int;
10
public
var
nextPage:int;
11
public
var
totalCount:String;
12
public
var
order:String;
13
public
var
orderBy:String;
14
public
var
hasPrev:Boolean;
15
public
var
hasNext:Boolean;
16
public
var
result:IList;
17
18
public
function
UserPageModelLocator()
19
{
20
if
(_instance !=
null
) {
21
throw
new
CairngormError(CairngormMessageCodes.SINGLETON_EXCEPTION,
22
"EmployeesModelLocator"
);
23
}
24
25
_instance =
this
;
26
}
27
28
public static
function
getInstance():UserPageModelLocator{
29
if
(_instance ==
null
){
30
_instance =
new
UserPageModelLocator();
31
}
32
return
_instance;
33
}
34
}
1
public class GetAllUserEvent extends CairngormEvent
2
{
3
public static const EVENT_GETALLUSER:String =
"getAllUser"
;
4
5
public
function
GetAllUserEvent(){
6
super
(GetAllUserControl.EVENT_GETALLUSER);
7
}
8
}
1
public class GetAllUserControl extends FrontController
2
{
3
public static const EVENT_GETALLUSER =
"getAllUser"
;
4
5
public
function
GetAllUserControl()
6
{
7
addCommand(GetAllUserControl.EVENT_GETALLUSER, GetAllUserCommand);
8
}
9
}
01
public class GetAllUserCommand implements ICommand, IResponder
02
{
03
04
public
function
execute(event:CairngormEvent):void
05
{
06
var
delegate:GetAllUserDelegate =
new
GetAllUserDelegate(
this
);
07
var
getAllUserEvent:GetAllUserEvent = GetAllUserEvent(event);
08
delegate.getAllUser();
09
}
10
11
public
function
result(event:Object):void
12
{
13
var
model:UserPageModelLocator = UserPageModelLocator.getInstance();
14
model.pageSize = event.result.pageSize;
15
model.pageCount = event.result.pageCount;
16
model.result = event.result.result;
17
model.pageNo = event.result.pageNo;
18
model.hasNext = event.result.hasNext;
19
model.hasPrev = event.result.hasPrev;
20
model.nextPage = event.result.nextPage;
21
model.prevPage = event.result.prevPage;
22
model.order = event.result.order;
23
model.orderBy = event.result.orderBy;
24
model.result = event.result.result;
25
model.totalCount = event.result.totalCount;
26
}
27
28
public
function
fault(event:Object):void
29
{
30
Alert.show(
"Somthing is wrong!"
);
31
}
32
}
01
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02
<
cairngorm:ServiceLocator
03
xmlns:mx
=
"http://www.adobe.com/2006/mxml"
04
xmlns:cairngorm
=
"http://www.adobe.com/2006/cairngorm"
>
05
06
<
mx:RemoteObject
id
=
"flexSev"
destination
=
"flexServlet"
>
07
08
</
mx:RemoteObject
>
09
10
</
cairngorm:ServiceLocator
>
01
public class GetAllUserDelegate
02
{
03
private
var
responder:IResponder
04
private
var
services:Object;
05
06
public
function
GetAllUserDelegate(responder:IResponder)
07
{
08
this
.responder = responder;
09
this
.services = ServiceLocator.getInstance().getRemoteObject(
"flexSev"
);
10
}
11
12
public
function
getAllUser():void{
13
var
token:AsyncToken = services.findAll();
14
token.addResponder(responder);
15
}
16
17
public
function
getUserByPageNo(pageNo:int):void{
18
var
token:AsyncToken = services.findPrev(pageNo);
19
token.addResponder(responder);
20
}
21
}
1
public
function
init():void{
2
var
getAllUserEvent:GetAllUserEvent =
new
GetAllUserEvent( );
3
CairngormEventDispatcher.getInstance().dispatchEvent(getAllUserEvent);
4
}
1
dataProvider="{UserPageModelLocator.getInstance().result}"
1
<
fx:Declarations
>
2
<
rds:Services
xmlns:rds
=
"com.boco.wb.cairngorm.business.demo.*"
/>
3
<
router:GetAllUserControl
xmlns:router
=
"com.boco.wb.cairngorm.control.demo.*"
/>
4
<
router:FindPageUserContol
xmlns:router
=
"com.boco.wb.cairngorm.control.demo.*"
/>
5
</
fx:Declarations
>
- Flex4使用Cairngorm2框架
- Flex4系列教程之十 – 整合Cairngorm2
- Flex4系列教程之十 – 整合Cairngorm2
- Flex4之测试框架--FlexUnit
- FLEX4 DropDownList 使用
- flex4 image 使用技巧
- flex4 -- fx:Vector 使用
- Flex4中使用WCF
- 在flex4里使用state
- Flex4 State状态的使用
- flex4中State的使用
- 【flex4】datagrid中使用combox
- Flex4 DropDownList组件的使用
- Flex4 Spark 中使用 TitleWindow
- Flex4使用 IStyleManager2 代替 StyleManager
- flex4 outerDocument的使用介绍
- flex4
- flex4滚动条([Flex4] VGroup 出現卷軸,使用VScrollBar)
- 6.4.2 使用 bind 函数
- [转载]BW数据源深入研究
- 谈谈对于企业级系统架构的理解
- 【转】MACHINE_START分析
- SQLite入门与分析(三)---内核概述(1)
- Flex4使用Cairngorm2框架
- [zt]GPRS行业应用方案分析
- 平衡组/递归匹配
- ThreadGroup其实比ExecutorService更好
- (转)简单的log
- 压缩 解压缩 文件
- codeigniter 数据库缓存
- 本人火系玩家全灵
- JAVA gc 工作原理