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.     <table id="gridTable"></table>  
  3.     <div id="gridPager"></div>  
  4. </body>  
<body>
	<table id="gridTable"></table>
	<div id="gridPager"></div>
</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 plain copy print ?
  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. })  
$(function()
{
	$("#gridTable").jqGrid({
		url:'json/jqgrid.action',
		datatype: "json",
		height: 250,
		colNames:['编号','用户名', '性别', '邮箱', 'QQ','手机号','出生日期'],
		colModel:[
			{name:'id',index:'id', width:60, sorttype:"int"},
			{name:'userName',index:'userName', width:90},
			{name:'gender',index:'gender', width:90},
			{name:'email',index:'email', width:125,sorttype:"string"},
			{name:'QQ',index:'QQ', width:100},		
			{name:'mobilePhone',index:'mobilePhone', width:120},		
			{name:'birthday',index:'birthday', width:100, sorttype:"date"}
		],
		sortname:'id',
		sortorder:'asc',
		viewrecords:true,
		rowNum:10,
		rowList:[10,20,30],
		jsonReader: {
			root:"dataRows",		// 数据行(默认为:rows)
			page: "curPage",  	// 当前页
			total: "totalPages",  // 总页数
			records: "totalRecords",  // 总记录数
			repeatitems : false		// 设置成false,在后台设置值的时候,可以乱序。且并非每个值都得设
		},
		prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"},
		pager:"#gridPager",
		caption: "jqGrid与Struts2集成"
}).navGrid('#gridPager',{edit:false,add:false,del:false});
})


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

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

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.opensymphony.xwork2.ActionSupport;
import com.polaris.jqgrid.util.Page;

/**
 * <p>
 * 该类是所有需要返回json数据的Action的<b>抽象基类</b>。在展示数据时,使用了jQuery的插件jqGrid,
 * 它对返回的json数据格式有一定的要求。该基类就处理了这些统一的格式要求。
 * 需要返回json格式数据被jqGrid使用的,应该继承该类。<br/>
 * <b><font color='red'>注意:所有子类应该实现以下get方法,并只简单的返回相应的属性值。</font></b>
 * <ul>
 * 	<li>{@link JsoBaseAction#getTotalPages()}</li>
 * 	<li>{@link JsoBaseAction#getCurPage()}</li>
 * 	<li>{@link JsoBaseAction#getTotalRecords()}</li>
 * 	<li>{@link JsoBaseAction#getDataRows()}</li>
 * </ul>
 * 之所以将这些get方法定义为抽象的,是因为struts2的json插件只会序列化Action类,而不会序列化其父类。
 * </p>
 * 
 * <p><font color='red'>
 * 继承该类的Action方法,除了搜索(它需要返回JSON数据,因此可以返回SUCCESS),其他操作都应该返回null而不是SUCCESS之类的。
 * 这意味着struts配置中,result什么也不用配,即没有相应的视图资源——这是AJAX请求。
 * </font></p>
 * 
 * <p>
 * 该类定义了以下几个字段:totalPages、curPage、totalRecords和dataRows。
 * 这几个字段是jqGrid格式的要求,而此处是自定义的。因此,在配置jqGrid接收服务器
 * 返回的数据格式时,应该配置成这几个名字。(因为默认名字不是这样的,默认名字为:page,total,records,rows)
 * 当然,也可以通过@JSON注解来指定与默认一样的名字
 * </p>
 * 
 * <p>
 * 另外一个字段page,则是一个分页类。因为jqGrid会向服务器端传递分页参数,
 * 用一个分页类接收这些参数。同样,为使Struts能够为page赋值,需要修改jqGrid默认的分页参数名。
 * jqGrid默认分页名为:(默认定义在options参数中的prmNames数组中)
 * <ul>
 * 	<li>page->显示第几页</li>
 * 	<li>rows->每页显示几条记录</li>
 * 	<li>sidx->排序字段</li>
 * 	<li>sord->排序方式(asc/desc)</li>
 * </ul>
 * 应用中应该根据{@link com.polaris.jqgrid.util.Page}类中的定义设置。设置为:
 * prmNames:{rows:"page.pageSize",page:"page.curPageNo",sort:"page.orderBy",order:"page.order"}
 * 
 * prmNames数组的默认值为:
 * prmNames: {page:"page",rows:"rows", sort: "sidx",order: "sord", search:"_search", nd:"nd", npage:null}
 * </p>
 * 
 * @author xuxinhua
 * @version 1.0
 */
@SuppressWarnings("unchecked")
public abstract class JsonBaseAction extends ActionSupport
{
	private static final long serialVersionUID = 1L;
	
	/**
	 * 该属性专门用于接收删除的数据的ID(主键)。注意,当支持一次删除多记录时,id的值是通过','号分隔的多个
	 */
	protected String id;
	
	/**
	 * 分页类
	 */
	protected Page page = new Page();
	/**
	 * 以下属性用于序列化成json格式的数据。名称不能改。如果要改,客户端页面对应的地方也要改;
	 * 或通过@JSON来指定序列化的名字
	 */
	/**
	 * 总页数
	 */
	protected int totalPages;
	/**
	 * 显示第几页
	 */
	protected int curPage;
	/**
	 * 总记录数
	 */
	protected int totalRecords;
	/**
	 * 保存实际的数据
	 */
	protected List<Map<String,Object>> dataRows = new ArrayList<Map<String,Object>>();

	public JsonBaseAction() {
		super();
	}

	public Page getPage() {
		return page;
	}

	public void setPage(Page page) {
		this.page = page;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	
	public String getId() {
		return id;
	}

	public abstract int getTotalPages();

	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}
	
	public abstract int getCurPage();

	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}
	
	public abstract int getTotalRecords();

	public void setTotalRecords(int totalRecords) {
		this.totalRecords = totalRecords;
	}
	
	/**
	 * 注意该方法的返回值:List。实际上包含了实际的数据,
	 * 而这些数据是放在Map<String, Object>中的。
	 * 因而,子类在action方法如:execute中,应该构建一个
	 * Map<String, Object>对象,将数据放入其中,并把该对象放入
	 * List中。
	 * @return
	 */
	public abstract List<Map<String, Object>> getDataRows();

	public void setDataRows(List<Map<String, Object>> dataRows) {
		this.dataRows = dataRows;
	}

}


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

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

import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 该Struts2向客户端返回一个json对象。为了简便,数据不是从数据库获得的。
 * jqGrid默认期望返回的json对象格式要求如下:
 * {"page":"1","total":"2","records":"13",
 * "rows":[
 * 		{id:"1",cell:["1","polaris","男","polaris@gmail.com","772618379","18329382732","1985-10-2"]},
 * 		{id:"2",cell:["2","张三","女","zhangsan@163.com","272618382","15329382732","1986-10-12"]},
 * 		{id:"3",cell:["3","王五","女","wangwu@yahoo.com","172635372","13329389832","1987-12-21"]},
 * 		{id:"4",cell:["4","赵六","男","zhaoliu@sina.com","372618332","18929343731","1988-09-22"]}
 * 	]
 * }
 * 当然,在js中,可以通过jqGrid的jsonReader属性来修改默认格式
 * 因为默认的格式,rows的数据要求顺序不能变,且每个字段都得有值(空也得有"")。因而,
 * 在jsonReader中定义repeatitems : false。这样,rows就变成了:
 * "rows":[
 * 		{id:"1",userName:"polaris",gender:"男",email:"polaris@gmail.com",QQ:"772618379",mobilePhone:"18329382732",birthday:"1985-10-2"]},
 * 		{id:"2",userName:"徐新华",gender:"男",email:"xh.xu@163.com",QQ:"272618382",mobilePhone:"15329382732",birthday:"1986-10-12"]},
 * 		{id:"3",userName:"王五",gender:"女",email:"wangwu@yahoo.com",QQ:"172635372",mobilePhone:"13329389832",birthday:"1987-12-21"]},
 * 		{id:"4",userName:"赵六",gender:"女",email:"zhaoliu@sina.com",QQ:"372618332",mobilePhone:"18929343731",birthday:"1988-09-22"]}
 * 	]
 * @author xuxinhua
 *
 */
public class JqGridForJSONAction extends JsonBaseAction
{
	private static final long serialVersionUID = 132383828833L;
	
	/**
	 * 该方法得到数据并构造json对象以便返回给客户端
	 * @return 
	 * @throws Exception
	 */
	public String execute() throws Exception
	{
		// 构建几条数据
		int i = 0;
		for(i=0;i<4;++i)
		{
			// 定义一个Map<String,Object>存放一行行数据。(跟从Servlet获得数据类似,只不过此处不需要用json-lib)
			Map<String, Object> row = new HashMap<String, Object>();
			
			row.put("id", i);
			if(i%2==0)
			{
				row.put("userName", "polaris");
				row.put("gender", "女");
			}
			else
			{
				row.put("userName", "徐新华");
				row.put("gender", "男");
			}
			row.put("email", "polaris@gmail.com");
			row.put("QQ", "772"+i+"1837"+i);
			row.put("mobilePhone", "132"+i+"1837"+i+"3"+i);
			row.put("birthday", "198"+i+"-10-"+"1"+i);
			
			dataRows.add(row);
		}
		
		// 给另外三个返回参数设值
		setTotalPages(1);		// 总页数
		setCurPage(1);			// 当前页
		setTotalRecords(i);		// 总记录数
		
		return SUCCESS;
	}
	
	/*
	 * 以下getter方法必须实现,struts2-json插件会将这些getter方法序列化,以便输出json对象。
	 * 这些getter方法只需返回相应的属性即可。如getCurPage应该返回curPage
	 * (curPage在JsonBaseAction中有定义)
	 */
	@Override
	public int getCurPage() 
	{
		return this.curPage;
	}

	@Override
	public List<Map<String, Object>> getDataRows() 
	{
		return this.dataRows;
	}

	@Override
	public int getTotalPages() 
	{
		return this.totalPages;
	}

	@Override
	public int getTotalRecords() 
	{
		return this.totalRecords;
	}
}


注意看注释。

struts.xml的配置:

Xml代码
  1. < constant   name = "struts.i18n.encoding"   value = "utf-8" > </ constant >    
  2.   
  3. < package   name = "json"   namespace = "/json"   extends = "json-default" >   
  4.     < action   name = "jqgrid"   class = "com.polaris.jqgrid.struts2.JqGridForJSONAction" >   
  5.         < result   type = "json" > </ result >   
  6.     </ action >   
  7. </ package >   
  1. <constant name="struts.i18n.encoding" value="utf-8"></constant>   
  2.   
  3. <package name="json" namespace="/json" extends="json-default">  
  4.     <action name="jqgrid" class="com.polaris.jqgrid.struts2.JqGridForJSONAction">  
  5.         <result type="json"></result>  
  6.     </action>  
  7. </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.   
  8. < filter-mapping >   
  9.     < filter-name > struts2 </ filter-name >   
  10.     < url-pattern > /* </ url-pattern >   
  11. </ 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.   
  8. <filter-mapping>  
  9.     <filter-name>struts2</filter-name>  
  10.     <url-pattern>/*</url-pattern>  
  11. </filter-mapping>  


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

结语:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值