论坛首页 Web前端技术论坛

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

浏览 5366 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-03  
DWR

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

当我们需要编辑某行数据的时候,可以将该行的数据设置到一个已经设计好的单行编辑框中进行编辑。在编辑完成以后,点击“保存”按钮,DWR可以采用ajax的方式访问服务器,将数据保存到数据库中。怎样设计一个单行编辑框呢?让我们一步一步来完成吧。

1、设计页面。

设计好一个单行编辑框的页面,为值对象中的每一个属性设计一个数据输入框,如单行文本框、多行编辑框、下拉框、单选框等等。设计这些数据输入框的同时应当将它们的id设置成与值对象对应的属性名相同的名称。这里我想特别说明的是下拉框,因为下拉框中的下拉部分应当是一个从数据库中查出来的下拉列表。DWR为下拉框设计了一个非常便利的函数addOptions(),函数addOptions的完整写法如下
addoptions(eleid, data, valueprop, textprop);
 在该函数中,eleid是下拉框的iddata是下拉框需要显示的下拉列表的数据集,它通常需要包含至少两行数据,一行是下拉框value部分的数据,即需要存数据库的数据,另一行是下拉框text部分的数据,即仅仅用于在下拉列表中显示的数据。比如,我们有一个选择部门的下拉框,value部分对应的应当部门编号,而text部分应当是部门名称。清楚了datavalueproptextprop就好说了,valueprop就是value部分的属性名,textprop就是text部分的属性名。因此,写一个选择部门的下拉框应当这样写:
DepartmentBus.findDepartment(
    function(resultset){    
        addoptions(‘department’,resultset.collection,
            ’departmentId’,’departmentName’);});

  另外一个关键的问题我想特别提一下,就是值对象的主键。我在设计hibernate的值对象的时候倡导的是使用无意义的主键。既然是无意义的主键,那么我们不应当将主键值展示给用户。因此我在设计页面的时候通常是将主键对应的标签设计成一个hidden标签。如果主键标签为空,在提交数据保存的时候,hibernate将执行插入操作;如果不为空,执行的将是更新操作。因此,通常不需要分别设计插入页面和更新页面,可以将它们合二为一(一些因特殊原因必须将插入页面和更新页面拆开来编写的情况应当另当别论)。

2、设计清除函数

如果你需要设计一个添加功能,则需要显示一个没有显示任何值的空单行编辑框。然而使用DWR设计页面,我们的思维需要发生一个转变,那就是不要随便刷新页面。什么意思呢?当你打开一个单行编辑框添加一条数据并保存以后,又需要添加另一条数据。如果不刷新页面,则该页面此时还依然显示的是上一条数据的内容,我们就需要设计一个页面清除函数。如果我们在dwr.xml文件中是一个一个注册值对象,那么写清除函数就非常简单了。具体编辑如下:
var department = new Department();
dwr.util.setValues(department);

 第一行产生一个空值对象,第二行使用setValues()将页面清空。

3、设计编辑函数

当我们在列表显示框中选择了某行并点击“编辑”按钮以后,需要一个编辑函数将该行的数据设置到单行编辑框中。用DWR怎样设计编辑函数呢?前面提到,在列表显示框装载查询结果集的时候,我们同时也将结果集放置到了一个叫objCache页面端数据缓存中。当用户点击“编辑”按钮时,需要将该行的行好以参数的形式传递给编辑函数,然后编辑函数将到objCache中取得该行的值对象,最后使用setValues()将该值对象设置到单行编辑框中。

4、设计保存函数

当编辑数据完成以后,点击“保存”按钮以后,需要执行一个保存函数来执行保存。在设计保存函数的时候,首先需要从页面中取出数据并放置到值对象中。为了完成该功能,DWR提供了getValues()函数。在使用该函数的时候,我们必须写产生一个空值对象,然后将该对象作为参数传递给getValues(),则页面中的数据就植入到了该对象中。最后,使用DWR的特有方式,调用服务器端的java对象中的函数,执行保存。在执行保存的过程这,DWR还专门提供了事务处理的功能,当然我从来没有测试过该事务处理的能力。总结保存函数应当如下编写:
var department = new Department();    
dwr.util.getValues(department);    
dwr.engine.beginBatch();
DepartmentBus.updateDepartment(department);
dwr.engine.endBatch();
objCache[curid] = obj;

 回顾保存函数,我们可以抽象出部分代码,以便简化保存函数的编写并提高代码复用度。代码中的第2356行都可以抽象成一个通用的函数进行编写。而代码中的14行则是个性化的代码,应当在具体编写每个功能的时候分别去实现。也就是说保存函数被我分成了通用函数和具体实现函数两部分,具体的实现见我的示例。

5、设计删除函数

当我们在列表显示框中选择了某行并点击“删除”按钮的时候,我们需要设计一个删除函数来删除该行数据。删除函数的设计与保存函数的设计比较近似,这里我就不再累赘了,朋友们自己思考吧。

示例:一个dwr+spring+hibernate的示例
   发表时间:2007-09-05  
终于把示例加进去了
0 请登录后投票
   发表时间:2007-09-07  
两个地方不明白,请教:

1、如何把页面上各个对象和hibernate对象对应起来??
2、如何使您的框架中的condition?
0 请登录后投票
   发表时间:2007-09-07  
kaki 写道
两个地方不明白,请教:

1、如何把页面上各个对象和hibernate对象对应起来??
2、如何使您的框架中的condition?


只要把hibernate的值对象都注册到dwr.xml中,在页面端就直接使用这些对象就行了,和在java中使用基本是一样的。至于hibernate的其它对象,我认为它们应当是对页面端完全隔离的。如果页面端需要某个hibernate可以提供的功能,应当是服务器端的bus和dao层调用hibernate来实现该功能,然后由页面端调用该功能,而不应当是页面端直接调用hibernate。

condition的使用可以看我的源码中的说明,我也正在考虑在示例中展示这个功能的使用,稍候了。
0 请登录后投票
   发表时间:2007-10-12  
var department = new Department();
dwr.util.getValues(department);

这样写并没有从页面取值给对象,是如何去到值的呢?
0 请登录后投票
   发表时间:2007-10-12  
是不是表单域中的属性id的值要和bean中的属性名相同呢?
0 请登录后投票
   发表时间:2007-10-13  
Philos 写道
var department = new Department();
dwr.util.getValues(department);

将Department注册到dwr.xml中,Department.js中就会包含对Department值对象的定义,因此直接使用new Department()就可以了。在调试页面中保存Department.js就可以查看到里面的内容。但注意,在dwr.xml注册的时候应当采用第二种方法。
0 请登录后投票
   发表时间:2007-10-13  
Philos 写道
是不是表单域中的属性id的值要和bean中的属性名相同呢?

当然,这样才能建立对应关系。但表单域中并不一定要包含所有bean中的属性。表单没有的属性在提交以后将为空。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics