`
z75148885
  • 浏览: 191534 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

struts+hibernate分页[转贴]

阅读更多
Hibernate3 提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改。

分页支持类:

java代码:


package com.javaeye.common.util;

import java.util.List;

publicclass PaginationSupport {

publicfinalstaticint PAGESIZE = 30;

privateint pageSize = PAGESIZE;

privateList items;

privateint totalCount;

privateint[] indexes = newint[0];

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

publicList getItems(){
return items;
}

publicvoid setItems(List items){
this.items = items;
}

publicint getPageSize(){
return pageSize;
}

publicvoid setPageSize(int pageSize){
this.pageSize = pageSize;
}

publicint getTotalCount(){
return totalCount;
}

publicvoid setTotalCount(int totalCount){
if(totalCount > 0){
this.totalCount = totalCount;
int count = totalCount / pageSize;
if(totalCount % pageSize > 0)
count++;
indexes = newint[count];
for(int i = 0; i < count; i++){
indexes[i] = pageSize * i;
}
}else{
this.totalCount = 0;
}
}

publicint[] getIndexes(){
return indexes;
}

publicvoid setIndexes(int[] indexes){
this.indexes = indexes;
}

publicint getStartIndex(){
return startIndex;
}

publicvoid setStartIndex(int startIndex){
if(totalCount <= 0)
this.startIndex = 0;
elseif(startIndex >= totalCount)
this.startIndex = indexes[indexes.length - 1];
elseif(startIndex < 0)
this.startIndex = 0;
else{
this.startIndex = indexes[startIndex / pageSize];
}
}

publicint getNextIndex(){
int nextIndex = getStartIndex() + pageSize;
if(nextIndex >= totalCount)
return getStartIndex();
else
return nextIndex;
}

publicint getPreviousIndex(){
int previousIndex = getStartIndex() - pageSize;
if(previousIndex < 0)
return0;
else
return previousIndex;
}

}



抽象业务类
java代码:


/**
* Created on 2005-7-12
*/

package com.javaeye.common.business;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.javaeye.common.util.PaginationSupport;

publicabstractclass AbstractManager extends HibernateDaoSupport {

privateboolean cacheQueries = false;

privateString queryCacheRegion;

publicvoid setCacheQueries(boolean cacheQueries){
this.cacheQueries = cacheQueries;
}

publicvoid setQueryCacheRegion(String queryCacheRegion){
this.queryCacheRegion = queryCacheRegion;
}

publicvoid save(finalObject entity){
getHibernateTemplate().save(entity);
}

publicvoid persist(finalObject entity){
getHibernateTemplate().save(entity);
}

publicvoid update(finalObject entity){
getHibernateTemplate().update(entity);
}

publicvoid delete(finalObject entity){
getHibernateTemplate().delete(entity);
}

publicObject load(finalClass entity, finalSerializable id){
return getHibernateTemplate().load(entity, id);
}

publicObject get(finalClass entity, finalSerializable id){
return getHibernateTemplate().get(entity, id);
}

publicList findAll(finalClass entity){
return getHibernateTemplate().find("from " + entity.getName());
}

publicList findByNamedQuery(finalString namedQuery){
return getHibernateTemplate().findByNamedQuery(namedQuery);
}

publicList findByNamedQuery(finalString query, finalObject parameter){
return getHibernateTemplate().findByNamedQuery(query, parameter);
}

publicList findByNamedQuery(finalString query, finalObject[] parameters){
return getHibernateTemplate().findByNamedQuery(query, parameters);
}

publicList find(finalString query){
return getHibernateTemplate().find(query);
}

publicList find(finalString query, finalObject parameter){
return getHibernateTemplate().find(query, parameter);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria){
return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, finalint startIndex){
return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex);
}

public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, finalint pageSize,
finalint startIndex){
return(PaginationSupport) getHibernateTemplate().execute(new HibernateCallback(){
publicObject 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);
}

publicList findAllByCriteria(final DetachedCriteria detachedCriteria){
return(List) getHibernateTemplate().execute(new HibernateCallback(){
publicObject doInHibernate(Session session)throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
}, true);
}

publicint getCountByCriteria(final DetachedCriteria detachedCriteria){
Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback(){
publicObject doInHibernate(Session session)throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.setProjection(Projections.rowCount()).uniqueResult();
}
}, true);
return count.intValue();
}
}




用户在web层构造查询条件detachedCriteria,和可选的startIndex,调用业务bean的相应findByCriteria方法,返回一个PaginationSupport的实例ps。

ps.getItems()得到已分页好的结果集
ps.getIndexes()得到分页索引的数组
ps.getTotalCount()得到总结果数
ps.getStartIndex()当前分页索引
ps.getNextIndex()下一页索引
ps.getPreviousIndex()上一页索引






连续看了两篇robbin有关DetachedCriteria的介绍,感觉真的不错,尤其是上面的示例代码,让我着实觉得该对我原来的分页查询做一下代码重构了。

我把原本我的做法也提供出来供大家讨论吧:

首先,为了实现分页查询,我封装了一个Page类:
java代码:


/*Created on 2005-4-14*/
package org.flyware.util.page;

/**
* @author Joa
*
*/

publicclass Page {

/** imply if the page has previous page */
privateboolean hasPrePage;

/** imply if the page has next page */
privateboolean hasNextPage;

/** the number of every page */
privateint everyPage;

/** the total page number */
privateint totalPage;

/** the number of current page */
privateint currentPage;

/** the begin index of the records by the current query */
privateint beginIndex;


/** The default constructor */
public Page(){

}

/** construct the page by everyPage
* @param everyPage
* */

public Page(int everyPage){
this.everyPage = everyPage;
}

/** The whole constructor */
public Page(boolean hasPrePage, boolean hasNextPage,
int everyPage, int totalPage,
int currentPage, int beginIndex){
this.hasPrePage = hasPrePage;
this.hasNextPage = hasNextPage;
this.everyPage = everyPage;
this.totalPage = totalPage;
this.currentPage = currentPage;
this.beginIndex = beginIndex;
}

/**
* @return
* Returns the beginIndex.
*/

publicint getBeginIndex(){
return beginIndex;
}

/**
* @param beginIndex
* The beginIndex to set.
*/

publicvoid setBeginIndex(int beginIndex){
this.beginIndex = beginIndex;
}

/**
* @return
* Returns the currentPage.
*/

publicint getCurrentPage(){
return currentPage;
}

/**
* @param currentPage
* The currentPage to set.
*/

publicvoid setCurrentPage(int currentPage){
this.currentPage = currentPage;
}

/**
* @return
* Returns the everyPage.
*/

publicint getEveryPage(){
return everyPage;
}

/**
* @param everyPage
* The everyPage to set.
*/

publicvoid setEveryPage(int everyPage){
this.everyPage = everyPage;
}

/**
* @return
* Returns the hasNextPage.
*/

publicboolean getHasNextPage(){
return hasNextPage;
}

/**
* @param hasNextPage
* The hasNextPage to set.
*/

publicvoid setHasNextPage(boolean hasNextPage){
this.hasNextPage = hasNextPage;
}

/**
* @return
* Returns the hasPrePage.
*/

publicboolean getHasPrePage(){
return hasPrePage;
}

/**
* @param hasPrePage
* The hasPrePage to set.
*/

publicvoid setHasPrePage(boolean hasPrePage){
this.hasPrePage = hasPrePage;
}

/**
* @return Returns the totalPage.
*
*/

publicint getTotalPage(){
return totalPage;
}

/**
* @param totalPage
* The totalPage to set.
*/

publicvoid setTotalPage(int totalPage){
this.totalPage = totalPage;
}

}



上面的这个Page类对象只是一个完整的Page描述,接下来我写了一个PageUtil,负责对Page对象进行构造:
java代码:


/*Created on 2005-4-14*/
package org.flyware.util.page;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* @author Joa
*
*/

publicclass PageUtil {

privatestaticfinal Log logger = LogFactory.getLog(PageUtil.class);

/**
* Use the origin page to create a new page
* @param page
* @param totalRecords
* @return
*/

publicstatic Page createPage(Page page, int totalRecords){
return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords);
}

/**
* the basic page utils not including exception handler
* @param everyPage
* @param currentPage
* @param totalRecords
* @return page
*/

publicstatic Page createPage(int everyPage, int currentPage, int totalRecords){
everyPage = getEveryPage(everyPage);
currentPage = getCurrentPage(currentPage);
int beginIndex = getBeginIndex(everyPage, currentPage);
int totalPage = getTotalPage(everyPage, totalRecords);
boolean hasNextPage = hasNextPage(currentPage, totalPage);
boolean hasPrePage = hasPrePage(currentPage);

returnnew Page(hasPrePage, hasNextPage,
everyPage, totalPage,
currentPage, beginIndex);
}

privatestaticint getEveryPage(int everyPage){
return everyPage == 0 ? 10 : everyPage;
}

privatestaticint getCurrentPage(int currentPage){
return currentPage == 0 ? 1 : currentPage;
}

privatestaticint getBeginIndex(int everyPage, int currentPage){
return(currentPage - 1) * everyPage;
}

privatestaticint getTotalPage(int everyPage, int totalRecords){
int totalPage = 0;

if(totalRecords % everyPage == 0)
totalPage = totalRecords / everyPage;
else
totalPage = totalRecords / everyPage + 1 ;

return totalPage;
}

privatestaticboolean hasPrePage(int currentPage){
return currentPage == 1 ? false : true;
}

privatestaticboolean hasNextPage(int currentPage, int totalPage){
return currentPage == totalPage || totalPage == 0 ? false : true;
}


}



上面的这两个对象与具体的业务逻辑无关,可以独立和抽象。

面对一个具体的业务逻辑:分页查询出User,每页10个结果。具体做法如下:
1. 编写一个通用的结果存储类Result,这个类包含一个Page对象的信息,和一个结果集List:
java代码:


/*Created on 2005-6-13*/
package com.adt.bo;

import java.util.List;

import org.flyware.util.page.Page;

/**
* @author Joa
*/

publicclass Result {

private Page page;

privateList content;

/**
* The default constructor
*/

public Result(){
super();
}

/**
* The constructor using fields
*
* @param page
* @param content
*/

public Result(Page page, List content)color: rgb(0,
分享到:
评论

相关推荐

    struts+hibernate 项目

    这个“Struts+Hibernate项目”旨在为开发者提供一个学习和实践的平台,帮助他们快速理解这两种框架的集成使用,并应用于实际项目开发。 Struts是一个基于MVC(Model-View-Controller)设计模式的开源框架,主要用于...

    struts+hibernate做的分页显示

    在这个项目中,"struts+hibernate做的分页显示"主要是利用这两者来实现数据的分页展示,提升用户体验,降低服务器压力。 首先,Struts是一个基于MVC设计模式的Java Web框架,它简化了开发过程,提供了处理HTTP请求...

    简单struts+spring+hibernate搭建,配置

    简单struts+spring+hibernate搭建,配置,适合初学者

    Struts+Hibernate增删改查

    因项目还在开发,所以本人只拿出一块单独的struts+hibernate增、删、改、查来演示,具体的一些包一看就知道; 项目直接在MyEclipse6.0运行,环境是里面自带的,用过的人都知道。本人测试没有问题。 具体的页面...

    图书管理系统spring+struts+hibernate

    《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、Struts和Hibernate。该系统利用MySQL作为数据库存储数据,提供了完整的数据库备份,确保了数据的安全性与...

    AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架)

    AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架) AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架) AJAX实现用户登录注册(Struts+Spring+Hibernate+Ajax框架)

    Java Web整合开发完全自学手册:Struts+Hibernate+Spring+Eclipse源码

    《JavaWeb整合开发完全自学手册》介绍如何整合Struts+Hibernate+Spring+Eclipse进行J2EE开发,所有实例都基于MyEclipseIDE开发,引领读者快速进入基于JavaWeb的J2EE应用领域。《JavaWeb整合开发完全自学手册》主要...

    Struts+Hibernate实现分页

    总结一下,实现Struts+Hibernate的分页功能主要包括以下步骤: 1. 创建实体类并配置ORM映射。 2. 编写Action类,处理分页请求,执行分页查询,并计算总页数。 3. 在JSP中展示数据和分页链接,利用请求范围内的属性...

    一个spring+struts+hibernate的例子

    一个spring+struts+hibernate的例子,是eclipse的工程,用tomcat5和mysql,文件夹下包含所有的源码和库,另外还有一个.sql的文件用于建立数据库。大家觉得它有什么不好,欢迎交流

    开发者突击·Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)源码

    《开发者突击:Java Web主流框架整合开发(J2EE+Struts+Hibernate+Spring)》详细介绍了Java Web软件架构中的各种开发技术。主要内容包括:以MySQL为数据库、Tomcat为Web服务器、Eclipse为开发工具、CVS为版本控制工具...

    Struts + Hibernate 分页实现

    在"Struts + Hibernate 分页实现"这个项目中,重点在于如何在Web应用中整合这两个框架,并实现数据的分页显示。分页是大型数据集处理时常见的需求,它能够帮助用户更有效地浏览和管理大量信息,避免一次性加载所有...

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    struts+hibernate整合jar包

    Struts和Hibernate是两个在Java Web开发中广泛使用的开源框架。Struts主要负责MVC(Model-View-Controller)架构的实现,提供控制层的功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作...

    整合Struts+Hibernate+Spring应用开发详解

    本光盘是《整合Struts+Hibernate+Spring应用开发详解》一书的配书光盘,书中的代码按章存放, 即第二章所使用的代码放在codes文件夹的02文件夹下,依次类推。 本光盘根目录下有11个文件夹,其内容和含义说明如下: ...

    Struts + Hibernate 实现简单分页功能

    本篇将详细讲解如何利用Struts和Hibernate来实现一个简单的分页功能。 首先,我们需要理解分页的基本原理。分页是为了提高用户体验,避免一次性加载大量数据导致页面加载慢或内存压力过大。在Web应用中,我们通常将...

    车辆管理系统(struts+hibernate+spring+oracle).rar

    这个系统的核心架构是使用了经典的Java企业级开发框架组合:Struts、Hibernate、Spring以及Oracle数据库。接下来,我们将详细讨论这些技术在车辆管理系统中的作用和相关知识点。 1. Struts: Struts是Apache组织...

    用Struts+Hibernate做的分页

    通过这个项目,开发者可以学习到如何在Struts和Hibernate的集成环境下实现分页功能,理解MVC架构下各层的职责,以及如何使用Hibernate进行数据库操作。此外,还能了解到如何在前端展示分页信息,提高用户体验。这是...

    网上图书系统(Struts+Hibernate+Jsp)

    网上图书系统是一个基于Web的应用程序,它整合了Struts、Hibernate和JSP三大技术,用于实现在线图书管理和销售的功能。这个系统通常包含用户界面、业务逻辑层和数据持久化层,下面将详细介绍这三个核心技术及其在...

    基于struts+hibernate+spring的用户管理系统

    【基于Struts+Hibernate+Spring的用户管理系统】是一种常见的企业级Web应用架构,它整合了三个主流的Java技术框架,以构建高效、可维护性高的系统。Struts提供了MVC(Model-View-Controller)设计模式,使得业务逻辑...

    整合Struts+Hibernate+Spring应用开发详解2

    本光盘是《整合Struts+Hibernate+Spring应用开发详解》一书的配书光盘,书中的代码按章存放, 即第二章所使用的代码放在codes文件夹的02文件夹下,依次类推。 本光盘根目录下有11个文件夹,其内容和含义说明如下: ...

Global site tag (gtag.js) - Google Analytics