SSH后台分页
Posted 秦唐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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}">第一页 上一页
</s:if> <s:else> <a href="studentPageList.action?page=1">第一页 </a> <a href="studentPageList.action?page=<s:property value=\'%{pageBean.currentPage-1}\'/>">上一页 </a> </s:else> <s:if test="%{pageBean.currentPage != pageBean.totalPage}"> <a href="studentPageList.action?page=<s:property value=\'%{pageBean.currentPage+1}\'/>">下一页 </a> <a href="studentPageList.action?page=<s:property value=\'pageBean.totalPage\'/>">最后一页</a> </s:if> <s:else>下一页 最后一页
</s:else> </td> </tr> </table>
8.效果图
struts.xml和applicationContext.xml配置文件这里就省略了
这次写分页给我最大感觉,只要付出了足够的时间,即使开始感觉很难做的东西都会写着写着,慢慢地就出来了,即使有些地方你不懂,但是你会很莫名其妙的去改正它,虽然你也不知道你为什么要去改,就好像是你知道怎么做一样。。。
最后要感谢龙哥的热心帮助,不仅写了份开发文档,还认真地指导了我很多,真是非常感谢!
此文部分内容来源网络,如有侵犯您的版权问题,请来消息至电子邮件2147895584&qq.com(&换成@)及时与本人联系。转载亦请注明出处,谢谢。
以上是关于SSH后台分页的主要内容,如果未能解决你的问题,请参考以下文章
modx - 当我在同上片段中使用“&documents =”参数时,分页不起作用