Ext 3.0新增内容系列文章之三:DWR的替代品Ext.Direct

来源:互联网 发布:平成骑士最终形态数据 编辑:程序博客网 时间:2024/05/20 03:46

上一期的内容谈了DataWriter,实质是与DataReader相对应的产物。今期咱们讲Ext.Direct的内容,无论DataWriter还是Ext.Direct我们都可以先检查一下官方所提供的例子,结合本文,加深理解。

 

Ext.Direct的目的在于提供一个无缝的通讯流(streamline)介乎于客户端和服务端之间,形成一种单一的接口,从而使得我们减少一些乏味的编码,例如数据的验证和出来返回的数据包(读数据、错误条件等等)。Ext.direct命名空间下有若干的类是为了与服务端更密切地整合。Ext.Direct的一些方法产生出来的数据经过Ext.data另外的一些类,就可以转给Ext.data.Stores处理。

 

供应器

Ext.Direct的架构属于“供应器(provider)”的架构,一个或多个的供应器负责将数据传输到服务器上。当前有几种关键的供应器:

  • JsonProvider 简易的JSON操作
  • PollingProvider 轮询供应器,用于重复的请求
  • RemotingProvider 向客户端暴露了服务端的供应器

供应器本身不能直接的使用,应该通过Ext.Direct.add()加入。该方法加入一个Ext.Direct供应器并创建代理,或者可理解我ie对服务端执行的方法进行一个快照。 如果供应器还没有链接,那么就会自动链接。下面的例子创建了两个provider。

路由器

在客户端与服务端部分方法之间,Ext.Direct使用了服务端“路由器(router)”的概念来直接请求。 由于Ext.Direct是真正平台无关性的,所以你完全可以在以Java为解决方案的服务端,立刻替换成为C#的服务端,过程中你不需要对JavaScript作任何的变动或修改。

 

服务端事件。

由服务器通知而来的事件,可以添加一个事件侦听器来应接并触发:

供应器Provider究竟是什么呢?文档是这样描述的,“Ext.direct.Provider是一个抽象类,用来扩展的。”!太简单了吧,呵呵其实还没说完了,看看这层次图:

 

Provider

|

+---JsonProvider

      |

      +---PollingProvider

      |

      +---RemotingProvider

 

基类Provider提供了重要的三个属性如下表:

属性:类型说明id : String 供应器的id(默认的由Ext.id()方法产生)。如果你没有用全局变量保存着这个供应器,那么你就应该分配一个id来记住这个供应器,以便日后寻找。例如:

 




priority : Number 请求的优先权(priority),数值愈低表示优先权愈高,0就表示“双工的”(总是打开)。 所有的供应器默认为1,但PollingProvider就除外,默认为3type : String 这是Ext.Direct的类型,这是必须的,默认是undefined。 执行addProvider创建新的供应器的时候就会用到这个类型。 默认可识别的类型如下规格:
  • polling : PollingProvider
  • remoting : RemotingProvider

RemotingProvider暴露了在客户端上访问服务端方法的方式方法。 这是一种RPC(remote procedure call,远程过程调录)的连接类型,即客户端可以初始化服务端上的进程。这样的话,组织代码的时候会更具可维护性,客户端与服务端之间的道路怎么走也会越加地清晰。如果单使用URL的话这点是不容易做到的。同时,服务端必须将有关类和方法的信息告诉给客户端知道。一般这些配置的信息由服务端的Ext.Direct包完成,构建一系列的API信息输出。

RemotingProvider.action是一个重要的配置项。它用对象字面化(Object literal)确定服务端的动作或方法。例如,如果供应器(Provider)是如下配置的:

 

上面的例子中,服务端的“multiply”函数会送入两个参数(2和4)。“multiply”函数就应该返回8,最后变为result变量。

另外,设置enableBuffer为true或false决定是否捆绑多个方法调用在一起。如果指定一个数字表示就等待形成一次批调用的机会(默认为10毫秒)。多个调用按一定的时候聚集在一起然后统一在一次请求中发出,就可以优化程序了,因为减少了服务端之间的往返次数。

配置项namespace则指定了远程供应器的命名空间(默认为浏览器的全局空间window)。完全命名这个空间,或者指定一个String执行隐式命名。

 

最后介绍PollingProvider似乎更“猛”一些,因为它让笔者感觉Ext有点向Web消息同步的技术挑战,因为我们知道整个Web世界的模型都是从低成本通讯出发的,白话说就是,客户端要什么,就向服务端请求,我答应你就是,我(服务端)可不主动塞信息给你(客户端),也就是说,客户端从Server拿了东西就完事了,,越简单的模型越符合低成本通讯的要求,,,---Web之所以是天下做大的网络,可以想象,诸如窄带等的问题不一而足,条件制约多的很,故所以不能有太奢侈的功能,还是第一代嘛 呵呵。

随着人们的发展(WebIM等等),这方面的需求日益高涨,好比HMTL5就活脱把TCP Stocket拉进来算了。。。

现在Comet长连接/BOSH都是力图先走一步,提供上述问题的解决方案。。。这不,Ext也来奏热闹了,弄了个PollingProvider,比较雏形,我们看看官方的怎么说:

 

按一定的周期不断轮询服务端。最开始的数据由客户端发出,然后由服务端响应。应该由运行在服务端其余部分的Ext.Direct包来生成PollingProvider的所有配置内容。

 

创建一个PollingProvider实例可以通过new关键字实现,或者只是指定type = 'polling'就可以,例如:

 

待续…