zoukankan      html  css  js  c++  java
  • 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(&换成@)及时与本人联系。转载亦请注明出处,谢谢。

  • 相关阅读:
    nginx变量(日志log_format)
    nginx中间件
    social-auth-app-django集成第三方登录
    Django REST Framework限速
    django-redis
    Django REST Framework extensions
    django-rest-framework-jwt
    FromXml 支付回调 xml 转数组
    下个月此时
    PHP 暂停函数 sleep() 与 usleep() 的区别
  • 原文地址:https://www.cnblogs.com/qintang/p/8124938.html
Copyright © 2011-2022 走看看