hiabernate+Struts 分页
环境:Eclipse3.3+MyEclipse6.0GA+SQL2000

前段时间在网上看到了几个人写的分页好多都是从其他人的基础上修改而来的。其实在用Hibernate来实现分页实在是再简单不过
Query对象中的.setFirstResult()和.setMaxResults()就已经可以实现分页的查询。只是需要在页面中作几个业务处理就可以达到分页的效果
自己写了一个分页,希望高手指导指导

.java类文件:
PaginationLogic.java
---------------------------------------------------------------------------------------------------------
package pageination;

import java.util.Collection;

import org.hibernate.Session;
import org.hibernate.Transaction;

import zhudonghua.HibernateSessionFactory;

public class PaginationLogic {
public PaginationLogic() {
  
}

/*******************************
*该方法主要是获得数据库中*
*所有数据库的总行数,   *
*用于在页面中实现所分数 *
*******************************/
/**
* @param tableName
* @return int
*/
public int getDataCont(String tableName) {
   int cont = 0;

   Session session = HibernateSessionFactory.getSession();
   Transaction tran = session.beginTransaction();

   Integer cos = (Integer) session.createQuery(
     "select count(*) from " + tableName).uniqueResult();

   cont = cos.intValue();

   tran.commit();
   session.close();
   System.out.println("PaginationLogic Count"+cont);
   return cont;
}

 

 

/*******************************
*该方法主要是获得数据库中*
*想查询的数据行数        *
*int first 开始的索引    *
*int max   查询的行数    *
*String tableName 表名   *
*******************************/
/**
* @param first
* @param max
* @return list
*/
public Collection findALl(int first, int max,String tableName) {

   Session session = HibernateSessionFactory.getSession();

   Transaction tran = session.beginTransaction();

   Collection list = session.createQuery("from "+tableName).setFirstResult(first)
     .setMaxResults(max).list();

   tran.commit();
   HibernateSessionFactory.closeSession();

   return list;
}

}

Page.Java
------------------------------------------页面显示信息------------------------------------------------------------

/*********************************
*该类的信息相关要在.Jsp页面显示.*
********************************/


package pageination;

public class PageClass {

public PageClass() {
}

private int pageCount;      // 总页数

private int currentPage;     // 当前页数

private int pageShow;      // 每页显示的行数

private int nextIndex;      // 下一页数据开始的索引

private final String hashNext="hashnext"; // 下一页字符串

private final String hashUp="hashup";    // 下一页的字符串

public int getCurrentPage() {

   return currentPage;
}

/**
* 如果传递近来的是负数则该页还是第1页
*
* @param currentPage
*/
public void setCurrentPage(int Page) {
   if (Page < 1) {
    this.currentPage = 1;
   } else if(Page <=this.pageCount){
    this.currentPage = Page;
   }

   //System.out.println("PageClass currentPage value:" + this.currentPage);

}

/**
* 获得下一页的起始索引 根据当前的相关信息 下一页的开始索引为 0=1*7-7 0为第一页所显示7条数据的第一行
* return int
*/
public int getNextIndex() {

   this.nextIndex = (this.currentPage * this.pageShow) - this.pageShow;
   if (this.nextIndex < 0) {
    this.nextIndex = 0;
   }

   return nextIndex;
}

/**
* 获得共有的页数
*
* @return int
*/
public int getPageCount() {
   return pageCount;
}

/**
* 设置分页后的总页数 分页数=总数居行/每页显示行
*
* @param pageCount
*/

public void setPageCount(int dateCount) {
   int num = dateCount % this.pageShow;
   //System.out.println("PageClass pageShow values:"+this.pageShow);

   if (num == 0) {
    this.pageCount = dateCount / this.pageShow;
   } else {
    // 如果不能被数据的总行数整除说明后面还有数据总页数+1
    this.pageCount = (dateCount / this.pageShow) + 1;
   }
   //System.out.println("pageclass pageCount value:"+this.pageCount);

}

/**
* 每页显示行数
*
* @return Int
*/
public int getPageShow() {
   return pageShow;
}

/**
* 每页显示行数
*
* @return int
*/
public void setPageShow(int pageShow) {
   this.pageShow = pageShow;
}

public String getHashNext() {
   return hashNext;
}

public String getHashUp() {
   return hashUp;
}


}

 

Action.java类,我用的是两个Action。ShowObjectAction.java用来初始化Page.java类中的属性。PageNextAndUpAction.java用来实现上下页的操作.至于页面上的查询页码那个只需要一个表单Bean和一个Action就可以实现
--------------------------------------------------------------------------------------------------------------------------
ShowObjectAction.java

/************************
*本类用去初始化页面信息*
************************/

package zhudonghua.action;

import java.util.Collection;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pageination.PageClass;
import pageination.PaginationLogic;


public class ShowObjectAction extends Action {
/*
* Generated Methods
*/

/**
* 用于初始化该页的信息
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
    //TODO 初始化页面的相关信息
  
   PaginationLogic pagination=new PaginationLogic();
   int num=pagination.getDataCont("Object");   //获得数据库中数据的总行数
   PageClass page=new PageClass();
   page.setCurrentPage(1);   //设置当前页
   page.setPageShow(3);   //设置每页显示的行数
   page.setPageCount(num);   //设置总页数
   int first=page.getNextIndex(); //获得开始的索引值
   int max=page.getPageShow();   //获得每次显示的值
  
   Collection list=pagination.findALl(first, max, "Object"); //获得当前页显示的数据
  
   request.getSession().setAttribute("page",page);
   request.setAttribute("show", list);
  
  
   return mapping.findForward("show");
}
}
--------------------------------------------------------------------------------------------------------------------------
PageNextAndUpAction.java用户执行上一页下一页的操作

package zhudonghua.action;

import java.util.Collection;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import pageination.PageClass;
import pageination.PaginationLogic;

/**
* MyEclipse Struts
* Creation date: 12-19-2007
*
* XDoclet definition:
* @struts.action validate="true"
* @struts.action-forward name="show" path="/show.jsp"
*/
public class PageNextAndUpAction extends Action {
   public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {
   // TODO 分页
  
  
   String linkValue=request.getParameter("currentPage");
  
   PageClass page=(PageClass)request.getSession().getAttribute("page");
   int current=page.getCurrentPage();
   int pageshow=page.getPageShow();   //获得页面显示的行数
  
  
  
   //判断超链接传递的值
   if(linkValue.equals("hashup"))
   {   
    page.setCurrentPage(current-1);
   
   
   }else if(linkValue.equals("hashnext"))
   {
    page.setCurrentPage(current+1);
   }
  
   int index=page.getNextIndex();    ///获得下一页数据的First索引值
  
   PaginationLogic pagin=new PaginationLogic();
   Collection list=pagin.findALl(index, pageshow, "Object");   //获得数据库中的该页信息
  
   request.setAttribute("show", list);
   request.getSession().setAttribute("page",page);  
  
   return mapping.findForward("show");
}
}
----------------------------------------------------------------------------------------------------------------
Hibernate配置文件 hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
<property name="connection.username">sa</property>
<property name="connection.url">jdbc:microsoft:sqlserver://.:1433</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<property name="myeclipse.connection.profile">sql</property>
<property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
<property name="show_sql">true</property>
<property name="connection.password"></property>
<mapping resource="zhudonghua/Object.hbm.xml" />

</session-factory>

</hibernate-configuration>

 


至于页面上的表单提交以及处理请求就是一格表单bean和一个Action。上一页和下一页完全可以使用Struts标签中的逻辑标签来判断是否允许下一页。方法:将 page.java中的 hashNext和HashUp属性 不设置为final,在Action判断传递参数。在页面用Logic标签判断这两个属性的值
我个人任务目前作这样就已经可以满足使用也就不在写下去了。对于PaginationLogic.java中使用的HibernateSessionFactory对象我使用的是Eclipse中自动生成的类;