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
package po; import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table; @Entity
@Table(name = "student")
public class Student {
@Id @Column(name="id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id; @Column(name="sid")
private String sid; @Column(name="sname")
private String sname; @Column(name="sex")
private String sex; //setter和getter
}
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后台分页的更多相关文章
- [linux]阿里云主机的免登陆安全SSH配置与思考
公司服务器使用的第三方云端服务,即阿里云,而本地需要经常去登录到服务器做相应的配置工作,鉴于此,每次登录都要使用密码是比较烦躁的,本着极速思想,我们需要配置我们的免登陆. 一 理论概述 SSH介绍 S ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- 记录一则Linux SSH的互信配置过程
需求:四台Linux主机,IP地址为192.168.10.10/11/12/13,配置登录用户的互信 1.各节点ssh-keygen生成RSA密钥和公钥 ssh-keygen -q -t rsa -N ...
- SSH免手动输入密码和设置代理
通过使用sshpass将密码写入命令里,直接执行,免去手动密码输入的步骤命令如下: sshpass -p password_abc ssh user_abc@ssh_host -p ssh_port ...
- github免输用户名/密码SSH登录的配置
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...
- Linux 利用Google Authenticator实现ssh登录双因素认证
1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...
- mac下生成ssh keys 并上传github仓储
使用github仓储需要本机生成一个公钥key 添加到自己的git账户SSH keys中 mac 生成方法: 1. 打开终端 输入 ssh-keygen 然后系统提示输入文件保存位置等信息 ...
- Linux实战教学笔记05:远程SSH连接服务与基本排错(新手扫盲篇)
第五节 远程SSH连接服务与基本排错 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 远程连接LInux系统管理 1.1 为什么要远程连接Linux系统 在实际的工作场景中,虚拟机界面或物理 ...
- 树莓派3B的食用方法-1(装系统 网线ssh连接)
首先要有一个树莓派3B , 在某宝买就行, 这东西基本上找到假货都难,另外国产和英国也没什么差别,差不多哪个便宜买哪个就行. 不要买店家的套餐,一个是配的东西有些不需要,有的质量也不好. 提示:除了G ...
随机推荐
- (转)jvm具体gc算法介绍标记整理--标记清除算法
转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...
- matlab逐行读取text文件,编写函数提取需要的文字
在数学建模中遇到的数据比较难处理,而且给的是text格式,自己想了好长时间才编出来,现在分享一下,可以交流学习 目标的text文件是 只提取里面的数据 需要自编函数 clc,clear path='D ...
- javascript当中onload用法
7)onload onload就是等页面加载完后才执行. 例 3.7.1 <HEAD> <meta http-equiv="content-type" conte ...
- 关于 setw() 函数(C++)
// about setw() #include <iostream> #include <iomanip> #include <cstring> using na ...
- F. Moving Points
https://codeforces.com/contest/1311/problem/F 这是一道线段树类型的题: 可以用权值线段树或者树状数组来解: 所以,我们可以分为两部分,第一部分是计算出到当 ...
- 如何在 messager/alert/confirm等消息提示框中 获取 / 设置 嵌入 html内容中的 input[type=checkbox]等的选中状态?
总结, 有3点: 不能/不要 在 这些消息框 / 提示框/ 对话框中的 回调函数中去写代码: 获取嵌入 内容中input.checkbox的选中状态, 因为 虽然在这些框存在的时候, 这个 check ...
- SQL Server database – Error 3743
Database mirroring must be removed before you drop SQL Server database – Error 3743 If you try to dr ...
- 133.在django中使用memcached
1. 在django中使用memcached,可以在settings.py文件中DATABASES变量下面配置CACHES缓存相关配置信息,只允许本机连接memcached就可以设置LOCATION为 ...
- Java工程师的必备知识点
最近参加了一次公司内部的调岗计划,打算加入一个更核心的部门.调岗计划有面试环节,为了不让自己搞砸,悉心准备了将近一个月,请教了百度和腾讯的有过面试官经验的大学同学,系统性的总结了Java工程师的核心知 ...
- NetCore使用使用Scaffold-DbContext命令生成数据库表实体类
一.为了模拟项目,本处创建了一个NetCore的Web项目.打算在Models文件夹下生成数据库表的实体类. 二.在程序包管理控制台,输入“Scaffold-DbContext "Serve ...