IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    springmvc 分页查询的简单实现

    summer发表于 2016-06-23 04:09:07
    love 0

    目前较常用的分页实现办法有两种:

     
      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,引用的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>


沪ICP备19023445号-2号
友情链接