原文来自:
http://hi.baidu.com/zhangyand/blog/item/21c98925ddd82e6335a80f40.html
基于displaytag 大批量数据 分页 原创:张彦德
由于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/
另外还要非常感谢热心网友,使我再次感受到站在巨人肩上的感觉。。。 。。。
分享到:
相关推荐
你可以通过`pages`属性控制显示的页码数量,以及`alwaysShowPager`属性决定在数据量较少时是否仍然显示分页栏。 6. **排序**:DisplayTag支持列头点击进行数据排序,通过`sortable`属性启用或禁用列的排序功能。 7...
2. **分页**:内置的分页功能允许用户浏览大量数据,同时减少网络传输的数据量,提高页面加载速度。 3. **排序**:用户可以通过点击表头进行列排序,Displaytag会自动处理排序逻辑。 4. **导出**:支持将表格数据...
总之,Displaytag 为开发人员提供了一个强大的工具,能够轻松地在 JSP 页面上创建具有分页和排序功能的数据表格。通过灵活的配置和丰富的定制选项,Displaytag 能够适应各种复杂的 Web 应用场景。
3. **分页**:DisplayTag 自带分页功能,可以轻松实现大量数据的分页显示,减轻服务器负担,并提供友好的用户体验。 4. **国际化**:支持多语言环境,可以方便地切换表格的头部标签和错误消息的语言。 5. **导出...
动态分页的核心在于能够根据用户的操作实时更新页面显示的数据量。具体来说,在 DisplayTag 的环境下,我们需要实现以下几点: 1. **页面初始化时**:默认显示一定数量的数据。 2. **用户操作**:当用户更改下拉框中...
DisplayTag不仅支持基本的分页,还提供了诸如国际化、导出数据、自定义样式等功能,使得在处理大量数据展示时更加得心应手。 "displaytag-1.2-src"则是DisplayTag 1.2版本的源代码包,对于想要深入了解其工作原理...
总的来说,Struts2和DisplayTag的结合使得开发人员能够快速构建功能丰富的Web应用,尤其是在处理大量数据展示和分页时,DisplayTag的易用性和灵活性得到了充分体现。通过不断实践和优化,你可以创建出更加高效、用户...
DisplayTag库提供了强大的表格渲染功能,不仅可以处理数据的分页,还支持排序、过滤、国际化以及自定义样式等特性。它的核心设计理念是将数据展示逻辑与视图层分离,这符合MVC(Model-View-Controller)架构的原则,...
DisplayTag分页技术的核心在于其能够自动处理大量数据,将这些数据按页显示,从而提高网页性能和用户体验。以下是关于DisplayTag分页的一些关键知识点: 1. **配置与引入**:首先,你需要在项目中引入DisplayTag库...
对于初学者来说,掌握Struts2和DisplayTag的结合使用,不仅可以快速实现数据的分页展示,还能提高开发效率,减少代码量。 总的来说,这个"Struts2结合DisplayTag框架进行分页案例"是一个非常适合初学者学习的实践...
DisplayTag是Java Web开发中的一款强大且功能丰富的表格和分页控件库,它极大地简化了在JSP页面中处理复杂表格和实现分页的工作。这个压缩包文件包含的就是DisplayTag的相关jar包以及可能的使用说明文档,对于开发...
2. **分页**:在大数据量的页面中,为了提高用户体验和加载速度,将数据分为多页显示,用户可以逐页浏览,而不是一次性加载所有数据。 3. **DisplayTag**:一个强大的开源JSP标签库,主要用于表格展示和分页,简化了...
NULL 博文链接:https://wooden-baby.iteye.com/blog/494060
1. **分页**:DisplayTag 自动处理数据的分页逻辑,只需要简单的配置,就能在页面上显示分页链接,用户可以轻松地浏览数据的各个页码。 2. **排序**:除了分页,DisplayTag 还支持表格内的数据排序,用户可以通过...
在提供的资料中,"displaytag分页模版使用说明书.xls"可能包含了一份详细的使用指南,涵盖如何配置DisplayTag,如何在JSP页面中嵌入标签,以及如何实现各种高级功能。这份文档将指导开发者了解DisplayTag的配置文件...
DisplayTag是个很好的jsp标签,目前最新版本为1.2,支持了自定义分页,解决了之前版本每次查询都把全部数据查出的低效率做法。但是DisplayTag默认是通过url传参,以及分页导航不灵活给人们带来了不少麻烦。鉴于此...
display tag 分页例子的源代码。 博文链接:https://zhou568xiao.iteye.com/blog/192366
DisplayTag是一个用于创建表格、分页和导出数据的JSP标签库。它通过简化HTML表格的复杂性,提供了诸如排序、分页、格式化和国际化等特性,极大地提高了开发效率。 2. **安装与引入** 要使用DisplayTag,首先需要...