freemarker實現分頁 jsp實現分頁 java內存分頁

不少時候咱們都會用到分頁,模版渲染有的用的是jsp,velocity,freemarker。。。html

今天搞了下分頁的發現有點燒腦,哈。 首前後臺進行分頁的時候會直接在sql裏面實現,這個都大同小異,這裏來講下在內存中分頁,先上代碼:前端

java內存分頁: 經過傳入查詢出來的總的list數據,頁碼頁數來獲得當頁的list數據。

/**
 * 內存分頁,從1開始
 * @param list list
 * @param pageIndex 頁碼
 * @param pageSize 頁數
 * @param  T
 * @return T
 */
public static  List pagination(List list, int pageIndex, int pageSize){
    final int totalSize = list.size();
    pageIndex = pageIndex <= 1 ? 1 : pageIndex;
    int startIndex = Math.max((pageIndex - 1) * pageSize, 0);
    startIndex = Math.min(startIndex, totalSize);
    int endIndex = startIndex + pageSize;
    endIndex = Math.min(endIndex, totalSize);
    return list.subList(startIndex, endIndex);
}

####後臺獲得數據以後須要由前端渲染獲得分頁html代碼,下面是分別使用freemarker和jsp的實現.java

  1. 使用freemarker,能夠定義分頁宏方便的解決這個問題。
<#macro page pageUrl totalCount pageIndex pageSize>

   <#-- 頁碼爲小於1的,惡意翻頁的狀況直接退出 -->
   <#if pageIndex<=0>
      <#assign pageIndex=1>
   </#if>
   <#-- 數量大於總數量,惡意翻頁的狀況直接退出 -->
   <#if ((pageIndex*pageSize-totalCount)>pageSize)>
      <#return>
   </#if>
   <#-- 只有一頁的數據就不顯示分頁了 -->
   <#if (totalCount<=pageSize)>
      <#return>
   </#if>
   <nav class="nav-pagination">
      <ul class="pagination">
      <#assign pageCount=(totalCount/pageSize)?ceiling>
      <#if (pageIndex>1)>
         <li><a href="${pageUrl+1}" title="首頁"><<</a></li>
      </#if>
      <#if (pageIndex>5)>
         <#assign prevPages=pageIndex-9>
         <#if prevPages lt 1>
            <#assign prevPages=1>
         </#if>
         <#assign start=pageIndex-4>
         <li><a href="${pageUrl+prevPages?c}" title="向前5頁">...</a></li>
      <#else>
         <#assign start=1>
      </#if>
      <#-- 顯示當前頁附近的頁-->
      <#assign end=pageIndex+4>
      <#if (end>pageCount)>
         <#assign end=pageCount>
      </#if>
      <#list start..end as index>
         <#if pageIndex==index>
            <li class="active"><a href="${pageUrl+index?c}"><b>${index?c}</b></a></li>
         <#elseif index!=0>
            <li><a href="${pageUrl+index?c}">${index?c}</a></li>
         </#if>
      </#list>
      <#--若是後面頁數過多,顯示"...":-->
      <#if (end lt pageCount)>
         <#assign endend=end+4>
         <#if (endend>pageCount)>
            <#assign endend=pageCount>
         </#if>
         <li><a href="${pageUrl+endend?c}" title="向後5頁">...</a><li>
      </#if>
      <#-- 顯示"下一頁":-->
      <#if (pageIndex lt pageCount)>
         <li><a href="${pageUrl+pageCount?c}" title="末頁">>></a></li>
      </#if>
      </nav>
</#macro>
  1. 使用jsp,這裏我是直接在java代碼裏實現的分頁插件。
/**
     * 分頁工具
     * @param pageUrl
     * @param pageIndex
     * @param pageSize
     * @param totalCount
     * @return string
     */
    public static String page(String pageUrl,int pageIndex,int pageSize,long totalCount){
        StringBuilder stringBuilder = new StringBuilder("");
        if( pageIndex<=0 ){
            pageIndex=1;
        }
        if( (pageIndex*pageSize-totalCount) >pageSize ){
            return stringBuilder.toString();  // 惡意翻頁
        }
        if( totalCount<=pageSize ){
            return stringBuilder.toString();  //只有一頁就不顯示了
        }
        stringBuilder.append("<div class='pagination'><ul>");
        int pageCount = (int) (totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1);
        int start;
        if(pageIndex>1) {
            stringBuilder.append("<li><a href='").append(pageUrl).append("1' title='首頁'><<</a></li>");
        }
        if( pageIndex>5 ){
            int prevPages = pageIndex-9;
            if( prevPages<1 ){
                prevPages=1;
            }
            start = pageIndex-4;
            stringBuilder.append("<li><a href='").append(pageUrl).append(prevPages).append("' title='向前5頁'>...</a></li>");
        }else{
            start=1;
        }
        int end = pageIndex+4;
        if( end>pageCount ) end=pageCount;
        for(int index=start;index<=end;index++){
            if( pageIndex==index ){
                stringBuilder.append("<li class='active'><a href='")
                        .append(pageUrl).append(index)
                        .append("'><b>").append(index)
                        .append("</b></a></li>");
            }else if(index!=0){
                stringBuilder.append("<li><a href='").append(pageUrl).append(index).append("'>").append(index).append("</a></li>");
            }
        }
        if( end<pageCount ){
            int endFive = end+4;
            if( end>pageCount ){
                endFive=pageCount;
            }
            stringBuilder.append("<li><a href='").append(pageUrl).append(endFive).append("' title='向後5頁'>...</a><li>");
        }
        if( pageIndex<pageCount ){
            stringBuilder.append("<li><a href='").append(pageUrl).append(pageCount).append("' title='末頁'>>></a></li>");
        }
        stringBuilder.append("</ul></div>");
        return stringBuilder.toString();
    }

像這樣就能夠了,至於傳入的url是什麼鬼,好比"index.jsp?p="或者"index.jsp?type=XXX&t=XXX&p="sql

這裏我本身定義的頁碼參數是p,看本身心情嘍。app

總之無論你使用何種方法,這幾個參數是須要的:傳入的須要拼接的url,頁碼pageIndex,一頁顯示多少數據pageSize,  總共多少totalCount.jsp

https://www.yuxianghe.net/article/23工具

相關文章
相關標籤/搜索