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

本文介绍如何利用DWR框架实现单行编辑框功能,包括设计页面、清除及编辑函数、保存及删除操作等步骤,并提供了一个DWR结合Spring与Hibernate的实际案例。

  也许朋友们会以为这是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的示例
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值