时间过得真快,已经半年没有更新自己的博客了。 好了,言归正传。大家都知道网上广为流传的一个分页类是:PaginationSupport.java其源代码如下:
public class PaginationSupport{
public final static int PAGESIZE = 30;
private int pageSize = PAGESIZE;
private List items;
private int totalCount;
private int[] indexes = new int[0];
private int startIndex = 0;
public PaginationSupport(List items, int totalCount) {
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(0);
}
public PaginationSupport(List items, int totalCount, int startIndex) {
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}
public PaginationSupport(List items, int totalCount, int pageSize,
int startIndex) {
setPageSize(pageSize);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}
public List getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
if (totalCount > 0) {
this.totalCount = totalCount;
int count = totalCount / pageSize;
if (totalCount % pageSize > 0)
count++;
indexes = new int[count];
for (int i = 0; i < count; i++) {
indexes[i] = pageSize * i;
}
} else {
this.totalCount = 0;
}
}
public int[] getIndexes() {
return indexes;
}
public void setIndexes(int[] indexes) {
this.indexes = indexes;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
if (totalCount <= 0)
this.startIndex = 0;
else if (startIndex >= totalCount)
this.startIndex = indexes[indexes.length - 1];
else if (startIndex < 0)
this.startIndex = 0;
else {
this.startIndex = indexes[startIndex / pageSize];
}
}
public int getNextIndex() {
int nextIndex = getStartIndex() + pageSize;
if (nextIndex >= totalCount)
return getStartIndex();
else
return nextIndex;
}
public int getPreviousIndex() {
int previousIndex = getStartIndex() - pageSize;
if (previousIndex < 0)
return 0;
else
return previousIndex;
}
public int getPageCount() {
int count = totalCount / pageSize;
if (totalCount % pageSize > 0)
count++;
return count;
}
public int getCurentPageNum() {
return getStartIndex() / pageSize + 1;
}
}
在这个分页类中设定了每页要显示的记录数以及开始索引,如果用普通的jsp来取这个分页类的数据还可以,但是使用spring+hibernate这种架构就显得比较麻烦(原因是spring MVC返回的是一个 PaginationSupport的对象,使用jstl作为前端显示的话,会在jsp页面中掺杂大量的计算,像下一页索引,共多少条记录,当前第几页,共多少页等等会使jsp很难维护)下面是对这个类的改进:
public class PaginationSupport {
public final static int PAGESIZE = 30;
private int pageSize = PAGESIZE;
private int totalCount;
private int currentPage;
private int startIndex;
private int[] indexes = new int[0];
private int nextIndex;
private int previousIndex;
private int pageCount;
private List items;
private int lastIndex;
public PaginationSupport(int pageSize,
int startIndex) {
setPageSize(pageSize);
setStartIndex(startIndex);
}
public PaginationSupport(List items, int totalCount) {
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(0);
}
public PaginationSupport(List items, int totalCount, int startIndex) {
setPageSize(PAGESIZE);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}
public PaginationSupport(List items, int totalCount, int pageSize,
int startIndex) {
setPageSize(pageSize);
setTotalCount(totalCount);
setItems(items);
setStartIndex(startIndex);
}
public void setTotalCount(int totalCount) {
if (totalCount > 0) {
this.totalCount = totalCount;
int count = totalCount / pageSize;
if (totalCount % pageSize > 0)
count++;
indexes = new int[count];
for (int i = 0; i < count; i++) {
indexes[i] = pageSize * i;
}
} else {
this.totalCount = 0;
}
}
public int getTotalCount() {
return totalCount;
}
public void setIndexes(int[] indexes) {
this.indexes = indexes;
}
public int[] getIndexes() {
return indexes;
}
public void setStartIndex(int startIndex) {
if (totalCount <= 0)
this.startIndex = 0;
else if (startIndex >= totalCount)
this.startIndex = indexes[indexes.length - 1];
else if (startIndex < 0)
this.startIndex = 0;
else {
this.startIndex = indexes[startIndex / pageSize];
}
}
public int getStartIndex() {
return startIndex;
}
public void setNextIndex(int nextIndex) {
this.nextIndex = nextIndex;
}
public int getNextIndex() {
int nextIndex = getStartIndex() + pageSize;
if (nextIndex >= totalCount)
return getStartIndex();
else
return nextIndex;
}
public void setPreviousIndex(int previousIndex) {
this.previousIndex = previousIndex;
}
public int getPreviousIndex() {
int previousIndex = getStartIndex() - pageSize;
if (previousIndex < 0)
return 0;
else
return previousIndex;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageCount() {
int count = totalCount / pageSize;
if (totalCount % pageSize > 0)
count++;
return count;
}
public int getCurrentPage() {
return getStartIndex() / pageSize + 1;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public void setLastIndex(int lastIndex) {
this.lastIndex =lastIndex ;
}
public int getLastIndex() {
return indexes[indexes.length-1];
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
}
以上是分页的封装类,下面是支持分页查询的方法:
1)
public PaginationSupport findPageByCriteria(
final DetachedCriteria detachedCriteria, final int pageSize,
final int startIndex) {
return (PaginationSupport) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
int totalCount = ((Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult())
.intValue();
criteria.setProjection(null);
List items = criteria.setFirstResult(startIndex)
.setMaxResults(pageSize).list();
PaginationSupport ps = new PaginationSupport(items,
totalCount, pageSize, startIndex);
return ps;
}
}, true);
}
2)
public PaginationSupport findPageByQuery( final String hsql, final int pageSize,final int startIndex){
return (PaginationSupport)getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(hsql);
int totalCount=query.list().size();
query.setFirstResult(startIndex);
query.setMaxResults(pageSize);
List items = query.list();
PaginationSupport ps = new PaginationSupport(items,
totalCount, pageSize, startIndex);
return ps;
}
},true);
}
你也许会问分页查询为什么会提供两个方法,这两个方法有区别吗?其实这两个方法并无本质区别,DetachedCriteria 也是构造查询语句的与Query功能一致,但是它提供了更加面向对象的方法来写hsql语句。一般人们都倾向第一种方法,但是这种方法并不通用,它有一种查询并不支持,那就是当你要查询的对象并不是一个单一对象的话(例如 你在数据库中有两个表,一个是user,另一个是userinfo,这两个表所对应的对象在hiberante中被指定为共享主键的话,在执行查询的时候就会报类型转换异常,原因是查询出来的对象并不是user而是一个包含user 和userinfo的Object,你若强制把它转换成user类型,肯定会出错),这时你不得不采用第二个方法。当然这只是我个人见解,也许还有地方说的不是很准确,希望大家多多批评指正。
最后是这个分页类的前台显示源代码:
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="GBK"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link type="text/css" rel="stylesheet" href="../css/panel.css">
<title>显示所有用户</title>
</head>
<body>
<div style="margin:20px auto 30px; width:70%;"><a href="index.jsp" class="btn2">返回首页</a></div>
<div style="margin:10px auto 0; width:70%;">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<caption>
显示所有用户
</caption>
<tr>
<td>用户ID</td>
<td>用户名</td>
<td>用户昵称</td>
<td>电子邮件</td>
<td>注册时间</td>
<td>详细信息</td>
<td>用户充值记录</td>
<td>用户定制服务信息</td>
</tr>
<c:forEach var="user" items="${userPage.items}">
<tr>
<td>${user.intId}</td>
<td>${user.username}</td>
<td>${user.name}</td>
<td>${user.email}</td>
<td><fmt:formatDate value='${user.creationTime}' pattern='yyyy-MM-dd HH:mm' /></td>
<td><a href="user_getdetailUser.ado?userId=${user.intId}" class="btn">详细信息</a></td>
<td><a href="orderService_getUserAccountAdds.ado?userId=${user.intId}" class="btn">用户充值记录</a></td>
<td><a href="orderService_getUserChargeItems.ado?userId=${user.intId}" class="btn">用户定制服务信息</a></td>
</tr>
</c:forEach>
</table>
<c:if test="${!empty userPage}">
共${userPage.totalCount}记录
<c:choose>
<c:when test="${userPage.startIndex ne '0'}">
<a href="user_getPage.ado?startIndex=0">首页</a>
</c:when>
<c:otherwise>
首页
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${userPage.previousIndex lt userPage.startIndex}">
<a href="user_getPage.ado?startIndex=${userPage.previousIndex }">上一页</a>
</c:when>
<c:otherwise>
上一页
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${userPage.nextIndex>userPage.startIndex}">
<a href="user_getPage.ado?startIndex=${userPage.nextIndex}">下一页</a>
</c:when>
<c:otherwise>
下一页
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${userPage.lastIndex eq userPage.startIndex}">
最后一页
</c:when>
<c:otherwise>
<a href="user_getPage.ado?startIndex=${userPage.lastIndex}">最后一页</a>
</c:otherwise>
</c:choose>
每页显示${userPage.pageSize}条记录
当前第${userPage.currentPage }/${userPage.pageCount}页
</c:if>
</div>
</body>
</html>
相关推荐
struts+spring+hibernate通用分页方法.rar 博文链接:https://igogogo9.iteye.com/blog/97692
综上所述,"Struts+Spring+Hibernate通用分页解决方案"是一个高效的Java Web开发策略,它充分利用了三大框架的优势,实现了数据的灵活分页,提高了应用的性能和用户体验。通过深入理解并实践这些技术,开发者可以更...
同时,为了适应不同的项目需求,可以将分页逻辑封装成一个通用的工具类,便于复用。 总的来说,Spring和Hibernate的组合为Java Web开发提供了一种强大的解决方案。通过合理配置和编程,我们可以轻松实现分页功能,...
总的来说,这个"Struts2+Spring2+Hibernate3注册查询搜索分页实例"是一个很好的学习资源,涵盖了Java Web开发中的基础和核心部分。通过学习这个实例,开发者不仅可以掌握三大框架的基本用法,还能了解到如何将它们...
该demo集成了spring+springmvc+hibernate框架,里面的dao、service、entity均采用注解形式,容易开发,另外该demo中dao采用注解形式,将所有实体dao需要用到的通用方法如insert,update,delete,分页查询等均采用...
AnyFoDao是AnyFo - Util下的一个子项目,其中只包含一个类,这个类是一个通用的DAO层类,这里包含了一个普通系统的DAO层的各种功 能,所以,在开发时,大家不用多次在各个模块开发DAO层的类了,各个模块共用这个...
总结来说,使用Hibernate、Struts和Spring实现的通用分页查询,涉及了Java Web开发中的多个层次,包括模型、持久层接口、持久层实现、业务层和服务层的交互,以及视图层的渲染。这种分页机制灵活且可复用,可以适应...
1、在dwr中尝试编写的一些通用的代码,包括如何编写一个通用的列表显示框并实现分页、如何编写一个通用的单行编辑框、如何编辑一个通用的存盘和删除程序等等。 <br>2、在dwr中如何与spring兼容,调用bus中的方法...
综上所述,这个项目提供了一个实际的示例,展示了如何在Java Web开发中集成Spring、Struts2和Hibernate三大框架,实现用户登录、单表数据操作、以及通过拦截器和分页功能增强用户体验。通过学习和理解这个项目,...
本文将深入探讨如何利用Java语言,结合Spring、Spring MVC和Hibernate三大框架,构建一个工程财务管理辅助系统。 首先,Spring作为核心的依赖注入(DI)和面向切面编程(AOP)框架,为项目提供了良好的结构化和模块...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...