freemarker jsp java内存方式实现分页示例
引言
很多时候我们都会用到分页,模版渲染有的用的是 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> <#-- 数量大于总数量,恶意翻页的情况直接退出 --> <#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>
使用 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 jsp java内存方式实现分页示例的详细内容,更多关于freemarker jsp java内存分页的资料请关注脚本之家其它相关文章!
相关文章
SpringBoot集成tensorflow实现图片检测功能
TensorFlow名字的由来就是张量(Tensor)在计算图(Computational Graph)里的流动(Flow),它的基础就是前面介绍的基于计算图的自动微分,本文将给大家介绍Spring Boot集成tensorflow实现图片检测功能,需要的朋友可以参考下2024-06-06Spring中@EnableScheduling注解的工作原理详解
这篇文章主要介绍了Spring中@EnableScheduling注解的工作原理详解,@EnableScheduling是 Spring Framework 提供的一个注解,用于启用Spring的定时任务(Scheduling)功能,需要的朋友可以参考下2024-01-01
最新评论