DWR帮助说明-如何编写通用的列表显示框

也许朋友们会以为这是DWR官方发布的什么帮助,但非常遗憾这不是。现在不少朋友在使用DWR开发项目,我也是其中之一,但苦于关于DWR的帮助文档实在太少,很多问题都不得不自己去钻研DWR的源码才能解决或理解。经过一段时间的苦苦钻研,总结出那么一点点心得,现在从DWR源码实现的角度详细讲解DWR的使用,写出来与大家分享。今天我谈一谈如何编写通用的页面端DWR代码。

看了DWR官方发布的示例代码,朋友们可以发现,在该示例代码中,每一个功能都至少有一个jsp文件和一个js文件。也就是说,示例中的每一个功能都需要我们为该功能单独地编写javascript代码,而没有能够有效的代码复用,这是我们不愿意看到的。然而,这仅仅是DWR提供给我们的示例代码,它可以不用过多考虑一些技术细节,但我们使用DWR开发项目则不得不考虑。那么,我们如何在使用DWR的过程中尽可能地代码复用呢?我想,我们先梳理一下页面端的DWR代码如何编写,然后一步一步分析总结这些代码应当如何复用,思路会更加清晰一些。

一、列表显示功能

首先,我们先看一看DWR的列表显示功能。DWR示例中的people目录中展示了一个列表显示功能。总结一下示例中的列表显示代码大致有这几个步骤:

1、调用一个服务器端某个对象中的一个查询方法,如DepartmentBus.findDepartment();这里的DepartmentBus和它的方法findDepartment()对应的是服务器端的一个类及其方法,并已经在dwr.xml中注册了的。在这里调用该方法看起来好像与在java中调用比较相似,但有一个很大的区别就是它的返回值。在java中获得返回值是将某个变量等于该函数:

List rs = DepartmentBus.findDepartment(String hql);

但在js中使用DWR应当这样写:

DepartmentBus.findDepartment(String hql, function(resultset){ … });

在这段代码中,function(resultset){ … }中的resultset变量就是返回值,而这个function中的内容就是对返回值的处理过程。在javascript中,一个function也被当作变量看待,只是一个可以调用的特殊变量。因此你也可以将以上代码写为这样:

DepartmentBus.findDepartment(String hql, getResultset);

function getResultset(resultset){ … };

甚至可以将后面这个函数写成这样:

getResultset = function(resultset){ … };

这样的代码比较奇怪是吧,习惯了就不奇怪了。

2、现在应当来实现getResultset中打省略号的部分,示例中是使用一个DWR的函数removeAllRows来删除table中所有的行,除了那个作为模板的行,其id取名为pattern。这个名为pattern的行十分重要,它被设置为不显示,但表格中的其它行都是由这一行进行克隆得到的。

3、执行一个循环语句,从resultset中依次取出值对象,然后使用DWR的函数cloneNode使用模板行克隆一个新行,然后使用数个DWR的函数setValue将值对象中的属性设置到这个新行的对应列中。当然,这个新行的各个列的id应当设置成属性名加列号。比如在设置第三行时,应当将该行的“部门编号”列的id设置为“departmentId002”,并在向该列赋值的时候写为:setValue(‘departmentId002’, vo.departmentId);其中vo就是这个值对象。另外,在完成对该行的赋值操作以后,为了今后的执行效率考虑,将一个叫objCache的变量作为页面的结果集缓存,将该行的值对象放进这个数组变量中。

经过这样三个步骤,DWR就实现了从后台查询出数据集并写入到页面的表格中。但这样一个过程我们可不可以写一个通用的代码,使得各种不同表的不同数据都可以通过少量程序就可以完成了?但不幸地是,以上的代码不能直接抽象出一个通用代码,我们必须需要进行改造。问题出在第三个步骤的setValue()函数。按照示例的思路,对于Department应当这样写:

setValue(‘departmentId002’, vo.departmentId);

setValue(‘departmentName002’, vo.departmentName);

而对于另一个表格Employee应当这样写:

setValue(‘emplyeeId002’, vo.employeeId);

setValue(‘name002’, vo.name);

setValue(‘sex002’, vo.sex);

也就是说,我们不得不根据值对象的不同分别去写setValue语句而不是一个通用语句。但所幸的是,DWR还提供另一个函数setValues(),你只需要将值对象传给它,它将把id等于属性名的对象设置为该属性的值,比如有个id等于departmentId的text框就会被setValues()设置成显示departmentId对应的值。然而这里使用setValues()有一个问题,值对象中只有departmentId属性,而在表格中我们为了区别不同的行,将每行的“部门编号”标签的id设置为departmentId000、departmentId001、departmentId002……与属性名不一致了。怎么办呢?如果我们把setValues()进行一些改造,使其能够提供后缀的功能就迎刃而解了,即将后面的序号作为后缀,以参数的形式传给setValues(),这样一个通用的列表查询函数就写出来了。具体的做法是我重新实现了DWR的setValues()和_getDataProperties()并提供了3个将结果集填充到表格的函数fillTable()fillResult()fillTableWithCache()fillTable()用于直接将结果集填充到表格中,fillResult()将表格填充的同时还实现了无刷新页面翻页的功能,而fillTableWithCache()则用于当数据更新时不查询后台而直接通过页面的结果集缓存变量刷新数据。具体的实现见我提供的示例。

二、前缀

前面我提到了后缀的功能,即页面在列表显示的时候,为了使表格中的数据既可以与值对象的属性对应,又可以使各列之间的id名称有所区别,在将标签的id名称设置为“属性名+行号”,这个行号就是后缀。然而DWR还提供了前缀的功能,这又是什么意思呢?

DWR一个非常重要的特点是将页面的id与后台值对象的属性名对应起来。通过这样,过去我们在MVC需要做的非常烦杂的,将页面的form中一个一个取出数据,再一个一个放到值对象的工作,变成了一个简单的setValues()的操作。但是这样却带来了另一个问题:同一个表的数据在一个页面中需要在多个部分显示,就会出现多个标签使用同一个id形成冲突的问题。比如,一个非常普遍的应用,在一个页面中同时包含一个列表显示框和一个单行编辑框。当用户选择列表显示框中的某行并点击“编辑”按钮,该行的信息将显示在单行编辑框中进行编辑,编辑结束并保存后将更新该行到列表显示框中。在列表显示框中如果显示的是所有部门的信息时,虽然各行标签的id取名为“属性名+行号”,但列表框中那个用于克隆的模板行却是取名为值对象的属性名,如departmentId、departmentName等。而在该页面中的单行编辑框中显示的也是部门信息,因此取名也是部门值对象的属性名。这样,在这个页面中将有两个id为departmentId的标签,两个id为departmentName的标签,id出现了冲突。众所周知,在一个页面中id应当是唯一的,如果出现id冲突将出现错误。解决这个问题的办法当然就是使用前缀。

如果在设计页面的时候出现id冲突,我们可以在id前添加一个前缀,如在departmentId前添加一个tbody,写成tbody. departmentId,而另一个添加另外的前缀,id冲突的问题就解决了。对于添加了前缀的标签,在调用setValues()和getValues()函数的时候应当将前缀作为参数传递过去,写法如下:

setValues(department, { prefix:tbodyid, postfix:id });

后面的后缀就是我重写setValues后提供的功能。

ShanYangClaw (DevMate)-python+agent-project 项目代码 立即下载

相关推荐

参数估计Picard迭代在非线性常微分方程参数估计中的应用研究(Matlab代码实现)

内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了算法的有效性,展示了其在科学计算与工程建模中的良好适应性与推广潜力。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能力,从事系统建模、参数辨识、动力学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计算中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对算法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。

关于使用DWR返回对象List的方法

以往我对dwr返回对象list的操作都是把其返回的信息设置到select标签上,今天突然碰见一个要求从返回对象的list中分别取出对象的一些属性进行其他操作,一时摸不着头绪,想了半天,再加上baidu,终于大功告成。 当我们把返回对象设置成select中option的做法是:DWRUtil.addOptions('addOptionsObject1', data, "...

duqiangcise 410

XYF.SHX

XYF.SHX

DWR帮助说明-如何编写通用的单行编辑

  也许朋友们会以为这是DWR官方发布的什么帮助,但非常遗憾这不是。现在不少朋友在使用DWR开发项目,我也是其中之一,但苦于关于DWR帮助文档实在太少,很多问题都不得不自己去钻研DWR的源码才能解决或理解。经过一段时间的苦苦钻研,总结出那么一点点心得,现在从DWR源码实现的角度详细讲解DWR的使用,写出来与大家分享。今天我谈一谈如何编写通用的单行编辑。当我们需要编辑某行数据的时候,可以将该行的...

充满诗意的联盟 155

一个dwr+spring+hibernate的示例

这是一个运用dwr+spring+hibernate这样一个编写的示例。它展示了一下内容:1、在dwr中尝试编写的一些通用的代码,包括如何编写一个通用列表显示并实现分页、如何编写一个通用的单行编辑、如何编辑一个通用的存盘和删除程序等等。2、在dwr中如何与spring兼容,调用bus中的方法;在dwr中如何与hibernate兼容,在页面端操作值对象,以及处理值对象间的各种关系。3、如何...

充满诗意的联盟 243

java dwr_【Java】dwr的使用方法

DWR(Direct Web Remoting)是一个Java Ajax的架,允许开发人员在客户端通过JavaScript代码调用服务器端的java方法,这些方法就像是在客户端一样DWR架主要由两部分组成,客户端JavaScript嗲吗直接调用服务器Java方法,服务器上运行的DWR核心Servlet负责处理客户端请求,将客户端的请求委托到实际的Java对象进行处理,并将结果返回给客户端首先...

weixin_29459473的博客 536

dwr java_Java的Web项目使用DWR简单配置说明

首先使用Maven引入DWR的Jar包org.directwebremotingdwr3.0.1-RELEASE其次建立一个测试用的Java类packagecom.k.ctc.web.dwr;/***@authorKai*@Date2016-1-714:32:08*/publicclassTestDwr{publicStringgetName(Stringname){Sy...

weixin_39992957的博客 191

java dwr_DWR文档之开始使用 DWR

原文出处: http://www.javatang.com/archives/2006/10/20/254879.html翻译: Jet Mah声明: 请维持文章的完整性任意转载开始使用 DWR有两种方法来开始 DWR 的学习,最简单的做法是下载官方提供的 WAR 文件然后对此深入研究。不过这种方式不能使你感到将 DWR 整合到你现有的 web 程序有多么的简单,所以我们推荐你跟随下面三个步骤:1...

weixin_39713686的博客 181

实用DWR的基本步骤

开始使用 DWR有两种方法来开始 DWR 的学习,最简单的做法是下载官方提供的 WAR 文件然后对此深入研究。不过这种方式不能使你感到将 DWR 整合到你现有的 web 程序有多么的简单,所以我们推荐你跟随下面三个步骤:1. 安装 DWR JAR 包下载 dwr.jar 文件,然后将它放在 web 程序的 WEB-INF/lib 目录下面,很可能在这个目录下已经有一些 jar 文件了。

百年一梦 960

java dwr bean_一天时间换来的DWR学习经验

Java代码dwr-invokerclass>uk.ltd.getahead.dwr.DWRServletclass>debugtruedwr-invoker/dwr/*然后在web.xml的同目录下,创建一个dwr.xml,配置如下:Java代码"1.0"encoding="UTF-8"?>nbsp;dwrPUBLIC"-//GetAheadLimited//DTDDir...

weixin_42303461的博客 126

焊接变位机_1.rar

焊接变位机_1.rar

基于多尺度集成极限学习机回归(Matlab代码实现)

内容概要:本文详细介绍了一种基于多尺度集成极限学习机(Extreme Learning Machine, ELM)的回归方法,并提供了完整的Matlab代码实现。该方法通过构建多尺度特征表示与集成学习机制,有效提升了ELM在处理非线性、高维复杂数据时的预测精度与模型鲁棒性,特别适用于时间序列回归任务。文档不仅阐述了算法的核心原理与技术流程,还系统展示了其在风电功率预测等工程场景中的应用潜力。同时,文中附带了丰富的科研仿真案例集合,涵盖智能优化算法、深度学习、信号处理、电力系统调度等多个前沿方向,体现了多学科交叉融合的技术优势与实践价值。; 适合人群:具备一定Matlab编程能力,从事科学研究或工程应用的研究生、科研人员及工程技术开发者,尤其适合专注于机器学习、智能算法优化、新能源预测与电力系统建模等相关领域的专业人员。; 使用场景及目标:①用于风电、光伏、负荷等时间序列数据的高精度回归预测任务;②为科研工作者提供可复现的多尺度集成ELM模型代码架,支持快速算法验证与二次开发;③满足实际工程项目中对高效建模、实时预测与智能决策的技术需求。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解多尺度特征构造与集成策略的设计思想,同时可参考文档中其他相关算法案例进行横向比较与综合应用,以提升整体科研创新能力。

精密钟表配件叉片插针组装机 -原创设计.rar

精密钟表配件叉片插针组装机 -原创设计.rar

精密制造基于桥式三坐标的深孔同轴度测量:半导体流体控制阀PTFE阀体形位公差定量检测方案

内容概要:本文针对高精密制造中深孔内部特征难以精确定量测量的技术瓶颈,提出了一套基于中图仪器Mars Classic 10128桥式三坐标测量机的解决方案,重点解决长径比大于5:1的PTFE四氟阀体深孔同轴度与圆柱度测量难题。通过采用自主研发的深孔加长测针组件与CP500S扫描测头,克服了传统接触式测针刚性不足和光学设备视场遮挡的问题,实现了对深孔内部形貌的连续扫描与三维拓扑建模,输出精度可达≤0.025mm,建立了可追溯、可量化的测量标准流程。; 适合人群:从事半导体流体控制阀、高精密PTFE阀体等零部件设计、制造与质量检测的工程技术人员及测试管理人员,具备一定几何公差与三坐标测量基础知识的专业人员; 使用场景及目标:①解决“影像仪测不到深孔内部”或“深孔长径比大于5怎么测”的实际工程问题;②实现对深孔同轴度、圆柱度等形位公差的定量评价,替代传统通止规定性判断;③为工艺优化、刀具补偿和质量追溯提供精准数据支持; 阅读建议:此资源作为技术应用指南,兼具设备选型参考与测量方法指导价值,建议结合实际检测案例对照操作,并联系中图仪器技术中心获取实测验证支持。

上一篇: DWR帮助说明-dwr的bug及其解决方法
下一篇: DWR帮助说明-服务器端程序的编写
iteye_6574
博客等级 码龄8年 0粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值