不少時候咱們都會用到分頁,模版渲染有的用的是jsp,velocity,freemarker。。。html
今天搞了下分頁的發現有點燒腦,哈。 首前後臺進行分頁的時候會直接在sql裏面實現,這個都大同小異,這裏來講下在內存中分頁,先上代碼:前端
/** * 內存分頁,從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
<#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>
/** * 分頁工具 * @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