- 浏览: 18640 次
- 性别:
- 来自: 成都
最新评论
-
日后再说吧:
sc config %SERVICE_NAME% start= ...
tomcat自带jre,添加到服务并开机启动 -
accommands:
真不错。。。减少翻印的麻烦
Jbpm4.3开发手册
PureMVC? 概述
- PureMVC 是什么?
PureMVC 是一个定位于设计高性能 RIA 客户端的基于模式的框架。目前已经被移植到多种语言(AS2、AS3、C#、ColdFusion、Haxe、JavaScript、Java、Objective C、PHP、Python、Ruby)和平台,包括服务器端环境。 - PureMVC 原理图示
- PureMVC 的两个版本
PureMVC 分为标准(Standard)和多核(MultiCore)两个版本。后者目的在于进行模块化编程。[PureMVC – Multicore vs Standard / Singlecore]介绍了两个版本的本质区别。 - PureMVC 教程
PureMVC Framework Goals and Benefits
PureMVC Framework Overview with UML
PureMVC Implementation Idioms and Best Practices
PureMVC Implementation Idioms and Best Practices 简体中文(感谢张泽远和 Tamt 的翻译工作)
开始整合
- 注意事项:
以下内容基于“ 声明式事务”中最后形成的 sampleApp 项目。 - 准备所需组件
下载 PureMVC(AS3) 多核版,将解压后的 PureMVC_AS3_MultiCore_1_0_5.swc 拷贝到 flex_libs 文件夹。 - 在 flex_src 下创建以下文件夹
employees
employees/controller :放置 Command 类
employees/model :放置 Proxy 类
employees/view :放置 Mediator
employees/view/components:放置视图文件(即 mxml 文件) - 在继续之前,还是回顾一下 PureMVC 的原理吧
记住一点:PureMVC 的通信并不采用 Flash 的 EventDispatcher/Event,而是使用观察者模式以一种松耦合的方式来实现的。所以要显示存储在数据库中的职员信息需经过以下过程:
- View Component 触发一个 Event;
- Mediator 监听到此 Event,发送通知;
- 控制器依据通知找到对应的 Command;
- Command 调用 Proxy(Proxy 又调用 Server 端对象),Proxy 依据执行结果发送相应通知;
- Mediator 接收到上诉通知,随即把通知中附带的雇员信息赋值给 DataGrid 组件。
- 不难理解,我们之所以创建 employees 文件夹就是要把雇员信息相关机能放到此文件下。
出于此目的我们把显示雇员信息的 DataGrid 组件从 sampleApp.mxml 中分离出来,命名为 EmployeesDataGrid,存储于 employees/view/components 下。<?xml version="1.0" encoding="utf-8"?> <s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="400" x="32" y="25"> <mx:DataGrid id="employeesList" width="400"> <mx:columns> <mx:DataGridColumn headerText="Name" dataField="name"/> <mx:DataGridColumn headerText="Age" dataField="age"/> <mx:DataGridColumn headerText="Email" dataField="email"/> </mx:columns> </mx:DataGrid> </s:VGroup>
- 在 sampleApp 中引入 EmployeesDataGrid 组件
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:view="employees.view.components.*"> <view:EmployeesDataGrid id="employeesDataGrid"/> </s:Application>
- 在 employees 下创建 ApplicationFacade,作为此应用程序的 Facade
package employees { import org.puremvc.as3.multicore.patterns.facade.Facade; import employees.controller.*; public class ApplicationFacade extends Facade { public static const STARTUP:String = 'startup'; public function ApplicationFacade(key:String) { super(key); } public static function getInstance(key:String):ApplicationFacade { if (instanceMap[key] == null) instanceMap[key] = new ApplicationFacade(key); return instanceMap[key] as ApplicationFacade; } override protected function initializeController():void { super.initializeController(); registerCommand(STARTUP, StartupCommand); } public function startup(app:sampleApp):void { sendNotification(STARTUP, app); } } }
[注:]看到上面的 StartupCommand 了吧,我们稍候创建它,该 Command 主要用于注册 Proxy 和 Mediator。
- 在主应用中初始化 Facade,并调用 startup 方法(应该能理解调用此方法的意图吧?)
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:view="employees.view.components.*" initialize="facade.startup(this);"> <fx:Script> <![CDATA[ import employees.ApplicationFacade; public static const NAME:String = 'sampleApp'; private var facade:ApplicationFacade = ApplicationFacade.getInstance(NAME); ]]> </fx:Script> <view:EmployeesDataGrid id="employeesDataGrid"/> </s:Application>
- 是时候创建 StartupCommand 了
package employees.controller { import org.puremvc.as3.multicore.patterns.command.SimpleCommand; import org.puremvc.as3.multicore.interfaces.INotification; public class StartupCommand extends SimpleCommand { override public function execute(note:INotification):void { // @TODO } } }
- 至此 pureMVC 已经整合完毕,是不是很简洁?:) 接下来实现雇员信息输出。
- 首先在 model 下创建 LoadEmployeesProxy,调用远程对象返回雇员信息
package employees.model { import org.puremvc.as3.multicore.patterns.proxy.Proxy; import mx.rpc.remoting.RemoteObject; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; public class LoadEmployeesProxy extends Proxy { public static const NAME:String = 'LoadEmployeesProxy'; public static const LOAD_EMPLOYEES_SUCCESS:String = 'loadEmployeesSuccess'; public static const LOAD_EMPLOYEES_FAILED:String = 'loadEmployeesFailed'; private var employeeServiceRO:RemoteObject; public function LoadEmployeesProxy() { super(NAME); employeeServiceRO = new RemoteObject(); employeeServiceRO.destination = "employeeServiceDest"; employeeServiceRO.addEventListener(ResultEvent.RESULT, onResult); employeeServiceRO.addEventListener(FaultEvent.FAULT, onFault); } public function load():void { employeeServiceRO.getList(); } private function onResult(event:ResultEvent):void { sendNotification(LOAD_EMPLOYEES_SUCCESS, event.result); } private function onFault(event:FaultEvent):void { sendNotification(LOAD_EMPLOYEES_FAILED, event.fault.faultString); } } }
- 其次在 view 下创建管理 EmployeesDataGrid 的 Mediator — EmployeesDataGridMediator
package employees.view { import org.puremvc.as3.multicore.patterns.mediator.Mediator; import org.puremvc.as3.multicore.interfaces.INotification; import flash.events.Event; import mx.controls.Alert; import employees.ApplicationFacade; import employees.model.LoadEmployeesProxy; import employees.view.components.EmployeesDataGrid; public class EmployeesDataGridMediator extends Mediator { public static const NAME:String = 'EmployeesListMediator'; public function EmployeesDataGridMediator(viewComponent:EmployeesDataGrid) { super(NAME, viewComponent); employeesDataGrid.addEventListener(EmployeesDataGrid.LOAD_EMPLOYEES, onGetEmployees); } protected function onGetEmployees(event:Event):void { sendNotification(ApplicationFacade.LOAD_EMPLOYEES); } override public function listNotificationInterests():Array { return [ LoadEmployeesProxy.LOAD_EMPLOYEES_SUCCESS, LoadEmployeesProxy.LOAD_EMPLOYEES_FAILED ]; } override public function handleNotification(note:INotification):void { switch (note.getName()) { case LoadEmployeesProxy.LOAD_EMPLOYEES_SUCCESS: employeesDataGrid.employeesList.dataProvider = note.getBody(); break; case LoadEmployeesProxy.LOAD_EMPLOYEES_FAILED: Alert.show(note.getBody().toString(), 'Error'); break; } } protected function get employeesDataGrid():EmployeesDataGrid { return viewComponent as EmployeesDataGrid; } } }
- 把上面创建的 Proxy 和 Mediator 注册到 Model 和 View 中
package employees.controller { import org.puremvc.as3.multicore.patterns.command.SimpleCommand; import org.puremvc.as3.multicore.interfaces.INotification; import employees.model.LoadEmployeesProxy; import employees.view.EmployeesDataGridMediator; public class StartupCommand extends SimpleCommand { override public function execute(note:INotification):void { facade.registerProxy(new LoadEmployeesProxy()); var app:sampleApp = note.getBody() as sampleApp; facade.registerMediator(new EmployeesDataGridMediator(app.employeesDataGrid)); } } }
[注:]在注册 Mediator 的时候也就确定了它所管理的 Mxml 文件
- 在 controller 中创建 LoadEmployeesCommand,用于调用 LoadEmployeesProxy
package employees.controller { import org.puremvc.as3.multicore.patterns.command.SimpleCommand; import org.puremvc.as3.multicore.interfaces.INotification; import employees.model.LoadEmployeesProxy; public class LoadEmployeesCommand extends SimpleCommand { override public function execute(note:INotification):void { var loadEmployeesProxy:LoadEmployeesProxy = facade.retrieveProxy(LoadEmployeesProxy.NAME) as LoadEmployeesProxy; loadEmployeesProxy.load(); } } }
- 把 LoadEmployeesCommand 与事件的对应关系追加到 ApplicationFacade 中
package employees { import org.puremvc.as3.multicore.patterns.facade.Facade; import employees.controller.*; public class ApplicationFacade extends Facade { public static const STARTUP:String = 'startup'; public static const LOAD_EMPLOYEES:String = 'loadEmployees'; public function ApplicationFacade(key:String) { super(key); } public static function getInstance(key:String):ApplicationFacade { if (instanceMap[key] == null) instanceMap[key] = new ApplicationFacade(key); return instanceMap[key] as ApplicationFacade; } override protected function initializeController():void { super.initializeController(); registerCommand(STARTUP, StartupCommand); registerCommand(LOAD_EMPLOYEES, LOADEmployeesCommand); } public function startup(app:sampleApp):void { sendNotification(STARTUP, app); } } }
- 万事俱备,只需要在 EmployeesDataGrid 创建完毕时触发相应事件
<?xml version="1.0" encoding="utf-8"?> <s:VGroup xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="400" x="32" y="25" creationComplete="init();"> <fx:Metadata> [Event('loadEmployees')] </fx:Metadata> <fx:Script> <![CDATA[ public static const LOAD_EMPLOYEES:String = 'loadEmployees'; public function init():void { dispatchEvent(new Event(LOAD_EMPLOYEES, true)); } ]]> </fx:Script> <mx:DataGrid id="employeesList" width="400"> <mx:columns> <mx:DataGridColumn headerText="Name" dataField="name"/> <mx:DataGridColumn headerText="Age" dataField="age"/> <mx:DataGridColumn headerText="Email" dataField="email"/> </mx:columns> </mx:DataGrid> </s:VGroup>
- 运行试试吧 :)
发表评论
-
Flex系列--1.1--构建Flex4.5为前端的Java EE项目
2012-05-09 08:41 1457本文的意图 一年前写过的“Flex4系列教程“已包括“ ... -
Flex系列--6--整合Cairngorm2
2012-05-09 08:41 1521Cairngorm 2 概述 Cairngorm ... -
Flex系列--5--声明式事务
2012-05-08 11:54 1034注意事项:以下内容基于“Flex4系列整合iBATIS ... -
Flex系列--4--Flex4系列整合iBATIS 2.3
2012-05-08 11:51 1421注意事项:以下内容 ... -
Flex系列--2--整合Flex,BlazeDS,Spring(< 2.5.6)
2012-05-08 11:35 1090为什么 BlazeDS 与 Spring 的整合分为 S ... -
Flex系列--1--构建Flex4为前端的Java EE项目
2012-05-08 11:32 1401在继续本教程之前你需要准备好以下事项:已安装 JDK(截稿时最 ... -
Flex系列--3--整合Flex,BlazeDS,Spring(>= 2.5.6)Spring BlazeDS Integration
2012-05-08 11:06 1852Spring BlazeDS Integration 是什么? ... -
MyEclipse_8.5+flex_4+Blazeds配置
2011-10-31 10:47 1642需要软件: apachetomcat.exe、 myeclip ...
相关推荐
标题中的“Flex实战-puremvc+java(spring+hibernate)实现增删改查操作”揭示了这个项目是关于使用Adobe Flex技术结合后端Java框架Spring和Hibernate来开发一个包含基本CRUD(Create, Read, Update, Delete)功能的...
"FlexMvcTest"可能是包含更多复杂功能或应用场景的测试项目,用于演示如何在实际项目中整合PureMVC。可能包括多个Mediator来管理界面组件,Observer用于监听并响应数据变化,以及Command来处理业务逻辑和数据交互。 ...
根据提供的文件信息,本文将详细介绍如何一步步搭建PureMVC+Flex+BlazeDS+Spring+Hibernate的技术栈。这个过程涉及到了多个技术领域的整合,包括前端的Flex开发、后端的Java开发以及数据库交互等多个方面。 ### 一...
标题中的“PureMVC+Flex+BlazeDS+Spring+Hibernate.doc”指的是一项整合了多种技术的Web应用开发方案,这些技术包括PureMVC、Flex、BlazeDS、Spring和Hibernate。这篇文档可能是指导读者如何将这些技术结合在一起...
《pureMVC范例解析:Flex前端与Spring+Hibernate后端集成》 纯MVC(PureMVC)是一个轻量级的设计模式框架,主要用于构建可维护性和可扩展性高的应用程序。在本例中,它被应用于一个Flex项目,展示了如何在前端使用...
### Flex教程核心知识点详解 ...在后续章节中,本教程将详细介绍如何将Flex与Java技术整合,特别是如何使用BlazeDS、Spring、iBatis、Cairngorm 和 pureMVC 这些框架来进行集成开发,从而实现高效、稳定的RIA应用开发。
在基于Flex和PHP的MVC框架整合应用中,两个主要框架是ThinkPHP(基于PHP)和PureMVC(基于Flex)。这种整合充分利用了PHP后端的强大力量和Flex前端的丰富用户体验能力。 - **ThinkPHP框架**:是PHP语言下的一款MVC...
非常好的东西,喜欢的下载下来吧spring 3.0jdbcTemplete+flex4.6+pureMvc+cairngorm2.2.2+blazeds, 最新出炉,可以选择pureMvc和cairngorm2.2.2两种框架
本教程通过四个不同的架构方法展示了如何利用Flex与BlazeDS、Spring以及iBATIS或pureMVC进行集成,以实现高效的数据交互和应用架构。 1. **Flex + BlazeDS + Spring() + iBATIS + Cairngorm**:此架构使用早期...
4. **Flex + BlazeDS + SpringBlazeDSIntegration + Spring (>= 2.5.6) + iBATIS + pureMVC** #### Flex访问服务器端数据的方式 Flex通过以下三种方式与服务器端进行通信: - **HTTPService**:发送HTTP请求。 - ...
4. Flex + BlazeDS + Spring BlazeDS Integration + Spring(>= 2.5.6)+ iBATIS + pureMVC Cairngorm和pureMVC都是MVC(Model-View-Controller)设计模式的实现,有助于分离应用的业务逻辑、视图和数据模型。...
4. Flex结合BlazeDS、Spring BlazeDS Integration、新版本的Spring(>=2.5.6)、iBATIS和pureMVC框架。 Flex4的开发不仅限于上述几种架构,它还支持多种其他技术的整合,如Adobe的AIR(Adobe Integrated Runtime)...
- **PureMVC**:作为一种轻量级框架,PureMVC旨在提高代码可维护性和可重用性。它强调将业务逻辑与UI逻辑分离,从而使得开发者可以更容易地管理和扩展项目。 - **Mate**:Mate是另一个强大的Flex框架,它支持模块化...
学习者将了解到如何配置和使用BlazeDS进行数据传输,以及如何在Spring框架下处理业务逻辑,同时利用Cairngorm或pureMVC实现客户端的模块化管理,从而提升Flex应用的开发效率和质量。通过这些实例,初学者不仅能掌握...