为何要使用分页?
数据方面的原因
增强用户使用体验需要,根据需要获取
浏览器—>网络—>服务器 减小网络和服务器压力,节省数据IO和网络传输时间时间
不同的分页方式 传统分页 明确的获取数据信息,如有多少条数据,分多少页显示等。
下拉式分页 无法明确的获取数据数量相关的信息,但是在分页操作以后,仍然可以看到之前查询的数据。
常见的分页实现方式
使用List接口中sublist(int startIndex,int endIndex)方法实现分页。
直接使用数据库SQL语句实现分页
使用hibernate,mybatis等框架实现跨数据库的分页1 2 Mysql:Select * from t_student limit 0,10 Psql:Select * from t_student limit 10 offset 0
传统sublist分页实现 参数说明 对任意可分数据类型T, 初始化参数 pageSize:前台传输过来 pageNum:前台传输过来 currentPage = pageNum > totalPage ? totalPage : pageNum dataList:后台传输过来 totalRecord = dataList.size() totalPage = totalRecord % pageSize?totalRecord / pageSize : totalRecord / pageSize + 1
过程分析 前台: T:判定参数,如gender = “male” pageSize:前台传输过来 pageNum:前台传输过来 提交
Servlet容器: 处理并调用持久层ServiceImpl方法取数据
后台: 生成sql语句,完成参数查询,返回Pager
Servlet容器: Servlet包装数据到request里面
前台: 根据参数去显示当前页数据
源代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 import java.io.Serializable; import java.util.List; public class Pager<T> implements Serializable { /** * */ private static final long serialVersionUID = -6150972860315433465L; private int pageSize;//每页显示多少条数据 private int currentPage;//当前第几页数据 private int totalRecord;//一共多少条记录 private int totalPage;//一共多少页记录 private List<T> dataList;//要显示的数据 public Pager () { super(); } public Pager(int pageNum,int pageSize, List<T> source ) { if (source == null){ return ; } this.pageSize = pageSize; this.totalRecord = source.size(); this.pageSize = pageSize; //总页数 this.totalPage = this.totalRecord/this.pageSize; if (this.totalRecord % this.pageSize != 0){ this.totalPage += 1; } //当前页数 if (this.totalPage < pageNum){ this.currentPage = this.totalPage; }else { this.currentPage = pageNum; } int fromIndex = this.pageSize * (this.currentPage - 1); int toIndex; if (this.pageSize * this.currentPage > this.totalRecord){ toIndex = this.totalRecord; }else { toIndex = this.pageSize * this.currentPage; } this.dataList = source.subList(fromIndex, toIndex); } public Pager(int pageSize, int currentPage, int totalRecord, int totalPage, List<T> dataList) { super(); this.pageSize = pageSize; this.currentPage = currentPage; this.totalRecord = totalRecord; this.totalPage = totalPage; this.dataList = dataList; } public int getPageSize () { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public int getCurrentPage () { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalRecord () { return totalRecord; } public void setTotalRecord(int totalRecord) { this.totalRecord = totalRecord; } public int getTotalPage () { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public List<T> getDataList () { return dataList; } public void setDataList(List<T> dataList) { this.dataList = dataList; } }
后台sql分页
取分页记录1 select * from table where 1 = 1[ and gender=male][ and username="a" ] limit (pageNum-1) * pageSize, pageSize;
取总的记录数1 select count(*) as totalRecord from table where 1 = 1[ and gender=male][ and username="a" ]
注:[]内的都是可选条件,1,2步骤的可选条件是一致的。
完整的源代码 maven项目pager-webapp
曾遇到的问题
JQuery选取元素 $(“#id”).attr(“action”,”property”);
遇到了浏览器重复重定位,清除浏览器缓存,clean tomcat项目再试!
将长整形转为整形 int intNumber = ((Number)(LongNumber)).intValue();