也许朋友们会以为这是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后提供的功能。
示例:一个dwr+spring+hibernate的示例
分享到:
相关推荐
这个不是我的原创,原文件出至这里:...原资源包含了,源代码和API Doc,只是美中不足的是没有整理成可用的zip文档,我这特分离了一下,并重新打好包了,初步测试了一下能用。
标题 "dwr-1.1.3-src.zip" 指示的是 Direct Web Remoting (DWR) 的源代码版本1.1.3的压缩包。DWR 是一个开源Java库,它允许JavaScript在Web浏览器中与服务器端的Java对象进行交互,实现Ajax功能。描述中的内容同样...
DWR(Direct Web Remoting)是一个用于改善web页面与Java类交互的远程服务器端Ajax开源框架,可以帮助开发人员开发包含AJAX技术的网站,其中包含jar包,javadoc,例子等
这可能是一个重复的文件,或者包含了与dwr.jar和dwr-2.0.5-src.zip不同的内容,比如可能是DWR的配置文件、文档或者特定环境的构建版本。通常,这样的zip文件会包含部署所需的全部资源,包括Web应用的结构和配置文件...
- 在`index.html`中,引入`dwr-engine.js`和`dwr-generate.js`,编写JavaScript函数处理按钮点击事件,调用DWR的`Calculator.add`方法。 - 最后,前端代码接收返回的结果,更新HTML元素显示和值。 5. **实际应用*...
在解压"Dwr-2.0.5-src.rar"后,你会得到一个名为“dwr-2.0.5-src”的文件夹,这个文件夹中包含了以下关键知识点: 1. **源码结构**:DWR的源代码通常会按照模块进行组织,如核心库、安全模块、测试用例等。通过分析...
dwr-1.1.1-util.js
<servlet-name>dwr-invoker</servlet-name> <display-name>DWRServlet</display-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name...
5. 最后,了解DWR的配置不仅可以帮助你更好地利用DWR提供的功能,还能避免不必要的MVC层编程,提高开发效率。通过合理配置`dwr.xml`,你可以实现更灵活、更直接的前端与后端交互,从而构建更高效的Web应用程序。 ...
标题 "dwr入门 -- 03 -- 结合Spring" 指向的是一个关于Direct Web Remoting (DWR)框架如何与Spring框架整合的教程。DWR是一个Java库,允许在浏览器和服务器之间进行实时、双向通信,使得JavaScript可以直接调用Java...
传不了太大的,分3份传上来 dwr-2.0.5-src dwr-2.0.5-src
在"**dwr-struts-示例**"中,我们看到的是一个展示了如何将DWR集成到Struts框架中的实际案例。这个示例主要包含以下几个关键知识点: 1. **DWR的配置**: - 在`dwr.xml`配置文件中,定义允许客户端调用的服务器端...
dwr-2.0-util.js
在"DWR-2.0.2-src.zip"这个压缩包中,包含的两个主要文件是: 1. **dwr.jar**:这是DWR的核心库文件,包含了所有必要的类和接口,用于在服务器端运行DWR服务。开发者在项目中引入此jar包,就可以使用DWR提供的API来...
1. 提供了修改后的DWR-3.0.2-RELEASE源代码工程 `dwr` ① 以maven方式组织DWR源码依赖的jar包 ② 下载了github上的DWR源代码, 对其进行了尽可能少的修改, 使其满足SpringBoot以jar包方式独立运行的需要 源码地址: ...
方佳玮编写的DWR中文使用文档是针对开发者的一个宝贵的资源,旨在帮助他们快速理解和应用DWR技术。下面将详细阐述DWR的主要特点、工作原理以及如何使用它来提升Web应用的性能和用户体验。 1. **DWR的基本概念** ...
struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。
struts2-dwr-plugin-2.1.6.jar