`

displayTags大数据量分页导航

阅读更多

 

李楠注:
    这个内容我还没有测试过,打算以后分别用mysql,mssql,oracle10g测试一下,
数据量分别为1万,2万,10万,100万。这里先把此文档保存下来。
    关注这个内容,主要是这个功能要经常使用,并且,每个框架的实现都不相同(比如hibernate,ibatis)。
这次,是因为我在分析ibatis的框架,而听说ibatis实现的PaginatedList接口在数据量不超过2万的时候,
可以使用,但遇到大数据量的时候会有问题。据说在一个30万行的表里翻页,
一次select用了363.031second。如果真是这样的话,只好自己实现这个接口了。
    以下,是文章的内容:
----------------------------------------------

由于displayTag只处理数据的显示,传递给他多少数据,它会根据数据的记录数及其每页显示多少计算出需要的页数,但是在处理大数据量集合的时候,会遇到问题,就是将所有的数据传递给displayTag表格显示标签变得不现实也没有必要,如何既能够用到dispalyTag强大的显示功能,用能够很好的处理大数据量的
显示和分页功能呢?


当我遇到这个问题的时候,感到无从下手,因为我当时并不是很熟悉displaytag,更不要提它的深层次的处理机制问题了,嘿嘿!于是我就开始在群里请教高人,未果,无奈之余我只有借助网络,哈,我不停的变换关键词进行搜索,结果发现不止是我一个人遇到此问题啊,那是千千万万啊(一点都不夸张)!在那些五花八门的答案中我开始筛选,实验。。。

最终,根据displayTag官方文档的推荐和网友们的建议,我做开始了解决这个问题的尝试(虽然之前我遇到这个问题的时候,就先请教了我的一个同事,但他给我的建议我感觉太麻烦了,改动比较大,于是就下决心一定自己解决这个问题啦!)

首先我了解到displaytag1.0实在是太傻了,每次分页还需要将所有数据一次载入,效率低到无法忍受:)而displaytag1.1就不同了,1.1版最大的改进可以说是终于支持了大家期待以久的分次加载功能了,想显示多少数据就载入多少数据.1.1版本支持两种方式的分页,第一种是实现其org.displaytag.pagination.PaginatedList 接口,第二种是在页面和后台同时做修改来实现分页功能.在网上关于第二种分页的使用方法介绍的非常多,而且官方文档上面写的也比较详细,所以在这里我主要介绍自己是如何使用第一种方式进行分页的,且这种方式也是官方推荐分页方式:

首先写一个org.displaytag.pagination.PaginatedList 接口的实现类:
//package com.greatroad.webapp.paging;

import java.util.List;

import org.displaytag.pagination.PaginatedList;
import org.displaytag.properties.SortOrderEnum;

/**
* PaginatedListImpl
* User: zhangyd
* Date: 2007-10-20
* Time: 20:35:18
*
* totalNum 所有条目数目
* currentPage 当前所在页号
* objectsPerPage 每页显示条数
* list 此页所需要显示的数据
*/
public class PaginatedListHelper implements PaginatedList{
      private List list;
      private int pageNumber = 1;
      private int objectsPerPage = 20;
      private int fullListSize = 0;
      private String sortCriterion;
      private SortOrderEnum sortDirection;
      private String searchId;

      public List getList() {
          return list;
      }

      public void setList(List list) {
          this.list = list;
      }

      public int getPageNumber() {
          return pageNumber;
      }

      public void setPageNumber(int pageNumber) {
          this.pageNumber = pageNumber;
      }

      public int getObjectsPerPage() {
          return objectsPerPage;
      }

      public void setObjectsPerPage(int objectsPerPage) {
          this.objectsPerPage = objectsPerPage;
      }

      public int getFullListSize() {
          return fullListSize;
      }

      public void setFullListSize(int fullListSize) {
          this.fullListSize = fullListSize;
      }

      public String getSortCriterion() {
          return sortCriterion;
      }

      public void setSortCriterion(String sortCriterion) {
          this.sortCriterion = sortCriterion;
      }

      public SortOrderEnum getSortDirection() {
          return sortDirection;
      }

      public void setSortDirection(SortOrderEnum sortDirection) {
          this.sortDirection = sortDirection;
      }

      public String getSearchId() {
          return searchId;
      }

      public void setSearchId(String searchId) {
          this.searchId = searchId;
      }

}
然后在使用的时候只需要创建此类的一个实例,且将所需要的参数通过set方法赋值进去就可以了,比如我在XXXController.java中是这样实现的(注意加粗的部分):

package com.greatroad.webapp.action;

import java.text.SimpleDateFormat;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.displaytag.pagination.PaginatedList;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import com.greatroad.Constants;
import com.greatroad.model.Station;
import com.greatroad.service.CardhistorydataManager;

import com.greatroad.service.StationManager;
import com.greatroad.webapp.paging.PaginatedListHelper;

public class CardhistorydataController implements Controller {
private final Log log = LogFactory.getLog(CardhistorydataController.class);

private CardhistorydataManager cardhistorydataManager = null;

public void setCardhistorydataManager(
     CardhistorydataManager cardhistorydataManager) {
    this.cardhistorydataManager = cardhistorydataManager;
}

private StationManager stationManager = null;

public void setStationManager(StationManager stationManager) {
    this.stationManager = stationManager;
}

public ModelAndView handleRequest(HttpServletRequest request,
                                        HttpServletResponse response)
      throws Exception {
          if (log.isDebugEnabled()) {
              log.debug("entering 'handleRequest' method...");
          }

          Object[] o = new Object[4];
          String personId = request.getParameter("person");
          String d1 = request.getParameter("starttime");
          String d2 = request.getParameter("endtime");
       
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
       
          if(personId!=null && personId.length()>0)
           o[0] = personId;
          if(d1!=null && d1.length()>0)
           o[1] = sdf.parse(d1);
          if(d2!=null && d2.length()>0)
           o[2] = sdf.parse(d2);
// ///////////////////////////////////////////////////////
          Station station = new Station();
          String stationId = request.getParameter("stationname");
          if(stationId!=null && stationId.length()>0){
           station = stationManager.getStation(stationId);
           o[3] = stationId;
           request.setAttribute("Stationid", stationId);
          }
           List stationList = stationManager.getStations(null);
           if(stationList != null && stationList.size()>0){
            request.setAttribute("stationlist", stationList);
           }
// /////////////////////////////////////////////////////////////////////////////
        /*
      * 其中request中的page参数为displaytag中的默认当前页数,当然也可以使用*TableTagParameters.SORT_AMOUNT_PAGE来表示当前页数
      */
        int pageSize;
        if (request.getParameter("pageSize") != null
          && !"".equals(request.getParameter("pageSize"))) {
         pageSize = Integer.parseInt(request.getParameter("pageSize"));
        } else {
         pageSize = 15;
        }

        int page = 1;
        if (request.getParameter("page") != null
          && !"".equals(request.getParameter("page"))) {
         page = Integer.parseInt(request.getParameter("page"));
        } else {
         page = 1;
        }

        int fromIndex = (page - 1) * pageSize;
//      int toIndex = fromIndex + pageSize;
        int toIndex = pageSize;
        // 获得每次查询的总记录数
        int ListSize = cardhistorydataManager.countListSize(o);//DAO中实现

        // 此页要显示的list数据
        List cardhistorydatas = null;

        if (ListSize > 0) {
         cardhistorydatas = cardhistorydataManager.getCardhistorydatas(o, fromIndex, toIndex);//DAO中实现
        } else {
         cardhistorydatas = null;
        }
        PaginatedList paginaredList = new PaginatedListHelper();
        ((PaginatedListHelper) paginaredList).setPageNumber(page);
        if (cardhistorydatas != null && ListSize != 0) {
         // System.out.println("getFullListSize: " + ListSize);
         // 总共有多少数据,他会根据所有数目和每页数目自动统计页数
         ((PaginatedListHelper) paginaredList).setFullListSize(ListSize);
         ((PaginatedListHelper) paginaredList).setObjectsPerPage(pageSize);
         ((PaginatedListHelper) paginaredList).setList(cardhistorydatas);
        } else {
         ((PaginatedListHelper) paginaredList).setFullListSize(0);
         ((PaginatedListHelper) paginaredList).setList(null);
        }
        // 如果你只设定这几个参数,那么其余的参数将会默认为你实现类中所赋的初值
        // 最后,你还需要将这个实例放入到request或session中去,好让displaytag知道这个是外部分页
//        request.setAttribute("cardhistorydataList", paginaredList);
////////////////////////////////////////////////////////////////////////////////

          return new ModelAndView("cardhistorydataList", Constants.CARDHISTORYDATA_LIST, paginaredList);
      }
}
当然还有相关的一些地方需要改动,如果你能做的这一步,其余的那些已经不是问题了^!^另外再强调一点:页面无需任何改动哦!

参考文献:http://displaytag.sourceforge.net/11/

分享到:
评论

相关推荐

    大数据量分页

    在IT行业中,大数据量分页是一项重要的技术,特别是在Web应用中,当用户需要浏览大量数据时,如电子商务网站的产品列表或社交媒体平台的消息流。分页能够有效地管理并展示这些数据,提高用户体验,同时减轻服务器...

    c#大数据量分页 大型数据分页程序

    在.NET开发环境中,C#是一种常用的编程语言,尤其在企业级应用中,处理大数据量的分页查询是一项常见的任务。本篇文章将详细讲解如何在C#中实现高效的大数据量分页程序,以及如何利用提供的源码进行实践。 首先,...

    spring-data集成mongodb大数据量分页+自增id实现+MongodbPlugin集成

    skip随着数据量上去,分页性能极具下降,不推荐。这里使用spring-data-mongo实现的分页,并且实现了mongodb自增id(监听器方式)、也集成了轻量级插件MongodbPlugin,有需要的可以下载看看哦~

    ACCESS数据库大数据量分页的几种方法比较及测试结果分析

    ACCESS 数据库大数据量分页的几种方法比较及测试结果分析 本文解决的问题:1.ACCESS 是否存在更有效率的分页方法?2.现有 ACCESS 大数据量 10 万条数据分页的效率测试3.ACCESS 的数据承载量到底有多大? ACCESS ...

    大数据量多线程执行分页查询

    3. **分页查询**:分页是一种优化大数据量查询的技术,它将结果集分割成多个小块(页面),每次只返回用户请求的一部分数据。这样不仅可以减轻服务器压力,还能减少网络传输的负担,提高响应速度。 4. **C#线程**:...

    Jax的大数据量分页

    在大数据量的Web应用中,分页是一种必不可少的数据展示方式,它可以有效提高用户体验,避免一次性加载过多数据导致页面响应变慢。本知识点主要探讨如何在Java应用中,使用Jax处理大数据量的分页,同时结合存储过程来...

    VC大数据量的分页显示

    "VC大数据量的分页显示"是一个专门解决此类问题的解决方案,适用于各种需要展示大量数据库信息的场景。这个小程序通过分页技术有效地管理和展示数据,提高了用户体验,避免了因一次性加载过多数据导致的性能下降和...

    asp.net2.0 大数据量分页

    ### ASP.NET 2.0大数据量分页技术详解 #### 引言 在处理大量数据时,有效地分页浏览是提升用户体验与系统性能的关键因素之一。ASP.NET 2.0 提供了两种分页方式:默认分页和自定义分页。本文将深入探讨这两种方法,...

    MySQL百万级数据量分页查询方法及其优化建议

    这种方式结合了索引扫描和预编译的优势,适合大数据量的分页查询。 5. **利用索引快速定位**:如`SELECT * FROM table WHERE pk >= 1000 ORDER BY pk ASC LIMIT 0, 20`,直接根据主键或唯一键的值来定位数据,避免...

    .NET 3.5大数据量分页源码

    标题中的".NET 3.5大数据量分页源码"是指在.NET Framework 3.5环境下,针对处理大量数据的场景,如何实现高效且用户体验良好的分页功能。在这个项目中,开发者提供了完整的源代码,帮助我们理解并学习如何在C#编程...

    这是一个关于vuejs表格数据的分页导航

    本项目“vuejs表格数据的分页导航”就是针对这一需求而设计的,它利用Vue.js的强大功能,提供了灵活且直观的数据分页解决方案。 在Vue.js中,我们可以创建一个组件来封装分页逻辑。组件通常包括模板(template)、...

    前端 elementUI 穿梭框大量数据分页处理

    然而,当穿梭框处理的数据量非常大时,可能会导致页面卡顿,影响用户体验。针对这个问题,我们可以通过添加分页功能来优化性能。 本文将详细介绍如何在ElementUI的穿梭框组件中实现大量数据的分页处理,并提供一个...

    分页导航通用类和js

    在网页开发中,分页导航是一项非常常见的功能,特别是在数据量较大的情况下,为了提高用户体验,我们需要将大量数据分批次展示,这就是分页的作用。本文将详细介绍一个通用的分页导航类和JavaScript实现,以及如何...

    MySQL大数据量分页查询方法及其优化

    ### MySQL大数据量分页查询方法及其优化 在处理大规模数据集时,MySQL的分页查询是非常常见的需求之一。为了提高查询效率,减少响应时间和资源消耗,开发者需要掌握多种不同的分页查询方法及其优化技巧。本文将详细...

    大数据量时提高分页的效率

    在处理大数据量时,分页是一种常见的优化策略,它能够有效地管理和展示数据,避免一次性加载过多的数据导致性能下降。本文主要讨论如何在大数据量下提高分页的效率,重点关注自定义分页的方法。 默认分页是一种简单...

    基于angular.js的分页导航

    2. 考虑性能:如果数据量大,考虑使用懒加载或虚拟滚动技术,减少一次性加载的数据量。 3. 错误处理:添加适当的错误处理机制,例如当总页数为0时,禁用分页操作。 通过以上步骤,你就可以在AngularJS项目中实现一...

    ajax大量数据分页

    描述中提到,单表10w条数据在300ms左右可以完成分页,而对于三表关联的100w, 50w, 50w数据量,能在1s内完成,这得益于高效的后端处理和数据库查询优化。在后端,可以采用以下策略提高性能: 1. 数据库索引:确保...

    PostgreSQL数据分页技术概述.pptx

    本文总结了 PostgreSQL 数据分页技术的概述,介绍了在大数据量时如何高效地使用模糊查询和数据分页浏览,并根据后台设计降低用户界面的使用复杂程度。 一、数据分页浏览技术 数据分页浏览技术是开发中基本都会用到...

    display大量数据的分页

    1. **数据库查询优化**:当数据量巨大时,直接查询全部记录可能导致数据库性能下降,甚至内存溢出。通过使用LIMIT和OFFSET或SQL的ROW_NUMBER()函数,我们可以只获取当前页面所需的数据,降低资源消耗。 2. **Java...

    分页显示大量数据

    这样做的好处在于可以显著减少单次请求的数据量,从而减轻服务器压力并提升用户界面的响应速度。 #### 知识点二:cxGrid组件介绍及应用场景 cxGrid是Embarcadero提供的一款用于Delphi和C++Builder的强大网格控件,...

Global site tag (gtag.js) - Google Analytics