현재 일반적으로 사용되는 페이징 구현 방법은 두 가지가 있습니다.
1. 페이지를 넘길 때마다 SQL을 수정하고, 해당 매개변수를 SQL에 전달하여 데이터베이스로 이동하여 알아봅니다. 페이지의 데이터를 실시간으로 표시합니다.
2. 데이터베이스의 특정 테이블에 있는 데이터를 모두 찾아 비즈니스 로직으로 처리하여 특정 데이터를 얻어서 표시합니다.
소량의 데이터를 사용하는 간단한 관리 시스템의 경우 첫 번째 구현 방법은 상대적으로 적은 코드를 사용하여 페이징 기능을 구현하는 방법입니다.
코드 조각:
1, Page.java
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, 인용 페이지 .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>
위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되기를 바랍니다. 또한 모든 분들이 PHP 중국어 웹사이트를 지지해 주시길 바랍니다.
springmvc 페이징 쿼리의 간단한 구현 예제 코드와 관련된 더 많은 기사를 보려면 PHP 중국어 사이트를 주목하세요!