少年游

欲买桂花同载酒,终不似,少年游。

0%

Java分页原理

为何要使用分页?

  1. 数据方面的原因
  2. 增强用户使用体验需要,根据需要获取
  3. 浏览器—>网络—>服务器 减小网络和服务器压力,节省数据IO和网络传输时间时间

不同的分页方式

传统分页

明确的获取数据信息,如有多少条数据,分多少页显示等。

下拉式分页

无法明确的获取数据数量相关的信息,但是在分页操作以后,仍然可以看到之前查询的数据。

常见的分页实现方式

  1. 使用List接口中sublist(int startIndex,int endIndex)方法实现分页。
  2. 直接使用数据库SQL语句实现分页
  3. 使用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. 取分页记录
    1
    select * from table where 1 = 1[ and gender=male][ and username="a"] limit (pageNum-1) * pageSize, pageSize; 
  2. 取总的记录数
    1
    select count(*) as totalRecord from table where 1 = 1[ and gender=male][ and username="a"]
    注:[]内的都是可选条件,1,2步骤的可选条件是一致的。

完整的源代码

maven项目pager-webapp

曾遇到的问题

  1. JQuery选取元素 $(“#id”).attr(“action”,”property”);
  2. 遇到了浏览器重复重定位,清除浏览器缓存,clean tomcat项目再试!
  3. 将长整形转为整形 int intNumber = ((Number)(LongNumber)).intValue();