1、SSH基础上分页功能的实现SSH基础上分页功能的实现 参考网址1:参考网址2:资料部分借鉴:上节课,我们完成了一个SSH整合的CRUD操作案例,并且完善了其国际化以及校验等内容,这节课,我们继续加以完善,我们知道,当我们查询数据库的内容过多的时候,显示在页面上的内容就比较冗长,所以分页的实现就显的十分有必要了。分页功能的实现是必不可少的,掌握一到两种分页技术在在实际开发前是有必要的,前两天浏览博客的时候看到了一个程序员的博文写的一个分页功能的实现非常好,在这里,分享给大家。在讲解分页功能实现之前,大家必须对分页有一定的了解,知道分页的几个要素:总记录数,每页显示数,共几页,当前页等。在上个例子
2、的基础上我们开始完善我们的程序。1.首先我们先新建立一个接口MemberDao.java,把所需要用到的方法列出来:package cn.zbvc.dao;import java.util.List;import cn.zbvc.bean.User;public interface MemberDao /* 分页查询* param hql 查询条件* param offset 开始记录* param length 一次查询几条记录* return 查询的记录集合*/public List queryForPage(final String hql,final int offset,final
3、int length);/* 查询所有的记录数* param hql 查询条件* return 总记录数*/public int getAllRowCount(String hql);2.然后我们创建其实现类:MemberDaoImpl.javapackage cn.zbvc.dao.impl;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;impo
4、rt cn.zbvc.bean.User;import cn.zbvc.dao.MemberDao;public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao /* 查询所有的记录数* param hql 查询条件* return 总记录数*/public int getAllRowCount(String hql) return this.getHibernateTemplate().find(hql).size();/* 分页查询* param hql 查询条件* param offset 开始记录
5、* param length 一次查询几条记录* return 查询的记录集合*/SuppressWarnings(unchecked)public List queryForPage(final String hql, final int offset, final int length) Session session = this.getSession();Query q = session.createQuery(hql);q.setFirstResult(offset);q.setMaxResults(length);List list = q.list();System.out.p
6、rintln(list.size();session.close();return list;大家可以看到,我们一共定义了两个方法,第一个方式是获取数据库表的总记录数,第二个方法是获取我们想要获取的某一页的数据集合,传递的三个参数分别是:查询条件、开始的记录、结束的记录。细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实
7、现分页查询功能。3.然后我们需要建立一个获取分页信息的pageBean.java:package cn.zbvc.util;import java.util.List;import cn.zbvc.bean.User;public class PageBean private List list; /要返回的某一页的记录列表private int allRow; /总记录数private int totalPage; /总页数private int currentPage; /当前页private int pageSize; /每页的记录数private boolean isFirstPage
8、; /是否为当前第一页private boolean isLastPage; /是否为最后一页private boolean hasPreviousPage; /是否有前一页private boolean hasNextPage; /是否有下一页Set and get方法PageBean中的具体方法:/* 初始化分页信息*/public void init()this.isFirstPage = isFirstPage;this.isLastPage = isLastPage;this.hasPreviousPage = hasPreviousPage;this.hasNextPage = h
9、asNextPage;/* 计算总页数 静态方法* param pageSize 每页的记录数* param allRow 总记录数* return 总页数*/public static int countTatalPage(final int pageSize,final int allRow)int toalPage = allRow % pageSize = 0 ? allRow/pageSize : allRow/pageSize + 1;return toalPage;/* 计算当前页开始的记录* param pageSize 每页记录数* param currentPage 当前第
10、几页* return 当前页开始记录号*/public static int countOffset(final int pageSize,final int currentPage)final int offset = pageSize * (currentPage - 1);return offset;/* 计算当前页,若为0或者请求的URL中没有“?page = ”则用1代替* param page 传入的参数(可能为空,即0 则返回1)* return*/public static int countCurrentPage(int page)final int curpage = (p
11、age = 0 ? 1 : page);return curpage; 4.业务逻辑层的实现:我们现在就只操作User,现在我们在UserService中定义一个方法:/* 分页查询 * param pageSize 每页显示多少记录* param currentPage 当前页* return 封装了分页信息的bean*/public PageBean queryForPage(int pageSize,int page);5.使用UserServiceImpl实现这个具体方法:/* 分页查询 * param pageSize 每页显示多少记录* param currentPage 当前页*
12、 return 封装了分页信息的bean*/public PageBean queryForPage(int pageSize, int page) final String hql = from User user order by user.id; /查询语句int allRow = memberDao.getAllRowCount(hql); /总记录数int totalPage = PageBean.countTatalPage(pageSize, allRow); /总页数final int offset = PageBean.countOffset(pageSize, page);
13、 /当前页开始记录final int length = pageSize; / 每页记录数final int currentPage = PageBean.countCurrentPage(page); / 当前页List list = memberDao.queryForPage(hql, offset, length); /把分页信息保存到Bean当中PageBean pageBean = new PageBean();pageBean.setPageSize(pageSize);pageBean.setCurrentPage(currentPage);pageBean.setAllRow
14、(allRow);pageBean.setTotalPage(totalPage);pageBean.setList(list);pageBean.init();return pageBean;6.然后我们为了不影响上一个例子,我们新创建一个ListUserAction2.java:package cn.zbvc.action.user;import java.util.List;import com.opensymphony.xwork2.ActionSupport;import cn.zbvc.bean.User;import cn.zbvc.service.UserService;imp
15、ort cn.zbvc.util.PageBean;public class ListUserAction2 extends ActionSupport private UserService service;/通过Spring创建业务层对象 使用set方法依赖注入private PageBean pageBean; /封装了分页信息和数据内容的pageBeanprivate List listUser;/用于储存pageBean当中被封装的User信息private int page = 1; /表示从网页中返回的当前页的值 默认为1 表示默认显示第一页内容public int getPag
16、e() return page;public void setPage(int page) this.page = page;public List getListUser() return listUser;public void setListUser(List listUser) this.listUser = listUser;public PageBean getPageBean() return pageBean;public void setPageBean(PageBean pageBean) this.pageBean = pageBean;public void setSe
17、rvice(UserService service) this.service = service;public String execute()throws Exceptionthis.pageBean = service.queryForPage(5, page);/获取封装了分页信息和数据的pageBeanthis.listUser = this.pageBean.getList(); /获取数据return SUCCESS;7.配置applicationContext.xml和struts.xml的相关信息,这里省略了。8.在listUser2.jsp页面中添加分页内容:共条记录 共页 当前第页第一页 上一页第一页a href=listUser2.action?page=上一页a href=listUser2.action?page=下一页a href=listUser2.action?page=最后一页下一页 最后一页9.查看效果:10.思考总结关于分页功能实现,应该是有有很多种解决方法,我介绍的这种解决方案是为了给大家一个范例,让大家明白分页功能实现的原理,其中,大部分的内容借鉴了之前提到的网址。接下来的时间,我会继续学习关于分页功能的其它实现方式,然后分享给大家,另外,还会继续的整理SSH的整合。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1