(十二) 表格分页及与服务器交互

(3) 表格分页
 一次性将成千上万条数据显示在Grid里,然后拖动滚动条查看数据,显然不是什么好主意,在效率上也是不允许的。实际上,Grid控件对性能的要求较高。如果在一个页面上放3个Grid,就可以感觉到响应变慢。如果在每个Grid里显示上千条数据,效率就可想而知了。所以说分页是必不可少的,而EXT提供了方便的集成分页工具条的方式。

下面看一个完整的分页示例:
首先完成一些后台的准备工作,包括数据库表,DAO等。
Student表结构如下:
CREATE TABLE `student` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(50) NOT NULL,
  `age` int(2) NOT NULL,
  `gender` char(1) NOT NULL,
  `email` varchar(50) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name_index` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

其它类略

page.html
<html>
  <head>
    <title>page.html</title>
 
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="this is my page">
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="ext2/resources/css/ext-all.css" />
    <script type="text/javascript" src="ext2/adapter/ext/ext-base.js"></script>
    <script type="text/javascript" src="ext2/ext-all.js"></script>
    <script type="text/javascript" src="ext2/build/locale/ext-lang-zh_CN.js"></script>
 <script type="text/javascript" src="page.js" charset="gbk"></script> 
  </head>
  <body>
    <div id="grid"></div>
  </body>
</html>

page.js
  Ext.onReady(function(){
     var cm = new Ext.grid.ColumnModel([
         {header:'编号',dataIndex:'id',sortable:true},
         {header:'名称',dataIndex:'name',sortable:true},
         {header:'年龄',dataIndex:'age',sortable:true},
         {header:'性别',dataIndex:'gender',sortable:true},
         {header:'邮箱',dataIndex:'email',sortable:true}
     ]);

     var store = new Ext.data.Store({
      proxy:new Ext.data.HttpProxy({url:'servlet/StudentServlet'}),
         reader: new Ext.data.JsonReader({
          totalProperty:'totalProperty',
          root:'root'
         }, [
             {name: 'id'},
             {name: 'name'},
             {name: 'age'},
             {name: 'gender'},
             {name: 'email'}
         ])
     });

     var grid = new Ext.grid.GridPanel({
         renderTo: 'grid',
         autoHeight: true,
         width:500,
         store: store,
         cm: cm,
         bbar: new Ext.PagingToolbar({
             pageSize: 5,
             store: store,
             displayInfo: true,
             displayMsg: '显示第 {0} 条到 {1} 条记录,共 {2} 条',
             emptyMsg: "没有记录"
         }),
         tbar: new Ext.PagingToolbar({
             pageSize: 5,
             store: store,
             displayInfo: true,
             displayMsg: '显示第 {0} 条到 {1} 条记录,共 {2} 条',
             emptyMsg: "没有记录"
         })
     });
     store.load({params:{start:0,limit:5}});
 });

(4) 与服务器交互
在实际的应用中,表格中的数据一般都是直接存放在数据库表或服务器的文件中。因此,在使用表格控件的时候经常需要与服务器进行交互。ExtJS 使用Ajax 方式提供了一套与服务器交互的机制,也就是可以不用刷新页面,就可以访问服务器的程序进行数据读取或数据保存等操作。比如前面在表格中显示xml 文档中数据的例子中,就是一个非常简单的从服务器端读取数据的例子,再回顾一下代码:
 var store=new Ext.data.Store({
  url: 'test.xml',
  reader:new Ext.data.XmlReader(
   {record:"row"},
   ["id","name","organization","homepage"]
  )
 });

因为Sote 组件接受一个参数url,如果设置url,则ExtJS 会创建一个与服务器交互的Ext.data.HttpProxy 对象,该对象通过指定的Connection 或Ext.Ajax.request 来向服务端发送请求,从而可以读取到服务器端的数据。经验表明,服务器端产生JSon 数据是一种非常不错的选择,也就是说假如服务器的url“student.jsp?cmd=list”产生下面的JSON 数据输出:
{results:[
 {id:1,name:'小王',email:'xiaowang@yahoo.com',sex:'男',bornDate:'1991-4-4'},
 {id:1,name:'小李',email:'xiaoli@yahoo.com',sex:'男',bornDate:'1992-5-6'},
 {id:1,name:'小兰',email:'xiaoxiao@yahoo.com',sex:'女',bornDate:'1993-3-7'}
] }

则前面显示学习信息编辑表格的store 可以创建成下面的形式:
var store=new Ext.data.Store({
 url:"student.jsp?cmd=list",
 reader:new Ext.data.JsonReader({
 root:"result"},
 ["id","name","organization","homepage"])
});

或者:
var store=new Ext.data.JsonStore({
 url:"student.jsp?cmd=list",
 root:"result",
 fields:["id","name","organization","homepage"]
});

其中root 表示包含记录集数据的属性。
如果在运行程序中需要给服务器端发送数据的时候,此时可以直接使用ExtJS 中提供的Ext.Ajax 对象的request 方法。
比如下面的代码实现放服务器的student.jsp?cmd=save 这个url发起一个请求,并在params 中指定发送的Student 对象:
index.jsp
Ext.onReady(function(){
 Ext.get("btn").on("click",function(){
  Ext.Ajax.request({
   url:'student.jsp?cmd=save',
   method:"post",
   success:sFn,
   failure:fFn,
   params:{name:'小李',email:'xiaoli@163.com',bornDate:'1992-5-6',sex:'男'}
  });
 });
 });
function sFn(){
 alert("保存成功");
  }
 function fFn(){
 alert("保存失败");
  }


<input type="button" id="btn" value="ext ajax"/>

student.jsp
<%
 request.setCharacterEncoding("UTF-8");
 String name = request.getParameter("name");
 String sex = request.getParameter("sex");
 String bornDate = request.getParameter("bornDate");
 String email = request.getParameter("email");
 System.out.println("name:"+name);
 System.out.println("sex:"+ sex);
 System.out.println("bornDate:"+bornDate);
 System.out.println("email:"+email);
%>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值