`

jqGrid与Struts2的结合应用(一) —— 显示基本Grid表格

 
阅读更多

根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:
$("#grid_id").jqGrid(options);
也就是通过选择符得到一个table的jQuery对象,然后调用jqGrid(options),得到一个jqGrid对象。

重点就在传入的option选项上了,通过这些选项可以得到各种各样的Grid表格。

1. jqGrid的重要选项

具体的options参考,可以访问jqGrid文档关于option的章节(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options)。其中有几个是比较常用的,重点介绍一下:

  • url :jqGrid控件通过这个参数得到需要显示的数据,具体的返回值可以使XML也可以是Json。
  • datatype :这个参数用于设定将要得到的数据类型。我最常用的是“json”,其余的类型还包括:xml、xmlstring、local、javascript、function。
  • mtype : 定义使用哪种方法发起请求,GET或者POST。
  • height :Grid的高度,可以接受数字、%值、auto,默认值为150。
  • width :Grid的宽度,如果未设置,则宽度应为所有列宽的之和;如果设置了宽度,则每列的宽度将会根据shrinkToFit选项的设置,进行设置。
  • shrinkToFit :此选项用于根据width计算每列宽度的算法。默认值为true。如果shrinkToFit为true且设置了width值,则每列宽度会根据width成比例缩放;如果shrinkToFit为false且设置了width值,则每列的宽度不会成比例缩放,而是保持原有设置,而Grid将会有水平滚动条。
  • autowidth :默认值为false。如果设为true,则Grid的宽度会根据父容器的宽度自动重算。重算仅发生在Grid初始化的阶段;如果当父容器尺寸变化了,同时也需要变化Grid的尺寸的话,则需要在自己的代码中调用setGridWidth方法来完成。
  • pager :定义页码控制条Page Bar
  • sortname :指定默认的排序列,可以是列名也可以是数字。此参数会在被传递到Server端。
  • viewrecords :设置是否在Pager Bar显示所有记录的总数。
  • caption :设置Grid表格的标题,如果未设置,则标题区域不显示。
  • caption :Grid的标题。如果设置了,则将显示在Grid的Header层。
  • rowNum :用于设置Grid中一次显示的行数,默认值为20。正是这个选项将参数rows(prmNames中设置的)通过url选项设置的链接传递到Server。注意如果Server返回的数据行数超过了rowNum的设定,则Grid也只显示rowNum设定的行数。
  • rowList :一个数组,用于设置Grid可以接受的rowNum值。例如[10,20,30]。
  • colNames :字符串数组,用于指定各列的题头文本,与列的顺序是对应的。
  • colModel :最重要的数组之一,用于设定各列的参数。(稍后详述)
  • prmNames :这是一个数组,用于设置jqGrid将要向Server传递的参数名称。(稍后详述)
  • jsonReader :这又是一个数组,用来设定如何解析从Server端发回来的json数据。(稍后详述)

1.1 prmNames选项

prmNames是jqGrid的一个重要选项,用于设置jqGrid将要向Server传递的参数名称。其默认值为:

[javascript] view plaincopyprint?
  1. prmNames:{
  2. page:"page",//表示请求页码的参数名称
  3. rows:"rows",//表示请求行数的参数名称
  4. sort:"sidx",//表示用于排序的列名的参数名称
  5. order:"sord",//表示采用的排序方式的参数名称
  6. search:"_search",//表示是否是搜索请求的参数名称
  7. nd:"nd",//表示已经发送请求的次数的参数名称
  8. id:"id",//表示当在编辑数据模块中发送数据时,使用的id的名称
  9. oper:"oper",//operation参数名称(我暂时还没用到)
  10. editoper:"edit",//当在edit模式中提交数据时,操作的名称
  11. addoper:"add",//当在add模式中提交数据时,操作的名称
  12. deloper:"del",//当在delete模式中提交数据时,操作的名称
  13. subgridid:"id",//当点击以载入数据到子表时,传递的数据名称
  14. npage:null,
  15. totalrows:"totalrows"//表示需从Server得到总共多少行数据的参数名称,参见jqGrid选项中的rowTotal
  16. }

可以通过这个选项来自定义当向Server发送请求时,默认发送的参数名称。
这个参数很重要也很有用,正是通过这个参数,可以方便的改变默认的request的参数,以符合Server端的需要。比如在prmNames中search默认的值为"_search",这在Struts2的Action中不太方便命名成员变量和getter/ setter。因此可以使用 prmNames: {search: 'search'} 来改变这一默认值为"search",这在Struts2的Action对象中就很好设置getter/ setter了,即getSearch()和setSearch()。当然其他名字也是可以的。

1.2 jsonReader选项

jsonReader是jqGrid的一个重要选项,用于设置如何解析从Server端发回来的json数据。其默认值为:

[javascript] view plaincopyprint?
  1. jsonReader:{
  2. root:"rows",//json中代表实际模型数据的入口
  3. page:"page",//json中代表当前页码的数据
  4. total:"total",//json中代表页码总数的数据
  5. records:"records",//json中代表数据行总数的数据
  6. repeatitems:true,//如果设为false,则jqGrid在解析json时,会根据name来搜索对应的数据元素(即可以json中元素可以不按顺序);而所使用的name是来自于colModel中的name设定。
  7. cell:"cell",
  8. id:"id",
  9. userdata:"userdata",
  10. subgrid:{
  11. root:"rows",
  12. repeatitems:true,
  13. cell:"cell"
  14. }
  15. }

可以这样理解,prmNames设置了如何将Grid所需要的参数传给Server,而jsonReader设置了如何去解析从Server端传回来的json数据。如果没有设置jsonReader的话,jqGrid将会根据默认的设置来解析json数据,并显示在表格里。但如果传回来的json数据,不太符合默认设置(比如内部的结构名不太一样),那么就有必要修改这一设置。比如:

[javascript] view plaincopyprint?
  1. jsonReader:{
  2. root:"gridModel",
  3. page:"page",
  4. total:"total",
  5. records:"record",
  6. repeatitems:false
  7. }

注1:据其他网友的文章,如果设置repeatitems为false,不但数据可以乱序,而且不用每个数据元素都要具备,用到哪个找到哪个就可以了。实验却是如此。
注2:cell、id在repeatitems为true时可以用到,即每一个记录是由一对id和cell组合而成,即可以适用另一种json结构。援引文档中的例子:

repeatitems为true时:

[javascript] view plaincopyprint?
  1. jQuery("#gridid").jqGrid({
  2. ...
  3. jsonReader:{
  4. root:"invdata",
  5. page:"currpage",
  6. total:"totalpages",
  7. records:"totalrecords"
  8. },
  9. ...
  10. });

json结构为:

[javascript] view plaincopyprint?
  1. {
  2. "totalpages":"xxx",
  3. "currpage":"yyy",
  4. "totalrecords":"zzz",
  5. "invdata":[
  6. {"id":"1","cell":["cell11","cell12","cell13"]},//cell中不需要各列的name,只要值就OK了,但是需要保持对应
  7. {"id":"2","cell":["cell21","cell22","cell23"]},
  8. ...
  9. ]
  10. }

repeatitems为false时:

[javascript] view plaincopyprint?
  1. jQuery("#gridid").jqGrid({
  2. ...
  3. jsonReader:{
  4. root:"invdata",
  5. page:"currpage",
  6. total:"totalpages",
  7. records:"totalrecords",
  8. repeatitems:false,
  9. id:"0"
  10. },
  11. ...
  12. });

json结构为:

[javascript] view plaincopyprint?
  1. {
  2. "totalpages":"xxx",
  3. "currpage":"yyy",
  4. "totalrecords":"zzz",
  5. "invdata":[
  6. {"invid":"1","invdate":"cell11","amount":"cell12","tax":"cell13","total":"1234","note":"somenote"},//数据中需要各列的name,但是可以不按列的顺序
  7. {"invid":"2","invdate":"cell21","amount":"cell22","tax":"cell23","total":"2345","note":"somenote"},
  8. ...
  9. ]
  10. }

2. colModel的重要选项

和jqGrid一样colModel也有许多非常重要的选项,在使用搜索、排序等方面都会用到。这里先只说说最基本的。

  • name :为Grid中的每个列设置唯一的名称,这是一个必需选项,其中保留字包括subgrid、cb、rn。
  • index :设置排序时所使用的索引名称,这个index名称会作为sidx参数(prmNames中设置的)传递到Server。
  • label :当jqGrid的colNames选项数组为空时,为各列指定题头。如果colNames和此项都为空时,则name选项值会成为题头。
  • width :设置列的宽度,目前只能接受以px为单位的数值,默认为150。
  • sortable :设置该列是否可以排序,默认为true。
  • search :设置该列是否可以被列为搜索条件,默认为true。
  • resizable :设置列是否可以变更尺寸,默认为true。
  • hidden :设置此列初始化时是否为隐藏状态,默认为false。
  • formatter :预设类型或用来格式化该列的自定义函数名。常用预设格式有:integer、date、currency、number等(具体参见文档 )。

3. 第一个实例

3.1 服务器端

用于提供数据的Action。为了可以复用这种专门接受jqGrid传来参数的Action,我抽象出一个基本类。具体代码如下:

  1. packagecn.gengv.struts2ex.jqGrid;
  2. importjava.util.Collections;
  3. importjava.util.List;
  4. importcom.opensymphony.xwork2.ActionSupport;
  5. @SuppressWarnings("serial")
  6. publicabstractclassJqGridBaseAction<T>extendsActionSupport{
  7. //和jqGrid组件相关的参数属性
  8. privateList<T>gridModel=Collections.emptyList();
  9. privateIntegerrows=0;
  10. privateIntegerpage=0;
  11. privateIntegertotal=0;
  12. privateIntegerrecord=0;
  13. privateStringsord;
  14. privateStringsidx;
  15. privateStringsearch;
  16. publicabstractintgetResultSize();
  17. publicabstractList<T>listResults(intfrom,intlength);
  18. publicStringrefreshGridModel(){
  19. try{
  20. List<T>results=Collections.emptyList();
  21. record=this.getResultSize();
  22. intfrom=rows*(page-1);
  23. intlength=rows;
  24. results=this.listResults(from,length);
  25. this.setGridModel(results);
  26. total=(int)Math.ceil((double)record/(double)rows);
  27. returnSUCCESS;
  28. }catch(Exceptione){
  29. e.printStackTrace();
  30. this.addActionError(e.getMessage());
  31. returnERROR;
  32. }
  33. }
  34. publicList<T>getGridModel(){
  35. returngridModel;
  36. }
  37. publicvoidsetGridModel(List<T>gridModel){
  38. this.gridModel=gridModel;
  39. }
  40. publicIntegergetRows(){
  41. returnrows;
  42. }
  43. publicvoidsetRows(Integerrows){
  44. this.rows=rows;
  45. }
  46. publicIntegergetPage(){
  47. returnpage;
  48. }
  49. publicvoidsetPage(Integerpage){
  50. this.page=page;
  51. }
  52. publicIntegergetTotal(){
  53. returntotal;
  54. }
  55. publicvoidsetTotal(Integertotal){
  56. this.total=total;
  57. }
  58. publicIntegergetRecord(){
  59. returnrecord;
  60. }
  61. publicvoidsetRecord(Integerrecord){
  62. this.record=record;
  63. }
  64. publicStringgetSord(){
  65. returnsord;
  66. }
  67. publicvoidsetSord(Stringsord){
  68. this.sord=sord;
  69. }
  70. publicStringgetSidx(){
  71. returnsidx;
  72. }
  73. publicvoidsetSidx(Stringsidx){
  74. this.sidx=sidx;
  75. }
  76. publicStringgetSearch(){
  77. returnsearch;
  78. }
  79. publicvoidsetSearch(Stringsearch){
  80. this.search=search;
  81. }
  82. }

说明:

  • 其中的成员变量对应着jqGrid的prmNames和jsonReader中的设置。

成员变量 对应 prmNames 对应 jsonReader 注释
rows rows - 每页中现实的记录行数
search search - 是否是用于查询的请求
sidx sort - 用于排序的列名
sord order - 排序的方式
page page page 当前页码
gridModel - root 用于得到实际数据的数组名称
total - total 总页数
record - records 总记录数

  • refreshGridModel()方法中,主要工作就是为gridModel、record、total赋值,这些值也将会传回客户端。

具体的一个实现类:

  1. packagecn.gengv.struts2ex.jqGrid;
  2. importjava.util.Collections;
  3. importjava.util.List;
  4. @SuppressWarnings("serial")
  5. publicclassListContactsActionextendsJqGridBaseAction<Contact>{
  6. privateContactServicecontactService;
  7. @Override
  8. publicStringexecute(){
  9. returnthis.refreshGridModel();
  10. }
  11. @Override
  12. publicintgetResultSize(){
  13. returnthis.contactService.queryResultsCount();
  14. }
  15. @Override
  16. publicList<Contact>listResults(intfrom,intlength){
  17. List<Contact>results=Collections.emptyList();
  18. results=this.contactService.queryByPage(from,length);
  19. returnresults;
  20. }
  21. publicvoidsetContactService(ContactServicecontactService){
  22. this.contactService=contactService;
  23. }
  24. }

而在struts.xml中,应按如下设置配置action:

  1. <actionname="jqGrid01"class="cn.gengv.struts2ex.jqGrid.ListContactsAction">
  2. <resultname="success"type="json">
  3. <paramname="includeProperties">
  4. ^gridModel/[/d+/]/./w+,
  5. rows,page,total,record
  6. </param>
  7. <paramname="noCache">true</param>
  8. <paramname="ignoreHierarchy">false</param>
  9. </result>
  10. </action>

3.2 客户端(浏览器)

javascript部分:

[javascript] view plaincopyprint?
  1. $(function(){
  2. //配置jqGrid组件
  3. $("#gridTable").jqGrid({
  4. url:"jqGrid01.action",
  5. datatype:"json",
  6. mtype:"GET",
  7. height:350,
  8. autowidth:true,
  9. colModel:[
  10. {name:"id",index:"id",label:"ID",width:40},
  11. {name:"lastName",index:"lastName",label:"LastName",width:80,sortable:false},
  12. {name:"firstName",index:"firstName",label:"FirstName",width:80,sortable:false},
  13. {name:"email",index:"email",label:"E-mail",width:160,sortable:false},
  14. {name:"telNo",index:"telNo",label:"TelNo",width:120,sortable:false}
  15. ],
  16. viewrecords:true,
  17. rowNum:15,
  18. rowList:[15,50,100],
  19. prmNames:{search:"search"},//(1)
  20. jsonReader:{
  21. root:"gridModel",//(2)
  22. records:"record",//(3)
  23. repeatitems:false//(4)
  24. },
  25. pager:"#gridPager",
  26. caption:"联系人列表",
  27. hidegrid:false
  28. });
  29. });

其中主要的选项在开头已经介绍过了,另外需要说明以下几点:
1、在位置(1)处,为了配合Server端的Action类中的成员变量命名,将prmNames中search对应的“_search”更改为“search”。
2、在位置(2)(3)处,为了配合Server端的Action类中的成员变量命名,将jsonReader中root对应的“rows”更改为“gridModel”,将records对应的“records”更改为“record”。
在后面的request和response解析中,就可以看到这些更改的作用。

html部分:

要想顺利的使用jqGrid,需要想页面中引入6个文件,其中4个js文件,2个css文件。它们分别是:

  • jquery-ui-1.8.1.custom.css(jQuery UI界面的CSS文件)
  • ui.jqgrid.custom.css(专用于jqGrid界面的CSS文件)
  • jquery-1.4.2.min.js(jQuery的核心)
  • jquery-ui-1.8.1.custom.min.js(用于支持jQuery UI界面)
  • grid.locale-zh-CN.js(针对jqGrid的locale设置,根据locale不同,选择不同的尾缀)
  • jquery.jqGrid.min.js(jqGrid的核心,可以到jqGrid网站,根据需求选择模块下载)


:jqGrid的官方包中原本针对中文的locale js文件是grid.locale-cn.js,但是里面的某些设置,并没有做到完全中文化,因此我从Struts2-jQuery插件中分离出grid.locale-zh-CN.js和jquery.ui.datepicker-zh-CN.min.js这两个文件以备后用。说起来这两个文件中,针对中文的设置还是不错的。


引入这6个文件后,创建jqGrid的工作就交给上面写的javascript代码来完成了。

  1. <!DOCTYPEhtml
  2. PUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="zh-CN"lang="zh-CN">
  5. <head>
  6. <title>jqGrid01</title>
  7. <linkrel="stylesheet"type="text/css"media="screen"href="../css/themes/aero/jquery-ui-1.8.1.custom.css"mce_href="css/themes/aero/jquery-ui-1.8.1.custom.css"/>
  8. <linkrel="stylesheet"type="text/css"media="screen"href="../css/themes/aero/ui.jqgrid.custom.css"mce_href="css/themes/aero/ui.jqgrid.custom.css"/>
  9. <mce:scripttype="text/javascript"src="../js/jquery-1.4.2.min.js"mce_src="js/jquery-1.4.2.min.js"></mce:script>
  10. <mce:scriptsrc="../js/jquery-ui-1.8.1.custom.min.js"mce_src="js/jquery-ui-1.8.1.custom.min.js"type="text/javascript"></mce:script>
  11. <mce:scriptsrc="../js/i18n/grid.locale-zh-CN.js"mce_src="js/i18n/grid.locale-zh-CN.js"type="text/javascript"></mce:script>
  12. <mce:scriptsrc="../js/jquery.jqGrid.min.js"mce_src="js/jquery.jqGrid.min.js"type="text/javascript"></mce:script>
  13. <mce:scriptsrc="js/jqGrid01.js"mce_src="js/jqGrid01.js"type="text/javascript"></mce:script>
  14. </head>
  15. <body>
  16. <h2>
  17. jqGrid测试01
  18. </h2>
  19. <div>
  20. <tableid="gridTable"></table>
  21. <divid="gridPager"></div>
  22. </div>
  23. </body>
  24. </html>

HTML中的代码,异常简洁。

3.3 整个流程


通过Firebug监测request和response就可以看出Server和浏览器之间的数据交互。当打开页面的时候,jqGrid初始化,会向Server发送url中定义的request,并传递参数。如下:

http://localhost:8085/Hare/jqGridTest/jqGrid01.action?search=false&nd=1278331032140&rows=15&page=1&sidx=&sord=asc

jqGrid会根据prmNames中的定义,向Server传递参数,例如将jqGrid选项中rowNum的值,作为参数rows传递到Server。

由于我将prmNames中的search设为“search”,所以参数里表中出现了这个参数;否则仍会根据原来的默认值,出现“_search”参数。


再看看response,Server发送来的json数据,格式是这样的:

[javascript] view plaincopyprint?
  1. {
  2. "gridModel":[
  3. {
  4. "address":"ADDR-yjfrot4i008toqlrl4dfq9",
  5. "email":"vl3@jv36.com",
  6. "firstName":"FN-gn7po9c9m",
  7. "fullName":"LN-3h6d1qFN-gn7po9c9m",
  8. "id":23016,
  9. "idCardNo":"CARD-28ew6dekrv9g8dml4n",
  10. "lastName":"LN-3h6d1q",
  11. "nationality":"NAT-6z1xhty2",
  12. "telNo"::"TEL-x3i4a625i"
  13. },
  14. {
  15. "address":"ADDR-9zeiasrr",
  16. "email":"wba@6ym4.com",
  17. "firstName":"FN-8mwhw7n",
  18. "fullName":"LN-yaontkFN-8mwhw7n",
  19. "id":23015,
  20. "idCardNo":"CARD-gqqbd9s4zjexj05sus",
  21. "lastName":"LN-yaontk",
  22. "nationality":"NAT-0phliht",
  23. "telNo"::"TEL-jf4c31"
  24. },
  25. {
  26. "address":"ADDR-o4ml00d98j7xgktl",
  27. "email":"m7j@dwy.com",
  28. "firstName":"FN-etzsxbaq4",
  29. "fullName":"LN-uedrek8FN-etzsxbaq4",
  30. "id":23014,
  31. "idCardNo":"CARD-md9bcyef7wvcc7om6b",
  32. "lastName":"LN-uedrek8",
  33. "nationality":"NAT-okbb5",
  34. "telNo"::"TEL-pp0d00"
  35. },
  36. {
  37. "address":"ADDR-obzar7v7z58uux",
  38. "email":"sqj@44wfo.com",
  39. "firstName":"FN-f1qnbw0x",
  40. "fullName":"LN-20ug4vxfcFN-f1qnbw0x",
  41. "id":23013,
  42. "idCardNo":"CARD-kzil6hhtpo68izim0b",
  43. "lastName":"LN-20ug4vxfc",
  44. "nationality":"NAT-dxidrf",
  45. "telNo"::"TEL-eug8ydessk"
  46. },
  47. {
  48. "address":"ADDR-r7954tumxw133a9os90l",
  49. "email":"2in@tw7.com",
  50. "firstName":"FN-pw1yl8ux",
  51. "fullName":"LN-nk7qg6byFN-pw1yl8ux",
  52. "id":23012,
  53. "idCardNo":"CARD-0cx02jpey6nivhkr29",
  54. "lastName":"LN-nk7qg6by",
  55. "nationality":"NAT-85tl0a",
  56. "telNo"::"TEL-4aa404"
  57. },
  58. {
  59. "address":"ADDR-jxmudykwu7kcu",
  60. "email":"0um@ut9yh.com",
  61. "firstName":"FN-cjxxxds3",
  62. "fullName":"LN-3iviu7oFN-cjxxxds3",
  63. "id":23011,
  64. "idCardNo":"CARD-9evl3ul16uldvjango",
  65. "lastName":"LN-3iviu7o",
  66. "nationality":"NAT-v2gnaa9",
  67. "telNo"::"TEL-gzbn1w"
  68. },
  69. {
  70. "address":"ADDR-9xsk62kmdidc",
  71. "email":"cld@pnx.com",
  72. "firstName":"FN-iqygy07ku",
  73. "fullName":"LN-3mrxkiFN-iqygy07ku",
  74. "id":23010,
  75. "idCardNo":"CARD-ccypafwru43cqyjo62",
  76. "lastName":"LN-3mrxki",
  77. "nationality":"NAT-qjpvfa",
  78. "telNo"::"TEL-2bqxde"
  79. },
  80. {
  81. "address":"ADDR-t8dizyumbedgbd0u8ml",
  82. "email":"dhk@yr8k.com",
  83. "firstName":"FN-89xwf0",
  84. "fullName":"LN-8wr6uiig3FN-89xwf0",
  85. "id":23009,
  86. "idCardNo":"CARD-7t09x2dw3i3y78z24e",
  87. "lastName":"LN-8wr6uiig3",
  88. "nationality":"NAT-9uu7xo",
  89. "telNo"::"TEL-p8ym9rtwy"
  90. },
  91. {
  92. "address":"ADDR-gupoe8jwcqwcjs2u01oa8",
  93. "email":"gug@wqb.com",
  94. "firstName":"FN-0amkpy2",
  95. "fullName":"LN-i73kpz5ncFN-0amkpy2",
  96. "id":23008,
  97. "idCardNo":"CARD-itgmrwwichkzan5220",
  98. "lastName":"LN-i73kpz5nc",
  99. "nationality":"NAT-k2aq2t",
  100. "telNo"::"TEL-2wdhbs"
  101. },
  102. {
  103. "address":"ADDR-gp9q73fzs68agav6",
  104. "email":"jj3@rpwe.com",
  105. "firstName":"FN-w42bd8y",
  106. "fullName":"LN-utrnn25cFN-w42bd8y",
  107. "id":23007,
  108. "idCardNo":"CARD-rrznb3ihqf94k2wjkv",
  109. "lastName":"LN-utrnn25c",
  110. "nationality":"NAT-gs3e9rk",
  111. "telNo"::"TEL-g8j19nqz9"
  112. },
  113. {
  114. "address":"ADDR-ja8w4gq485m3dn2gr66",
  115. "email":"zt5@sy30t.com",
  116. "firstName":"FN-dxfyd5m5m",
  117. "fullName":"LN-li98bkFN-dxfyd5m5m",
  118. "id":23006,
  119. "idCardNo":"CARD-indqfrmi13zfazly67",
  120. "lastName":"LN-li98bk",
  121. "nationality":"NAT-qglj9sx2",
  122. "telNo"::"TEL-mzlpe3m"
  123. },
  124. {
  125. "address":"ADDR-rm3r94qanvt1q4drp",
  126. "email":"uct@ayg0.com",
  127. "firstName":"FN-qkq3w1m",
  128. "fullName":"LN-0j90saFN-qkq3w1m",
  129. "id":23005,
  130. "idCardNo":"CARD-8vc92wevyunbpl29c0",
  131. "lastName":"LN-0j90sa",
  132. "nationality":"NAT-mv2wzlt",
  133. "telNo"::"TEL-ntkah0"
  134. },
  135. {
  136. "address":"ADDR-u3gsxpq61e2",
  137. "email":"7zr@k7du4.com",
  138. "firstName":"FN-evno7jy",
  139. "fullName":"LN-0fuix09FN-evno7jy",
  140. "id":23004,
  141. "idCardNo":"CARD-jgyf09by0rxboex8ut",
  142. "lastName":"LN-0fuix09",
  143. "nationality":"NAT-cw8cctzy",
  144. "telNo"::"TEL-artsappc2"
  145. },
  146. {
  147. "address":"ADDR-04kfdpp7",
  148. "email":"qm6@9c2.com",
  149. "firstName":"FN-zz0e74gvh",
  150. "fullName":"LN-26u851FN-zz0e74gvh",
  151. "id":23003,
  152. "idCardNo":"CARD-wminx9rykz1sn7xsxz",
  153. "lastName":"LN-26u851",
  154. "nationality":"NAT-05uk2c93",
  155. "telNo"::"TEL-9de2jt4oh",
  156. },
  157. {
  158. "address":"ADDR-i18dy2cew6eizvmvgi0w",
  159. "email":"r8x@n67mb.com",
  160. "firstName":"FN-gt4aice1",
  161. "fullName":"LN-db6vre9FN-gt4aice1",
  162. "id":23002,
  163. "idCardNo":"CARD-spwifyvehzkcfj5g7f",
  164. "lastName":"LN-db6vre9",
  165. "nationality":"NAT-osiionb",
  166. "telNo"::"TEL-1vigb907",
  167. }
  168. ],
  169. "page":1,
  170. "record":23013,
  171. "rows":15,
  172. "total":1535
  173. }

jqGrid根据jsonReader中的设置,解析json数据。根据jsonReader中的root(我设置的是“gridModel”),得到数据记录数组;根据rows得到每页显示的行数;根据page设置当前页数;根据records(我设置的是“record”)得到所有记录数量;根据total得到所有页数。



由此,jqGrid完成一个request,并将得到的response,解析为所需的数据,显示到Grid表格中。

根据jqGrid的文档,要想生成一个jqGrid,最直接的方法就是:
$("#grid_id").jqGrid(options);
也就是通过选择符得到一个table的jQuery对象,然后调用jqGrid(options),得到一个jqGrid对象。

重点就在传入的option选项上了,通过这些选项可以得到各种各样的Grid表格。

1. jqGrid的重要选项

具体的options参考,可以访问jqGrid文档关于option的章节(http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options)。其中有几个是比较常用的,重点介绍一下:

  • url :jqGrid控件通过这个参数得到需要显示的数据,具体的返回值可以使XML也可以是Json。
  • datatype :这个参数用于设定将要得到的数据类型。我最常用的是“json”,其余的类型还包括:xml、xmlstring、local、javascript、function。
  • mtype : 定义使用哪种方法发起请求,GET或者POST。
  • height :Grid的高度,可以接受数字、%值、auto,默认值为150。
  • width :Grid的宽度,如果未设置,则宽度应为所有列宽的之和;如果设置了宽度,则每列的宽度将会根据shrinkToFit选项的设置,进行设置。
  • shrinkToFit :此选项用于根据width计算每列宽度的算法。默认值为true。如果shrinkToFit为true且设置了width值,则每列宽度会根据width成比例缩放;如果shrinkToFit为false且设置了width值,则每列的宽度不会成比例缩放,而是保持原有设置,而Grid将会有水平滚动条。
  • autowidth :默认值为false。如果设为true,则Grid的宽度会根据父容器的宽度自动重算。重算仅发生在Grid初始化的阶段;如果当父容器尺寸变化了,同时也需要变化Grid的尺寸的话,则需要在自己的代码中调用setGridWidth方法来完成。
  • pager :定义页码控制条Page Bar
  • sortname :指定默认的排序列,可以是列名也可以是数字。此参数会在被传递到Server端。
  • viewrecords :设置是否在Pager Bar显示所有记录的总数。
  • caption :设置Grid表格的标题,如果未设置,则标题区域不显示。
  • caption :Grid的标题。如果设置了,则将显示在Grid的Header层。
  • rowNum :用于设置Grid中一次显示的行数,默认值为20。正是这个选项将参数rows(prmNames中设置的)通过url选项设置的链接传递到Server。注意如果Server返回的数据行数超过了rowNum的设定,则Grid也只显示rowNum设定的行数。
  • rowList :一个数组,用于设置Grid可以接受的rowNum值。例如[10,20,30]。
  • colNames :字符串数组,用于指定各列的题头文本,与列的顺序是对应的。
  • colModel :最重要的数组之一,用于设定各列的参数。(稍后详述)
  • prmNames :这是一个数组,用于设置jqGrid将要向Server传递的参数名称。(稍后详述)
  • jsonReader :这又是一个数组,用来设定如何解析从Server端发回来的json数据。(稍后详述)

1.1 prmNames选项

prmNames是jqGrid的一个重要选项,用于设置jqGrid将要向Server传递的参数名称。其默认值为:

[javascript] view plaincopyprint?
  1. prmNames:{
  2. page:"page",//表示请求页码的参数名称
  3. rows:"rows",//表示请求行数的参数名称
  4. sort:"sidx",//表示用于排序的列名的参数名称
  5. order:"sord",//表示采用的排序方式的参数名称
  6. search:"_search",//表示是否是搜索请求的参数名称
  7. nd:"nd",//表示已经发送请求的次数的参数名称
  8. id:"id",//表示当在编辑数据模块中发送数据时,使用的id的名称
  9. oper:"oper",//operation参数名称(我暂时还没用到)
  10. editoper:"edit",//当在edit模式中提交数据时,操作的名称
  11. addoper:"add",//当在add模式中提交数据时,操作的名称
  12. deloper:"del",//当在delete模式中提交数据时,操作的名称
  13. subgridid:"id",//当点击以载入数据到子表时,传递的数据名称
  14. npage:null,
  15. totalrows:"totalrows"//表示需从Server得到总共多少行数据的参数名称,参见jqGrid选项中的rowTotal
  16. }

可以通过这个选项来自定义当向Server发送请求时,默认发送的参数名称。
这个参数很重要也很有用,正是通过这个参数,可以方便的改变默认的request的参数,以符合Server端的需要。比如在prmNames中search默认的值为"_search",这在Struts2的Action中不太方便命名成员变量和getter/ setter。因此可以使用 prmNames: {search: 'search'} 来改变这一默认值为"search",这在Struts2的Action对象中就很好设置getter/ setter了,即getSearch()和setSearch()。当然其他名字也是可以的。

1.2 jsonReader选项

jsonReader是jqGrid的一个重要选项,用于设置如何解析从Server端发回来的json数据。其默认值为:

[javascript] view plaincopyprint?
  1. jsonReader:{
  2. root:"rows",//json中代表实际模型数据的入口
  3. page:"page",//json中代表当前页码的数据
  4. total:"total",//json中代表页码总数的数据
  5. records:"records",//json中代表数据行总数的数据
  6. repeatitems:true,//如果设为false,则jqGrid在解析json时,会根据name来搜索对应的数据元素(即可以json中元素可以不按顺序);而所使用的name是来自于colModel中的name设定。
  7. cell:"cell",
  8. id:"id",
  9. userdata:"userdata",
  10. subgrid:{
  11. root:"rows",
  12. repeatitems:true,
  13. cell:"cell"
  14. }
  15. }

可以这样理解,prmNames设置了如何将Grid所需要的参数传给Server,而jsonReader设置了如何去解析从Server端传回来的json数据。如果没有设置jsonReader的话,jqGrid将会根据默认的设置来解析json数据,并显示在表格里。但如果传回来的json数据,不太符合默认设置(比如内部的结构名不太一样),那么就有必要修改这一设置。比如:

[javascript] view plaincopyprint?
  1. jsonReader:{
  2. root:"gridModel",
  3. page:"page",
  4. total:"total",
  5. records:"record",
  6. repeatitems:false
  7. }

注1:据其他网友的文章,如果设置repeatitems为false,不但数据可以乱序,而且不用每个数据元素都要具备,用到哪个找到哪个就可以了。实验却是如此。
注2:cell、id在repeatitems为true时可以用到,即每一个记录是由一对id和cell组合而成,即可以适用另一种json结构。援引文档中的例子:

repeatitems为true时:

[javascript] view plaincopyprint?
  1. jQuery("#gridid").jqGrid({
  2. ...
  3. jsonReader:{
  4. root:"invdata",
  5. page:"currpage",
  6. total:"totalpages",
  7. records:"totalrecords"
  8. },
  9. ...
  10. });

json结构为:

[javascript] view plaincopyprint?
  1. {
  2. "totalpages":"xxx",
  3. "currpage":"yyy",
  4. "totalrecords":"zzz",
  5. "invdata":[
  6. {"id":"1","cell":["cell11","cell12","cell13"]},//cell中不需要各列的name,只要值就OK了,但是需要保持对应
  7. {"id":"2","cell":["cell21","cell22","cell23"]},
  8. ...
  9. ]
  10. }

repeatitems为false时:

[javascript] view plaincopyprint?
  1. jQuery("#gridid").jqGrid({
  2. ...
  3. jsonReader:{
  4. root:"invdata",
  5. page:"currpage",
  6. total:"totalpages",
  7. records:"totalrecords",
  8. repeatitems:false,
  9. id:"0"
  10. },
  11. ...
  12. });

json结构为:

[javascript] view plaincopyprint?
  1. {
  2. "totalpages":"xxx",
  3. "currpage":"yyy",
  4. "totalrecords":"zzz",
  5. "invdata":[
  6. {"invid":"1","invdate":"cell11","amount":"cell12","tax":"cell13","total":"1234","note":"somenote"},//数据中需要各列的name,但是可以不按列的顺序
  7. {"invid":"2","invdate":"cell21","amount":"cell22","tax":"cell23","total":"2345","note":"somenote"},
  8. ...
  9. ]
  10. }

2. colModel的重要选项

和jqGrid一样colModel也有许多非常重要的选项,在使用搜索、排序等方面都会用到。这里先只说说最基本的。

  • name :为Grid中的每个列设置唯一的名称,这是一个必需选项,其中保留字包括subgrid、cb、rn。
  • index :设置排序时所使用的索引名称,这个index名称会作为sidx参数(prmNames中设置的)传递到Server。
  • label :当jqGrid的colNames选项数组为空时,为各列指定题头。如果colNames和此项都为空时,则name选项值会成为题头。
  • width :设置列的宽度,目前只能接受以px为单位的数值,默认为150。
  • sortable :设置该列是否可以排序,默认为true。
  • search :设置该列是否可以被列为搜索条件,默认为true。
  • resizable :设置列是否可以变更尺寸,默认为true。
  • hidden :设置此列初始化时是否为隐藏状态,默认为false。
  • formatter :预设类型或用来格式化该列的自定义函数名。常用预设格式有:integer、date、currency、number等(具体参见文档 )。

3. 第一个实例

3.1 服务器端

用于提供数据的Action。为了可以复用这种专门接受jqGrid传来参数的Action,我抽象出一个基本类。具体代码如下:

  1. packagecn.gengv.struts2ex.jqGrid;
  2. importjava.util.Collections;
  3. importjava.util.List;
  4. importcom.opensymphony.xwork2.ActionSupport;
  5. @SuppressWarnings("serial")
  6. publicabstractclassJqGridBaseAction<T>extendsActionSupport{
  7. //和jqGrid组件相关的参数属性
  8. privateList<T>gridModel=Collections.emptyList();
  9. privateIntegerrows=0;
  10. privateIntegerpage=0;
  11. privateIntegertotal=0;
  12. privateIntegerrecord=0;
  13. privateStringsord;
  14. privateStringsidx;
  15. privateStringsearch;
  16. publicabstractintgetResultSize();
  17. publicabstractList<T>listResults(intfrom,intlength);
  18. publicStringrefreshGridModel(){
  19. try{
  20. List<T>results=Collections.emptyList();
  21. record=this.getResultSize();
  22. intfrom=rows*(page-1);
  23. intlength=rows;
  24. results=this.listResults(from,length);
  25. this.setGridModel(results);
  26. total=(int)Math.ceil((double)record/(double)rows);
  27. returnSUCCESS;
  28. }catch(Exceptione){
  29. e.printStackTrace();
  30. this.addActionError(e.getMessage());
  31. returnERROR;
  32. }
  33. }
  34. publicList<T>getGridModel(){
  35. returngridModel;
  36. }
  37. publicvoidsetGridModel(List<T>gridModel){
  38. this.gridModel=gridModel;
  39. }
  40. publicIntegergetRows(){
  41. returnrows;
  42. }
  43. publicvoidsetRows(Integerrows){
  44. this.rows=rows;
  45. }
  46. publicIntegergetPage(){
  47. returnpage;
  48. }
  49. publicvoidsetPage(Integerpage){
  50. this.page=page;
  51. }
  52. publicIntegergetTotal(){
  53. returntotal;
  54. }
  55. publicvoidsetTotal(Integertotal){
  56. this.total=total;
  57. }
  58. publicIntegergetRecord(){
  59. returnrecord;
  60. }
  61. publicvoidsetRecord(Integerrecord){
  62. this.record=record;
  63. }
  64. publicStringgetSord(){
  65. returnsord;
  66. }
  67. publicvoidsetSord(Stringsord){
  68. this.sord=sord;
  69. }
  70. publicStringgetSidx(){
  71. returnsidx;
  72. }
  73. publicvoidsetSidx(Stringsidx){
  74. this.sidx=sidx;
  75. }
  76. publicStringgetSearch(){
  77. returnsearch;
  78. }
  79. publicvoidsetSearch(Stringsearch){
  80. this.search=search;
  81. }
  82. }

说明:

  • 其中的成员变量对应着jqGrid的prmNames和jsonReader中的设置。

成员变量 对应 prmNames 对应 jsonReader 注释
rows rows - 每页中现实的记录行数
search search - 是否是用于查询的请求
sidx sort - 用于排序的列名
sord order - 排序的方式
page page page 当前页码
gridModel - root 用于得到实际数据的数组名称
total - total 总页数
record - records 总记录数

  • refreshGridModel()方法中,主要工作就是为gridModel、record、total赋值,这些值也将会传回客户端。

具体的一个实现类:

  1. packagecn.gengv.struts2ex.jqGrid;
  2. importjava.util.Collections;
  3. importjava.util.List;
  4. @SuppressWarnings("serial")
  5. publicclassListContactsActionextendsJqGridBaseAction<Contact>{
  6. privateContactServicecontactService;
  7. @Override
  8. publicStringexecute(){
  9. returnthis.refreshGridModel();
  10. }
  11. @Override
  12. publicintgetResultSize(){
  13. returnthis.contactService.queryResultsCount();
  14. }
  15. @Override
  16. publicList<Contact>listResults(intfrom,intlength){
  17. List<Contact>results=Collections.emptyList();
  18. results=this.contactService.queryByPage(from,length);
  19. returnresults;
  20. }
  21. publicvoidsetContactService(ContactServicecontactService){
  22. this.contactService=contactService;
  23. }
  24. }

而在struts.xml中,应按如下设置配置action:

  1. <actionname="jqGrid01"class="cn.gengv.struts2ex.jqGrid.ListContactsAction">
  2. <resultname="success"type="json">
  3. <paramname="includeProperties">
  4. ^gridModel/[/d+/]/./w+,
  5. rows,page,total,record
  6. </param>
  7. <paramname="noCache">true</param>
  8. <paramname="ignoreHierarchy">false</param>
  9. </result>
  10. </action>

3.2 客户端(浏览器)

javascript部分:

[javascript] view plaincopyprint?
  1. $(function(){
  2. //配置jqGrid组件
  3. $("#gridTable").jqGrid({
  4. url:"jqGrid01.action",
  5. datatype:"json",
  6. mtype:"GET",
  7. height:350,
  8. autowidth:true,
  9. colModel:[
  10. {name:"id",index:"id",label:"ID",width:40},
  11. {name:"lastName",index:"lastName",label:"LastName",width:80,sortable:false},
  12. {name:"firstName",index:"firstName",label:"FirstName",width:80,sortable:false},
  13. {name:"email",index:"email",label:"E-mail",width:160,sortable:false},
  14. {name:"telNo",index:"telNo",label:"TelNo",width:120,sortable:false}
  15. ],
  16. viewrecords:true,
  17. rowNum:15,
  18. rowList:[15,50,100],
  19. prmNames:{search:"search"},//(1)
  20. jsonReader:{
  21. root:"gridModel",//(2)
  22. records:"record",//(3)
  23. repeatitems:false//(4)
  24. },
  25. pager:"#gridPager",
  26. caption:"联系人列表",
  27. hidegrid:false
  28. });
  29. });

其中主要的选项在开头已经介绍过了,另外需要说明以下几点:
1、在位置(1)处,为了配合Server端的Action类中的成员变量命名,将prmNames中search对应的“_search”更改为“search”。
2、在位置(2)(3)处,为了配合Server端的Action类中的成员变量命名,将jsonReader中root对应的“rows”更改为“gridModel”,将records对应的“records”更改为“record”。
在后面的request和response解析中,就可以看到这些更改的作用。

html部分:

要想顺利的使用jqGrid,需要想页面中引入6个文件,其中4个js文件,2个css文件。它们分别是:

  • jquery-ui-1.8.1.custom.css(jQuery UI界面的CSS文件)
  • ui.jqgrid.custom.css(专用于jqGrid界面的CSS文件)
  • jquery-1.4.2.min.js(jQuery的核心)
  • jquery-ui-1.8.1.custom.min.js(用于支持jQuery UI界面)
  • grid.locale-zh-CN.js(针对jqGrid的locale设置,根据locale不同,选择不同的尾缀)
  • jquery.jqGrid.min.js(jqGrid的核心,可以到jqGrid网站,根据需求选择模块下载)


:jqGrid的官方包中原本针对中文的locale js文件是grid.locale-cn.js,但是里面的某些设置,并没有做到完全中文化,因此我从Struts2-jQuery插件中分离出grid.locale-zh-CN.js和jquery.ui.datepicker-zh-CN.min.js这两个文件以备后用。说起来这两个文件中,针对中文的设置还是不错的。


引入这6个文件后,创建jqGrid的工作就交给上面写的javascript代码来完成了。

  1. <!DOCTYPEhtml
  2. PUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
  3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="zh-CN"lang="zh-CN">
  5. <head>
  6. <title>jqGrid01</title>
  7. <linkrel="stylesheet"type="text/css"media="screen"href="../css/themes/aero/jquery-ui-1.8.1.custom.css"mce_href="css/themes/aero/jquery-ui-1.8.1.custom.css"/>
  8. <linkrel="stylesheet"type="text/css"media="screen"href="../css/themes/aero/ui.jqgrid.custom.css"mce_href="css/themes/aero/ui.jqgrid.custom.css"/>
  9. <mce:scripttype="text/javascript"src="../js/jquery-1.4.2.min.js"mce_src="js/jquery-1.4.2.min.js"></mce:script>
  10. <mce:scriptsrc="../js/jquery-ui-1.8.1.custom.min.js"mce_src="js/jquery-ui-1.8.1.custom.min.js"type="text/javascript"></mce:script>
  11. <mce:scriptsrc="../js/i18n/grid.locale-zh-CN.js"mce_src="js/i18n/grid.locale-zh-CN.js"type="text/javascript"></mce:script>
  12. <mce:scriptsrc="../js/jquery.jqGrid.min.js"mce_src="js/jquery.jqGrid.min.js"type="text/javascript"></mce:script>
  13. <mce:scriptsrc="js/jqGrid01.js"mce_src="js/jqGrid01.js"type="text/javascript"></mce:script>
  14. </head>
  15. <body>
  16. <h2>
  17. jqGrid测试01
  18. </h2>
  19. <div>
  20. <tableid="gridTable"></table>
  21. <divid="gridPager"></div>
  22. </div>
  23. </body>
  24. </html>

HTML中的代码,异常简洁。

3.3 整个流程


通过Firebug监测request和response就可以看出Server和浏览器之间的数据交互。当打开页面的时候,jqGrid初始化,会向Server发送url中定义的request,并传递参数。如下:

http://localhost:8085/Hare/jqGridTest/jqGrid01.action?search=false&nd=1278331032140&rows=15&page=1&sidx=&sord=asc

jqGrid会根据prmNames中的定义,向Server传递参数,例如将jqGrid选项中rowNum的值,作为参数rows传递到Server。

由于我将prmNames中的search设为“search”,所以参数里表中出现了这个参数;否则仍会根据原来的默认值,出现“_search”参数。


再看看response,Server发送来的json数据,格式是这样的:

[javascript] view plaincopyprint?
  1. {
  2. "gridModel":[
  3. {
  4. "address":"ADDR-yjfrot4i008toqlrl4dfq9",
  5. "email":"vl3@jv36.com",
  6. "firstName":"FN-gn7po9c9m",
  7. "fullName":"LN-3h6d1qFN-gn7po9c9m",
  8. "id":23016,
  9. "idCardNo":"CARD-28ew6dekrv9g8dml4n",
  10. "lastName":"LN-3h6d1q",
  11. "nationality":"NAT-6z1xhty2",
  12. "telNo"::"TEL-x3i4a625i"
  13. },
  14. {
  15. "address":"ADDR-9zeiasrr",
  16. "email":"wba@6ym4.com",
  17. "firstName":"FN-8mwhw7n",
  18. "fullName":"LN-yaontkFN-8mwhw7n",
  19. "id":23015,
  20. "idCardNo":"CARD-gqqbd9s4zjexj05sus",
  21. "lastName":"LN-yaontk",
  22. "nationality":"NAT-0phliht",
  23. "telNo"::"TEL-jf4c31"
  24. },
  25. {
  26. "address":"ADDR-o4ml00d98j7xgktl",
  27. "email":"m7j@dwy.com",
  28. "firstName":"FN-etzsxbaq4",
  29. "fullName":"LN-uedrek8FN-etzsxbaq4",
  30. "id":23014,
  31. "idCardNo":"CARD-md9bcyef7wvcc7om6b",
  32. "lastName":"LN-uedrek8",
  33. "nationality":"NAT-okbb5",
  34. "telNo"::"TEL-pp0d00"
  35. },
  36. {
  37. "address":"ADDR-obzar7v7z58uux",
  38. "email":"sqj@44wfo.com",
  39. "firstName":"FN-f1qnbw0x",
  40. "fullName":"LN-20ug4vxfcFN-f1qnbw0x",
  41. "id":23013,
  42. "idCardNo":"CARD-kzil6hhtpo68izim0b",
  43. "lastName":"LN-20ug4vxfc",
  44. "nationality":"NAT-dxidrf",
  45. "telNo"::"TEL-eug8ydessk"
  46. },
  47. {
  48. "address":"ADDR-r7954tumxw133a9os90l",
  49. "email":"2in@tw7.com",
  50. "firstName":"FN-pw1yl8ux",
  51. "fullName":"LN-nk7qg6byFN-pw1yl8ux",
  52. "id":23012,
  53. "idCardNo":"CARD-0cx02jpey6nivhkr29",
  54. "lastName":"LN-nk7qg6by",
  55. "nationality":"NAT-85tl0a",
  56. "telNo"::"TEL-4aa404"
  57. },
  58. {
  59. "address":"ADDR-jxmudykwu7kcu",
  60. "email":"0um@ut9yh.com",
  61. "firstName":"FN-cjxxxds3",
  62. "fullName":"LN-3iviu7oFN-cjxxxds3",
  63. "id":23011,
  64. "idCardNo":"CARD-9evl3ul16uldvjango",
  65. "lastName":"LN-3iviu7o",
  66. "nationality":"NAT-v2gnaa9",
  67. "telNo"::"TEL-gzbn1w"
  68. },
  69. {
  70. "address":"ADDR-9xsk62kmdidc",
  71. "email":"cld@pnx.com",
  72. "firstName":"FN-iqygy07ku",
  73. "fullName":"LN-3mrxkiFN-iqygy07ku",
  74. "id":23010,
  75. "idCardNo":"CARD-ccypafwru43cqyjo62",
  76. "lastName":"LN-3mrxki",
  77. "nationality":"NAT-qjpvfa",
  78. "telNo"::"TEL-2bqxde"
  79. },
  80. {
  81. "address":"ADDR-t8dizyumbedgbd0u8ml",
  82. "email":"dhk@yr8k.com",
  83. "firstName":"FN-89xwf0",
  84. "fullName":"LN-8wr6uiig3FN-89xwf0",
  85. "id":23009,
  86. "idCardNo":"CARD-7t09x2dw3i3y78z24e",
  87. "lastName":"LN-8wr6uiig3",
  88. "nationality":"NAT-9uu7xo",
  89. "telNo"::"TEL-p8ym9rtwy"
  90. },
  91. {
  92. "address":"ADDR-gupoe8jwcqwcjs2u01oa8",
  93. "email":"gug@wqb.com",
  94. "firstName":"FN-0amkpy2",
  95. "fullName":"LN-i73kpz5ncFN-0amkpy2",
  96. "id":23008,
  97. "idCardNo":"CARD-itgmrwwichkzan5220",
  98. "lastName":"LN-i73kpz5nc",
  99. "nationality":"NAT-k2aq2t",
  100. "telNo"::"TEL-2wdhbs"
  101. },
  102. {
  103. "address":"ADDR-gp9q73fzs68agav6",
  104. "email":"jj3@rpwe.com",
  105. "firstName":"FN-w42bd8y",
  106. "fullName":"LN-utrnn25cFN-w42bd8y",
  107. "id":23007,
  108. "idCardNo":"CARD-rrznb3ihqf94k2wjkv",
  109. "lastName":"LN-utrnn25c",
  110. "nationality":"NAT-gs3e9rk",
  111. "telNo"::"TEL-g8j19nqz9"
  112. },
  113. {
  114. "address":"ADDR-ja8w4gq485m3dn2gr66",
  115. "email":"zt5@sy30t.com",
  116. "firstName":"FN-dxfyd5m5m",
  117. "fullName":"LN-li98bkFN-dxfyd5m5m",
  118. "id":23006,
  119. "idCardNo":"CARD-indqfrmi13zfazly67",
  120. "lastName":"LN-li98bk",
  121. "nationality":"NAT-qglj9sx2",
  122. "telNo"::"TEL-mzlpe3m"
  123. },
  124. {
  125. "address":"ADDR-rm3r94qanvt1q4drp",
  126. "email":"uct@ayg0.com",
  127. "firstName":"FN-qkq3w1m",
  128. "fullName":"LN-0j90saFN-qkq3w1m",
  129. "id":23005,
  130. "idCardNo":"CARD-8vc92wevyunbpl29c0",
  131. "lastName":"LN-0j90sa",
  132. "nationality":"NAT-mv2wzlt",
  133. "telNo"::"TEL-ntkah0"
  134. },
  135. {
  136. "address":"ADDR-u3gsxpq61e2",
  137. "email":"7zr@k7du4.com",
  138. "firstName":"FN-evno7jy",
  139. "fullName":"LN-0fuix09FN-evno7jy",
  140. "id":23004,
  141. "idCardNo":"CARD-jgyf09by0rxboex8ut",
  142. "lastName":"LN-0fuix09",
  143. "nationality":"NAT-cw8cctzy",
  144. "telNo"::"TEL-artsappc2"
  145. },
  146. {
  147. "address":"ADDR-04kfdpp7",
  148. "email":"qm6@9c2.com",
  149. "firstName":"FN-zz0e74gvh",
  150. "fullName":"LN-26u851FN-zz0e74gvh",
  151. "id":23003,
  152. "idCardNo":"CARD-wminx9rykz1sn7xsxz",
  153. "lastName":"LN-26u851",
  154. "nationality":"NAT-05uk2c93",
  155. "telNo"::"TEL-9de2jt4oh",
  156. },
  157. {
  158. "address":"ADDR-i18dy2cew6eizvmvgi0w",
  159. "email":"r8x@n67mb.com",
  160. "firstName":"FN-gt4aice1",
  161. "fullName":"LN-db6vre9FN-gt4aice1",
  162. "id":23002,
  163. "idCardNo":"CARD-spwifyvehzkcfj5g7f",
  164. "lastName":"LN-db6vre9",
  165. "nationality":"NAT-osiionb",
  166. "telNo"::"TEL-1vigb907",
  167. }
  168. ],
  169. "page":1,
  170. "record":23013,
  171. "rows":15,
  172. "total":1535
  173. }

jqGrid根据jsonReader中的设置,解析json数据。根据jsonReader中的root(我设置的是“gridModel”),得到数据记录数组;根据rows得到每页显示的行数;根据page设置当前页数;根据records(我设置的是“record”)得到所有记录数量;根据total得到所有页数。



由此,jqGrid完成一个request,并将得到的response,解析为所需的数据,显示到Grid表格中。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics