快捷搜索:

基于displaytag 大批量数据 分页

基于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/

您可能还会对下面的文章感兴趣: