- 浏览: 173902 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
SimpleFunning:
ajax 怎么处理redirect 后台重定向 -
ykjsw:
java多态http://learn.jser.com/jav ...
Java知识积累:序列化、反序列化 -
xiayh04:
cs_wyx 写道用jxl很方便的啊我这边是不想应用第三方包的 ...
java生成excle column -
cs_wyx:
用jxl很方便的啊
java生成excle column -
sixinya:
ajax 怎么处理redirect 后台重定向
Ext 介绍入门之 DWR的替代品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。
var pollProv = new Ext.direct.PollingProvider({
url: 'php/poll2.php'
});
Ext.Direct.addProvider(
{
"type":"remoting", // create a Ext.direct.RemotingProvider
"url":"php\/router.php", // url to connect to the Ext.Direct server-side router.
"actions":{ // each property within the actions object represents a Class
"TestAction":[ // array of methods within each server side Class
{
"name":"doEcho", // name of method
"len":1
},{
"name":"multiply",
"len":1
},{
"name":"doForm",
"formHandler":true, // handle form on server with Ext.Direct.Transaction
"len":1
}]
},
"namespace":"myApplication",// namespace to create the Remoting Provider in
},{
type: 'polling', // create a Ext.direct.PollingProvider
url: 'php/poll.php'
},
pollProv // reference to previously created instance
);
var pollProv = new Ext.direct.PollingProvider({
url: 'php/poll2.php'
});
Ext.Direct.addProvider(
{
"type":"remoting", // create a Ext.direct.RemotingProvider
"url":"php\/router.php", // url to connect to the Ext.Direct server-side router.
"actions":{ // each property within the actions object represents a Class
"TestAction":[ // array of methods within each server side Class
{
"name":"doEcho", // name of method
"len":1
},{
"name":"multiply",
"len":1
},{
"name":"doForm",
"formHandler":true, // handle form on server with Ext.Direct.Transaction
"len":1
}]
},
"namespace":"myApplication",// namespace to create the Remoting Provider in
},{
type: 'polling', // create a Ext.direct.PollingProvider
url: 'php/poll.php'
},
pollProv // reference to previously created instance
);
路由器
在客户端与服务端部分方法之间,Ext.Direct使用了服务端“路由器(router)”的概念来直接请求。 由于Ext.Direct是真正平台无关性的,所以你完全可以在以Java为解决方案的服务端,立刻替换成为C#的服务端,过程中你不需要对JavaScript作任何的变动或修改。
服务端事件。
由服务器通知而来的事件,可以添加一个事件侦听器来应接并触发:
{"type":"event","name":"message","data":"Successfully polled at: 11:19:30 am"}
// 对应服务端“message”的事件的处理函数。add a handler for a 'message' event sent by the server
Ext.Direct.on('message', function(e){
out.append(String.format('
{0}
', e.data)); out.el.scrollTo('t', 100000, true); }); {"type":"event","name":"message","data":"Successfully polled at: 11:19:30 am"} // 对应服务端“message”的事件的处理函数。add a handler for a 'message' event sent by the server Ext.Direct.on('message', function(e){ out.append(String.format('{0}
', e.data)); out.el.scrollTo('t', 100000, true); }); 供应器Provider究竟是什么呢?文档是这样描述的,“Ext.direct.Provider是一个抽象类,用来扩展的。”!太简单了吧,呵呵其实还没说完了,看看这层次图: Provider | +---JsonProvider | +---PollingProvider | +---RemotingProvider 基类Provider提供了重要的三个属性如下表: 属性:类型 说明 id : String 供应器的id(默认的由Ext.id()方法产生)。如果你没有用全局变量保存着这个供应器,那么你就应该分配一个id来记住这个供应器,以便日后寻找。例如: view plaincopy to clipboardprint?Ext.Direct.addProvider( { type: 'polling', url: 'php/poll.php', id: 'poll-provider' } ); Ext.Direct.addProvider( { type: 'polling', url: 'php/poll.php', id: 'poll-provider' } ); priority : Number 请求的优先权(priority),数值愈低表示优先权愈高,0 就表示“双工的”(总是打开)。 所有的供应器默认为1 ,但PollingProvider就除外,默认为3 。 type : String 这是Ext.Direct的类型,这是必须的 ,默认是undefined 。 执行addProvider创建新的供应器的时候就会用到这个类型。 默认可识别的类型如下规格: polling : PollingProvider remoting : RemotingProvider RemotingProvider暴露了在客户端上访问服务端方法的方式方法。 这是一种RPC(remote procedure call,远程过程调录)的连接类型,即客户端可以初始化服务端上的进程。这样的话,组织代码的时候会更具可维护性,客户端与服务端之间的道路怎么走也会越加地清晰。如果单使用URL的话这点是不容易做到的。同时,服务端必须将有关类和方法的信息告诉给客户端知道。一般这些配置的信息由服务端的Ext.Direct包完成,构建一系列的API信息输出。 RemotingProvider.action是一个重要的配置项。它用对象字面化(Object literal)确定服务端的动作或方法。例如,如果供应器(Provider)是如下配置的: view plaincopy to clipboardprint? "actions":{ // actions对象下面的属性每个都代表者对应服务端的类。each property within the 'actions' object represents a server side Class "TestAction":[ // 服务端的类其方法所组成的数组,要将他们暴露给客户端。array of methods within each server side Class to be { // stubbed out on client "name":"doEcho", "len":1 },{ "name":"multiply",// name of method "len":2 // 参数的个数是多少。一定要是数字类型,而不能是字符串。The number of parameters that will be used to create an // array of data to send to the server side function. // Ensure the server sends back a Number, not a String. },{ "name":"doForm", "formHandler":true, // direct the client to use specialized form handling method "len":1 }] } * *
* 注意Store不是必须的,一个服务端方法可以在任何的时候被调用。下面的例子中我们客户端的方法调用服务端中的“乘法”,就在服务端的“TestAction”类中:
*
* Note that a Store is not required, a server method can be called at any time.
* In the following example a client side handler is used to call the
* server side method "multiply" in the server-side "TestAction" Class:
TestAction.multiply(
2, 4, // 这两个参数都会传到服务器中,所以指定len=2。pass two arguments to server, so specify len=2
// 下面的回调函数在服务端调用后执行。callback function after the server is called
// result: the result returned by the server
// e: Ext.Direct.RemotingEvent object result就是由服务端返回的对象,例如Ext.Direct.RemotingEvent类型的对象
function(result, e){
var t = e.getTransaction();
var action = t.action; // 调用服务端的类。server side Class called
var method = t.method; // 调用服务端的方法。server side method called
if(e.status){
var answer = Ext.encode(result); // 8
}else{
var msg = e.message; // 失败的信息 failure message
}
}
);
"actions":{ // actions对象下面的属性每个都代表者对应服务端的类。each property within the 'actions' object represents a server side Class
"TestAction":[ // 服务端的类其方法所组成的数组,要将他们暴露给客户端。array of methods within each server side Class to be
{ // stubbed out on client
"name":"doEcho",
"len":1
},{
"name":"multiply",// name of method
"len":2 // 参数的个数是多少。一定要是数字类型,而不能是字符串。The number of parameters that will be used to create an
// array of data to send to the server side function.
// Ensure the server sends back a Number, not a String.
},{
"name":"doForm",
"formHandler":true, // direct the client to use specialized form handling method
"len":1
}]
}
*
*
* 注意Store不是必须的,一个服务端方法可以在任何的时候被调用。下面的例子中我们客户端的方法调用服务端中的“乘法”,就在服务端的“TestAction”类中:
*
* Note that a Store is not required, a server method can be called at any time.
* In the following example a client side handler is used to call the
* server side method "multiply" in the server-side "TestAction" Class:
TestAction.multiply(
2, 4, // 这两个参数都会传到服务器中,所以指定len=2。pass two arguments to server, so specify len=2
// 下面的回调函数在服务端调用后执行。callback function after the server is called
// result: the result returned by the server
// e: Ext.Direct.RemotingEvent object result就是由服务端返回的对象,例如Ext.Direct.RemotingEvent类型的对象
function(result, e){
var t = e.getTransaction();
var action = t.action; // 调用服务端的类。server side Class called
var method = t.method; // 调用服务端的方法。server side method called
if(e.status){
var answer = Ext.encode(result); // 8
}else{
var msg = e.message; // 失败的信息 failure message
}
}
);
上面的例子中,服务端的“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' 就可以,例如:
var pollA = new Ext.direct.PollingProvider({
type:'polling',
url: 'php/pollA.php',
});
Ext.Direct.addProvider(pollA);
pollA.disconnect();
Ext.Direct.addProvider(
{
type:'polling',
url: 'php/pollB.php',
id: 'pollB-provider'
}
);
var pollB = Ext.Direct.getProvider('pollB-provider');
发表评论
-
多线程,并发相关知识积累
2015-03-09 13:37 01 聊聊并发(一)——深入分析Volatile的实现原理 ... -
extjs5 学习
2015-01-04 23:10 0http://blog.csdn.net/jfok/art ... -
ajax 怎么处理redirect 后台重定向
2014-04-03 14:14 7226问题:在用Rich app时,基本所有请求都是ajax。在 ... -
mama
2014-02-25 18:19 0mama -
真空包装机
2014-01-21 17:12 0http://s.taobao.com/search?q=% ... -
sencha cmd
2013-12-19 00:30 0sencha -
eclipse java.lang.OutOfMemoryError: Java heap space
2013-11-26 18:03 1362运行环境: STS(eclipse -Xms40m -Xm ... -
保险材料
2013-10-28 17:58 0保险材料 -
海通zq
2013-10-21 21:53 0ht zq 系统 -
垂直搜索技术及框架选型
2013-09-23 12:50 01、垂直搜索与一般搜索区别 2、垂直搜索框架比较 ... -
spring ehcache annotation 配置
2013-08-05 23:38 0jdbc.properties #hibernate ... -
临时存放资料共享
2013-07-22 22:25 0临时存放资料共享: http://pan.baidu.c ... -
链接共享 临时存放
2013-07-22 22:24 1临时存放资料共享: http://pan.baidu.c ... -
用Ant自动测试JUnit spring
2013-07-10 21:52 0http://blog.csdn.net/shendl/ar ... -
JUnit+Ant自动化执行单元测试并生成报告
2013-07-10 21:47 0http://aofengblog.blog.163 ... -
ant junit spring集成
2013-07-10 21:42 0Spring框架下利用Ant进行自动测试 ... -
cccc
2013-07-05 15:50 0ccccc -
自己保留
2013-07-04 20:47 0自己保留 临时中转 -
一些常用的正则表达式-actionscript
2011-12-10 09:21 3069转自:http://hi.baidu.com/hereson/ ... -
(转)利用HttpSessionListener实现网站在线人数统计功能
2010-11-30 11:14 1627在网站中经常需要进行在线人数的统计。过去的一般做法是结合登 ...
相关推荐
dwr包.rar dwr.jar engine.js util.js dwr-noncla.jar readme.txt JAR File: dwr.jar (1.08Mb) To DWR enable your web-app WAR File: dwr.war (4.62Mb) Demos/Examples of what DWR can do Sources: dwr-...
1、 导入dwr.jar包 2、 在web.xml中配置dwr,如下: <!-- 配置DWR --> <servlet-name>dwr-invoker org.directwebremoting.servlet.DwrServlet <init-param> <param-name>debug</param-name> ...
这通常涉及到在web.xml文件中配置DWR过滤器和Servlet,并在应用中创建一个DWR配置文件(dwr.xml),声明允许的远程方法。 3. **服务器端逻辑**:编写Java类,包含处理聊天消息的方法,如接收新消息、存储聊天记录和...
首先,`dwr.jar` 文件是DWR的主要库文件,包含了所有必要的类和接口,使得Java对象能够在浏览器中被调用。它简化了AJAX(Asynchronous JavaScript and XML)应用的开发,通过动态生成JavaScript,将服务器端的Java...
配置过程主要涉及两个文件:web.xml和dwr.xml。在web.xml中,你需要定义一个名为dwr-invoker的Servlet,这是DWR的核心组件。配置如下: ```xml <servlet-name>dwr-invoker <servlet-class>uk.ltd.getahead.dwr....
Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时通信,绕过传统的Ajax限制。DWR通过提供一套简单的API,使得JavaScript可以直接调用服务器端的Java方法,实现了富...
Direct Web Remoting (DWR) 是一个开源Java库,它允许Web应用程序在浏览器和服务器之间进行实时、安全的双向通信,有效地打破了JavaScript和Java之间的壁垒。这个技术在2005年推出,主要解决了AJAX(异步JavaScript...
EXT TreePanel 和 DWR(Direct Web Remoting)是两种在Web开发中常用的技术。EXT TreePanel 是EXT JS库中的一个组件,它用于展示层次结构的数据,通常以树形结构显示,广泛应用于文件系统、组织结构或者菜单的展示。...
具体实现上,你需要在后台配置DWR的`dwr.xml`文件,声明允许前端调用的Java方法。然后在前端,使用Ext JS的TreeStore,配置DWR的URL作为数据源。当树节点被展开时,TreeStore的`load`事件会被触发,从而执行DWR调用...
- **dwr.xml**:这个文件用于描述DWR服务的配置,包括哪些类和方法可以被远程调用,以及如何处理这些调用的细节。例如,通过`<allow>`标签指定允许远程访问的类和方法,通过`<converters>`和`<creators>`标签指定...
dwr-1.1.1-util.js
1. **DWR.jar**: 这是DWR的核心库文件,包含了运行DWR所需的所有类和资源。当你在项目中引入dwr.jar,你可以使用DWR提供的API来实现Ajax功能。这个jar文件包括了各种Servlet、Filter、JavaScript接口和辅助类,...
dwr配置文件详解 dwr.xml配置文件详解 dwr配置文件是Direct Web Remoting(DWR)的核心组件之一,它负责配置DWR的各种设置和参数。在本文中,我们将详细介绍dwr配置文件的结构和配置方法,并探讨它在实际应用中的...
3. `dwr.ipr` 和 `dwr.iws` 文件同样是Intelij IDEA的项目和工作空间配置,分别存储项目设置和用户特定的工作区状态。 4. `dwr.jar` 是DWR的核心库文件,包含了所有编译后的Java类和资源,供开发者在项目中直接引用...
DWR框架的jar包dwr-2.0RC1.jar
- **配置**:在Web应用中添加DWR相关的jar文件,并配置dwr.xml文件声明可公开的Java类和方法。 - **生成JavaScript接口**:DWR自动生成对应的JavaScript接口,使得客户端可以直接调用。 - **调用**:JavaScript...
在开发过程中,如果不想去dwr.jar中寻找这些文件,可以直接下载这个压缩包,这样就可以快速地在项目中引入DWR的功能,实现前后端的高效通信。记住,引入DWR后,还需要正确配置Web应用的`web.xml` 文件以及服务器端的...
Direct Web Remoting (DWR) 是一个开源Java库,它允许在Web应用程序中实现JavaScript与服务器端Java...通过这个"**dwr.rar**"压缩包,你可以获取到DWR的核心组件,并根据提供的文档和示例快速开始你的AJAX开发之旅。