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 ...
随机推荐
- Vue中vue-i18n结合element-ui实现国际化
(一)添加依赖模块 在package.json文件中添加vant模块的依赖,如: // package.json { "dependencies": { "element ...
- 关于FrameLayout中覆盖的问题
FrameLayout中xml文件中写在下方的控件会默认覆盖上方的控件,如图,我准备实现如下效果: 这时recyclerview就要写在前面 如果recyclerview写在下面就会覆盖掉我linea ...
- Python3中的支持向量机SVM的使用(有实例)
https://www.cnblogs.com/luyaoblog/p/6775342.html 首先,我们需要安装scikit-learn 一.导入sklearn算法包 在python中导入sci ...
- Java 运行报错:不支持发行版本 5
解决方案: 第一步:在Intellij中点击“File” -->“Project Structure”,看一下“Project”和“Module”栏目中Java版本是否与本地一致: 第二步:点击 ...
- Android中的消息处理机制
安卓中的消息处理机制主要涉及到5个概念 (1)消息类:Message,可以理解成一个数据单元: (2)消息队列类:Message Queue,存放通过Hander发布的消息,处理顺序类似于队列,按照先 ...
- LeetCode:27 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- 一次H5毛玻璃效果有感
印象中H5实现毛玻璃效果是挺好实现的,主要的代码就是css的filter:blur. 之前也用过几次,给背景图加高斯模糊啊,给一个div加高斯模糊啊.只要给需要添加高斯模糊的元素直接添加filter属 ...
- 2019kali中文乱码
1.安装KALI2019.4版本后会出现乱码问题 2.更新国内源,使用vim编辑器修改:vim /etc/apt/sources.list添加 #清华大学 [更新源] deb https://m ...
- 带你快速了解Linux文件系统
http://www.embeddedlinux.org.cn/emb-linux/file-system/201807/03-8197.html 这篇教程将帮你快速了解 Linux 文件系统. 早在 ...
- script标签引入脚本的引入位置与效果
用script标签引入脚本的引入位置大致有两种情况: 1,在head中引入: 2,在body末尾引入: 浏览器由上到下解析代码,正常情况下,先解析head中的代码,在解析body中的代码:放在head ...