SSH后台分页

初学SSH,开始用的Struts2+Hibernate3+Spring3,Hibernate中用的HibernateTemplate进行数据库的操作。之后在进行前台页面显示的时候,要用到分页,查了一下资料,Spring 整合 Hibernate 时候用的 HibernateTemplate 不支持分页,因此需要自己包装一个类进行分页,具体实现感觉有点不懂,就没怎么看了。

之后决定把框架都换成跟书上一样的,Struts2.3.34+Hibernate4.3.5+Spring4.0.4,把映射方式改成了注解(其中也遇到了很多问题,卡了很久,见《注解改成映射遇到的问题》),能够正常的List和Delete之后便准备又开始进行分页的工作。

刚刚开始真的是一点头绪都没有,就到处找代码,问人,去GitHub找现成的项目,反正过程很艰难╮(╯﹏╰)╭。

现在把能用的代码整理如下,主体还是借鉴了大神的源码:http://www.blogjava.net/DyEnigma/articles/352773.html

1.数据库建表

2.PO

student.java

 1 package po;
 2 
 3 import javax.persistence.Column;
 4 import javax.persistence.Entity;
 5 import javax.persistence.GeneratedValue;
 6 import javax.persistence.GenerationType;
 7 import javax.persistence.Id;
 8 import javax.persistence.Table;
 9 
10 @Entity
11 @Table(name = "student")
12 public class Student {
13     @Id @Column(name="id")
14     @GeneratedValue(strategy = GenerationType.AUTO)
15     private Integer id;
16     
17     @Column(name="sid")
18     private String sid;
19     
20     @Column(name="sname")
21     private String sname;
22     
23     @Column(name="sex")
24     private String sex;
25     
26     //setter和getter
27 }

3.DAO

BaseDAO

package dao;

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

public interface BaseDAO<T>
{
    // 根据ID加载实体
    T get(Class<T> entityClazz , Serializable id);
    // 保存实体
    Serializable save(T entity);
    // 更新实体
    void update(T entity);
    // 删除实体
    void delete(T entity);
    // 根据ID删除实体
    void delete(Class<T> entityClazz , Serializable id);
    // 获取所有实体
    List<T> findAll(Class<T> entityClazz);
    // 获取实体总数
    long findCount(Class<T> entityClazz);
    //分页获取
    List<T> findByPage(String hql, int pageNo, int pageSize);
}

BaseDAOImpl

package dao;

import org.hibernate.*;
import org.springframework.transaction.annotation.Transactional;

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

public class BaseDAOImpl<T> implements BaseDAO<T>
{
    // DAO组件进行持久化操作底层依赖的SessionFactory组件
    private SessionFactory sessionFactory;

    // 依赖注入SessionFactory所需的setter方法
    public void setSessionFactory(SessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }
    public SessionFactory getSessionFactory()
    {
        return this.sessionFactory;
    }

    // 根据ID加载实体
    @SuppressWarnings("unchecked")
    @Transactional
    public T get(Class<T> entityClazz , Serializable id)
    {
        return (T)getSessionFactory().getCurrentSession()
            .get(entityClazz , id);
    }

    // 保存实体
        @Transactional
    public Serializable save(T entity)
    {
        return getSessionFactory().getCurrentSession()
            .save(entity);
    }

    // 更新实体
        @Transactional
    public void update(T entity)
    {
        getSessionFactory().getCurrentSession().saveOrUpdate(entity);
    }

    // 删除实体
    @Transactional
    public void delete(T entity)
    {
        getSessionFactory().getCurrentSession().delete(entity);
    }

    // 根据ID删除实体
    @Transactional
    public void delete(Class<T> entityClazz , Serializable id)
    {
        getSessionFactory().getCurrentSession()
            .createQuery("delete " + entityClazz.getSimpleName()
                + " en where en.id = ?0")
            .setParameter("0" , id)
            .executeUpdate();
    }

    // 获取所有实体
    @Transactional
    public List<T> findAll(Class<T> entityClazz)
    {
        return find("select en from "
            + entityClazz.getSimpleName() + " en");
    }

    // 获取实体总数
    @Transactional
    public long findCount(Class<T> entityClazz)
    {
        List<?> l = find("select count(*) from "
            + entityClazz.getSimpleName());
        // 返回查询得到的实体总数
        if (l != null && l.size() == 1 )
        {
            return (Long)l.get(0);
        }
        return 0;
    }

    /**
     * 使用hql 语句进行分页查询操作
     * @param hql 需要查询的hql语句
     * @param pageNo 查询第pageNo页的记录
     * @param pageSize 每页需要显示的记录数
     * @return 当前页的所有记录
     */
    @SuppressWarnings("unchecked")
    @Transactional
    public List<T> findByPage(String hql,
         int pageNo, int pageSize)
    {
        // 创建查询
        return getSessionFactory().getCurrentSession()
            .createQuery(hql)
            // 执行分页
            .setFirstResult(pageNo)
            .setMaxResults(pageSize)
            .list();
    }
}    

StudentDAO和StudentDAOImpl直接继承以上即可无须修改

4.创建一个PageBean

package vo;

import java.util.List;


public class PageBean {
  
     @SuppressWarnings("rawtypes")
     private List list;// 要返回的某一页的记录列表
      
     private int allRow; // 总记录数
     private int totalPage; // 总页数
     private int currentPage; // 当前页
     private int pageSize;// 每页记录数
     
     @SuppressWarnings("unused")
     private boolean isFirstPage; // 是否为第一页
     @SuppressWarnings("unused")
     private boolean isLastPage;// 是否为最后一页
     @SuppressWarnings("unused")
     private boolean hasPreviousPage; // 是否有前一页
     @SuppressWarnings("unused")
     private boolean hasNextPage;// 是否有下一页

     @SuppressWarnings("rawtypes")
    public List getList() {
         return list;
     }
 
    @SuppressWarnings("rawtypes")
    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 void init() {
         this.isFirstPage = isFirstPage();
         this.isLastPage = isLastPage();
         this.hasPreviousPage = isHasPreviousPage();
         this.hasNextPage = isHasNextPage();
     }
 
     /**
      * 以下判断页的信息,只需getter方法(is方法)即可
      * 
      * @return
      */
     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页
     }
 
     /**
     * 计算总页数,静态方法,供外部直接通过类名调用
      * 
      * @param pageSize每页记录数
      * @param allRow总记录数
     * @return 总页数
     */
    public static int countTotalPage(final int pageSize, final int allRow) {
        int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;
        return totalPage;
    }

    /**
     * 计算当前页开始记录
     * 
     * @param pageSize每页记录数
     * @param currentPage当前第几页
     * @return 当前页开始记录号
     */
    public static int countOffset(final int pageSize, final int currentPage) {
        final int offset = pageSize * (currentPage - 1);
        return offset;
    }

    /**
     * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
     * 
    * @paramPage 传入的参数(可能为空,即0,则返回1)
     * @return 当前页
     */
    public static int countCurrentPage(int page) {
        final int curPage = (page == 0 ? 1 : page);
        return curPage;
    }
}

5.Service层

StudentService.java

package service;

import java.util.List;

import po.Student;
import vo.PageBean;

public interface StudentService {//分页查询
    PageBean queryForPage(int pageSize, int currentPage);
}

StudentServiceImpl.java

package service;

import java.util.List;

import po.Student;
import vo.PageBean;
import dao.StudentDAO;

public class StudentServiceImpl implements StudentService{
    
    private StudentDAO studentDAO;
    
    public void setStudentDAO(StudentDAO studentDAO)
    {
        this.studentDAO = studentDAO;
    }

    
    @Override
    public PageBean queryForPage(int pageSize, int page) {
        
        int count =  (int) studentDAO.findCount(Student.class); // 总记录数
        int totalPage = PageBean.countTotalPage(pageSize, count); // 总页数
        int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录
        int length = pageSize; // 每页记录数
        int currentPage = PageBean.countCurrentPage(page);
        List<Student> list = studentDAO.findByPage("from Student", offset, length); // 该分页的记录
        // 把分页信息保存到Bean中
        PageBean pageBean = new PageBean();
        pageBean.setPageSize(pageSize);
        pageBean.setCurrentPage(currentPage);
        pageBean.setAllRow(count);
        pageBean.setTotalPage(totalPage);
        pageBean.setList(list);
        pageBean.init();
        return pageBean;
    }
}

6.action

package action;

import java.util.List;

import po.Student;
import service.StudentService;
import vo.PageBean;

import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class StudentAction extends ActionSupport{
    private StudentService studentService;

    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }
    
    
    private int page;

    private PageBean pageBean;

    public int getPage() {
        return page;
    }
    
    public void setPage(int page) {
        this.page = page;
    }
    
    public PageBean getPageBean() {
        return pageBean;
    }
    public void setPageBean(PageBean pageBean) {
        this.pageBean = pageBean;
    }
    
    
    public String pageList(){
        this.pageBean = studentService.queryForPage(4, page);
        return SUCCESS;
    }
}

7.前端界面

<table width="800px" border="1px">
    <s:iterator value="pageBean.list">
        <tr>
            <td ><s:property value="sid"/></td>
            <td ><s:property value="sname"/></td>
            <td ><s:property value="sex"/></td>
        </tr>
    </s:iterator>
       <tr>
        <td>共<s:property value="pageBean.totalPage" />页
            共<s:property value="pageBean.allRow" />条记录
            当前第<s:property value="pageBean.currentPage" />页
<s:if test="%{pageBean.currentPage == 1}">第一页&nbsp;上一页&nbsp;
</s:if> <s:else> <a href="studentPageList.action?page=1">第一页&nbsp;</a> <a href="studentPageList.action?page=<s:property value='%{pageBean.currentPage-1}'/>">上一页&nbsp;</a> </s:else> <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> <a href="studentPageList.action?page=<s:property value='%{pageBean.currentPage+1}'/>">下一页&nbsp;</a> <a href="studentPageList.action?page=<s:property value='pageBean.totalPage'/>">最后一页</a> </s:if> <s:else>下一页&nbsp; 最后一页
</s:else> </td> </tr> </table>

8.效果图

struts.xml和applicationContext.xml配置文件这里就省略了

这次写分页给我最大感觉,只要付出了足够的时间,即使开始感觉很难做的东西都会写着写着,慢慢地就出来了,即使有些地方你不懂,但是你会很莫名其妙的去改正它,虽然你也不知道你为什么要去改,就好像是你知道怎么做一样。。。

最后要感谢龙哥的热心帮助,不仅写了份开发文档,还认真地指导了我很多,真是非常感谢!

 此文部分内容来源网络,如有侵犯您的版权问题,请来消息至电子邮件2147895584&qq.com(&换成@)及时与本人联系。转载亦请注明出处,谢谢。

原文地址:https://www.cnblogs.com/qintang/p/8124938.html