`

jQuery学习之:jqGrid表格插件——从Struts2获得数据

 
阅读更多

之前谈到了jqGrid与Serlvet/JSP集成,实际上就是Servlet按jqGrid对数据的要求返回相应的数据,Servlet中是通过 PrintWriter输出数据的,那时,我们用到了json-lib来构建Json数据。现在来谈谈jqGrid如何与Struts2集成。

对于Struts2,同样需要按jqGrid的要求返回相应的json数据格式。当然,我们可以在Struts2的Action中通过返回 null来干Servlet一样的事情,这样也能够同Servlet一样实现与jqGrid集成。然而,此时Struts2实际上相当于没有。既然用到了 Struts2,我们就应该用Struts2为我们提供的方法。而且,在Struts的Action中应该尽量避免使用request之类的 Servlet对象,用Struts2更是如此。在struts1.x中,request直接就有的,因而在开发中总会有人“打着struts的旗帜,干着Servlet的勾当”。我们知道,request等是依赖于Servlet容器的,Struts2把这些屏蔽了,Struts2的Action可以直接是POJO,因而我们更不应该违反Struts2的设计原则,硬是去“干Servlet的勾当”。闲话不说,开始咱们的正题。

在Struts2的jar包中,有一个struts2-json-plugin.jar,它就是用于处理json数据的(Struts2提供了很多插件),我们就是应用它来实现struts2与jqGrid的集成。

1、效果图:



2、代码与解释:

Html 代码

  1. < body >
  2. < table id = "gridTable" > </ table >
  3. < div id = "gridPager" > </ div >
  4. </ body >
  1. <body>
  2. <tableid="gridTable"></table>
  3. <divid="gridPager"></div>
  4. </body>


Javascript 代码
  1. $( function ()
  2. {
  3. $("#gridTable" ).jqGrid({
  4. url:'json/jqgrid.action' ,
  5. datatype:"json" ,
  6. height:250,
  7. colNames:['编号' , '用户名' , '性别' , '邮箱' , 'QQ' , '手机号' , '出生日期' ],
  8. colModel:[
  9. {name:'id' ,index: 'id' ,width:60,sorttype: "int" },
  10. {name:'userName' ,index: 'userName' ,width:90},
  11. {name:'gender' ,index: 'gender' ,width:90},
  12. {name:'email' ,index: 'email' ,width:125,sorttype: "string" },
  13. {name:'QQ' ,index: 'QQ' ,width:100},
  14. {name:'mobilePhone' ,index: 'mobilePhone' ,width:120},
  15. {name:'birthday' ,index: 'birthday' ,width:100,sorttype: "date" }
  16. ],
  17. sortname:'id' ,
  18. sortorder:'asc' ,
  19. viewrecords:true ,
  20. rowNum:10,
  21. rowList:[10,20,30],
  22. jsonReader:{
  23. root:"dataRows" , //数据行(默认为:rows)
  24. page:"curPage" , //当前页
  25. total:"totalPages" , //总页数
  26. records:"totalRecords" , //总记录数
  27. repeatitems:false //设置成false,在后台设置值的时候,可以乱序。且并非每个值都得设
  28. },
  29. prmNames:{rows:"page.pageSize" ,page: "page.curPageNo" ,sort: "page.orderBy" ,order: "page.order" },
  30. pager:"#gridPager" ,
  31. caption:"jqGrid与Struts2集成"
  32. }).navGrid('#gridPager' ,{edit: false ,add: false ,del: false });
  33. })
[javascript] view plaincopyprint?
  1. $(function()
  2. {
  3. $("#gridTable").jqGrid({
  4. url:'json/jqgrid.action',
  5. datatype:"json",
  6. height:250,
  7. colNames:['编号','用户名','性别','邮箱','QQ','手机号','出生日期'],
  8. colModel:[
  9. {name:'id',index:'id',width:60,sorttype:"int"},
  10. {name:'userName',index:'userName',width:90},
  11. {name:'gender',index:'gender',width:90},
  12. {name:'email',index:'email',width:125,sorttype:"string"},
  13. {name:'QQ',index:'QQ',width:100},
  14. {name:'mobilePhone',index:'mobilePhone',width:120},
  15. {name:'birthday',index:'birthday',width:100,sorttype:"date"}
  16. ],
  17. sortname:'id',
  18. sortorder:'asc',
  19. viewrecords:true,
  20. rowNum:10,
  21. rowList:[10,20,30],
  22. jsonReader:{
  23. root:"dataRows",//数据行(默认为:rows)
  24. page:"curPage",//当前页
  25. total:"totalPages",//总页数
  26. records:"totalRecords",//总记录数
  27. repeatitems:false//设置成false,在后台设置值的时候,可以乱序。且并非每个值都得设
  28. },
  29. prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"},
  30. pager:"#gridPager",
  31. caption:"jqGrid与Struts2集成"
  32. }).navGrid('#gridPager',{edit:false,add:false,del:false});
  33. })


注意,JavaScript代码与Servlet例子中的有点不一样,主要是:jsonReader参数,另外增加了prmNames参数。每一项的是什么意思下面Java代码的注释中有详细说明。

Java 代码
  1. package com.polaris.jqgrid.struts2;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.polaris.jqgrid.util.Page;
  7. /**
  8. *<p>
  9. *该类是所有需要返回json数据的Action的<b>抽象基类</b>。在展示数据时,使用了jQuery的插件jqGrid,
  10. *它对返回的json数据格式有一定的要求。该基类就处理了这些统一的格式要求。
  11. *需要返回json格式数据被jqGrid使用的,应该继承该类。<br/>
  12. *<b><fontcolor='red'>注意:所有子类应该实现以下get方法,并只简单的返回相应的属性值。</font></b>
  13. *<ul>
  14. *<li>{@linkJsoBaseAction#getTotalPages()}</li>
  15. *<li>{@linkJsoBaseAction#getCurPage()}</li>
  16. *<li>{@linkJsoBaseAction#getTotalRecords()}</li>
  17. *<li>{@linkJsoBaseAction#getDataRows()}</li>
  18. *</ul>
  19. *之所以将这些get方法定义为抽象的,是因为struts2的json插件只会序列化Action类,而不会序列化其父类。
  20. *</p>
  21. *
  22. *<p><fontcolor='red'>
  23. *继承该类的Action方法,除了搜索(它需要返回JSON数据,因此可以返回SUCCESS),其他操作都应该返回null而不是SUCCESS之类的。
  24. *这意味着struts配置中,result什么也不用配,即没有相应的视图资源——这是AJAX请求。
  25. *</font></p>
  26. *
  27. *<p>
  28. *该类定义了以下几个字段:totalPages、curPage、totalRecords和 dataRows。
  29. *这几个字段是 jqGrid格式的要求,而此处是自定义的。因此,在配置jqGrid接收服务器
  30. *返回的数据格式时,应该配置成这几个名字。(因为默认名字不是这样的,默认名字为:page,total,records,rows)
  31. *当然,也可以通过@JSON注解来指定与默认一样的名字
  32. *</p>
  33. *
  34. *<p>
  35. *另外一个字段page,则是一个分页类。因为jqGrid会向服务器端传递分页参数,
  36. *用一个分页类接收这些参数。同样,为使Struts能够为page赋值,需要修改jqGrid默认的分页参数名。
  37. *jqGrid默认分页名为:(默认定义在options参数中的prmNames数组中)
  38. *<ul>
  39. *<li>page->显示第几页</li>
  40. *<li>rows->每页显示几条记录</li>
  41. *<li>sidx->排序字段</li>
  42. *<li>sord->排序方式(asc/desc)</li>
  43. *</ul>
  44. *应用中应该根据{@linkcom.polaris.jqgrid.util.Page}类中的定义设置。设置为:
  45. *prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"}
  46. *
  47. *prmNames 数组的默认值为:
  48. *prmNames:{page:"page",rows:"rows",sort:"sidx",order:"sord",search:"_search",nd:"nd",npage:null}
  49. *</p>
  50. *
  51. *@authorxuxinhua
  52. *@version1.0
  53. */
  54. @SuppressWarnings ( "unchecked" )
  55. public abstract class JsonBaseAction extends ActionSupport
  56. {
  57. private static final long serialVersionUID=1L;
  58. /**
  59. *该属性专门用于接收删除的数据的ID(主键)。注意,当支持一次删除多记录时,id的值是通过','号分隔的多个
  60. */
  61. protected Stringid;
  62. /**
  63. *分页类
  64. */
  65. protected Pagepage= new Page();
  66. /**
  67. *以下属性用于序列化成json格式的数据。名称不能改。如果要改,客户端页面对应的地方也要改;
  68. *或通过@JSON来指定序列化的名字
  69. */
  70. /**
  71. *总页数
  72. */
  73. protected int totalPages;
  74. /**
  75. *显示第几页
  76. */
  77. protected int curPage;
  78. /**
  79. *总记录数
  80. */
  81. protected int totalRecords;
  82. /**
  83. *保存实际的数据
  84. */
  85. protected List<Map<String,Object>>dataRows= new ArrayList<Map<String,Object>>();
  86. public JsonBaseAction(){
  87. super ();
  88. }
  89. public PagegetPage(){
  90. return page;
  91. }
  92. public void setPage(Pagepage){
  93. this .page=page;
  94. }
  95. public void setId(Stringid){
  96. this .id=id;
  97. }
  98. public StringgetId(){
  99. return id;
  100. }
  101. public abstract int getTotalPages();
  102. public void setTotalPages( int totalPages){
  103. this .totalPages=totalPages;
  104. }
  105. public abstract int getCurPage();
  106. public void setCurPage( int curPage){
  107. this .curPage=curPage;
  108. }
  109. public abstract int getTotalRecords();
  110. public void setTotalRecords( int totalRecords){
  111. this .totalRecords=totalRecords;
  112. }
  113. /**
  114. *注意该方法的返回值:List。实际上包含了实际的数据,
  115. *而这些数据是放在Map<String,Object>中的。
  116. *因而,子类在action方法如:execute中,应该构建一个
  117. *Map<String,Object>对象,将数据放入其中,并把该对象放入
  118. *List中。
  119. *@return
  120. */
  121. public abstract List<Map<String,Object>>getDataRows();
  122. public void setDataRows(List<Map<String,Object>>dataRows){
  123. this .dataRows=dataRows;
  124. }
  125. }
  1. packagecom.polaris.jqgrid.struts2;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. importcom.opensymphony.xwork2.ActionSupport;
  6. importcom.polaris.jqgrid.util.Page;
  7. /**
  8. *<p>
  9. *该类是所有需要返回json数据的Action的<b>抽象基类</b>。在展示数据时,使用了jQuery的插件jqGrid,
  10. *它对返回的json数据格式有一定的要求。该基类就处理了这些统一的格式要求。
  11. *需要返回json格式数据被jqGrid使用的,应该继承该类。<br/>
  12. *<b><fontcolor='red'>注意:所有子类应该实现以下get方法,并只简单的返回相应的属性值。</font></b>
  13. *<ul>
  14. *<li>{@linkJsoBaseAction#getTotalPages()}</li>
  15. *<li>{@linkJsoBaseAction#getCurPage()}</li>
  16. *<li>{@linkJsoBaseAction#getTotalRecords()}</li>
  17. *<li>{@linkJsoBaseAction#getDataRows()}</li>
  18. *</ul>
  19. *之所以将这些get方法定义为抽象的,是因为struts2的json插件只会序列化Action类,而不会序列化其父类。
  20. *</p>
  21. *
  22. *<p><fontcolor='red'>
  23. *继承该类的Action方法,除了搜索(它需要返回JSON数据,因此可以返回SUCCESS),其他操作都应该返回null而不是SUCCESS之类的。
  24. *这意味着struts配置中,result什么也不用配,即没有相应的视图资源——这是AJAX请求。
  25. *</font></p>
  26. *
  27. *<p>
  28. *该类定义了以下几个字段:totalPages、curPage、totalRecords和dataRows。
  29. *这几个字段是jqGrid格式的要求,而此处是自定义的。因此,在配置jqGrid接收服务器
  30. *返回的数据格式时,应该配置成这几个名字。(因为默认名字不是这样的,默认名字为:page,total,records,rows)
  31. *当然,也可以通过@JSON注解来指定与默认一样的名字
  32. *</p>
  33. *
  34. *<p>
  35. *另外一个字段page,则是一个分页类。因为jqGrid会向服务器端传递分页参数,
  36. *用一个分页类接收这些参数。同样,为使Struts能够为page赋值,需要修改jqGrid默认的分页参数名。
  37. *jqGrid默认分页名为:(默认定义在options参数中的prmNames数组中)
  38. *<ul>
  39. *<li>page->显示第几页</li>
  40. *<li>rows->每页显示几条记录</li>
  41. *<li>sidx->排序字段</li>
  42. *<li>sord->排序方式(asc/desc)</li>
  43. *</ul>
  44. *应用中应该根据{@linkcom.polaris.jqgrid.util.Page}类中的定义设置。设置为:
  45. *prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"}
  46. *
  47. *prmNames数组的默认值为:
  48. *prmNames:{page:"page",rows:"rows",sort:"sidx",order:"sord",search:"_search",nd:"nd",npage:null}
  49. *</p>
  50. *
  51. *@authorxuxinhua
  52. *@version1.0
  53. */
  54. @SuppressWarnings("unchecked")
  55. publicabstractclassJsonBaseActionextendsActionSupport
  56. {
  57. privatestaticfinallongserialVersionUID=1L;
  58. /**
  59. *该属性专门用于接收删除的数据的ID(主键)。注意,当支持一次删除多记录时,id的值是通过','号分隔的多个
  60. */
  61. protectedStringid;
  62. /**
  63. *分页类
  64. */
  65. protectedPagepage=newPage();
  66. /**
  67. *以下属性用于序列化成json格式的数据。名称不能改。如果要改,客户端页面对应的地方也要改;
  68. *或通过@JSON来指定序列化的名字
  69. */
  70. /**
  71. *总页数
  72. */
  73. protectedinttotalPages;
  74. /**
  75. *显示第几页
  76. */
  77. protectedintcurPage;
  78. /**
  79. *总记录数
  80. */
  81. protectedinttotalRecords;
  82. /**
  83. *保存实际的数据
  84. */
  85. protectedList<Map<String,Object>>dataRows=newArrayList<Map<String,Object>>();
  86. publicJsonBaseAction(){
  87. super();
  88. }
  89. publicPagegetPage(){
  90. returnpage;
  91. }
  92. publicvoidsetPage(Pagepage){
  93. this.page=page;
  94. }
  95. publicvoidsetId(Stringid){
  96. this.id=id;
  97. }
  98. publicStringgetId(){
  99. returnid;
  100. }
  101. publicabstractintgetTotalPages();
  102. publicvoidsetTotalPages(inttotalPages){
  103. this.totalPages=totalPages;
  104. }
  105. publicabstractintgetCurPage();
  106. publicvoidsetCurPage(intcurPage){
  107. this.curPage=curPage;
  108. }
  109. publicabstractintgetTotalRecords();
  110. publicvoidsetTotalRecords(inttotalRecords){
  111. this.totalRecords=totalRecords;
  112. }
  113. /**
  114. *注意该方法的返回值:List。实际上包含了实际的数据,
  115. *而这些数据是放在Map<String,Object>中的。
  116. *因而,子类在action方法如:execute中,应该构建一个
  117. *Map<String,Object>对象,将数据放入其中,并把该对象放入
  118. *List中。
  119. *@return
  120. */
  121. publicabstractList<Map<String,Object>>getDataRows();
  122. publicvoidsetDataRows(List<Map<String,Object>>dataRows){
  123. this.dataRows=dataRows;
  124. }
  125. }


这个类是一个抽象基类,为了方便扩展而设计的。需要返回json数据(使用jqGrid插件)的Action应该继承该类。这个类是我为公司写的一个类,拿出来与大家分享。

Java 代码
  1. package com.polaris.jqgrid.struts2;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. /**
  6. *该 Struts2向客户端返回一个json对象。为了简便,数据不是从数据库获得的。
  7. *jqGrid默认期望返回的json对象格式要求如下:
  8. *{"page":"1","total":"2","records":"13",
  9. *"rows":[
  10. *{id:"1",cell:["1","polaris"," 男","polaris@gmail.com","772618379","18329382732","1985-10-2"]},
  11. *{id:"2",cell:["2","张三"," 女","zhangsan@163.com","272618382","15329382732","1986-10-12"]},
  12. *{id:"3",cell:["3","王五"," 女","wangwu@yahoo.com","172635372","13329389832","1987-12-21"]},
  13. *{id:"4",cell:["4","赵六"," 男","zhaoliu@sina.com","372618332","18929343731","1988-09-22"]}
  14. *]
  15. *}
  16. *当然,在js中,可以通过jqGrid的jsonReader属性来修改默认格式
  17. *因为默认的格式,rows的数据要求顺序不能变,且每个字段都得有值(空也得有"")。因而,
  18. *在jsonReader中定义repeatitems:false。这样,rows就变成了:
  19. *"rows":[
  20. *{id:"1",userName:"polaris",gender:" 男",email:"polaris@gmail.com",QQ:"772618379",mobilePhone:"18329382732",birthday:"1985-10-2"]},
  21. *{id:"2",userName:"徐新华",gender:" 男",email:"xh.xu@163.com",QQ:"272618382",mobilePhone:"15329382732",birthday:"1986-10-12"]},
  22. *{id:"3",userName:"王五",gender:" 女",email:"wangwu@yahoo.com",QQ:"172635372",mobilePhone:"13329389832",birthday:"1987-12-21"]},
  23. *{id:"4",userName:"赵六",gender:" 女",email:"zhaoliu@sina.com",QQ:"372618332",mobilePhone:"18929343731",birthday:"1988-09-22"]}
  24. *]
  25. *@authorxuxinhua
  26. *
  27. */
  28. public class JqGridForJSONAction extends JsonBaseAction
  29. {
  30. private static final long serialVersionUID=132383828833L;
  31. /**
  32. *该方法得到数据并构造json对象以便返回给客户端
  33. *@return
  34. *@throwsException
  35. */
  36. public Stringexecute() throws Exception
  37. {
  38. //构建几条数据
  39. int i= 0 ;
  40. for (i= 0 ;i< 4 ;++i)
  41. {
  42. //定义一个Map<String,Object>存放一行行数据。(跟从Servlet获得数据类似,只不过此处不需要用json-lib)
  43. Map<String,Object>row=new HashMap<String,Object>();
  44. row.put("id" ,i);
  45. if (i% 2 == 0 )
  46. {
  47. row.put("userName" , "polaris" );
  48. row.put("gender" , "女" );
  49. }
  50. else
  51. {
  52. row.put("userName" , "徐新华" );
  53. row.put("gender" , "男" );
  54. }
  55. row.put("email" , "polaris@gmail.com" );
  56. row.put("QQ" , "772" +i+ "1837" +i);
  57. row.put("mobilePhone" , "132" +i+ "1837" +i+ "3" +i);
  58. row.put("birthday" , "198" +i+ "-10-" + "1" +i);
  59. dataRows.add(row);
  60. }
  61. //给另外三个返回参数设值
  62. setTotalPages(1 ); //总页数
  63. setCurPage(1 ); //当前页
  64. setTotalRecords(i);//总记录数
  65. return SUCCESS;
  66. }
  67. /*
  68. *以下getter方法必须实现,struts2-json插件会将这些getter方法序列化,以便输出json对象。
  69. *这些getter方法只需返回相应的属性即可。如getCurPage应该返回curPage
  70. *(curPage在JsonBaseAction中有定义)
  71. */
  72. @Override
  73. public int getCurPage()
  74. {
  75. return this .curPage;
  76. }
  77. @Override
  78. public List<Map<String,Object>>getDataRows()
  79. {
  80. return this .dataRows;
  81. }
  82. @Override
  83. public int getTotalPages()
  84. {
  85. return this .totalPages;
  86. }
  87. @Override
  88. public int getTotalRecords()
  89. {
  90. return this .totalRecords;
  91. }
  92. }
  1. packagecom.polaris.jqgrid.struts2;
  2. importjava.util.HashMap;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. /**
  6. *该Struts2向客户端返回一个json对象。为了简便,数据不是从数据库获得的。
  7. *jqGrid默认期望返回的json对象格式要求如下:
  8. *{"page":"1","total":"2","records":"13",
  9. *"rows":[
  10. *{id:"1",cell:["1","polaris","男","polaris@gmail.com","772618379","18329382732","1985-10-2"]},
  11. *{id:"2",cell:["2","张三","女","zhangsan@163.com","272618382","15329382732","1986-10-12"]},
  12. *{id:"3",cell:["3","王五","女","wangwu@yahoo.com","172635372","13329389832","1987-12-21"]},
  13. *{id:"4",cell:["4","赵六","男","zhaoliu@sina.com","372618332","18929343731","1988-09-22"]}
  14. *]
  15. *}
  16. *当然,在js中,可以通过jqGrid的jsonReader属性来修改默认格式
  17. *因为默认的格式,rows的数据要求顺序不能变,且每个字段都得有值(空也得有"")。因而,
  18. *在jsonReader中定义repeatitems:false。这样,rows就变成了:
  19. *"rows":[
  20. *{id:"1",userName:"polaris",gender:"男",email:"polaris@gmail.com",QQ:"772618379",mobilePhone:"18329382732",birthday:"1985-10-2"]},
  21. *{id:"2",userName:"徐新华",gender:"男",email:"xh.xu@163.com",QQ:"272618382",mobilePhone:"15329382732",birthday:"1986-10-12"]},
  22. *{id:"3",userName:"王五",gender:"女",email:"wangwu@yahoo.com",QQ:"172635372",mobilePhone:"13329389832",birthday:"1987-12-21"]},
  23. *{id:"4",userName:"赵六",gender:"女",email:"zhaoliu@sina.com",QQ:"372618332",mobilePhone:"18929343731",birthday:"1988-09-22"]}
  24. *]
  25. *@authorxuxinhua
  26. *
  27. */
  28. publicclassJqGridForJSONActionextendsJsonBaseAction
  29. {
  30. privatestaticfinallongserialVersionUID=132383828833L;
  31. /**
  32. *该方法得到数据并构造json对象以便返回给客户端
  33. *@return
  34. *@throwsException
  35. */
  36. publicStringexecute()throwsException
  37. {
  38. //构建几条数据
  39. inti=0;
  40. for(i=0;i<4;++i)
  41. {
  42. //定义一个Map<String,Object>存放一行行数据。(跟从Servlet获得数据类似,只不过此处不需要用json-lib)
  43. Map<String,Object>row=newHashMap<String,Object>();
  44. row.put("id",i);
  45. if(i%2==0)
  46. {
  47. row.put("userName","polaris");
  48. row.put("gender","女");
  49. }
  50. else
  51. {
  52. row.put("userName","徐新华");
  53. row.put("gender","男");
  54. }
  55. row.put("email","polaris@gmail.com");
  56. row.put("QQ","772"+i+"1837"+i);
  57. row.put("mobilePhone","132"+i+"1837"+i+"3"+i);
  58. row.put("birthday","198"+i+"-10-"+"1"+i);
  59. dataRows.add(row);
  60. }
  61. //给另外三个返回参数设值
  62. setTotalPages(1);//总页数
  63. setCurPage(1);//当前页
  64. setTotalRecords(i);//总记录数
  65. returnSUCCESS;
  66. }
  67. /*
  68. *以下getter方法必须实现,struts2-json插件会将这些getter方法序列化,以便输出json对象。
  69. *这些getter方法只需返回相应的属性即可。如getCurPage应该返回curPage
  70. *(curPage在JsonBaseAction中有定义)
  71. */
  72. @Override
  73. publicintgetCurPage()
  74. {
  75. returnthis.curPage;
  76. }
  77. @Override
  78. publicList<Map<String,Object>>getDataRows()
  79. {
  80. returnthis.dataRows;
  81. }
  82. @Override
  83. publicintgetTotalPages()
  84. {
  85. returnthis.totalPages;
  86. }
  87. @Override
  88. publicintgetTotalRecords()
  89. {
  90. returnthis.totalRecords;
  91. }
  92. }


注意看注释。

struts.xml的配置:

Xml代码
  1. < constant name = "struts.i18n.encoding" value = "utf-8" > </ constant >
  2. < package name = "json" namespace = "/json" extends = "json-default" >
  3. < action name = "jqgrid" class = "com.polaris.jqgrid.struts2.JqGridForJSONAction" >
  4. < result type = "json" > </ result >
  5. </ action >
  6. </ package >
  1. <constantname="struts.i18n.encoding"value="utf-8"></constant>
  2. <packagename="json"namespace="/json"extends="json-default">
  3. <actionname="jqgrid"class="com.polaris.jqgrid.struts2.JqGridForJSONAction">
  4. <resulttype="json"></result>
  5. </action>
  6. </package>


说明:1)设置字符编码,否则会乱码;2)package要继承自json-default,json-default在struts2- json-plugin中有定义;3)result的type必须为json,表示返回数据类型为json,然而视图映射留空(即result不能对应一个视图)

web.xml中struts2核心过滤器的配置:

Xml代码
  1. < filter >
  2. < filter-name > struts2 </ filter-name >
  3. < filter-class >
  4. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  5. </ filter-class >
  6. </ filter >
  7. < filter-mapping >
  8. < filter-name > struts2 </ filter-name >
  9. < url-pattern > /* </ url-pattern >
  10. </ filter-mapping >
  1. <filter>
  2. <filter-name>struts2</filter-name>
  3. <filter-class>
  4. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>struts2</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>


你可能会发现,此处配置的过滤器类名和网上很多地方说的不一样。的确,我用的struts2是2.1.8。自从2.1.3开始,原来的过滤器 FilterDispatcher被标注为:Deprecated

结语:

至此jqGrid告一段落,不好之处请指正。如有什么问题,可以联系我,我们一起讨论。

之前谈到了jqGrid与Serlvet/JSP集成,实际上就是Servlet按jqGrid对数据的要求返回相应的数据,Servlet中是通过 PrintWriter输出数据的,那时,我们用到了json-lib来构建Json数据。现在来谈谈jqGrid如何与Struts2集成。

对于Struts2,同样需要按jqGrid的要求返回相应的json数据格式。当然,我们可以在Struts2的Action中通过返回 null来干Servlet一样的事情,这样也能够同Servlet一样实现与jqGrid集成。然而,此时Struts2实际上相当于没有。既然用到了 Struts2,我们就应该用Struts2为我们提供的方法。而且,在Struts的Action中应该尽量避免使用request之类的 Servlet对象,用Struts2更是如此。在struts1.x中,request直接就有的,因而在开发中总会有人“打着struts的旗帜,干着Servlet的勾当”。我们知道,request等是依赖于Servlet容器的,Struts2把这些屏蔽了,Struts2的Action可以直接是POJO,因而我们更不应该违反Struts2的设计原则,硬是去“干Servlet的勾当”。闲话不说,开始咱们的正题。

在Struts2的jar包中,有一个struts2-json-plugin.jar,它就是用于处理json数据的(Struts2提供了很多插件),我们就是应用它来实现struts2与jqGrid的集成。

1、效果图:



2、代码与解释:

Html 代码

  1. < body >
  2. < table id = "gridTable" > </ table >
  3. < div id = "gridPager" > </ div >
  4. </ body >
  1. <body>
  2. <tableid="gridTable"></table>
  3. <divid="gridPager"></div>
  4. </body>


Javascript 代码
  1. $( function ()
  2. {
  3. $("#gridTable" ).jqGrid({
  4. url:'json/jqgrid.action' ,
  5. datatype:"json" ,
  6. height:250,
  7. colNames:['编号' , '用户名' , '性别' , '邮箱' , 'QQ' , '手机号' , '出生日期' ],
  8. colModel:[
  9. {name:'id' ,index: 'id' ,width:60,sorttype: "int" },
  10. {name:'userName' ,index: 'userName' ,width:90},
  11. {name:'gender' ,index: 'gender' ,width:90},
  12. {name:'email' ,index: 'email' ,width:125,sorttype: "string" },
  13. {name:'QQ' ,index: 'QQ' ,width:100},
  14. {name:'mobilePhone' ,index: 'mobilePhone' ,width:120},
  15. {name:'birthday' ,index: 'birthday' ,width:100,sorttype: "date" }
  16. ],
  17. sortname:'id' ,
  18. sortorder:'asc' ,
  19. viewrecords:true ,
  20. rowNum:10,
  21. rowList:[10,20,30],
  22. jsonReader:{
  23. root:"dataRows" , //数据行(默认为:rows)
  24. page:"curPage" , //当前页
  25. total:"totalPages" , //总页数
  26. records:"totalRecords" , //总记录数
  27. repeatitems:false //设置成false,在后台设置值的时候,可以乱序。且并非每个值都得设
  28. },
  29. prmNames:{rows:"page.pageSize" ,page: "page.curPageNo" ,sort: "page.orderBy" ,order: "page.order" },
  30. pager:"#gridPager" ,
  31. caption:"jqGrid与Struts2集成"
  32. }).navGrid('#gridPager' ,{edit: false ,add: false ,del: false });
  33. })
[javascript] view plaincopyprint?
  1. $(function()
  2. {
  3. $("#gridTable").jqGrid({
  4. url:'json/jqgrid.action',
  5. datatype:"json",
  6. height:250,
  7. colNames:['编号','用户名','性别','邮箱','QQ','手机号','出生日期'],
  8. colModel:[
  9. {name:'id',index:'id',width:60,sorttype:"int"},
  10. {name:'userName',index:'userName',width:90},
  11. {name:'gender',index:'gender',width:90},
  12. {name:'email',index:'email',width:125,sorttype:"string"},
  13. {name:'QQ',index:'QQ',width:100},
  14. {name:'mobilePhone',index:'mobilePhone',width:120},
  15. {name:'birthday',index:'birthday',width:100,sorttype:"date"}
  16. ],
  17. sortname:'id',
  18. sortorder:'asc',
  19. viewrecords:true,
  20. rowNum:10,
  21. rowList:[10,20,30],
  22. jsonReader:{
  23. root:"dataRows",//数据行(默认为:rows)
  24. page:"curPage",//当前页
  25. total:"totalPages",//总页数
  26. records:"totalRecords",//总记录数
  27. repeatitems:false//设置成false,在后台设置值的时候,可以乱序。且并非每个值都得设
  28. },
  29. prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"},
  30. pager:"#gridPager",
  31. caption:"jqGrid与Struts2集成"
  32. }).navGrid('#gridPager',{edit:false,add:false,del:false});
  33. })


注意,JavaScript代码与Servlet例子中的有点不一样,主要是:jsonReader参数,另外增加了prmNames参数。每一项的是什么意思下面Java代码的注释中有详细说明。

Java 代码
  1. package com.polaris.jqgrid.struts2;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import com.opensymphony.xwork2.ActionSupport;
  6. import com.polaris.jqgrid.util.Page;
  7. /**
  8. *<p>
  9. *该类是所有需要返回json数据的Action的<b>抽象基类</b>。在展示数据时,使用了jQuery的插件jqGrid,
  10. *它对返回的json数据格式有一定的要求。该基类就处理了这些统一的格式要求。
  11. *需要返回json格式数据被jqGrid使用的,应该继承该类。<br/>
  12. *<b><fontcolor='red'>注意:所有子类应该实现以下get方法,并只简单的返回相应的属性值。</font></b>
  13. *<ul>
  14. *<li>{@linkJsoBaseAction#getTotalPages()}</li>
  15. *<li>{@linkJsoBaseAction#getCurPage()}</li>
  16. *<li>{@linkJsoBaseAction#getTotalRecords()}</li>
  17. *<li>{@linkJsoBaseAction#getDataRows()}</li>
  18. *</ul>
  19. *之所以将这些get方法定义为抽象的,是因为struts2的json插件只会序列化Action类,而不会序列化其父类。
  20. *</p>
  21. *
  22. *<p><fontcolor='red'>
  23. *继承该类的Action方法,除了搜索(它需要返回JSON数据,因此可以返回SUCCESS),其他操作都应该返回null而不是SUCCESS之类的。
  24. *这意味着struts配置中,result什么也不用配,即没有相应的视图资源——这是AJAX请求。
  25. *</font></p>
  26. *
  27. *<p>
  28. *该类定义了以下几个字段:totalPages、curPage、totalRecords和 dataRows。
  29. *这几个字段是 jqGrid格式的要求,而此处是自定义的。因此,在配置jqGrid接收服务器
  30. *返回的数据格式时,应该配置成这几个名字。(因为默认名字不是这样的,默认名字为:page,total,records,rows)
  31. *当然,也可以通过@JSON注解来指定与默认一样的名字
  32. *</p>
  33. *
  34. *<p>
  35. *另外一个字段page,则是一个分页类。因为jqGrid会向服务器端传递分页参数,
  36. *用一个分页类接收这些参数。同样,为使Struts能够为page赋值,需要修改jqGrid默认的分页参数名。
  37. *jqGrid默认分页名为:(默认定义在options参数中的prmNames数组中)
  38. *<ul>
  39. *<li>page->显示第几页</li>
  40. *<li>rows->每页显示几条记录</li>
  41. *<li>sidx->排序字段</li>
  42. *<li>sord->排序方式(asc/desc)</li>
  43. *</ul>
  44. *应用中应该根据{@linkcom.polaris.jqgrid.util.Page}类中的定义设置。设置为:
  45. *prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"}
  46. *
  47. *prmNames 数组的默认值为:
  48. *prmNames:{page:"page",rows:"rows",sort:"sidx",order:"sord",search:"_search",nd:"nd",npage:null}
  49. *</p>
  50. *
  51. *@authorxuxinhua
  52. *@version1.0
  53. */
  54. @SuppressWarnings ( "unchecked" )
  55. public abstract class JsonBaseAction extends ActionSupport
  56. {
  57. private static final long serialVersionUID=1L;
  58. /**
  59. *该属性专门用于接收删除的数据的ID(主键)。注意,当支持一次删除多记录时,id的值是通过','号分隔的多个
  60. */
  61. protected Stringid;
  62. /**
  63. *分页类
  64. */
  65. protected Pagepage= new Page();
  66. /**
  67. *以下属性用于序列化成json格式的数据。名称不能改。如果要改,客户端页面对应的地方也要改;
  68. *或通过@JSON来指定序列化的名字
  69. */
  70. /**
  71. *总页数
  72. */
  73. protected int totalPages;
  74. /**
  75. *显示第几页
  76. */
  77. protected int curPage;
  78. /**
  79. *总记录数
  80. */
  81. protected int totalRecords;
  82. /**
  83. *保存实际的数据
  84. */
  85. protected List<Map<String,Object>>dataRows= new ArrayList<Map<String,Object>>();
  86. public JsonBaseAction(){
  87. super ();
  88. }
  89. public PagegetPage(){
  90. return page;
  91. }
  92. public void setPage(Pagepage){
  93. this .page=page;
  94. }
  95. public void setId(Stringid){
  96. this .id=id;
  97. }
  98. public StringgetId(){
  99. return id;
  100. }
  101. public abstract int getTotalPages();
  102. public void setTotalPages( int totalPages){
  103. this .totalPages=totalPages;
  104. }
  105. public abstract int getCurPage();
  106. public void setCurPage( int curPage){
  107. this .curPage=curPage;
  108. }
  109. public abstract int getTotalRecords();
  110. public void setTotalRecords( int totalRecords){
  111. this .totalRecords=totalRecords;
  112. }
  113. /**
  114. *注意该方法的返回值:List。实际上包含了实际的数据,
  115. *而这些数据是放在Map<String,Object>中的。
  116. *因而,子类在action方法如:execute中,应该构建一个
  117. *Map<String,Object>对象,将数据放入其中,并把该对象放入
  118. *List中。
  119. *@return
  120. */
  121. public abstract List<Map<String,Object>>getDataRows();
  122. public void setDataRows(List<Map<String,Object>>dataRows){
  123. this .dataRows=dataRows;
  124. }
  125. }
  1. packagecom.polaris.jqgrid.struts2;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. importcom.opensymphony.xwork2.ActionSupport;
  6. importcom.polaris.jqgrid.util.Page;
  7. /**
  8. *<p>
  9. *该类是所有需要返回json数据的Action的<b>抽象基类</b>。在展示数据时,使用了jQuery的插件jqGrid,
  10. *它对返回的json数据格式有一定的要求。该基类就处理了这些统一的格式要求。
  11. *需要返回json格式数据被jqGrid使用的,应该继承该类。<br/>
  12. *<b><fontcolor='red'>注意:所有子类应该实现以下get方法,并只简单的返回相应的属性值。</font></b>
  13. *<ul>
  14. *<li>{@linkJsoBaseAction#getTotalPages()}</li>
  15. *<li>{@linkJsoBaseAction#getCurPage()}</li>
  16. *<li>{@linkJsoBaseAction#getTotalRecords()}</li>
  17. *<li>{@linkJsoBaseAction#getDataRows()}</li>
  18. *</ul>
  19. *之所以将这些get方法定义为抽象的,是因为struts2的json插件只会序列化Action类,而不会序列化其父类。
  20. *</p>
  21. *
  22. *<p><fontcolor='red'>
  23. *继承该类的Action方法,除了搜索(它需要返回JSON数据,因此可以返回SUCCESS),其他操作都应该返回null而不是SUCCESS之类的。
  24. *这意味着struts配置中,result什么也不用配,即没有相应的视图资源——这是AJAX请求。
  25. *</font></p>
  26. *
  27. *<p>
  28. *该类定义了以下几个字段:totalPages、curPage、totalRecords和dataRows。
  29. *这几个字段是jqGrid格式的要求,而此处是自定义的。因此,在配置jqGrid接收服务器
  30. *返回的数据格式时,应该配置成这几个名字。(因为默认名字不是这样的,默认名字为:page,total,records,rows)
  31. *当然,也可以通过@JSON注解来指定与默认一样的名字
  32. *</p>
  33. *
  34. *<p>
  35. *另外一个字段page,则是一个分页类。因为jqGrid会向服务器端传递分页参数,
  36. *用一个分页类接收这些参数。同样,为使Struts能够为page赋值,需要修改jqGrid默认的分页参数名。
  37. *jqGrid默认分页名为:(默认定义在options参数中的prmNames数组中)
  38. *<ul>
  39. *<li>page->显示第几页</li>
  40. *<li>rows->每页显示几条记录</li>
  41. *<li>sidx->排序字段</li>
  42. *<li>sord->排序方式(asc/desc)</li>
  43. *</ul>
  44. *应用中应该根据{@linkcom.polaris.jqgrid.util.Page}类中的定义设置。设置为:
  45. *prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"}
  46. *
  47. *prmNames数组的默认值为:
  48. *prmNames:{page:"page",rows:"rows",sort:"sidx",order:"sord",search:"_search",nd:"nd",npage:null}
  49. *</p>
  50. *
  51. *@authorxuxinhua
  52. *@version1.0
  53. */
  54. @SuppressWarnings("unchecked")
  55. publicabstractclassJsonBaseActionextendsActionSupport
  56. {
  57. privatestaticfinallongserialVersionUID=1L;
  58. /**
  59. *该属性专门用于接收删除的数据的ID(主键)。注意,当支持一次删除多记录时,id的值是通过','号分隔的多个
  60. */
  61. protectedStringid;
  62. /**
  63. *分页类
  64. */
  65. protectedPagepage=newPage();
  66. /**
  67. *以下属性用于序列化成json格式的数据。名称不能改。如果要改,客户端页面对应的地方也要改;
  68. *或通过@JSON来指定序列化的名字
  69. */
  70. /**
  71. *总页数
  72. */
  73. protectedinttotalPages;
  74. /**
  75. *显示第几页
  76. */
  77. protectedintcurPage;
  78. /**
  79. *总记录数
  80. */
  81. protectedinttotalRecords;
  82. /**
  83. *保存实际的数据
  84. */
  85. protectedList<Map<String,Object>>dataRows=newArrayList<Map<String,Object>>();
  86. publicJsonBaseAction(){
  87. super();
  88. }
  89. publicPagegetPage(){
  90. returnpage;
  91. }
  92. publicvoidsetPage(Pagepage){
  93. this.page=page;
  94. }
  95. publicvoidsetId(Stringid){
  96. this.id=id;
  97. }
  98. publicStringgetId(){
  99. returnid;
  100. }
  101. publicabstractintgetTotalPages();
  102. publicvoidsetTotalPages(inttotalPages){
  103. this.totalPages=totalPages;
  104. }
  105. publicabstractintgetCurPage();
  106. publicvoidsetCurPage(intcurPage){
  107. this.curPage=curPage;
  108. }
  109. publicabstractintgetTotalRecords();
  110. publicvoidsetTotalRecords(inttotalRecords){
  111. this.totalRecords=totalRecords;
  112. }
  113. /**
  114. *注意该方法的返回值:List。实际上包含了实际的数据,
  115. *而这些数据是放在Map<String,Object>中的。
  116. *因而,子类在action方法如:execute中,应该构建一个
  117. *Map<String,Object>对象,将数据放入其中,并把该对象放入
  118. *List中。
  119. *@return
  120. */
  121. publicabstractList<Map<String,Object>>getDataRows();
  122. publicvoidsetDataRows(List<Map<String,Object>>dataRows){
  123. this.dataRows=dataRows;
  124. }
  125. }


这个类是一个抽象基类,为了方便扩展而设计的。需要返回json数据(使用jqGrid插件)的Action应该继承该类。这个类是我为公司写的一个类,拿出来与大家分享。

Java 代码
  1. package com.polaris.jqgrid.struts2;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. /**
  6. *该 Struts2向客户端返回一个json对象。为了简便,数据不是从数据库获得的。
  7. *jqGrid默认期望返回的json对象格式要求如下:
  8. *{"page":"1","total":"2","records":"13",
  9. *"rows":[
  10. *{id:"1",cell:["1","polaris"," 男","polaris@gmail.com","772618379","18329382732","1985-10-2"]},
  11. *{id:"2",cell:["2","张三"," 女","zhangsan@163.com","272618382","15329382732","1986-10-12"]},
  12. *{id:"3",cell:["3","王五"," 女","wangwu@yahoo.com","172635372","13329389832","1987-12-21"]},
  13. *{id:"4",cell:["4","赵六"," 男","zhaoliu@sina.com","372618332","18929343731","1988-09-22"]}
  14. *]
  15. *}
  16. *当然,在js中,可以通过jqGrid的jsonReader属性来修改默认格式
  17. *因为默认的格式,rows的数据要求顺序不能变,且每个字段都得有值(空也得有"")。因而,
  18. *在jsonReader中定义repeatitems:false。这样,rows就变成了:
  19. *"rows":[
  20. *{id:"1",userName:"polaris",gender:" 男",email:"polaris@gmail.com",QQ:"772618379",mobilePhone:"18329382732",birthday:"1985-10-2"]},
  21. *{id:"2",userName:"徐新华",gender:" 男",email:"xh.xu@163.com",QQ:"272618382",mobilePhone:"15329382732",birthday:"1986-10-12"]},
  22. *{id:"3",userName:"王五",gender:" 女",email:"wangwu@yahoo.com",QQ:"172635372",mobilePhone:"13329389832",birthday:"1987-12-21"]},
  23. *{id:"4",userName:"赵六",gender:" 女",email:"zhaoliu@sina.com",QQ:"372618332",mobilePhone:"18929343731",birthday:"1988-09-22"]}
  24. *]
  25. *@authorxuxinhua
  26. *
  27. */
  28. public class JqGridForJSONAction extends JsonBaseAction
  29. {
  30. private static final long serialVersionUID=132383828833L;
  31. /**
  32. *该方法得到数据并构造json对象以便返回给客户端
  33. *@return
  34. *@throwsException
  35. */
  36. public Stringexecute() throws Exception
  37. {
  38. //构建几条数据
  39. int i= 0 ;
  40. for (i= 0 ;i< 4 ;++i)
  41. {
  42. //定义一个Map<String,Object>存放一行行数据。(跟从Servlet获得数据类似,只不过此处不需要用json-lib)
  43. Map<String,Object>row=new HashMap<String,Object>();
  44. row.put("id" ,i);
  45. if (i% 2 == 0 )
  46. {
  47. row.put("userName" , "polaris" );
  48. row.put("gender" , "女" );
  49. }
  50. else
  51. {
  52. row.put("userName" , "徐新华" );
  53. row.put("gender" , "男" );
  54. }
  55. row.put("email" , "polaris@gmail.com" );
  56. row.put("QQ" , "772" +i+ "1837" +i);
  57. row.put("mobilePhone" , "132" +i+ "1837" +i+ "3" +i);
  58. row.put("birthday" , "198" +i+ "-10-" + "1" +i);
  59. dataRows.add(row);
  60. }
  61. //给另外三个返回参数设值
  62. setTotalPages(1 ); //总页数
  63. setCurPage(1 ); //当前页
  64. setTotalRecords(i);//总记录数
  65. return SUCCESS;
  66. }
  67. /*
  68. *以下getter方法必须实现,struts2-json插件会将这些getter方法序列化,以便输出json对象。
  69. *这些getter方法只需返回相应的属性即可。如getCurPage应该返回curPage
  70. *(curPage在JsonBaseAction中有定义)
  71. */
  72. @Override
  73. public int getCurPage()
  74. {
  75. return this .curPage;
  76. }
  77. @Override
  78. public List<Map<String,Object>>getDataRows()
  79. {
  80. return this .dataRows;
  81. }
  82. @Override
  83. public int getTotalPages()
  84. {
  85. return this .totalPages;
  86. }
  87. @Override
  88. public int getTotalRecords()
  89. {
  90. return this .totalRecords;
  91. }
  92. }
  1. packagecom.polaris.jqgrid.struts2;
  2. importjava.util.HashMap;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. /**
  6. *该Struts2向客户端返回一个json对象。为了简便,数据不是从数据库获得的。
  7. *jqGrid默认期望返回的json对象格式要求如下:
  8. *{"page":"1","total":"2","records":"13",
  9. *"rows":[
  10. *{id:"1",cell:["1","polaris","男","polaris@gmail.com","772618379","18329382732","1985-10-2"]},
  11. *{id:"2",cell:["2","张三","女","zhangsan@163.com","272618382","15329382732","1986-10-12"]},
  12. *{id:"3",cell:["3","王五","女","wangwu@yahoo.com","172635372","13329389832","1987-12-21"]},
  13. *{id:"4",cell:["4","赵六","男","zhaoliu@sina.com","372618332","18929343731","1988-09-22"]}
  14. *]
  15. *}
  16. *当然,在js中,可以通过jqGrid的jsonReader属性来修改默认格式
  17. *因为默认的格式,rows的数据要求顺序不能变,且每个字段都得有值(空也得有"")。因而,
  18. *在jsonReader中定义repeatitems:false。这样,rows就变成了:
  19. *"rows":[
  20. *{id:"1",userName:"polaris",gender:"男",email:"polaris@gmail.com",QQ:"772618379",mobilePhone:"18329382732",birthday:"1985-10-2"]},
  21. *{id:"2",userName:"徐新华",gender:"男",email:"xh.xu@163.com",QQ:"272618382",mobilePhone:"15329382732",birthday:"1986-10-12"]},
  22. *{id:"3",userName:"王五",gender:"女",email:"wangwu@yahoo.com",QQ:"172635372",mobilePhone:"13329389832",birthday:"1987-12-21"]},
  23. *{id:"4",userName:"赵六",gender:"女",email:"zhaoliu@sina.com",QQ:"372618332",mobilePhone:"18929343731",birthday:"1988-09-22"]}
  24. *]
  25. *@authorxuxinhua
  26. *
  27. */
  28. publicclassJqGridForJSONActionextendsJsonBaseAction
  29. {
  30. privatestaticfinallongserialVersionUID=132383828833L;
  31. /**
  32. *该方法得到数据并构造json对象以便返回给客户端
  33. *@return
  34. *@throwsException
  35. */
  36. publicStringexecute()throwsException
  37. {
  38. //构建几条数据
  39. inti=0;
  40. for(i=0;i<4;++i)
  41. {
  42. //定义一个Map<String,Object>存放一行行数据。(跟从Servlet获得数据类似,只不过此处不需要用json-lib)
  43. Map<String,Object>row=newHashMap<String,Object>();
  44. row.put("id",i);
  45. if(i%2==0)
  46. {
  47. row.put("userName","polaris");
  48. row.put("gender","女");
  49. }
  50. else
  51. {
  52. row.put("userName","徐新华");
  53. row.put("gender","男");
  54. }
  55. row.put("email","polaris@gmail.com");
  56. row.put("QQ","772"+i+"1837"+i);
  57. row.put("mobilePhone","132"+i+"1837"+i+"3"+i);
  58. row.put("birthday","198"+i+"-10-"+"1"+i);
  59. dataRows.add(row);
  60. }
  61. //给另外三个返回参数设值
  62. setTotalPages(1);//总页数
  63. setCurPage(1);//当前页
  64. setTotalRecords(i);//总记录数
  65. returnSUCCESS;
  66. }
  67. /*
  68. *以下getter方法必须实现,struts2-json插件会将这些getter方法序列化,以便输出json对象。
  69. *这些getter方法只需返回相应的属性即可。如getCurPage应该返回curPage
  70. *(curPage在JsonBaseAction中有定义)
  71. */
  72. @Override
  73. publicintgetCurPage()
  74. {
  75. returnthis.curPage;
  76. }
  77. @Override
  78. publicList<Map<String,Object>>getDataRows()
  79. {
  80. returnthis.dataRows;
  81. }
  82. @Override
  83. publicintgetTotalPages()
  84. {
  85. returnthis.totalPages;
  86. }
  87. @Override
  88. publicintgetTotalRecords()
  89. {
  90. returnthis.totalRecords;
  91. }
  92. }


注意看注释。

struts.xml的配置:

Xml代码
  1. < constant name = "struts.i18n.encoding" value = "utf-8" > </ constant >
  2. < package name = "json" namespace = "/json" extends = "json-default" >
  3. < action name = "jqgrid" class = "com.polaris.jqgrid.struts2.JqGridForJSONAction" >
  4. < result type = "json" > </ result >
  5. </ action >
  6. </ package >
  1. <constantname="struts.i18n.encoding"value="utf-8"></constant>
  2. <packagename="json"namespace="/json"extends="json-default">
  3. <actionname="jqgrid"class="com.polaris.jqgrid.struts2.JqGridForJSONAction">
  4. <resulttype="json"></result>
  5. </action>
  6. </package>


说明:1)设置字符编码,否则会乱码;2)package要继承自json-default,json-default在struts2- json-plugin中有定义;3)result的type必须为json,表示返回数据类型为json,然而视图映射留空(即result不能对应一个视图)

web.xml中struts2核心过滤器的配置:

Xml代码
  1. < filter >
  2. < filter-name > struts2 </ filter-name >
  3. < filter-class >
  4. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  5. </ filter-class >
  6. </ filter >
  7. < filter-mapping >
  8. < filter-name > struts2 </ filter-name >
  9. < url-pattern > /* </ url-pattern >
  10. </ filter-mapping >
  1. <filter>
  2. <filter-name>struts2</filter-name>
  3. <filter-class>
  4. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  5. </filter-class>
  6. </filter>
  7. <filter-mapping>
  8. <filter-name>struts2</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>


你可能会发现,此处配置的过滤器类名和网上很多地方说的不一样。的确,我用的struts2是2.1.8。自从2.1.3开始,原来的过滤器 FilterDispatcher被标注为:Deprecated

结语:

至此jqGrid告一段落,不好之处请指正。如有什么问题,可以联系我,我们一起讨论。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics