目前较常用的分页实现办法有两种:
1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示。
2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数据并显示。
对于数据量并不大的简单的管理系统而言,第一种实现方法相对来说容易使用较少的代码实现分页这一功能,本文也正是为大家介绍这种方法:
代码片段:
1,Page.java
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
|
package com.cm.contract.common;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
/**分页类
* @author FENGWEI
* @date 2016-5-23
*/
public class Page implements java.io.Serializable{
private static final long serialVersionUID = 1L;
//前一页
private Boolean hasPrePage;
//后一页
private Boolean hasNextPage;
//每页显示多少条:默认20条
private Long everyPage = 20L;
//总页数
private Long totalPage;
//当前第多少页:默认第1页
private Long currentPage = 1L;
//开始下标
private Long beginIndex;
//结束下标
private Long endinIndex;
//总共多少条
private Long totalCount;
//排序列名
private String sortName;
//排序状态
private String sortState;
//排序信息
private String sortInfo;
//是否排序
private Boolean sort = false ;
private String defaultInfo = " " ;
public String getDefaultInfo() {
return defaultInfo;
}
public void setDefaultInfo(String defaultInfo) {
this .defaultInfo = defaultInfo;
}
public String getSortInfo() {
return sortInfo;
}
public void setSortInfo(String sortInfo) {
this .sortInfo = sortInfo;
}
public String getSortName() {
return sortName;
}
public void setSortName(String sortName) {
setPageSortState(sortName);
}
public String getSortState() {
return sortState;
}
public void setSortState(String sortState) {
this .sortState = sortState;
}
public Page() {
}
/**
* 常用,用于计算分页
* */
public Page(Long totalRecords){
this .totalCount = totalRecords;
setTotalPage(getTotalPage(totalRecords));
}
/**
* 设置每页显示多少条时使用
* */
public Page(Long everyPage,Long totalRecords){
this .everyPage = everyPage;
this .totalCount = totalRecords;
setTotalPage(getTotalPage(totalRecords));
}
/**
* @param state 状态码
* @param value 到第多少页或者设置每页显示多少条或者为排序列名
*/
public void pageState( int index,String value) {
sort = false ;
switch (index) {
case 0 :setEveryPage(Long.parseLong(value)); break ;
case 1 :first(); break ;
case 2 : previous(); break ;
case 3 : next(); break ;
case 4 : last(); break ;
case 5 : sort = true ;sort(value); break ;
case 6 : //到指定第多少页
setCurrentPage(Long.parseLong(value));
break ;
}
}
/**
* 最前一页
*/
private void first() {
currentPage = 1L;
}
private void previous() {
currentPage--;
}
private void next() {
currentPage++;
}
private void last() {
currentPage = totalPage;
}
private void sort(String sortName) {
//设置排序状态
setPageSortState(sortName);
}
/**
* 计算总页数
* */
private Long getTotalPage(Long totalRecords) {
Long totalPage = 0L;
everyPage = everyPage == null ? 10L : everyPage;
if (totalRecords % everyPage == 0 )
totalPage = totalRecords / everyPage;
else {
totalPage = totalRecords / everyPage + 1 ;
}
return totalPage;
}
public Long getBeginIndex() {
this .beginIndex = (currentPage - 1 ) * everyPage;
return this .beginIndex;
}
public void setBeginIndex(Long beginIndex) {
this .beginIndex = beginIndex;
}
public Long getCurrentPage() {
this .currentPage = currentPage == 0 ? 1 : currentPage;
return this .currentPage;
}
public void setCurrentPage(Long currentPage) {
if ( 0 == currentPage){
currentPage = 1L;
}
this .currentPage = currentPage;
}
public Long getEveryPage() {
this .everyPage = everyPage == 0 ? 10 : everyPage;
return this .everyPage;
}
public void setEveryPage(Long everyPage) {
this .everyPage = everyPage;
}
public Boolean getHasNextPage() {
this .hasNextPage = (currentPage != totalPage) && (totalPage != 0 );
return this .hasNextPage;
}
public void setHasNextPage(Boolean hasNextPage) {
this .hasNextPage = hasNextPage;
}
public Boolean getHasPrePage() {
this .hasPrePage = currentPage != 1 ;
return this .hasPrePage;
}
public void setHasPrePage(Boolean hasPrePage) {
this .hasPrePage = hasPrePage;
}
public Long getTotalPage() {
return this .totalPage;
}
public void setTotalPage(Long totalPage) {
if ( this .currentPage > totalPage){
this .currentPage = totalPage;
}
this .totalPage = totalPage;
}
public Long getTotalCount() {
return this .totalCount;
}
public void setTotalCount(Long totalCount) {
setTotalPage(getTotalPage(totalCount));
this .totalCount = totalCount;
}
@Override
public String toString() {
return ToStringBuilder.reflectionToString( this );
}
/**
* 设置排序状态
* */
private void setPageSortState(String newPageSortName){
//判断之前的排序字段是否为空
if (StringUtils.isEmpty(sortName)){
//默认排序为升序
this .sortState = PageUtil.ASC;
this .sortInfo = PageUtil.PAGE_ASC;
} else {
if (StringUtils.equalsIgnoreCase(newPageSortName, sortName)){
//判断sortState排序状态值
if (StringUtils.equalsIgnoreCase(sortState, PageUtil.ASC)){
this .sortState = PageUtil.DESC;
this .sortInfo = PageUtil.PAGE_DESC;
} else {
this .sortState = PageUtil.ASC;
this .sortInfo = PageUtil.PAGE_ASC;
}
} else {
//默认
this .sortState = PageUtil.ASC;
this .sortInfo = PageUtil.PAGE_ASC;
}
}
sortName = newPageSortName.toLowerCase();
}
public Boolean isSort() {
return sort;
}
public void setSort(Boolean sort) {
this .sort = sort;
}
public Long getEndinIndex() {
this .endinIndex = (currentPage) * everyPage;
return endinIndex;
}
public void setEndinIndex(Long endinIndex) {
this .endinIndex = endinIndex;
}
}
|
2.PageState.java
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
|
package com.cm.contract.common;
import org.apache.commons.lang.StringUtils;
/**分页状态类
* @author FENGWEI
* @date 2016-5-23
*/
public enum PageState {
/**
* 设置每页显示多少条
* */
SETPAGE,
/**
* 首页
* */
FIRST,
/**
* 向前一页
* */
PREVIOUS,
/**
* 向后一页
* */
NEXT,
/**
* 末页
* */
LAST,
/**
* 排序
* */
SORT,
/**
* 到第多少页
* */
GOPAGE;
/**
* @param value 索引名称
* @return 返回索引下标
*/
public static int getOrdinal(String value) {
int index = - 1 ;
if (StringUtils.isEmpty(value)) {
return index;
}
String newValue = StringUtils.trim(value).toUpperCase();
try {
index = valueOf(newValue).ordinal();
} catch (IllegalArgumentException e) {}
return index;
}
}
|
3.PageUtil.java
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
|
/**
* 分页工具类
* @author FENGWEI
* @date 2016-5-23
*/
public class PageUtil {
public static final String ASC = "asc" ;
public static final String DESC = "desc" ;
public static final String PAGE_DESC = "↓" ;
public static final String PAGE_ASC = "↑" ;
public static final String PAGE_NULL = " " ;
public static final String SESSION_PAGE_KEY = "page" ;
/**
* 初始化分页类
* @param initPageSql 未分页的查询SQL
* @param totalCount 总行数
* @param index 分页状态
* @param value 只有在设置每页显示多少条时,值不会NULL,其它为NULL
*/
public static Page inintPage(Long totalCount,Integer index,String value,Page sessionPage){
Page page = null ;
if (index < 0 ){
page = new Page(totalCount);
} else {
/**每页显示多少条*/
Long everPage = null == value ? 10 : Long.parseLong(value);
/**获取Session中的分页类,方便保存页面分页状态*/
page = sessionPage;
page.setEveryPage(everPage);
page.setTotalCount(totalCount);
}
return page;
}
/**
* 当页点击:首页,前一页,后一页,末页,排序,到第多少页时进行分页操作
* @param index 分页状态
* @param value 排序字段名或者到第多少页
*/
public static Page execPage( int index,String value,Page sessionPage){
Page page = sessionPage;
/**调用方法进行分页计算*/
page.pageState(index,value);
return page;
}
}
|
4.DefaultController.java 此部分可以灵活使用
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
|
package com.cm.contract.common;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.ModelAttribute;
/**
* 提取公用的request和response Title:DefaultController Descrption:
*
* @author FENGWEI
* @date 2016-5-6下午3:30:32
*/
public class DefaultController {
/**
* oracel的三层分页语句 子类在展现数据前,进行分页计算!
*
* @param querySql
* 查询的SQL语句,未进行分页
* @param totalCount
* 根据查询SQL获取的总条数
* @param columnNameDescOrAsc
* 列名+排序方式 : ID DESC or ASC
*/
protected Page executePage(HttpServletRequest request, Long totalCount) {
if ( null == totalCount) {
totalCount = 0L;
}
/** 页面状态,这个状态是分页自带的,与业务无关 */
String pageAction = request.getParameter( "pageAction" );
String value = request.getParameter( "pageKey" );
/** 获取下标判断分页状态 */
int index = PageState.getOrdinal(pageAction);
Page page = null ;
/**
* index < 1 只有二种状态 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1 2 当页面设置每页显示多少条:
* index=0,当每页显示多少条时,分页类要重新计算
* */
Page sessionPage = getPage(request);
if (index < 1 ) {
page = PageUtil.inintPage(totalCount, index, value, sessionPage);
} else {
page = PageUtil.execPage(index, value, sessionPage);
}
setSession(request, page);
return page;
}
private Page getPage(HttpServletRequest request) {
Page page = (Page) request.getSession().getAttribute(
PageUtil.SESSION_PAGE_KEY);
if (page == null ) {
page = new Page();
}
return page;
}
private void setSession(HttpServletRequest request, Page page) {
request.getSession().setAttribute(PageUtil.SESSION_PAGE_KEY, page);
}
}
|
使用方法:
5,Controller.java
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
|
/**
* model 添加的分页条件
* executePage 方法写在工具类中
* @param model
*/
@Controller
public class CMLogController extends DefaultController {
@RequestMapping ( "index.do" )
public ModelAndView userInto(ModelMap model, String username) {
nameStr = username;
model.addAttribute( "username" , nameStr);
// 分页数
Long totalCount = logService.pageCounts(model);
// 分页显示
Page page = executePage(request, totalCount);
if (page.isSort()) {
model.put( "orderName" , page.getSortName());
model.put( "descAsc" , page.getSortState());
} else {
model.put( "orderName" , "logtime" );
model.put( "descAsc" , "desc" );
}
model.put( "startIndex" , page.getBeginIndex());
model.put( "endIndex" , page.getEndinIndex());
ModelAndView mv = new ModelAndView();
// 分页查询
logList = logService.pageList(model);
mv.addObject( "logList" , logList);
mv.setViewName( "/jsp/log" );
return mv;
}}
|
6.maybatis中几条查询语句
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
|
//分页查询
< select id = "pageList" parameterType = "map" resultMap = "BaseResultMap" >
select ttt.* from(select tt.*,rownum rn from(select * from CM_LOG
< where >
< if test = "username != null and username != ''" >
<!--
特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。
在开发时使用: $,方便调试sql,发布时使用: #
-->
and username like '%${username}%'
</ if >
< if test = "type != null and type != ''" >
<!--
特别提醒一下, $只是字符串拼接, 所以要特别小心sql注入问题。
在开发时使用: $,方便调试sql,发布时使用: #
-->
AND TYPE = #{type,jdbcType=VARCHAR}
</ if >
</ where >
order by ${orderName} ${descAsc} )tt)ttt
< where >
< if test = "startIndex != null and startIndex != ''" >
rn > ${startIndex}
</ if >
< if test = "endIndex != null and endIndex != ''" >
<![CDATA[ and rn <= ${endIndex} ]]> </ if >
</ where >
</ select >
// 分页数
< select id = "pageCounts" parameterType = "map" resultType = "long" >
select count(*) from CM_LOG
< where >
< if test = "username != null and username != ''" >
and username like '%${username}%'
</ if >
</ where >
</ select >
|
7.前台页面index.jsp
1
2
3
4
5
6
7
8
9
10
11
12
|
//只需在页面布局添加该div
//username 为条件
// <jsp:param name="url" value="/log/index.do?"/> 不带条件的方式 问号必须存在
<body >
<div align= "right" style= "height: 20" >
<jsp:include page= "/jsp/page.jsp" >
<jsp:param name= "url" value= "/log/index.do?username=${username }" />
</jsp:include>
</div>
</body >
|
8,引用的Page.jsp
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
|
<%@ page language= "java" contentType= "text/html; charset=UTF-8"
pageEncoding= "UTF-8" %>
<%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %>
<c:set var = "page" value= "${sessionScope.page}" />
<c:set var = "path" value= "${pageContext.request.contextPath}" />
<c:set var = "url" value= "${param.url}" />
<c:set var = "urlParams" value= "${param.urlParams}" />
<c:set var = "pathurl" value= "${path}/${url}" />
<tr>
<td colspan= "5" >
${urlParams }
共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条
当前第${page.currentPage}页
<c:choose>
<c:when test= "${page.hasPrePage eq false}" >
<<首页 <上页
</c:when>
<c:otherwise>
<a href= "${pathurl}&pageAction=first${urlParams}" ><<首页 </a>
<a href= "${pathurl}&pageAction=previous${urlParams}" /><上一页</a>
</c:otherwise>
</c:choose>
||
<c:choose>
<c:when test= "${page.hasNextPage eq false}" >
下页> 尾页>>
</c:when>
<c:otherwise>
<a href= "${pathurl}&pageAction=next${urlParams}" >下一页> </a>
<a href= "${pathurl}&pageAction=last${urlParams}" >末页>></a>
</c:otherwise>
</c:choose>
<SELECT name= "indexChange" id= "indexChange"
onchange= "getCurrentPage(this.value);" >
<c:forEach var = "index" begin= "1" end= "${page.totalPage}" step= "1" >
<option value= "${index}" ${page.currentPage eq index ? "selected" : "" }>
第${index}页
</option>
</c:forEach>
</SELECT>
每页显示:<select name= "everyPage" id= "everyPage" onchange= "setEveryPage(this.value);" >
<c:forEach var = "pageCount" begin= "5" end= "${page.totalCount}" step= "5" >
<option value= "${pageCount}" ${page.everyPage eq pageCount ? "selected" : "" }>
${pageCount}条
</option>
</c:forEach>
</select>
</td>
</tr>
<div style= 'display: none' >
<a class=listlink id= "indexPageHref" href= '#' ></a>
</div>
<script>
function getCurrentPage(index){
var a = document.getElementById( "indexPageHref" );
a.href = '${pathurl}&pageAction=gopage&pageKey=' +index+ '${urlParams}' ;
a.setAttribute( "onclick" , '' );
a.click( "return false" );
}
function setEveryPage(everyPage){
var a = document.getElementById( "indexPageHref" );
var currentPage = document.getElementById( 'indexChange' ).value;
a.href = '${pathurl}&pageAction=setpage&pageKey=' +everyPage+ '${urlParams}' ;
a.setAttribute( "onclick" , '' );
a.click( "return false" );
}
function sortPage(sortName){
var a = document.getElementById( "indexPageHref" );
a.href = '${pathurl}&pageAction=sort&pageKey=' +sortName+ '${urlParams}' ;
a.setAttribute( "onclick" , '' );
a.click( "return false" );
}
</script>
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/fiangasdre/article/details/51741456