`
hideto
  • 浏览: 2650079 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在客户端保存状态

阅读更多
Keeping State on the Client

在第一部分里,我介绍了Cairngorm,一个简化大规模RIA开发中重复出现的复杂性的轻量级技术架构。

在这篇文章里,我描述了在开发企业RIA时面临的挑战 -- 特别是怎样在客户端保存状态。我在Cairngorm Store程序中解释了
这点。你将徐希Cairngorm架构里的两个基本模式:Value Object模式和Model Locator模式。在这篇文章结束时,你将了解
在你自己的Flex程序开发中使用这些模式。

介绍Cairngorm Store
Flex Store程序展示了Flex程序框架的特性。它展示了怎样使用多种layout containers、navigator containters、controls、
effects、data binding、Drag-and-Drop manager、form validation和History manager。
而且,Flex Store展示了Flex的组件开发模型和怎样创建与事件驱动架构集成的松耦合组件。学习Flex Store程序是熟悉使用
MXML和ActionScript开发声明式layout和业务逻辑的绝佳方式。

Cairngorm Store使用熟悉的Store程序并使用Cairngorm完全重新构建成为一个rapid,scalable和maintainable的企业RIA。

在第三部分我通过展示很容易就添加新功能性到Cairngorm程序来说明Cairngorm架构的好处。

Cairngorm Store:四个主要的挑战
我将解释怎样使用Cairngorm来解决RIA开发中常见的高级挑战。我也解释了Cairngorm框架里使用的多种设计模式。

一个好的技术架构首先将程序开发看作是商业问题的解决方案,然后作为一个实现该解决方案的系统,然后作为系统中自定义
软件的技术架构,最后作为该技术架构的详细的类级别的实现。

从高级来看,有四个主要的挑战Adobe consulting团队要面对:
1,在客户端保存状态
2,架构视图
3,推动FDD
4,调用服务端服务

这些挑战和需求对Cairngorm Store而言没有区别。

客户端展示要卖给客户的产品,购物车记住用户购买哪些产品,用户在结帐的流程中必须完成多页表单。在整个流程中,你的
程序必须在客户端维护状态。

单页面用户体验在页面中有许多不同的组件。有许多视图,如产品列表,图形显示,购物车,表单等等,你必须架构视图。

用户在程序中需要多个特性,用户必须能够做如下事情:
1,可以查看所有的产品以及对选择的产品可以浏览详细信息
2,添加产品到购物车或从购物车删除产品
3,购买购物车里的产品
4,继续完成结帐流程

这些特性驱动你的开发。

最后,程序出售的产品由于库存改变而更改。你的程序必须具有从服务端基础架构得到产品信息的能力。而且,当客户发送
订单时,你的程序必须将这些订单保存到数据库或SAP等系统。你的程序必须与服务端服务调用集成。

你可以看到,当学习这四个主要挑战时Cairngorm Store和其他RIA一样。

在这篇文章里,我们来看看第一个挑战:在客户端保存状态。

在客户端保存状态
你从Web程序开发移至RIA时首先要考虑的就是客户端是有状态的。

Web程序开发人员熟悉无状态请求/响应方式,因此,他们创建了多种方式来在客户端维护状态。你可以频繁的填充数据到
HTTP请求作为客户端而服务器更改页面,或者使用URL encoding或cookies来在客户端保存有限的状态信息,或使用这些
特性的抽象如J2EE sessions,保存在服务端,并让客户端可以访问。

但是,使用RIA,Web程序开发人员可以挣脱这些HTTP请求和响应的桎梏。你不需再构思无状态客户端的解决方案因为客户端
就是有状态的。如果你使用过Swing或AWT来构建桌面程序,你将耸耸肩因为这一切是如此熟悉。

MVC里State和Model的区别
许多开发人员熟悉程序开发里的MVC概念或Model/View/Control概念并想知道状态在这里的讨论中位于什么位置。非常简单,
状态就是模型。这展示了一些更常见的挑战来解决RIA里的模型的实现。

首先,我们抵制以字符串,数字,布尔值等所有primitive对象分散状态到你的程序中。这里使用面向对象开发最佳实践不是
我的目的。确实,接收OO原则的好处和实践是理解这篇文章的前提。

但是,我强烈推荐客户端保存数据 -- 作为状态,模型或任何称谓 -- 作为对象来具有语义含义。在这里语义是什么意思?
我的意思是如果你在线出售fly-fishing flies,你的对象模型应该包括flies,patterns,hooks和hackles。如果你出售
mortgages,你的对象模型应该包含products,rates,repayments和terms。如果你出售maps,你的对象模型可能包含routes,
waypoints,points of interest和gas stations。

同步客户端和服务端
RIA的有状态客户端的一个挑战是:客户端的状态通常反应了服务端的状态。让我们看看一些更多的设计问题。

在服务端程序开发中,一个首要挑战是状态通常位于两个层面:业务层和集成层。

集成层通常包含数据库,mainframes,message queues,ERP解决方案,CRM系统以及其他企业信息系统等在对象上保存数据
并处理业务逻辑的系统。

在企业程序开发里,这些系统以中间件层来集成进来并展示给用户,通常也称作业务层。许多解决方案企图跨两层来保存
状态。首先,在这些层里数据的表示非常不同。例如,关系数据库里的实体,关系,视图,查询必须被映射到中间业务层的
对象模型。你可以使用EJB,Hibernate,ADO.NET等技术来跨架构层映射数据。

作为RIA开发人员,你被从业务和集成层间的复杂里抽象处理,你主要关注于怎样确保业务层的模型与展示层数据一致。

你可以通过确保客户端和服务端的对象模型一致来减少最少的努力来保持对象模型同步。

介绍Value Object / DataTransfer Object 模式
当你呈现数据到客户端时,创建类或对象来表示数据是最好的了。例如,在Cairngorm Store里,产品就是我们需要展示的
东西。每个产品有一些属性:name,description,price,image和thumbnail iamge。

这些值对象在RIA里扮演这双重角色。除了在客户端保存状态外,它们也对程序的不同层交互数据非常有用。在服务端,考虑
你使用SQL查询数据库的策略...太罗嗦了,受不了了!

六,看看Cairngorm Store程序里的VO,在org/nevis/cairngorm/samples/store/vo包:
class org.nevis.cairngorm.samples.store.vo.ProductVO implements ValueObject, Comparable
{
  public static var registered:Boolean = Object.registerClass("org.nevis.cairngorm.samples.store.vo.ProductVO", ProductVO);

  public var id : Number;
  public var name : String;
  public var description : String;
  public var price : Number;
  public var image : String;
  public var thumbnail : String;
}

如果程序必须知道当前选择的product是什么,以ProductVO实例在客户端保存信息即可。如果程序需要在客户的购物车保存产品列表,以
ProductVO实例的列表信息保存即可。

而且,如果你需要从服务端传输products或传输products回到服务器,将数据作为对象传输即可。

在Flex和Java之间维持一个一致的对象模型
省略很多废话...

为了允许Flex映射客户端和服务端的value objects,你必须告诉Flex这些类之间的关系。在Cairngorm里,你通过如下方式即可:
public static var registered:Boolean = Ojbect.registerClass("org.nevis.cairngorm.samples.store.vo.ProductVO", ProductVO);

这行代码确保客户端的ProductVO类映射到服务器上org.nevis.cairngorm.samples.store.vo包下的的ProductVO这个Java类

同XDoclet2使用ActionScript
XDoclet2是一个Java驱动的ActionScript代码生成器。

将模型和视图绑定在一起

进入Model Locator模式
Adobe Consulting团队构思了Model Locator模式作为FLex开发人员的最佳实践。
public static var selectedItem : ProductVo;

public static var products : Array;

public stativ var workflowState: Number;

<details:ProductDetails
  id="productDetailsCOmp"
  width="100%" height="325"
  currencyFormatter="{ModelLocator.currencyFormatter}"
  selectedItem="{ModelLocator.selectedItem}"
  addProduct=addProductToShoppingCart{event}"/>


我真服了,又一个《Ruby for Rails》作者的同仁,婆妈大人。

结论是: Cairngorm连一篇像样的文档都没有。不再继续翻译Webster的六部曲了。
分享到:
评论
1 楼 woshixlhm 2008-08-06  
绝大多数是废话!

相关推荐

    .NET客户端和服务器端保存状态的方法

    ASP.NET状态保存分为客户端保存和服务器端保存两种:  使用客户端选项存储页信息而不使用服务器资源的这些选项往往具有最低的安全性但具有最快 的服务器性能,因为对服务器资源的要求是适度的。但是,由于必须将...

    一个可以保存客户端DOM状态的控件 CeellScriptManager

    一个可以保存客户端DOM状态的控件 可实现简单的非Ajax的ajax效果 比如禁用背景,浮动层位置保持,因为在页面回传之后通过脚本修改过的Dom属性会还原回去,具体请看示例 注意:使用该控件不可以再设置page的...

    课程设计=基于C++ MFC框架的通信聊天系统(源码+数据库+报告).zip

    、系统概要 该聊天程序分为服务器和客户端两个部分。...4、为离线客户端保存聊天记录。 5、验证密码,当用户登录时,密码错误给出提示。 6、禁止已登录用户,再次登录。 7、保存用户信息。 8、为用户保存离线消息。

    DHCP客户端测试软件(dhcp for xcap)

    说明: 1表示报文组1, 选中报文组后, 在状态栏会显示报文组的索引, 2表示第三个报文, 即索引为3的报文. 版本记录: V1.0.1(基础版本) 1, 支持连接xcap并读取报文功能; 2, 支持刷新按钮自动更新报文功能; 3, 支持选择...

    graphql-normalizr:标准化GraphQL响应以在客户端缓存状态中持久保存

    graphql-normalizr 归一化GraphQL响应以保留在客户端缓存/状态中。 无论如何,它与都不相关,只是无耻地piggy带了它的流行性。 另外,采用“ normaliz E r”。 TL; DR :转换: { " data " : { " findUser " : [ { ...

    tortoisesvn客户端操作手册

    是否曾经保存完一个修改,然后又想把个文件恢复到修改以前的状态?是否曾经希望能够看到一个文件以前某个时间点的状态? 是否曾经在项目中发现了一个 BUG,然后想调查它是什么时候产生的? 如果这些问题中的任何...

    TortoiseSVN 1.5.2.13595(SVN客户端)

     在2002年,Tim Kemp 发现 Subversion 是一个很好的版本控制系统,但是没有好的图形化客户端,创建一个作为 Windows 外壳集成的 Subversion 客户端的创意来自 TortoiseCVS,一个非常类似的 CVS 客户端。  Tim 学习...

    主题:基于ejb 的 仿flash的java富客户端applet 的实现构想 及意义

    这些小数据就不能存在客户端了,当然,一关浏览器就什么都没了 ,因为这个会话bean是无状态的,所以不需要服务器保存任何信息,, 如果可能的话 最好能实现bt, 客户端相互可以通信 ,加快信息交换速度,减小服务器压力, ...

    凌波多媒体教室客户端

    无人值守,凌波多媒体教室软件可以自动记录全体学生电脑的屏幕画面,压缩成jpeg格式文件,保存到指定的文件夹中,供教师事后检查学生电脑的使用情况; 凌波多媒体教室软件具有极强的系统稳定性,保证教学过程的顺利...

    TortoiseSVN-1.6.4.16808-cn(SVN客户端1.6.4中文版)

     在2002年,Tim Kemp 发现 Subversion 是一个很好的版本控制系统,但是没有好的图形化客户端,创建一个作为 Windows 外壳集成的 Subversion 客户端的创意来自 TortoiseCVS,一个非常类似的 CVS 客户端。  Tim 学习...

    SVN客户端用户使用手册

    当对一个文件进行了修改并保存后(注意此处并没有进行提交),如果对修改不满意,想要重新修改,可以右键单击修改过的文件(带红色叹号的那个),然后选择revert,前面的一系列修改便会被撤销,恢复到Updata之后的...

    jsp网页之间共享数据

    在多次请求之间不会保存状态信息,用户每次提交的信息仅仅在当前请求处理过程有用,例 如用户在登陆时候提交的信息只能在第一次处理的时候有用,以后就不能用了。但是有时候 程序需要在多个页面或者多次请求之间共享...

    安卓网站交互JSONxmlWebserviceUPnP相关-客户端1登录时检查网络状态2登录加载进度条3登录服务器端进行验证如果用户名和密码存在且正确则登录否则失败4注册时将用户信息保存到服务器端数据库中(MySQL)5记住密码功能.rar

    客户端: 1、登录时检查网络状态 2、登录加载进度条 3、登录服务器端进行验证,如果用户名和密码存在且正确,则登录,否则失败 4、注册时将用户信息保存到服务器端数据库中(MySQL) 5、记住密码功能.rar,太多无法一一...

    递易企业文档管理(客户端)

     直接从系统菜单中选择卸载即可,服务器端卸载后,保存在递易中的文档将不复存在。 其它 ~~~~  我要感谢我太太,正是她对我的支持与理解,才使得我有可能将自己的兴趣与爱好进行到底。  这个版本上的用户...

    递易企业文档管理(客户端管理)

     直接从系统菜单中选择卸载即可,服务器端卸载后,保存在递易中的文档将不复存在。 其它 ~~~~  我要感谢我太太,正是她对我的支持与理解,才使得我有可能将自己的兴趣与爱好进行到底。  这个版本上的用户...

    使用js添加DropDownList的项

    在客户端对DropDownList(Select)赋值时,不会保存状态。当你执行提交时,会将页面发送至服务器端,通过Page_Load事件处理,在返回到请求的页面。由于没有保存状态,所以列表被清空。之后才会执行按钮提交的事件,...

    TortoiseSVN 1.5.2.13595版(Windows下的SVN客户端)

     在2002年,Tim Kemp 发现 Subversion 是一个很好的版本控制系统,但是没有好的图形化客户端,创建一个作为 Windows 外壳集成的 Subversion 客户端的创意来自 TortoiseCVS,一个非常类似的 CVS 客户端。  Tim 学习...

    Socket TCP协议的服务类(20110304修正)

    /// SocketSession 客户端Socket连接会话类,保存会话信息,接收处理数据,返回数据给客户端。 /// 主要2个线程: /// 监听客户端连接的线程,监听所有客户端的链接创建并分配会话。 /// 会话遍历线程,遍历会话列表...

    Android使用token维持登陆状态的方法

    token(令牌)是一串唯一的字符串,通常由服务端生成,在注册完成时返回给客户端,用来标识此用户,客户端将此字符串存储在本地。在以后的网络请求时,客户端先查询本地的token,如果有则直接使用此令牌进行网络请求...

    Android代码-Android密码管理客户端

    一款基于Google Material Design,采用MVP模式设计开发的Android密码管理客户端--怕死我的(PassWord)如果对你有帮助,欢迎多多的star 屏幕截图 用到的技术点: MVP模式 数据库采用了Realm DataBinding,...

Global site tag (gtag.js) - Google Analytics