Struts2 Hibernate Spring分页及分页查询



Struts2 Hibernate Spring分页及分页查询。

最近学习写了一个分页以及查询的功能。主要就是用了Hibernate的一些功能。直接说吧。。

   首页写一个PageBean类

==================================================================================================

public class PageBean{

 private List list;        //要返回的某一页的记录列表
   
    private int allRow;         //总记录数
    private int totalPage;        //总页数
    private int currentPage;    //当前页
    private int pageSize;        //每页记录数
    private String strpage;     //链接增加的字符参数
   

 private boolean isFirstPage;    //是否为第一页
    private boolean isLastPage;        //是否为最后一页
    private boolean hasPreviousPage;    //是否有前一页
    private boolean hasNextPage;        //是否有下一页
   
   
    public List getList() {
        return list;
    }
    public void setList(List list) {
        this.list = list;
    }
    public int getAllRow() {
        return allRow;
    }
    public void setAllRow(int allRow) {
        this.allRow = allRow;
    }
    public int getTotalPage() {
        return totalPage;
    }
    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
    public int getCurrentPage() {
        return currentPage;
    }
    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
   
 public String getStrpage() {
  return strpage;
 }
 public void setStrpage(String strpage) {
  this.strpage = strpage;
 }
   
   
    public void init(){
        this.isFirstPage = isFirstPage();
        this.isLastPage = isLastPage();
        this.hasPreviousPage = isHasPreviousPage();
        this.hasNextPage = isHasNextPage();
    }
   
   
   
    public boolean isFirstPage() {
        return currentPage == 1;    // 如是当前页是第1页
    }
    public boolean isLastPage() {
        return currentPage == totalPage;    //如果当前页是最后一页
    }
    public boolean isHasPreviousPage() {
        return currentPage != 1;        //只要当前页不是第1页
    }
    public boolean isHasNextPage() {
        return currentPage != totalPage;    //只要当前页不是最后1页
    }
   
   
   
    public static int countTotalPage(final int pageSize,final int allRow){
        int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;
        return totalPage;
    }
   
   
    public static int countOffset(final int pageSize,final int currentPage){
        final int offset = pageSize*(currentPage-1);
        return offset;
    }
   
   
    public static int countCurrentPage(int page){
        final int curPage = (page==0?1:page);
        return curPage;
    }
==================================================================================================

   在写实现、操作数据库的Pagination类。

==================================================================================================

public class Pagination extends HibernateDaoSupport {

 
   @SuppressWarnings(“unchecked”)
public List queryForPage(final String hql,final int offset,final int length){
       List list = getHibernateTemplate().executeFind(new HibernateCallback(){
           public Object doInHibernate(Session session) throws HibernateException,SQLException{
               Query query = session.createQuery(hql);
               query.setFirstResult(offset);
               query.setMaxResults(length);
               List list = query.list();
               return list;
           }
       });
       return list;
   }
  
  
   public int getAllRowCount(String hql){
       return getHibernateTemplate().find(hql).size();
   }

  
   @SuppressWarnings(“unchecked”)
public PageBean findAll(final String hql,int pageSize,int page)
{
       int allRow = getAllRowCount(hql);    //总记录数
       int totalPage = PageBean.countTotalPage(pageSize, allRow);    //总页数
       final int offset = PageBean.countOffset(pageSize, page);    //当前页开始记录
       final int length = pageSize;    //每页记录数
       final int currentPage = PageBean.countCurrentPage(page);
       List<User> list = queryForPage(hql,offset, length);        //”一页”的记录
      
       //把分页信息保存到Bean中
       PageBean pageBean = new PageBean();
       pageBean.setPageSize(pageSize);   
       pageBean.setCurrentPage(currentPage);
       pageBean.setAllRow(allRow);
       pageBean.setTotalPage(totalPage);
       pageBean.setList(list);
       pageBean.init();
       return pageBean;

}==================================================================================================

   由于这个类需要操作数据库。需要在Spring的配置文件applicationContext.xml中添加

==================================================================================================

<bean id=”pagination”
 scope=”singleton”>
 <property name=”sessionFactory”>
  <ref bean=”sessionFactory” />
 </property>
</bean>

==================================================================================================


   在具体实现某种需求的时候调用Pagination类中的方法。下面拿我写的一个用户类做例子

==================================================================================================

//查询所用用户 分页
public PageBean findAll(int pageSize,int page)
{
 //return this.userDao.findAllUsers();
 
 String hql = “from User”;        //查询语句
 
       return this.pagination.findAll(hql, pageSize, page);

}

//用户搜索 分页

public PageBean search(String field, String search, int pageSize, int page) {

 String hql = “from User where “+field+” like ‘%”+search+”%’”;        //查询语句
 
       return this.pagination.findAll(hql, pageSize, page);
}

==================================================================================================

   后台基本就这些了,前台分页部分我是这样写的。

==================================================================================================

<span>
        共<s:property value=”pageBean.allRow”/> 条记录
       共<s:property value=”pageBean.totalPage”/> 页
       当前第<s:property value=”pageBean.currentPage”/>页
      
       <s:if test=”%{pageBean.currentPage == 1}”>
           第一页 上一页
       </s:if>
       <s:else>
           <a href=”listUser.action?page=1&field=${field}&search=${search}”>第一页</a>
           <a href=”listUser.action?page=${pageBean.currentPage-1}&field=${field}&search=${search}”>上一页</a>
       </s:else>
       <s:if test=”%{pageBean.currentPage != pageBean.totalPage}”>
           <a href=”listUser.action?page=${pageBean.currentPage+1}&field=${field}&search=${search}”>下一页</a>
           <a href=”listUser.action?page=${pageBean.totalPage}&field=${field}&search=${search}”>最后一页</a>
       </s:if>
       <s:else>
           下一页 最后一页
       </s:else></span>

==================================================================================================

  需要指出的是由于加了查询所以在翻页的时候需要传field和search变量的值。

http://blog.sina.com.cn/s/blog_7d0c4ede0100thmt.html