<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>ext-grid分页显示</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=gbk"> <link rel="stylesheet" type="text/css" href="ext4/resources/css/ext-all.css"> <script type="text/javascript" src="ext4/ext-all-debug.js"></script> <script type="text/javascript" src="js/grid.js"></script> </head> <body> <div id="topic-grid"></div> </body> </html>
说明:导入ext-all.css和ext-all-debug.js文件就可以了,grid.js是页面具体的js代码。
Ext.onReady(function(){ Ext.define('csdnModel', { extend: 'Ext.data.Model', fields: [ {name:'id',type:'int'}, {name:'username',type:'string'}, {name:'password',type:'string'}, {name:'email',type:'email'} ], idProperty: 'threadid' }); var store = Ext.create('Ext.data.Store', { storeId:'csdnStore', model:'csdnModel', pageSize:50, proxy: { type: 'ajax', url: 'csdnServlet', reader: { type:'json', root: 'users', totalProperty: 'totalCount' }, // sends single sort as multi parameter simpleSortMode: true }, }); Ext.grid.PageRowNumberer = Ext.extend(Ext.grid.RowNumberer, { renderer:function(value, cellmeta, record, rowIndex, columnIndex, store){ return (store.currentPage - 1) * store.pageSize + rowIndex + 1; } }); Ext.create('Ext.grid.Panel', { title: 'CSDN泄漏用户账户信息', titleAlgin:'center', columnLines:true, store: Ext.data.StoreManager.lookup('csdnStore'), columns: [ Ext.create('Ext.grid.PageRowNumberer',{ header:'序号', width:'80' }), {header:'ID',dataIndex:'id',hidden:true}, { header: '用户名', dataIndex: 'username',sortable:true,width:150}, { header: '密码', dataIndex: 'password', flex: 1,width:150}, { header: '注册邮箱', dataIndex: 'email',sortable:true,width:300} ], tbar:[ '-', { text: '添加', enableToggle: true, toggleHandler: function(btn, pressed) { Ext.Msg.alert('友情提示','未添加此功能!'); } },'-',{ text: '删除', enableToggle: true, toggleHandler: function(btn, pressed) { Ext.Msg.alert('友情提示','未添加此功能!'); } }], bbar: Ext.create('Ext.PagingToolbar', { store: Ext.data.StoreManager.lookup('csdnStore'), displayInfo: true, displayMsg: '正在展示CSDN泄漏用户信息 第 {0} - {1}条 共 {2} 条数据', emptyMsg: "没有任何数据", beforePageText:"第", afterPageText:"/ {0}页", firstText:"首页", prevText:"上一页", nextText:"下一页", lastText:"尾页", refreshText:"刷新", items:[ '-', { text: '添加', enableToggle: true, toggleHandler: function(btn, pressed) { Ext.Msg.alert('友情提示','未添加此功能!'); } },'-',{ text: '删除', enableToggle: true, toggleHandler: function(btn, pressed) { Ext.Msg.alert('友情提示','未添加此功能!'); } }] }), height: 570, width: 700, renderTo: Ext.getBody() }); store.loadPage(1); });
说明: (1) 首先定义了一个csdnModel继承自Ext.data.Model 它指明了后台返回的json对象有那些属性,也就是说j返回的json对象有id,username,password,email这4个属性,这决定了后台返回json对象的格式。(2) 其次定义了一个store,store非常重要,它就是数据的来源,grid最终的数据都是由store提供。在store中指明数据的格式,就是刚才定义的csdnModel,pageSize指明每页显示的数据量,我这里配置了50,每页显示50条数据。然后配置代理选项,代理项中需要指明数据来源的url,以及读取数据的方式ajax,reader是真正读取数据的东西,指明返回的是json格式的数据,root是指json对象组成的数组由“users”开始*,totalProperty指明返回数据的同时返回的数据总量的属性是什么(可以看第4步后台返回数据的格式,便于理解)。(3)接下来就要创建真正的gridPanel了 相关配置项可以参考API,在此主要说一下添加行号,分页行号是连续的。在Columns的配置项中添加了 'Ext.grid.PageRowNumberer'对象,这个类并不是EXTJS自有的 ,而是自己定义的,定义在gridPanel前面。它继承自 Ext.grid.RowNumberer,在定义的时候重写renderer,这是一个函数表格数据在渲染前会调用这个函数,然后该列就会显示函数返回的值,函数中通过计算得到该行的真实行号。行号连续效果如下:
int start = Integer.parseInt(request.getParameter("start")); int limit = Integer.parseInt(request.getParameter("limit")); int total = userDAO.getTotalOfUsers(); List userList = userDAO.getAllUser(start, limit); request.setAttribute("total", total); request.setAttribute("userList", userList); request.getRequestDispatcher("/gridDatas.jsp").forward(request, response);
public class User { private int id; private String username; private String password; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> { 'totalCount':${total }, 'users':[ <c:forEach items="${userList }" var="user"> {'id':${user.id},'username':'${user.username }','password':'${user.password }','email':'${user.email }'}, </c:forEach> ] }第2步中定义store的时候 指明 totalProperty的值为 ‘totalCount’,所以后台必须用totalCount指明数据的总量,同样第2步中store的 root选项指明根元素为 'users',所以返回的json对象的跟元素必须为users 。json对象中的属性是第1步中定义的 csdnModel中的字段值。前台定义好之后,后台的数据返回相对简单。
到此为止,所有的步骤都完成了,徒说无用,给大家看看效果:
请求数据:
数据返回展示:
添加删除等: