初学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

  1. package dao;
  2.  
  3. import java.util.List;
  4. import java.io.Serializable;
  5.  
  6. public interface BaseDAO<T>
  7. {
  8. // 根据ID加载实体
  9. T get(Class<T> entityClazz , Serializable id);
  10. // 保存实体
  11. Serializable save(T entity);
  12. // 更新实体
  13. void update(T entity);
  14. // 删除实体
  15. void delete(T entity);
  16. // 根据ID删除实体
  17. void delete(Class<T> entityClazz , Serializable id);
  18. // 获取所有实体
  19. List<T> findAll(Class<T> entityClazz);
  20. // 获取实体总数
  21. long findCount(Class<T> entityClazz);
  22. //分页获取
  23. List<T> findByPage(String hql, int pageNo, int pageSize);
  24. }

BaseDAOImpl

  1. package dao;
  2.  
  3. import org.hibernate.*;
  4. import org.springframework.transaction.annotation.Transactional;
  5.  
  6. import java.util.List;
  7. import java.io.Serializable;
  8.  
  9. public class BaseDAOImpl<T> implements BaseDAO<T>
  10. {
  11. // DAO组件进行持久化操作底层依赖的SessionFactory组件
  12. private SessionFactory sessionFactory;
  13.  
  14. // 依赖注入SessionFactory所需的setter方法
  15. public void setSessionFactory(SessionFactory sessionFactory)
  16. {
  17. this.sessionFactory = sessionFactory;
  18. }
  19. public SessionFactory getSessionFactory()
  20. {
  21. return this.sessionFactory;
  22. }
  23.  
  24. // 根据ID加载实体
  25. @SuppressWarnings("unchecked")
  26. @Transactional
  27. public T get(Class<T> entityClazz , Serializable id)
  28. {
  29. return (T)getSessionFactory().getCurrentSession()
  30. .get(entityClazz , id);
  31. }
  32.  
  33. // 保存实体
  34. @Transactional
  35. public Serializable save(T entity)
  36. {
  37. return getSessionFactory().getCurrentSession()
  38. .save(entity);
  39. }
  40.  
  41. // 更新实体
  42. @Transactional
  43. public void update(T entity)
  44. {
  45. getSessionFactory().getCurrentSession().saveOrUpdate(entity);
  46. }
  47.  
  48. // 删除实体
  49. @Transactional
  50. public void delete(T entity)
  51. {
  52. getSessionFactory().getCurrentSession().delete(entity);
  53. }
  54.  
  55. // 根据ID删除实体
  56. @Transactional
  57. public void delete(Class<T> entityClazz , Serializable id)
  58. {
  59. getSessionFactory().getCurrentSession()
  60. .createQuery("delete " + entityClazz.getSimpleName()
  61. + " en where en.id = ?0")
  62. .setParameter("0" , id)
  63. .executeUpdate();
  64. }
  65.  
  66. // 获取所有实体
  67. @Transactional
  68. public List<T> findAll(Class<T> entityClazz)
  69. {
  70. return find("select en from "
  71. + entityClazz.getSimpleName() + " en");
  72. }
  73.  
  74. // 获取实体总数
  75. @Transactional
  76. public long findCount(Class<T> entityClazz)
  77. {
  78. List<?> l = find("select count(*) from "
  79. + entityClazz.getSimpleName());
  80. // 返回查询得到的实体总数
  81. if (l != null && l.size() == 1 )
  82. {
  83. return (Long)l.get(0);
  84. }
  85. return 0;
  86. }
  87.  
  88. /**
  89. * 使用hql 语句进行分页查询操作
  90. * @param hql 需要查询的hql语句
  91. * @param pageNo 查询第pageNo页的记录
  92. * @param pageSize 每页需要显示的记录数
  93. * @return 当前页的所有记录
  94. */
  95. @SuppressWarnings("unchecked")
  96. @Transactional
  97. public List<T> findByPage(String hql,
  98. int pageNo, int pageSize)
  99. {
  100. // 创建查询
  101. return getSessionFactory().getCurrentSession()
  102. .createQuery(hql)
  103. // 执行分页
  104. .setFirstResult(pageNo)
  105. .setMaxResults(pageSize)
  106. .list();
  107. }
  108. }

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

4.创建一个PageBean

  1. package vo;
  2.  
  3. import java.util.List;
  4.  
  5. public class PageBean {
  6.  
  7. @SuppressWarnings("rawtypes")
  8. private List list;// 要返回的某一页的记录列表
  9.  
  10. private int allRow; // 总记录数
  11. private int totalPage; // 总页数
  12. private int currentPage; // 当前页
  13. private int pageSize;// 每页记录数
  14.  
  15. @SuppressWarnings("unused")
  16. private boolean isFirstPage; // 是否为第一页
  17. @SuppressWarnings("unused")
  18. private boolean isLastPage;// 是否为最后一页
  19. @SuppressWarnings("unused")
  20. private boolean hasPreviousPage; // 是否有前一页
  21. @SuppressWarnings("unused")
  22. private boolean hasNextPage;// 是否有下一页
  23.  
  24. @SuppressWarnings("rawtypes")
  25. public List getList() {
  26. return list;
  27. }
  28.  
  29. @SuppressWarnings("rawtypes")
  30. public void setList(List list) {
  31. this.list = list;
  32. }
  33.  
  34. public int getAllRow() {
  35. return allRow;
  36. }
  37.  
  38. public void setAllRow(int allRow) {
  39. this.allRow = allRow;
  40. }
  41.  
  42. public int getTotalPage() {
  43. return totalPage;
  44. }
  45.  
  46. public void setTotalPage(int totalPage) {
  47. this.totalPage = totalPage;
  48. }
  49.  
  50. public int getCurrentPage() {
  51. return currentPage;
  52. }
  53.  
  54. public void setCurrentPage(int currentPage) {
  55. this.currentPage = currentPage;
  56. }
  57.  
  58. public int getPageSize() {
  59. return pageSize;
  60. }
  61.  
  62. public void setPageSize(int pageSize) {
  63. this.pageSize = pageSize;
  64. }
  65.  
  66. /**
  67. * 初始化分页信息
  68. */
  69. public void init() {
  70. this.isFirstPage = isFirstPage();
  71. this.isLastPage = isLastPage();
  72. this.hasPreviousPage = isHasPreviousPage();
  73. this.hasNextPage = isHasNextPage();
  74. }
  75.  
  76. /**
  77. * 以下判断页的信息,只需getter方法(is方法)即可
  78. *
  79. * @return
  80. */
  81. public boolean isFirstPage() {
  82. return currentPage == 1; // 如是当前页是第1页
  83. }
  84.  
  85. public boolean isLastPage() {
  86. return currentPage == totalPage; // 如果当前页是最后一页
  87. }
  88.  
  89. public boolean isHasPreviousPage() {
  90. return currentPage != 1;// 只要当前页不是第1页
  91. }
  92.  
  93. public boolean isHasNextPage() {
  94. return currentPage != totalPage; // 只要当前页不是最后1页
  95. }
  96.  
  97. /**
  98. * 计算总页数,静态方法,供外部直接通过类名调用
  99. *
  100. * @param pageSize每页记录数
  101. * @param allRow总记录数
  102. * @return 总页数
  103. */
  104. public static int countTotalPage(final int pageSize, final int allRow) {
  105. int totalPage = allRow % pageSize == 0 ? allRow / pageSize : allRow / pageSize + 1;
  106. return totalPage;
  107. }
  108.  
  109. /**
  110. * 计算当前页开始记录
  111. *
  112. * @param pageSize每页记录数
  113. * @param currentPage当前第几页
  114. * @return 当前页开始记录号
  115. */
  116. public static int countOffset(final int pageSize, final int currentPage) {
  117. final int offset = pageSize * (currentPage - 1);
  118. return offset;
  119. }
  120.  
  121. /**
  122. * 计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
  123. *
  124. * @paramPage 传入的参数(可能为空,即0,则返回1)
  125. * @return 当前页
  126. */
  127. public static int countCurrentPage(int page) {
  128. final int curPage = (page == 0 ? 1 : page);
  129. return curPage;
  130. }
  131. }

5.Service层

StudentService.java

  1. package service;
  2.  
  3. import java.util.List;
  4.  
  5. import po.Student;
  6. import vo.PageBean;
  7.  
  8. public interface StudentService {//分页查询
  9. PageBean queryForPage(int pageSize, int currentPage);
  10. }

StudentServiceImpl.java

  1. package service;
  2.  
  3. import java.util.List;
  4.  
  5. import po.Student;
  6. import vo.PageBean;
  7. import dao.StudentDAO;
  8.  
  9. public class StudentServiceImpl implements StudentService{
  10.  
  11. private StudentDAO studentDAO;
  12.  
  13. public void setStudentDAO(StudentDAO studentDAO)
  14. {
  15. this.studentDAO = studentDAO;
  16. }
  17.  
  18. @Override
  19. public PageBean queryForPage(int pageSize, int page) {
  20.  
  21. int count = (int) studentDAO.findCount(Student.class); // 总记录数
  22. int totalPage = PageBean.countTotalPage(pageSize, count); // 总页数
  23. int offset = PageBean.countOffset(pageSize, page); // 当前页开始记录
  24. int length = pageSize; // 每页记录数
  25. int currentPage = PageBean.countCurrentPage(page);
  26. List<Student> list = studentDAO.findByPage("from Student", offset, length); // 该分页的记录
  27. // 把分页信息保存到Bean中
  28. PageBean pageBean = new PageBean();
  29. pageBean.setPageSize(pageSize);
  30. pageBean.setCurrentPage(currentPage);
  31. pageBean.setAllRow(count);
  32. pageBean.setTotalPage(totalPage);
  33. pageBean.setList(list);
  34. pageBean.init();
  35. return pageBean;
  36. }
  37. }

6.action

  1. package action;
  2.  
  3. import java.util.List;
  4.  
  5. import po.Student;
  6. import service.StudentService;
  7. import vo.PageBean;
  8.  
  9. import com.opensymphony.xwork2.ActionSupport;
  10.  
  11. @SuppressWarnings("serial")
  12. public class StudentAction extends ActionSupport{
  13. private StudentService studentService;
  14.  
  15. public void setStudentService(StudentService studentService) {
  16. this.studentService = studentService;
  17. }
  18.  
  19. private int page;
  20.  
  21. private PageBean pageBean;
  22.  
  23. public int getPage() {
  24. return page;
  25. }
  26.  
  27. public void setPage(int page) {
  28. this.page = page;
  29. }
  30.  
  31. public PageBean getPageBean() {
  32. return pageBean;
  33. }
  34. public void setPageBean(PageBean pageBean) {
  35. this.pageBean = pageBean;
  36. }
  37.  
  38. public String pageList(){
  39. this.pageBean = studentService.queryForPage(4, page);
  40. return SUCCESS;
  41. }
  42. }

7.前端界面

  1. <table width="800px" border="1px">
  2. <s:iterator value="pageBean.list">
  3. <tr>
  4. <td ><s:property value="sid"/></td>
  5. <td ><s:property value="sname"/></td>
  6. <td ><s:property value="sex"/></td>
  7. </tr>
  8. </s:iterator>
  9. <tr>
  10. <td><s:property value="pageBean.totalPage" />
  11. <s:property value="pageBean.allRow" />条记录
  12. 当前第<s:property value="pageBean.currentPage" />
    <s:if test="%{pageBean.currentPage == 1}">第一页&nbsp;上一页&nbsp;
    </s:if>
  13. <s:else>
  14. <a href="studentPageList.action?page=1">第一页&nbsp;</a>
  15. <a href="studentPageList.action?page=<s:property value='%{pageBean.currentPage-1}'/>">上一页&nbsp;</a>
  16. </s:else>
  17. <s:if test="%{pageBean.currentPage != pageBean.totalPage}">
  18. <a href="studentPageList.action?page=<s:property value='%{pageBean.currentPage+1}'/>">下一页&nbsp;</a>
  19. <a href="studentPageList.action?page=<s:property value='pageBean.totalPage'/>">最后一页</a>
  20. </s:if>
  21. <s:else>下一页&nbsp; 最后一页
    </s:else>
  22. </td>
  23. </tr>
  24. </table>

8.效果图

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

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

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

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

SSH后台分页的更多相关文章

  1. [linux]阿里云主机的免登陆安全SSH配置与思考

    公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...

  2. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  3. 记录一则Linux SSH的互信配置过程

    需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...

  4. SSH免手动输入密码和设置代理

    通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...

  5. github免输用户名/密码SSH登录的配置

    从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...

  6. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  7. mac下生成ssh keys 并上传github仓储

    使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中   mac 生成方法:   1. 打开终端 输入   ssh-keygen 然后系统提示输入文件保存位置等信息 ...

  8. Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)

    第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...

  9. 树莓派3B的食用方法-1(装系统 网线ssh连接)

    首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...

随机推荐

  1. win10 系统到期的解决方案

    本人是 win10 教育版,今天多次提醒 windows 要到期了(烦银).所以网上找到了解决方法,记录一下. 废话:win10 与之前的 windows 版本一样,有家庭版.专业版.企业版等各个版本 ...

  2. cf1242B

    题意简述:给出一个n个点的完全图,边权要么是1要么是0,输入只给出权值的是1的那些边,求解最小生成树的权值 解答:边很多,我们考虑使用prim算法,prim算法的过程中维护了一个dis数组,这里我们可 ...

  3. kali安装后中文乱码

    参考: 文章一:https://blog.csdn.net/dust_hk/article/details/103299136?depth_1-utm_source=distribute.pc_rel ...

  4. HDU1862 - EXCEL排序

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1862 解题思路:结构体排序 #include <bits/stdc++.h> using ...

  5. linux 文件系统管理三部曲之二:创建文件系统

    创建文件系统的含义:就是格式化一个硬盘分区,不同的格式化方式,就是创建了不同的文件系统. 格式化: 低级格式化:划分分区前执行,主要是划分硬盘的磁道等. 高级格式化:划分分区后执行,创建文件系统 创建 ...

  6. P3768 简单的数学题 [杜教筛,莫比乌斯反演]

    \[\sum_{i=1}^{n}\sum_{j=1}^{n} ij\gcd(i,j)\] \[=\sum_{d=1}^{n} d \sum_{i=1}^{n}\sum_{j=1}^{n} ij[\gc ...

  7. 3级搭建类301-Oracle 11g RAC 双节点搭建(11.2.0.4)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  8. mysql权限过滤

    1.用like做权限过滤 上级部门可以看到下级部门发布的正式文件,下级部门不能看到上级部门发布的正式文件 SELECT*FROM cms_nrgl_st a, mz_xzjg bWHERE a.sys ...

  9. 在vue项目中设置BASE_URL

    在vue项目中设置BASE_URL 1.在config文件夹中新建global.js文件 const BASE_URL = 'http://192.168.1.62:8080/rest/' expor ...

  10. Educational Codeforces Round 81 (Rated for Div. 2) 题解

    过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...