雨翔河
首页
列表
关于
freemarker实现分页 jsp实现分页 java内存分页
2016-09-28 14:19
很多时候我们都会用到分页,模版渲染有的用的是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的实现. 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> ``` 2. 使用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="`。 这里我自己定义的页码参数是p,看自己心情喽。 总之不管你使用何种方法,这几个参数是需要的:传入的需要拼接的url,页码pageIndex,一页显示多少数据pageSize, 总共多少totalCount.
类型:工作
标签:freemarker,java,jsp
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室