freemarker jsp java内存方式实现分页示例

 更新时间:2023年06月02日 14:16:11   作者:雨翔河  
这篇文章主要介绍了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内存分页的资料请关注脚本之家其它相关文章!

相关文章

  • IDEA编译报错“java: 常量字符串过长”的原因及解决方法

    IDEA编译报错“java: 常量字符串过长”的原因及解决方法

    今天在开发过程中,由于尝试将一个文件的 Base64 字符串设置为常量,结果导致 IDEA 编译的时候出现了如下报错java: 常量字符串过长,所以本文给大家记录了IDEA编译报错“java: 常量字符串过长”的原因及解决方法,需要的朋友可以参考下
    2025-02-02
  • Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    Spring boot集成Go-FastDFS实现图片上传删除等功能实现

    这篇文章主要介绍了Spring boot集成Go-FastDFS实现图片上传删除等功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

    这篇文章主要介绍了Java如何实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序,需要的朋友可以参考下
    2015-07-07
  • 浅谈java对象之间相互转化的多种方式

    浅谈java对象之间相互转化的多种方式

    这篇文章主要介绍了浅谈java对象之间相互转化的多种方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java值传递之swap()方法不能交换的解决

    Java值传递之swap()方法不能交换的解决

    这篇文章主要介绍了Java值传递之swap()方法不能交换的解决,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java Servlet简单实例分享(文件上传下载demo)

    Java Servlet简单实例分享(文件上传下载demo)

    下面小编就为大家带来一篇Java Servlet简单实例分享(文件上传下载demo)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • SpringBoot和MyBatis环境下实现动态数据源切换过程

    SpringBoot和MyBatis环境下实现动态数据源切换过程

    dynamic-datasource-spring-boot-starter 是一个用于在SpringBoot和MyBatis环境下实现动态数据源切换的工具,它简化了配置和切换逻辑,通过引入依赖,配置数据源和使用@DS注解,可以轻松实现数据源的动态切换
    2025-10-10
  • java中的Filter使用示例详解

    java中的Filter使用示例详解

    Filter是JavaWeb开发中实现全局逻辑控制的核心工具,通过灵活配置拦截路径和类型,可高效完成编码转换、权限校验、日志记录等通用功能,这篇文章主要介绍了java中的Filter使用详解,需要的朋友可以参考下
    2025-05-05
  • Java中的关键字volatile详解

    Java中的关键字volatile详解

    这篇文章主要介绍了Java中的关键字volatile,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 在Spring Boot中浅尝内存泄漏的实战记录

    在Spring Boot中浅尝内存泄漏的实战记录

    本文给大家分享在Spring Boot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04

最新评论