[置頂] springmvc 分頁查詢的簡單實現
阿新 • • 發佈:2019-01-09
目前較常用的分頁實現辦法有兩種:
1.每次翻頁都修改SQL,向SQL傳入相關引數去資料庫實時查出該頁的資料並顯示。
2.查出資料庫某張表的全部資料,再通過在業務邏輯裡面進行處理去取得某些資料並顯示。
對於資料量並不大的簡單的管理系統而言,第一種實現方法相對來說容易使用較少的程式碼實現分頁這一功能,本文也正是為大家介紹這種方法:
程式碼片段:
1,Page.java
3.PageUtil.java
4.DefaultController.java 此部分可以靈活使用
使用方法:
5,Controller.java
6.maybatis中幾條查詢語句
7.前臺頁面index.jsp
8,引用的Page.jsp
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
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
/** * 分頁工具類 * @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 此部分可以靈活使用
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
/**
* 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中幾條查詢語句
//分頁查詢
<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
//只需在頁面佈局新增該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
<%@ 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>