利用AJAX_JSON实现DataGrid
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
开发研究与设计技术
本栏目责任编辑:谢媛媛
1概述
在现在的企业应用中,大量需要显示表数据,在J2EE中,大部分情况下,很多的开发人员普遍采用迭代或遍历的办法显示数据,再根据需要显示发那也信息,而用过ASP.Net的人肯定对它的DataGrid组件印象很深刻,它不但能显示数据集和数据表数据而且还提供分页功能,但是在JAVA里面却没有类似的DataGrid组件可以复用,而在我们实际的项目中却大量需要用到它,为此我们在项目中利用JSON+AJAX自己开发出了一个DataGridJSP标签组件,它具有以下特性:
(1)分页方式可采取超级链接、
按钮或者图片,设置pageSize=0不显示分页;
(2)设置optionType属性可以在第一列自动添加CheckBox或者Radio或不加;
(3)支持日期格式化以及奇数行和偶数行不同的风格;
(4)采用AJAX+JSON实现第一次之后数据的读取,大大提高了效率;
(5)采取类似JSFDataModel数据模型,可扩展性强;(6)支持AJAX模式和非AJAX模式以及默认风格设置;(7)支持绝大部分表格属性的设置,支持IE和Firefox。
其效果图如图1所示(为了减小图片占用幅面,故使用简单表结构和较少的行):
图1采用CheckBox和图片分页效果
上面的效果图对应JSP标签代码为:
<data:datagriddataSource="data"id="dict"border="0"align="center"defaultRowStyle='true'pageSize='6'cssClass='table0'pagerStyle='2'width='500px'optionType='1'optionBind='DataNo'headStyle="background-color:#EEEEEE;height:20px;"
cellSpacing="1"cellPadding="1"ajax='true'
firstImage="images/arrow-first.gif"lastImage="images/arrow-last.gif"
nextImage="images/arrow-next.gif"prevImage="images/arrow-prev.gif">
<data:columnname="DataNo"title="数据编号"headAlign="center"
rowAlign="center"width='100px'/><data:columnname="DataName"title="数据名称"headAlign="center"
rowAlign="center"width='170px'link="DataLink"/>
<data:columnname="DataTime"title="时间"headAlign="cen-ter"
rowAlign="center"width='200px'dateFormat="yyyy-MM-ddHH:mm"/>
</data:datagrid>
2AJAX及JSON简介
2.1AJAX
AJAX用来描述一组技术,它使浏览器可以为用户提供更为自然的浏览体验。
在Ajax之前,Web站点强制用户进入提交/等待/重新显示范例,用户的动作总是与服务器的“思考时间”同步。
Ajax提供与服务器异步通信的能力,从而使用户从请求/响应的循环中解脱出来。
借助于Ajax,可以在用户单击按钮时,使用JavaScript和DHTML立即更新UI,并向服务器发出异步请求,以执行更新或查询数据库。
当请求返回时,就可以使用JavaScript和CSS来相应地更新UI,而不是刷新整个页面。
最重要的是,用户甚至不知道浏览器正在与服务器通信:Web站点看起来是即时响应的。
Ajax不是一种技术。
实际上,它由几种蓬勃发展的技术以新的强大方式组合而成,是AsynchronousJavaScript+XML的缩写,
它包含以下四种技术:
(1)基于XHTML和CSS标准的表示;
(2)使用DocumentObjectModel进行动态显示和交互;(3)使用XMLHttpRequest与服务器进行异步通信;(4)使用JavaScript绑定一切。
在本组件中,我们用到了prototypeAJAXJavaScript脚本库,prototype是一个开源的JavaScript开发框架,里面封装了大量可以加快开发速度的方法,包括AJAX、DOM、array、string、form等,例如使用¥('div')代替getElementById("div")。
许多语言的开发框架如RubyonRails,PHP都集成Prototype,利用它来操作JavaScript将会大大节省开发时间,提高开发效率。
收稿日期:2006-11-13
作者简介:薛胜军(1956-),男,教授,博士生导师,研究方向:计算机支持的协同工作(CSCW),人工智能与故障诊断,计算机网络技术;毛志勇(1978-),男,硕士研究生,系统分析师,研究方向:软件工程、软件体系架构。
利用AJ AX+J SON 实现DataGrid
薛胜军,毛志勇
(武汉理工大学计算机科学与技术学院湖北武汉430063)
摘要:本文结合在实际项目中开发的一个AJAXDataGrid,讨论了利用AJAX+JSON来实现DataGrid的原理、后台数据模型、JSON
字符串的组装解析和客户端表格行数据替换策略以及相应的克隆节点策略。
在实际项目应用中表明:它极大地提高了开发效率和用户体验。
关键词:AJAX;JSON;JSP;自定义标签;DataGrid中图分类号:TP391文献标识码:A文章编号:1009-3044(2007)01-10161-02
UseAJAX+JSONtoImplementDataGrid
XUESheng-junMAOZhi-yong
(collegeofcomputerscience,Wuhanuniversityoftechnology,Wuhan430063,China)
Abstract:Inthepaper,toassociatewiththeAJAXDataGridintheactualdevelopmentofaproject,discussedprincipleofusingAJAX+JSONtoimplementDataGrid,backgrounddatamodel,theJSONstringcombinationandparsingstrategy,clienttablerowdatareplacementstrategyandthecorrespondingcloningnodestrategy.Inthepracticalprojectitisshownthat:TheDataGridJSPTagimprovedourdevelopmentefficiencyanduserexperiencegreatly.
Keywords:AJAX;JSON;JSP;Custom-
Tag;DataGrid
开发研究与设计技术本栏目责任编辑:谢媛媛
2.2JSON
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。
易于人阅读和编写。
同时也易于机器解析和生成。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,C#,Java等),直接在JavaScript中操作数组和对象,使用非常简单,比操作XML更方便,在服务器端有Java类库直接生成JSON字符串,这些特性使JSON成为理想的数据交换语言。
下面只列出了组件中需要用到的两种JSON数据类型:object和array,其格式见表1:
表1object和array格式
对象是“名称/值”对的无序集合,以“{”开始,以“}”结束,每个名称后面跟着“:”,“:”后面是值,“名称/值”对之间用“,”分隔。
其表现图如图2所示:
图2“JSON对象”表现图
数组是元素的有序集合,以“[”开始,以“]”结束,元素之间用“,”分隔。
其表现图如图3所示:
图3“JSON数组”表现图
3实现原理
首先是JSP页面解析DataGridTag标签,在DataGridTag里面嵌套了ColumnTag标签,DataGridTag从ColumnTag获取其属性值并组成列的集合,然后获取Request或者Session属性里面保存的数据源(必须是DataTable抽象类的子类),再根据风格以及列的属性集合生成HTML表格及分页信息返回。
每次点击翻页链接(或按钮/图片)的时候,利用AJAX的XMLHttpRequest请求后台Servlet,在该Servlet中,同样需要获取Request或者Session属性里面保存的数据源,然后根据JSON生成字符串规则生成JSON字符串返回:把List和ResultSet变成数组,而把List里的对象根据属性和ResultSet的列名对应生成JSON对象。
客户端通过异步机制获取后台Servlet返回的文本,将JSON字符串转换为JSON对象和JSON数组。
然后利用DOM模型和JSON数组和对象更新表中的数据以及分页信息。
其序列图如图4所示:
图4AJAXDataGrid数据处理序列图
4数据读取和修改实现策略
4.1JSON字符串组装和解析
为了得到分页信息,以方便组装分页字符串,以替换表格最后一列分页信息,在服务器端,将页面数据组装后,并在JSONOb-ject字符串数组的最后一项加上分页属性,包括页号和页数。
对于页面数据,每一行数据是组装为JSONObject字符串,所有行组装为JSON数组。
例如(为了可读性比较好,人为进行了换行和超级链接简化处理):
[{"DataNo":"1008","DataName":
"四川省","DataLink":"#",
"DataTime":"2006-08-2915:01:03"},
{"DataNo":"1009","DataName":
"吉林省","DataLink":"#",
"DataTime":"2006-08-2915:01:03"},
{"DataNo":"1010","DataName":
"北京市","DataLink":"#",
"DataTime":"2006-08-2915:01:03"},
{"DataNo":"1011","DataName":
"上海市","DataLink":"#",
"DataTime":"2006-08-2915:01:03"},
{"DataNo":"1012","DataName":
"天津市","DataLink":"#",
"DataTime":"2006-08-2915:01:03"},
{"pageNo":"2","pageCount":"2"}
]//注:数组最后一项为分页信息
在客户端,直接将服务器发送过来的字符串用JSON的JavaScript脚本中的parseJSON()函数将它转换为JSON数组和对象,这样给数据处理带来了极大的方便。
4.2AJAX发送请求与处理响应:
直接使用prototype中的ajax脚本库,用法如下:
varajax=newAjax.Request(
url,{//请求的URL地址
method:'get',//发送方法
//true-异步;false-同步;默认为true
asynchronous:true,
//异步处理响应回调函数
onComplete:fillTable});
4.3利用DOM替换表格数据策略
在替换表格数据的过程中,我们对表格属性以及表格的标题(表格的第一行)保持不变,对分页信息直接组装字符串替换最后一行TD的innerHTML属性,对于页面显示数据采用下面的策略:(1)当取回的数据(source)行数和页面显示数据(target)行数相等,直接以source中第n行替换target中第n行;
(2)当取回的数据(source)行数小于页面显示数据(target)行数,则先删除target多余的行节点,然后以source中第n行替换target中第n行;
(3)当取回的数据(source)行数大于页面显示数据(target)行数,则采用克隆节点(CloneNode)的办法添加target少的行节点,然后以source中第n行替换target中第n行。
节点添加完毕之后,然后遍历JSON数组,根据每个TD绑定的列名获取JSON数组中的对象属性的值,组装文本或HTML字符串,对应替换每行中TD的innerHTML(注:Firefox不支持inner-Text,统一使用innerHTML)。
4.4克隆节点策略
由于页面显示数据(target)行数可能只有一行,如果奇偶数行风格不一致,那么采用直接克隆第一行的办法会导致新增的行风格不一致,为此,在表格的第一行的前面添加风格不同的两行,并设置TBODY的style属性为“display:none”加以隐藏(注:在IE中,利用DOM动态添加表格的行时,在TR的上一层必须添加TBODY,否则动态添加之后无法显示出来),如果添加的是偶数列则克隆隐藏的第一行,如果是奇数列则克隆隐藏的第二行,而克隆的节点是TBODY的子节点(TR)及其下属子节点(TD等),避免再去修改TBODY的style属性。
5后台DataTable模型
基类DataTable是抽象类,支持List和ResultSet的两个子类分别为ListDataTable和ResultDataTable,这是借鉴了JSF里的DataModel的设计结构,具有良好的可扩展性,必要的时候可以支
(下转第236页
)
计算机教育本栏目责任编辑:王力
易引起学生的兴趣。
而Blog则简单易用,能最大程度上适合高职院校学生信息技术水平。
学生可以亲自动手,根据自己的个性、爱好选择不同模板、设置不同栏目,把自己搜索到的有价值的信息资源发布到Blog中以不断地充实资源内容。
Blog还具有及时更新的特点,学生每天都能在各种繁杂的信息资源中精心搜索、判断、整理和记录与学习相关的信息。
笔者曾亲自与学生同时建立了关于电脑技术主题的Blog圈,二个月下来,发现以前对电脑、网络不感兴趣的同学现在都能很顺利地在网上找到想要的信息资源。
5.2Blog有助于提高学生的发展学生高级思维能力
高职学校的学生的学习,不再是简单的以老师为主的教学模式,许多学生本身就是问题的发现者和探究者。
学生要在任务的驱动下,不断探究问题的解决方法,在此过程中促进自身知识和能力的提升。
学生使用Blog学习,必须要进行撰写与录入工作,这样将思考与操作结合起来,可以调动自己的归纳、分析、判断和数字化表达能力,按照自己的认知方式和学习风格进行表达。
在这一过程中,学生无形中对知识进行了二次加工,加深了对知识的理解和运用。
台湾的E-Learning专家邹景平认为,Blog是利用信息技术改善思考能力的有效方式,它为学习者提供了审视、慎思、明辨和践行以及在彼此间进行经验交流的空间。
因此,Blog不但可以反映学习者的进步过程,还能够激发更高层次的反思和思维活动。
5.3Blog有助于学生学会知识管理,提高学生的信息读写能力。
知识管理是将可得到的各种信息转化为知识,并将知识与人联系起来的过程。
知识管理的基本原则是积累、共享和交流。
事实上,Blog系统的基本机制和原理就是一个积累、共享和交流的过程,它既可以是个人化的行为,也可以是群体化的活动。
与以往的网络知识管理工具不同的是,Blog系统的知识管理是即时的,是立体的知识管理(以时间为纵轴对知识进行纵向管理,以分类为横轴对知识进行横向管理,以群体为Z轴对知识进行深度管理)。
它极大地方便了学生们对知识、资源的筛选、管理、搜索和分享。
每个学习者都可以用数字化方式把自己的创作内容、链接的文档、图片、声音或视频文件等资源组织在一起,包括其他人所做出的评论或评价信息。
由于需要用数字化的方式、多种媒体符号来管理知识,因此,它首先表现的是一种对信息化写作能力的培养。
高职院校的学生在校期间就应有意识地培养信息读写能力,为以后从事相关的工作做重要准备。
笔者曾采访过在校的高职学生,我问学生你们是否进行用电脑进行阅读或写作,他们大多数都说没有。
我又问他们是否写电子邮件、用即时通信工具(QQ或MSN)时,他们异口同声地说是。
对于他们来说,网络或其他各种形式电子文档的使用与在学校的读和写几乎没有任何关联,这种差别可能就在于一种是“乐趣”而另一种是“工作”。
而采用Blog进行网上阅读和写作则符合高职院校的学生这种表现自我的个性,是学生们愿意的采用的。
5.4有助于培养高职学生的反思、交流及评价能力
高职院校的学生在学习过程中,要了解大量的信息去不断地进行交流、反思。
而Blog就是一个能提高学生这种反思、交流、评价能力很好地工具。
运用Blog进行协作探究式学习,能充分建立起师生之间的相互交流,学生与社会的交流、评价。
这样一种多向循环交流机制能使参与者进行更充分地交流与沟通,进行相互之间的协作、评价。
通过这种方式,能使学生的思想和学习情况更好地被老师和同学了解,缩小彼此间的距离。
Blog将具有同一目标的人聚集在一起,彼此之间对各自的观点、想法以及问题解决过程等做出及时的响应,进行交流评价,使得Blog成为一个具有高度凝聚力和活跃力的网络学习共同体。
Blog以日志形式发布,具有及时更新的特点,这有利于对学生的学习过程及结果做出及时有效的跟踪评价,也有利于学生间的及时互评,让学生得到及时多方位的反思,不断得到改进,在这一过程中,学生的交流评价能力也得到提高。
总之,信息素养是信息社会人的整体素养的一部分。
我们是通过Blog的应用对高职院校的学生进行各方面的信息技能的培养,不断提高他们的信息文化素养(知识层面)与信息意识(意识层面)的水平,从而提高他们的信息素养,以便他们将来更好地为社会服务。
参考文献:
[1]方兴东,何为博客.[EB/OL].http://www.blogchina.com/new/display/583.html.
[2]何克抗,李文光.教育技术学[M].北京师范大学出版社,2002.
[3]王俊杰.略论高校大学生信息素养教育[J].图书馆论坛,2004.(8).
[4]章慧敏,傅德荣.信息素养与信息技术教育[J].中国电化教育,2001.(9).
[5]李玉斌,姚巧红.Blog系统之教学功能分析.[EB/OL].中国教育先锋网,
http://www.ep-china.net/academia/articlce/info.htm.
[6]中国教育技术学资源网.[EB/OL].http://www.ChinaRet.com.
(上接第162页)
持数组或者其它数据集合类型。
其类图如图5所示(其中斜体字的方法为抽象方法),每个函数的作用见表2:
表2函数说明
图5后台DataTable类图
6结束语
由于篇幅有限,这里没有具体介绍实现代码,只是提供了实现思路,不过我觉得AJAX+JSON实现出来的DataGrid,功能还是比较强大的,也比较实用,在实际的项目开发过程中,也会大大提高开发效率以及保持界面风格的一致性,其中DataTable也借鉴了JSF中DataModel的设计思想,达到了较好的可扩展性,而且采取这种方式降低了和其他模块的耦合度,由于该组件不依赖于第三方组件(如:struts、spring),使用简单的JSP标签,从而使之具有较好的通用性。
我们可以看到,使用了这个组件之后,用户基本上感觉不到页面闪烁现象,不仅提高了效率,而且提高了用户体验,不过还需要在以后的使用过程中进一步去完善使之更灵活更通用!
参考文献:
[1]json.IntroducingJSON[EB/OL].http://www.json.org/,2006.7.
[2]DavidTeare.Ajax简介[EB/OL].http://dev2dev.bea.com.cn/techdoc/2005110103.html,2005.11.
[3]Onion.prototype中的ajax对象应用实例[EB/OL].http://blog.yening.cn/2006/03/14/46.html,2006.3.
[4]lemon.prototype.js使用手册[EB/OL].http://www.onejava.com/lemon/archives/2006/552.html,2006.7.
[5]DaveCrane,EricPascarello,DarrenJames.Ajaxinaction[EB/OL].http://www.okajax.com,2006.8.。