`

displaytag分页优化,处理大批量数据

阅读更多
Display Tag Lib是一个标签库,用来处理jsp网页上的Table,功能非常强,可以对的Table进行分页、数据导出、分组、对列排序等等。使用它依赖的包有:
commons-beanunits;
commons-lang
commons- logging
commons- collections
displaytag;
dislaytag分页原理:displaytag分页是将数据库中的所有数据先读入内存,然后在根据分页条件,将不需要显示的数据删除掉,这样我们就很容易想到:如果数据量非常大的时候,可能会引起系统内容崩溃;因上述原因本人参考网络,优化了一下displaytag的分页,希望对同行的朋友,有帮助。优化后的分页原理:只从数据库读取需要显示的条数(比如每页显示10条记录,则每次从数据库读取10条,不会出现内容崩溃的情况),具体炒作如下:
第一步[size=large][/size]
    编写一个类,实现了displaytag的标签提供的接口 PaginatedList,该类的功能是提供displaytag依赖的分页条件,比如当前页,每页显示数目等。类的代码如下:
public class PaginatedListHelper implements PaginatedList {
	@SuppressWarnings("unchecked")
	private List list;
	private int pageNumber = 1;
	private int objectsPerPage = 10;
	private int fullListSize = 0;
	private String sortCriterion;
	private SortOrderEnum sortDirection;
	private String searchId;

	@SuppressWarnings("unchecked")
	public List getList() {
		return list;
	}

	@SuppressWarnings("unchecked")
	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 fieldN) {
		this.sortCriterion = (fieldN == null || "null".equals(fieldN)) ? "1"
				: fieldN;
	}

	public void setSortDirection(String dir) {
		if (dir == null || "null".equals(dir) || "asc".equalsIgnoreCase(dir)) {
			sortDirection = SortOrderEnum.ASCENDING;
		} else {
			sortDirection = SortOrderEnum.DESCENDING;
		}
	}

	public String getSortDirectionStr() {
		if (sortDirection == SortOrderEnum.ASCENDING)
			return "ASC";
		else
			return "DESC";
	}

	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;
	}
}

第二步:
      实现一个基础类。这个是一个action,如果哪个类要实现分页,需要继承这个类,对显示的数据,及格式做初始化。代码如下:
public class SearchBaseAction extends ActionSupport {
	protected static final long serialVersionUID = -7269846658053183360L;
	//页显示数目
	protected int pageSize = 10;//手动设置需要显示的数目
	//当前页数
	protected int page;
	//排序格式
	protected String dir;
	protected PaginatedListHelper paginaredList;
	//排序字段 了
	protected String sort;

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		if (pageSize < 0)
			pageSize = 10;
		this.pageSize = pageSize;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		if (page < 0)
			page = 1;
		this.page = page;
	}

	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}

	public String getDir() {
		return dir;
	}

	public void setDir(String dir) {
		this.dir = dir;
	}

	@SuppressWarnings("unchecked")
	public PaginatedListHelper createPaginaredList(List l, int totalCount) {
		paginaredList = new PaginatedListHelper();
		paginaredList.setPageNumber(this.page);
		paginaredList.setObjectsPerPage(pageSize);
		paginaredList.setSearchId(sort);
		paginaredList.setSortCriterion(sort);
		paginaredList.setSortDirection(dir);
		paginaredList.setFullListSize(totalCount);
		paginaredList.setList(l);
		return paginaredList;
	}
	
	@SuppressWarnings("unchecked")
	public PaginatedListHelper createPaginaredList(List l, int totalCount,int pageSize) {
		paginaredList = new PaginatedListHelper();
		paginaredList.setPageNumber(this.page);
		paginaredList.setObjectsPerPage(pageSize);
		paginaredList.setSearchId(sort);
		paginaredList.setSortCriterion(sort);
		paginaredList.setSortDirection(dir);
		paginaredList.setFullListSize(totalCount);
		paginaredList.setList(l);
		return paginaredList;
	}

	public int getFromIndex() {
		return (this.page - 1) * pageSize; 
										
	}

	public int getLimit() {
		return pageSize;
	}

	public PaginatedListHelper getPaginaredList() {
		return paginaredList;
	}

	public void setPaginaredList(PaginatedListHelper paginaredList) {
		this.paginaredList = paginaredList;
	}

}

第三步:
  编写自己的action,得到要显示的数据,具体代码如下:
public class ListUserAction extends SearchBaseAction {

/**
*
*/
private static final long serialVersionUID = 1L;
private UserService userService;//自己的数据库连接类,处理数据库
private String name;
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public UserService getUserService() {
return userService;
}

public void setUserService(UserService userService) {
this.userService = userService;
}

public String getSort() {
return sort;
}

public void setSort(String sort) {
this.sort = sort;
}

public String getDir() {
return dir;
}

public void setDir(String dir) {
this.dir = dir;
}

@SuppressWarnings( { "static-access" })
@Override
public String execute() throws Exception {
// 如果当前页为零,则默认为1
if (this.page == 0) {
this.page = 1;
}
// 得到起始索引
int fromIndex = this.getFromIndex();
// 得到每页显示数量
int limit = this.getLimit();
//修改display:tag标签的属性,并返回当前页需要显示的数据
List displayDate = userService.getDisplaydate(fromIndex,limit);//具体方法实现内容,根据自己的业务逻辑实现,使用时,只要得到一个每页显示的数目就ok,返回list,具体实现sql语句根据数据库不同而不同(比如mysql,select × from table limit form,end。mssql采用top,orcale使用rownum,本人采用的是hibernate,)
               int count = userService.getCount();//返回所有的数据数量,
              //这是关键,也就是唯一使用到分页的重要一步,这个方法只接受两个参数,你也可以扩展上边的那个action,实现自己的一些方法,这个方法只接受两个参数,一个是要显示的数据,第二个是总共数据量。
paginaredList = this.createPaginaredList(displayDate,
count);
return this.SUCCESS;
}
}
第四步jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://displaytag.sf.net" prefix="display"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>All user</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
</head>

<body>
<center>
<display:table name="${paginaredList}" export="true"
defaultorder="ascending" sort="list" requestURI="listUser.action"
cellspacing="1" cellpadding="1">
<display:setProperty name="sort.amount" value="list" />
<display:setProperty name="export.amount" value="list" />
<display:setProperty name="paging.banner.placement" value="bottom" />
<display:column property="id" title="序号" sortable="true" paramId="page" paramProperty="page"/>
<display:column property="name" title="姓名" sortable="true" />
<display:column property="password" title="密码" />
<display:column value="修改" href="updateUser.action"
paramId="user.id" paramProperty="id"></display:column>
<display:column value="删除" href="deleteUser.action"
paramId="user.id" paramProperty="id"></display:column>
</display:table>
<BR />
</center>
</body>

</html>

分享到:
评论

相关推荐

    DisplayTag分页及属性

    - **优化分页查询**:为了提高性能,避免每次翻页都重新查询所有数据,可以在后台服务实现分页查询,只返回当前页所需的数据。 4. **DisplayTag 页面基本组成** - **要引入标签**:除了上述的 `&lt;display:table&gt;` ...

    Displaytag实现分页

    - 在处理大量数据时,优化数据库查询以提高效率。 - 使用 Displaytag 的版本应与你的其他依赖库兼容,以防止潜在的冲突。 总之,Displaytag 为开发人员提供了一个强大的工具,能够轻松地在 JSP 页面上创建具有...

    displaytag 分页标签 中文化

    NULL 博文链接:https://wooden-baby.iteye.com/blog/494060

    Struts2 DisplayTag 分页

    总的来说,Struts2和DisplayTag的结合使得开发人员能够快速构建功能丰富的Web应用,尤其是在处理大量数据展示和分页时,DisplayTag的易用性和灵活性得到了充分体现。通过不断实践和优化,你可以创建出更加高效、用户...

    displaytag,pager-taglib 分页包

    2. **分页**:内置的分页功能允许用户浏览大量数据,同时减少网络传输的数据量,提高页面加载速度。 3. **排序**:用户可以通过点击表头进行列排序,Displaytag会自动处理排序逻辑。 4. **导出**:支持将表格数据...

    displayTag分页插件及配置文档

    改装后的displayTag分页插件,解决中文问题,内置帮助文档和示例文件及jar包,比较好用,如果不满足你的需求请不要砸砖 补充: csdn附件不能修改,jsp+servlet分页时有bug,请注意查询所有的serlvet不支持带参数,即...

    displaytag 分页的简单例子(附源代码)

    display tag 分页例子中用到的有关display tag lib的jar包,把这些jar包拷贝到WEB-INF/lib中例子就可以运行了。 博文链接:https://zhou568xiao.iteye.com/blog/192366

    displaytag 分页模版资料 JSP

    通过集成简单的分页配置,DisplayTag可以自动处理数据的分页展示,用户只需提供数据源即可。`&lt;display:table&gt;`标签中的一些关键属性,如`pagesize`用于设置每页显示的记录数,`export`则决定是否允许导出数据到CSV或...

    DisplayTag分页资料整理.chm

    个人学习收集网上资料辛苦整理而成. DisplayTag分页资料整理.chm DisplayTag 分页 chm java taglib

    DisplayTag分页

    DisplayTag分页技术的核心在于其能够自动处理大量数据,将这些数据按页显示,从而提高网页性能和用户体验。以下是关于DisplayTag分页的一些关键知识点: 1. **配置与引入**:首先,你需要在项目中引入DisplayTag库...

    displaytag分页jar包和使用说明

    DisplayTag是Java Web开发中的一款强大且功能丰富的表格和分页控件库,它极大地简化了在JSP页面中处理复杂表格和实现分页的工作。这个压缩包文件包含的就是DisplayTag的相关jar包以及可能的使用说明文档,对于开发...

    displayTag 分页

    1. **分页**:DisplayTag 自动处理数据的分页逻辑,只需要简单的配置,就能在页面上显示分页链接,用户可以轻松地浏览数据的各个页码。 2. **排序**:除了分页,DisplayTag 还支持表格内的数据排序,用户可以通过...

    displaytag分页模版使用说明书

    displaytag分页模版使用说明书

    一个完美的displaytag分页控件的例子

    通过设置`page-size`属性,你可以指定每一页显示的数据量。同时,DisplayTag会自动处理分页链接的生成,用户可以轻松地向前或向后翻页。此外,还可以自定义分页样式,以适应不同的界面设计需求。 2. **排序**:...

    displaytag分页模版

    displaytag分页模版

    displaytag 一个后台管理的分页组件

    5. **导出功能**:DisplayTag 可以将表格数据导出为多种格式,如CSV、Excel、PDF等,方便数据的进一步处理或打印。 6. **样式可配置**:通过CSS样式表,开发者可以完全控制表格的外观,包括边框、颜色、字体等。 7...

    07java培训displaytag分页实例六.doc

    07java培训displaytag分页实例六

Global site tag (gtag.js) - Google Analytics