代码改变世界

ext网格实践

2010-02-22 17:57  乱世文章  阅读(211)  评论(0编辑  收藏  举报

打开eclipse,新建web project

1、  首先把ext2.0包拷贝到WebRoot目录:

2、  WebRoot目录下新建ext_query.html文件:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=GBK">

<title>Ext2.0查询示例</title>

    <!-- 公用CSSLib -->

    <link rel="stylesheet" type="text/css" href="./js/ext2.0/resources/css/ext-all.css" />

    <script type="text/javascript" src="./js/ext2.0/adapter/ext/ext-base.js"></script>

    <script type="text/javascript" src="./js/ext2.0/ext-all.js"></script>

    <!-- Tooltip中文提示 -->

    <script type="text/javascript" src="./js/ext2.0/build/locale/ext-lang-zh_CN-min.js"></script>

   

    <!-- 我的脚本 -->

    <script type="text/javascript" src="ext_query.js"></script>

    <!-- 我的样式 -->

    <style type="text/css">

    body{padding:10px;}

    .icon-grid {background-image:url(images/icons/fam/grid.png) !important;}

        .red{color:red; font-weight:bold;}

        .green{color:green; font-weight:bold;}

        .icon-search {background-image:url(images/icons/fam/application_go.png) !important;}

        .icon-del{background-image:url(images/icons/fam/delete.gif) !important;}

    </style>

 

</head>

<body>

    <!-- 作用不明,但是必须 -->

    <script type="text/javascript" src="./js/ext2.0/examples/examples.js"></script>

   

    <div id="grid" ></div>

    <div id="debuger"></div>

</body>

</html>

注意阴影部分代码。编辑完保存,这个文件基本上会固定不变了。

 

3、  然后使用ext API编写脚本文件ext_query.js

 

Ext.onReady(function(){

    //初始化鼠标提示

    Ext.QuickTips.init();

   

    //设置从服务器读取数据的方式,即把服务端返回的数据解析(转换)为Record格式、

    //由于namemapping的名字一样,故省略了mapping属性

    var fds = Ext.data.Record.create([

       {name:'type',type:'string'},

       {name:'id',type:'int'},

       {name:'dest',type:'string'},

       {name:'source',type:'string'},

       {name:'content',type:'string'}

       ,{name:'sendtime',type:'string'} //数据读取格式

    ]);

   

    var today = new Date().dateFormat('Y-m-d');

   

 

    //数据储备器(设置服务器端数据在客户端的缓存方式)

    var signStore = new Ext.data.JsonStore({

       url:'./ext_query.jsp',

       baseParams:{startDate:today,endDate:today,number:'',command:'query'},

       //totalProperty:'count',

       root:'records',//records是服JSONObject对象,必须是集合

       fields:fds,

       sortInfo:{field:'id',direction:'ASC'}

    });

    //全选Checkbox

    var sm = new Ext.grid.CheckboxSelectionModel({singleSelect:false});

   

    //列模型

    var columnModel = new Ext.grid.ColumnModel([

       sm,

       new Ext.grid.RowNumberer(),{

           header:'目标号码',

           dataIndex:'dest',

           width:100

       },{

           header:'源号码',

           dataIndex:'source',

           width:80

       },{

           header:'内容',

           dataIndex:'content',

           width:220

       },{

           header:'发送时间',

           dataIndex:'sendtime',

           width:80

       },{

           header:'业务类型',

           dataIndex:'type',

           width:80

       }, {

           header: "id",

           dataIndex: 'id',

           width: 50,

           hidden: true,//本列隐藏

           sortable: true

       }

    ]);

    columnModel.defaultSortable=true;

   

    //查询-开始日期

    var sdField = new Ext.form.DateField({

       id:'startDate',

       name:'startDate',

       format:'Y-m-d',

       minValue:'2008-02-01',

       maxValue:today,

       allowBlank:false,

       value:today

    });

    //查询-结束日期

    var edField = new Ext.form.DateField({

       id:'endDate',

       name:'endDate',

       format:'Y-m-d',

       minValue:'2008-02-01',

       maxValue:today,

       allowBlank:false,

       value:today

    });

    //查询-手机号

    var fldNumber=new Ext.form.TextField({

       id:'number',

       name:'number'

    });

   

    //查询按钮

    var btnSearch = new Ext.Button({

       text:'查询',

       iconCls:'icon-search',

       handler:function(){

           if(sdField.isValid() && edField.isValid()){

              signStore.baseParams.startDate=sdField.getValue().dateFormat('Y-m-d');

              signStore.baseParams.endDate=edField.getValue().dateFormat('Y-m-d');

              signStore.baseParams.number=fldNumber.getValue();

           }

           signStore.load();

       }

    });

   

    //创建Grid

    var signGrid = new Ext.grid.GridPanel({

       store:signStore,

       cm:columnModel,

       sm:sm,

       renderTo:'grid',

       width:650,

       height:440,

       title:'短信队列查询',

       frame:true,

       iconCls:'icon-grid',

       loadMask:true,

       stripeRows:true,

       tbar:[

           '日期从',sdField,' ',edField,'&nbsp;手机号&nbsp;',fldNumber,'&nbsp;&nbsp;',btnSearch,'-'

       ]

    });

   

    signStore.load();

   

});

 

以上代码比较复杂,但只需注意代码中标注的-处即可。

①设置服务端数据的读取格式(DataReader),即把服务端返回的JSONObject对象映射为Record对象;

②准备数据存储器,即规定如何从服务端获取数据并缓存到客户端的Record对象,这里会使用ajax请求获取服务端数据,且在此指定服务端url地址

③设置列模型,即数据在网格上的显示方式,并将列和Record对象的属性进行绑定

④创建grid,即把列模型和grid绑定,并设置grid的工具栏等;

 

4、  编写后台服务,这里是ext_query.jsp页面。为了简单起见,ext_query.jsp仅仅是随便生成了一些测试数据,并以JSONObject对象的格式输出:

<%@ page contentType="text/html; charset=GBK"%>

<jsp:directive.page import="org.json.*"/>

<%

    String command = request.getParameter("command");

    System.out.println("command:" + command);

    if ("query".equals(command)) {

       String startDate = request.getParameter("startDate");

       String endDate = request.getParameter("endDate");

       String number=request.getParameter("number");

       System.out.println("startdate:" + startDate + "__enddate:"

              + endDate+"__number:"+number);

       JSONArray signs = new JSONArray();

       for (int i = 0; i < 12; i++) {

           JSONObject sign = new JSONObject();

           sign.put("id",i+1).put("dest", "08712875577").put("source", "106295598")

                  .put("type","-DFTZ").put("content", "短信测试" + i).put("sendtime",

                         "2010-01-01 01:02:03.05");

           signs.put(sign);

       }

       JSONObject json = new JSONObject();

       json.put("records", signs);

       out.print(json);//输出json数据

       //System.out.print(signLog);

    }

%>

显然,大部分情况下我们的都是从数据库中得到的,这只需要对ext_query.jsp进行简单修改就可以了。

 

5、  运行工程,最终效果如下:

 

 

现在我们来给grid加上分页功能。

 

6、  首先需要修改服务端代码ext_query.jsp,在返回的JSONObject对象中加上一个totalCount属性,并根据ext传来的两个参数startlimit返回不同的页数据:

<%@ page contentType="text/html; charset=GBK"%>

<jsp:directive.page import="org.json.*"/>

<%

    String command = request.getParameter("command");

    String start=request.getParameter("start");

    start=start==null||"".equals(start)?"0":start;

    String limit=request.getParameter("limit");

    limit=limit==null||"".equals(limit)?"10":limit;

    int iStart=Integer.parseInt(start);

    int iLimit=Integer.parseInt(limit);

    int total=32;

    int max=total;

    if(iStart+iLimit<total)max=iStart+iLimit;

    System.out.println("command:" + command+" start:"+start+" limit:"+limit);

    if ("query".equals(command)) {

       String startDate = request.getParameter("startDate");

       String endDate = request.getParameter("endDate");

       String number=request.getParameter("number");

       System.out.println("startdate:" + startDate + "__enddate:"

              + endDate+"__number:"+number);

       JSONArray signs = new JSONArray();

       //System.out.println(signs.length());

       int i = iStart;

       for (; i < max; i++) {         

           JSONObject sign = new JSONObject();

           sign.put("id",i+1).put("dest", "08712875577").put("source", "106295598")

                  .put("type","-DFTZ").put("content", "短信测试" + i).put("sendtime",

                         "2010-01-01 01:02:03.05");

           signs.put(sign);

       }

       JSONObject json = new JSONObject();

       json.put("records", signs).put("totalCount",total);

       out.print(json);//输出json数据

       //System.out.print(signs.toString());

    }

%>

注意阴影部分修改的代码。运行浏览ext_query.jsp,可以看到返回的JSONObject对象最后增加了一个属性totalCount,并且根据请求参数startlimit只返回当页的数据:

 

7、  修改ext_query.js,首先增加一个全局变量:

//页大小

    var pageSize=10;

然后构建一个分页工具栏:

//构造分页工具栏

    var pagingToolbar = new Ext.PagingToolbar({

       pageSize: pageSize,

       store: signStore,

       displayInfo: true,

       displayMsg: '{0}-{1}条,一共{2}',

       emptyMsg: "没有记录",

       items: [

           '-', btnDel

       ]     

    });

在创建grid时把分页工具栏添加进去:

    //创建Grid

    var signGrid = new Ext.grid.GridPanel({

       ……

       bbar: pagingToolbar

    });

最后,在load store时需要增加两个参数startlimit

signStore.load({ params: { start: 0, limit: 10} });

 

运行效果如图:

 

 

8、  最后再完善一下。序号列每一页都从1开始,似乎不太合理,应改为记录在整个记录中的序号才合理。

首先增加一个全局变量:

//起始序号

    var record_start=0;

在构造分页工具栏时增加处理函数,使得翻页后把每次翻页的起始记录号记录下来:

//构造带分页工具栏

    var pagingToolbar = new Ext.PagingToolbar({

        ……

       doLoad : function(start){

            record_start = start;//记录每次翻页后的起始序号

              //另外,由于翻页函数被覆盖了,还需要在加载数据时传递limitstart

          var o = {}, pn = this.paramNames;

          o[pn.start] = start;

          o[pn.limit] = this.pageSize;

          this.store.load({params:o});

     }

    });

最后,修改列模型,把序号列的计算方式改为:

//列模型

    var columnModel = new Ext.grid.ColumnModel([

       ……

       new Ext.grid.RowNumberer({

            renderer:function(value,metadata,record,rowIndex){

                   return record_start + 1 + rowIndex;

            }

         }),……

    ]);

现在再来看翻页效果:

 

序号已经过重新计算了。源码下载:ext网格实践