很多时候我们都会用到分页,模版渲染有的用的是jsp,velocity,freemarker。。。
今天搞了下分页的发现有点烧脑,哈。 首先后台进行分页的时候会直接在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的实现.
- 使用freemarker,可以定义分页宏方便的解决这个问题。
<#macro page pageUrl totalCount pageIndex pageSize> <#-- 页码为小于1的,恶意翻页的情况直接退出 --> <#if pageIndex<=0> <#assign pageIndex=1> <#-- 数量大于总数量,恶意翻页的情况直接退出 --> <#if ((pageIndex*pageSize-totalCount)>pageSize)> <#return> <#-- 只有一页的数据就不显示分页了 --> <#if (totalCount<=pageSize)> <#return>
- 使用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(""); return stringBuilder.toString(); }"); int pageCount = (int) (totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1); int start; if(pageIndex>1) { stringBuilder.append("
- <<
"); } if( pageIndex>5 ){ int prevPages = pageIndex-9; if( prevPages<1 ){ prevPages=1; } start = pageIndex-4; stringBuilder.append("- ...
"); }else{ start=1; } int end = pageIndex+4; if( end>pageCount ) end=pageCount; for(int index=start;index<=end;index++){ if( pageIndex==index ){ stringBuilder.append("- ").append(index) .append("
"); }else if(index!=0){ stringBuilder.append("- ").append(index).append("
"); } } if( endpageCount ){ endFive=pageCount; } stringBuilder.append(" - ...
- "); } if( pageIndex
"); } stringBuilder.append(">>
像这样就可以了,至于传入的url是什么鬼,比如"index.jsp?p="
或者"index.jsp?type=XXX&t=XXX&p="
。
这里我自己定义的页码参数是p,看自己心情喽。
总之不管你使用何种方法,这几个参数是需要的:传入的需要拼接的url,页码pageIndex,一页显示多少数据pageSize, 总共多少totalCount.