`
kidiaoer
  • 浏览: 822172 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

DWR与EXT整合

阅读更多
据不完全统计,从事Ajax开发的Java程序员有一大半都使用DWR。我们下面来介绍一下如何在EXT中使用DWR与后台交互。

因为DWR在前台的表现形式和普通的JavaScript完全一样,所以我们不需要特地去做些什么,直接使用EXT调用DWR生成的JavaScript函数即可。以Grid为例,比如现在我们要显示一个通讯录的信息,后台记录的数据有:id、name、sex、email、tel、addTime和descn。编写对应的POJO,代码如下所示。

public class Info {

    long id;

    String name;

    int sex;

    String email;

    String tel;

    Date addTime;

    String descn;

}

然后编写操作POJO的manager类,代码如下所示。

public class InfoManager {

    private List infoList = new ArrayList();

    public List getResult() {

        return infoList;

    }

}

代码部分有些删减,我们只保留了其中的关键部分,就这样把这两个类配置到dwr.xml中,让前台可以对这些类进行调用。

下面是EXT与DWR交互的关键部分,我们要对JavaScript部分做如下修改,如代码清单10-7所示。

代码清单10-7 使用EXT调用DWR

var cm = new Ext.grid.ColumnModel([

    {header:'编号',dataIndex:'id'},

    {header:'名称',dataIndex:'name'},

    {header:'性别',dataIndex:'sex'},

    {header:'邮箱',dataIndex:'email'},

    {header:'电话',dataIndex:'tel'},

    {header:'添加时间',dataIndex:'addTime'},

    {header:'备注',dataIndex:'descn'}

]);

var store = new Ext.data.JsonStore({

    fields: ["id","name","sex",'email','tel','addTime','descn']

});

// 调用DWR取得数据

infoManager.getResult(function(data) {

    store.loadData(data);

});

var grid = new Ext.grid.GridPanel({

    renderTo: 'grid',

    store: store,

    cm: cm

});

注意,执行infoManager.getResult()函数时,DWR就会使用Ajax去后台取数据了,操作成功后调用我们定义的匿名回调函数。在这里我们只做一件事,那就是将返回的data直接注入到ds中。

DWR返回的data可以被JsonStore直接读取,我们需要设置对应的fields参数,以告诉JsonReader需要哪些属性。

在这里,EXT和DWR两者之间没有任何关系,将它们任何一方替换掉都可以。实际上它们只是在一起运行,并没有整合。我们给出的这个示例也是说明了一种松耦合的可能性,实际操作中完全可以使用这种方式。

要结合使用EXT和DWR,不需要对后台程序进行任何修改,可以直接让前后台数据进行交互。不过还要考虑很多细节,比如Grid分页、刷新、排序、搜索等常见的操作。EXT的官方网站上已经有人放上了DWRProxy,借助它可以让DWR和 EXT连接得更加紧密。不过,需要在后台添加DWRProxy所需要的Java类,这可能不是最好的解决方案。但我们相信,通过对它的内在实现的讨论,我们可以有更多的选择和想象空间。

注意     这个DWRProxy.js一定要放在ext-base.js和ext-all.js后面,否则会出错。

我们现在就用DWRProxy来实现一个分页的示例。除了准备好插件DWRProxy.js 外,还要在后台准备一个专门用于分页的封装类。因为不仅要告诉前台显示哪些数据,还要告诉前台一共有多少条数据。现在我们来重点看一下 ListRange.java,如下面的代码所示。

public class ListRange {

    Object[] data;

    int totalSize;

}

其实ListRange非常简单,只有两个属性:提供数据的data和提供数据总量的totalSize。再看一下InfoManager.java,为了实现分页,我们专门编写了一个getItems方法,代码如下所示。

public ListRange getItems(Map conditions) {

    int start = 0;

    int pageSize = 10;

    int pageNo = (start / pageSize) + 1;

    try {

        start = Integer.parseInt(conditions.get("start").toString());

        pageSize = Integer.parseInt(conditions.get("limit").toString());

        pageNo = (start / pageSize) + 1;

    } catch (Exception ex) {

        ex.printStackTrace();

    }

    List list = infoList.subList(start, start + pageSize);

    return new ListRange(list.toArray(), infoList.size());

}

getItems()的参数是Map,我们从中获得需要的参数,比如start和 limit。不过HTTP里的参数都是字符串,而我们需要的是数字,所以要对类型进行相应的转换。根据start和limit两个属性从全部数据中截取一部分,放进新建的ListRange中,然后把生成的ListRange返回给前台,于是一切都解决了。

重头戏要上演了,我们就要使用传说中的Ext.data.DWRProxy了,还有Ext.data.List- RangeReader。通过这两个扩展,EXT完全可以支持DWR的数据传输协议。实际上,这正是EXT要把数据和显示分离设计的原因,这样你只需要添加自定义的proxy和reader,不需要修改EXT的其他部分,就可以实现从特定途径获取数据的功能。后台还是DWR,所以至少在Grid部分,我们可以很好地使用它们的结合,主要代码如下所示。

var store = new Ext.data.Store({

    proxy: new Ext.data.DWRProxy(infoManager.getItems, true),

    reader: new Ext.data.ListRangeReader({

        totalProperty: 'totalSize',

        root: 'data',

        id: 'id'

    }, info),

    remoteSort: true

});

与我们上面说的一样,我们修改了proxy,也修改了reader,其他地方都不需要进行修改,Grid已经可以正常运行了。需要提醒的是DWRProxy的用法,其中包括两个参数:第一个是dwr- Call,它把一个DWR函数放进去,它对应的是后台的getItems方法;第二个参数是paging- AndSort,这个参数控制DWR是否需要分页和排序。

ListRangeReader部分与后台的ListRange.java对应。 totalProperty表示后台数据总数,我们通过它指定从ListRange中读取totalSize属性的值来作为后台数据总数。还需要指定 root参数,以告诉它在ListRange中的数据变量的名称为data,随后DWRProxy会从ListRange中的data属性中获取数据并显示到页面上。如果不想使用我们提供的ListRange.java类,也可以自己创建一个类,只要把totalProperty和data两个属性与之对应即可。

我们现在来尝试一下让树形也支持DWR。有了前面的基础,整合DWR和tree就更简单了。在后台,我们需要树形节点对应的TreeNode.java。目前,只要id、text和leaf三项就可以了。

public class TreeNode {

    String id;

    String text;

    boolean leaf;

}

id是节点的唯一标记,知道了id就能知道是在触发哪个节点了。text是显示的标题,leaf比较重要,它用来标记这个节点是不是叶子。

这里还是用异步树,TreeNodeManager.java里的getTree()方法将获得一个节点的id作为参数,然后返回这个节点下的所有子节点。我们这里没有限制生成的树形的深度,你可以根据自己的需要进行设置。 TreeNodeManager.java的代码如下所示。

public List getTree(String id) {

    List list = new ArrayList();

    String seed1 = id + 1;

    String seed2 = id + 2;

    String seed3 = id + 3;

    list.add(new TreeNode(seed1, "" + seed1, false));

    list.add(new TreeNode(seed2, "" + seed2, false));

    list.add(new TreeNode(seed3, "" + seed3, true));

    return list;

}

上面的代码并不复杂,它实现的效果与在Java中使用List或数组是相同的,因为返回给前台的数据都是JSON格式的。前台使用JavaScript处理返回信息的部分更简单,先引入DWRTree- Loader.js,然后把TreeLoader替换成DWRTreeLoder即可,如下面的代码所示。

var tree = new Ext.tree.TreePanel('tree', {

    loader: new Ext.tree.DWRTreeLoader({dataUrl: treeNodeManager.getTree})

});

参数依然是dataUrl,它的值treeNodeManager.getTree代表的是一个DWR函数,我们不需要对它进行深入研究,它的内部会自动处理数据之间的对应关系。DWR有时真的很方便。

DWRProxy既然可以用在Ext.data.Store中,那么它也可以为ComboBox服务,如代码清单10-8所示。

代码清单10-8 DWRProxy与ComboBox整合

var info = Ext.data.Record.create([

    {name: 'id', type: 'int'},

    {name: 'name', type: 'string'}

]);

var store = new Ext.data.Store({

    proxy: new Ext.data.DWRProxy(infoManager.getItems, true),

    reader: new Ext.data.ListRangeReader({

        totalProperty: 'totalSize',

        root: 'data',

        id: 'id'

    }, info)

});

var combo = new Ext.form.ComboBox({

    store: store,

    displayField: 'name',

    valueField: 'id',

    triggerAction: 'all',

    typeAhead: true,

    mode: 'remote',

    emptyText: '请选择',

    selectOnFocus: true

});

combo.render('combo');

我们既可以用mode:'remote'和triggerAction:'all'在第一次选择时读取数据,也可以设置mode:'local',然后手工操作store.load()并读取数据。

DWR要比Json-lib方便得多,而且DWR返回的数据可以直接作为JSON使用,使用Json-lib时还要面对无休无止的循环引用。

这次的示例稍微复杂一些,因为包括依赖jar包、class、XML和JSP,所以示例单独放在10.store/dwr2/下,请将它们复制到tomcat的webapps下,然后再使用浏览器访问。
分享到:
评论

相关推荐

    EXT-DWR-SPRING 整合详细指导

    EXT-DWR-SPRING整合详细...整合后的应用能够通过Ext JS丰富的组件提供友好的用户界面,通过DWR实现浏览器端与服务器端的无缝交互,以及利用Spring框架强大的服务支持和依赖注入功能,来管理和组织应用中的各个组件。

    基于DWR与EXT的Ajax应用研究与实现.pdf

    基于DWR与EXT的Ajax应用研究与实现 Ajax技术是Web 2.0时代的核心技术之一,它使Web页面不需要刷新就可以动态更新,从而节省了网络带宽,减轻了服务器的负担,使用户得到更好的体验。但是,Ajax技术也存在一些问题,...

    dwr和EXT的整合

    本文将深入探讨DWR与EXTJS的整合过程以及它们如何协同工作,帮助开发者构建高效、动态的Web应用。 1. DWR(Direct Web Remoting) DWR是一个开源Java库,它允许开发者在JavaScript和Java之间进行直接的远程调用,...

    《ajax框架:dwr与ext》实战

    - 使用DWR与Spring、Hibernate整合,实现数据持久化操作。 3. **测试DWR**: - 编写单元测试用例验证DWR的功能。 - 确保前后端数据交换正确无误。 4. **编写前台DWR调用代码**: - 在前端页面中引入DWR ...

    使用注解整合ext dwr spring hibernate

    EXT与DWR的整合主要是通过DWR生成的JavaScript接口调用服务器端的方法。EXT组件的事件处理函数可以直接调用这些接口,实现数据的获取和更新。例如,EXT的一个GridPanel可以通过DWR异步加载由Hibernate查询得到的数据...

    dwr+ext+spring demo

    【标题】"dwr+ext+spring demo" 是一个整合Direct Web Remoting (DWR), Ext JS 和 Spring 框架的示例项目。这个项目旨在展示如何将这些技术有效地结合在一起,创建一个功能丰富的、交互性强的Web应用程序。 【描述...

    dwr+ext+strusts2+spring+hibernate整合

    "dwr+ext+struts2+spring+hibernate整合"就是一个典型的例子,它涵盖了前端展示、后端控制、业务逻辑处理、持久层操作等多个层面的技术。下面将分别详细介绍这些技术以及它们在整合中的作用。 1. DWR (Direct Web ...

    ext 与 dwr 的结合

    开发者可以查看这些源代码来学习如何将EXT、DWR和Spring整合在一起,构建出高性能、交互性强的Web应用。 总的来说,EXT与DWR的结合是提高Web应用交互性和实时性的有效手段,它们与Spring的配合则进一步优化了应用的...

    spring+ext+dwr.rar_ext dwr_ext java_java 用户管理_spring e_spring ex

    《Spring+Ext+DWR整合应用详解:用户管理与实战》 在当今的Web开发领域,Spring、Ext和Direct Web Remoting (DWR) 是三种非常重要的技术,它们各自在不同的层面发挥着关键作用。Spring作为Java企业级应用的框架,...

    ssh整合例子(spring3 + struts2 + hibernate4+dwr+ext+json)

    内含 ext+dwr+freemark+jasperreort+ireport+echance+oscache+velocite等技术 展示例子:http://zz563143188.iteye.com/blog/1462413 若要下载chm格式请到http://user.qzone.qq.com/563143188 程序源码下载地址10MB...

    Ext 开发指南 学习资料

    10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader 10.1.4. DWRProxy和ComboBox 10.2. localXHR让你在不用服务器就玩ajax 10.3. 在form中使用fckeditor 10.4. 健康快乐动...

    EXT2.0中文教程

    10.1. dwr与ext整合 10.1.1. 无侵入式整合dwr和ext 10.1.2. DWRProxy 10.1.3. DWRTreeLoader 10.2. localXHR让你在不用服务器就玩ajax 10.3. 在form中使用fckeditor A. 常见问题乱弹 A.1. ext到底是收费还是免费 A...

    DWR+EXT+SPRING+HIBERNATE较为完整的一个例子

    DWR 提供了一种在浏览器与服务器之间进行实时通信的技术,EXT 是一个强大的 JavaScript UI 框架,Spring 是一个全面的轻量级应用框架,而 Hibernate 则是 Java 的对象关系映射(ORM)工具。这四个组件的结合可以构建...

    ext-dwr-hibernate

    这种整合的优势在于,EXT提供了优秀的用户界面,DWR简化了前端与后端的通信,而Hibernate则确保了数据操作的高效和灵活。这样的架构可以构建出响应快速、功能强大的Web应用,尤其适合于需要大量数据操作和实时更新的...

    Ext深入浅出 数据传输

    10.10 DWR与EXT整合..................................249 10.10.1 在EXT中直接使用DWR......249 10.10.2 DWRProxy............................250 10.10.3 DWRTreeLoader................252 10.10.4 DWRProxy和...

    ext + dwr proxy

    标题“ext + dwr proxy”涉及的技术点是EXT JavaScript库与Direct Web Remoting (DWR)框架的结合使用,创建了一个代理服务。EXT是一个用于构建富互联网应用(RIA)的前端JavaScript库,提供了丰富的组件和数据绑定...

    ext+Json+dwr+spring+hibernate整合项目实例与资源

    这个"ext+Json+dwr+spring+hibernate整合项目实例与资源"就是一个典型的案例,它展示了如何将这五个关键技术融合在一起,以实现一个功能强大的前端和后端交互系统。让我们详细探讨这些技术及其整合方式。 1. **...

Global site tag (gtag.js) - Google Analytics