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 ...
随机推荐
- Spring MVC 定时任务注解说明
一.注解说明. Spring 自带的定时任务执行@Scheduled注解,可以定时的.周期性的执行一些任务.查看@Scheduled的注解可以看到有以下三种: 1.1 String cron() de ...
- Mac下git的安装配置以及gerrit初次使用
1.Mac下git下载 在终端首次运行git命令,若未安装,会提示下载开发者工具Xcode,根据提示下载即可: 2.查看git版本 git version 2.首次使用git配置 git config ...
- JS Radio结合TEXT
<script> function fun_a(value){ if(value === "on"){ document.getElementById('a').dis ...
- ECMAScript基本对象——Math数学对象
1.创建 不用创建直接使用.直接Math.方法名(): 2.方法 ①random():返回0.0-1.0的随机数,左闭有开 区间有开区间和闭区间,其中又分为全开区间( ),全闭区间[ ],左开右闭区间 ...
- C语言输出杨辉三角形
// 打印杨辉三角: 行 + 列 ][] = { }; // 1. 确定要打印的行数: 13(n) ; i < ; ++i) { // 2. 确定列数:杨辉三角 行 == 列 ; j <= ...
- hdu 1007 Quoit Design(平面最近点对)
题意:求平面最近点对之间的距离 解:首先可以想到枚举的方法,枚举i,枚举j算点i和点j之间的距离,时间复杂度O(n2). 如果采用分治的思想,如果我们知道左半边点对答案d1,和右半边点的答案d2,如何 ...
- Python函数装饰器
装饰器的原则 1)不修改被修饰函数的源代码: 2)不修改被修饰函数的调用方式: 装饰器的知识点 = 高阶函数 + 函数嵌套 + 闭包 1. 只用高阶函数写装饰器--->有瑕疵 import ti ...
- HDU - 5532 Almost Sorted Array (最长非严格单调子序列)
We are all familiar with sorting algorithms: quick sort, merge sort, heap sort, insertion sort, sele ...
- LeetCode 第四题 Median of Two Sorted Arrays 二人 渣渣选手乱七八糟分析发现基本回到思路1
题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- 使用Xpath爬取酷狗TOP500的歌曲信息
使用xpath爬取酷狗TOP500的歌曲信息, 将排名.歌手名.歌曲名.歌曲时长,提取的结果以文件形式保存下来.参考网址:http://www.kugou.com/yy/rank/home/1-888 ...