SSH基础上分页功能的实现.docx
《SSH基础上分页功能的实现.docx》由会员分享,可在线阅读,更多相关《SSH基础上分页功能的实现.docx(6页珍藏版)》请在冰豆网上搜索。
SSH基础上分页功能的实现
SSH基础上分页功能的实现
参考网址1:
参考网址2:
资料部分借鉴:
上节课,我们完成了一个SSH整合的CRUD操作案例,并且完善了其国际化以及校验等内容,这节课,我们继续加以完善,我们知道,当我们查询数据库的内容过多的时候,显示在页面上的内容就比较冗长,所以分页的实现就显的十分有必要了。
分页功能的实现是必不可少的,掌握一到两种分页技术在在实际开发前是有必要的,前两天浏览博客的时候看到了一个程序员的博文写的一个分页功能的实现非常好,在这里,分享给大家。
在讲解分页功能实现之前,大家必须对分页有一定的了解,知道分页的几个要素:
总记录数,每页显示数,共几页,当前页等。
在上个例子的基础上我们开始完善我们的程序。
1.首先我们先新建立一个接口MemberDao.java,把所需要用到的方法列出来:
packagecn.zbvc.dao;
importjava.util.List;
importcn.zbvc.bean.User;
publicinterfaceMemberDao{
/**
*分页查询
*@paramhql查询条件
*@paramoffset开始记录
*@paramlength一次查询几条记录
*@return查询的记录集合
*/
publicListqueryForPage(finalStringhql,finalintoffset,finalintlength);
/**
*查询所有的记录数
*@paramhql查询条件
*@return总记录数
*/
publicintgetAllRowCount(Stringhql);
}
2.然后我们创建其实现类:
MemberDaoImpl.java
packagecn.zbvc.dao.impl;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;
importcn.zbvc.bean.User;
importcn.zbvc.dao.MemberDao;
publicclassMemberDaoImplextendsHibernateDaoSupportimplementsMemberDao{
/**
*查询所有的记录数
*@paramhql查询条件
*@return总记录数
*/
publicintgetAllRowCount(Stringhql){
returnthis.getHibernateTemplate().find(hql).size();
}
/**
*分页查询
*@paramhql查询条件
*@paramoffset开始记录
*@paramlength一次查询几条记录
*@return查询的记录集合
*/
@SuppressWarnings("unchecked")
publicListqueryForPage(finalStringhql,finalintoffset,finalintlength){
Sessionsession=this.getSession();
Queryq=session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
Listlist=q.list();
System.out.println(list.size());
session.close();
returnlist;
}
大家可以看到,我们一共定义了两个方法,第一个方式是获取数据库表的总记录数,第二个方法是获取我们想要获取的某一页的数据集合,传递的三个参数分别是:
查询条件、开始的记录、结束的记录。
细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实现分页查询功能。
3.然后我们需要建立一个获取分页信息的pageBean.java:
packagecn.zbvc.util;
importjava.util.List;
importcn.zbvc.bean.User;
publicclassPageBean{
privateListlist;//要返回的某一页的记录列表
privateintallRow;//总记录数
privateinttotalPage;//总页数
privateintcurrentPage;//当前页
privateintpageSize;//每页的记录数
privatebooleanisFirstPage;//是否为当前第一页
privatebooleanisLastPage;//是否为最后一页
privatebooleanhasPreviousPage;//是否有前一页
privatebooleanhasNextPage;//是否有下一页
Setandget方法
PageBean中的具体方法:
/**
*初始化分页信息
*/
publicvoidinit(){
this.isFirstPage=isFirstPage;
this.isLastPage=isLastPage;
this.hasPreviousPage=hasPreviousPage;
this.hasNextPage=hasNextPage;
}
/**
*计算总页数静态方法
*@parampageSize每页的记录数
*@paramallRow总记录数
*@return总页数
*/
publicstaticintcountTatalPage(finalintpageSize,finalintallRow){
inttoalPage=allRow%pageSize==0?
allRow/pageSize:
allRow/pageSize+1;
returntoalPage;
}
/**
*计算当前页开始的记录
*@parampageSize每页记录数
*@paramcurrentPage当前第几页
*@return当前页开始记录号
*/
publicstaticintcountOffset(finalintpageSize,finalintcurrentPage){
finalintoffset=pageSize*(currentPage-1);
returnoffset;
}
/**
*计算当前页,若为0或者请求的URL中没有“?
page=”则用1代替
*@parampage传入的参数(可能为空,即0则返回1)
*@return
*/
publicstaticintcountCurrentPage(intpage){
finalintcurpage=(page==0?
1:
page);
returncurpage;
}}
4.业务逻辑层的实现:
我们现在就只操作User,现在我们在UserService中定义一个方法:
/**
*分页查询
*@parampageSize每页显示多少记录
*@paramcurrentPage当前页
*@return封装了分页信息的bean
*/
publicPageBeanqueryForPage(intpageSize,intpage);
5.使用UserServiceImpl实现这个具体方法:
/**
*分页查询
*@parampageSize每页显示多少记录
*@paramcurrentPage当前页
*@return封装了分页信息的bean
*/
publicPageBeanqueryForPage(intpageSize,intpage){
finalStringhql="fromUseruserorderbyuser.id";//查询语句
intallRow=memberDao.getAllRowCount(hql);//总记录数
inttotalPage=PageBean.countTatalPage(pageSize,allRow);//总页数
finalintoffset=PageBean.countOffset(pageSize,page);//当前页开始记录
finalintlength=pageSize;//每页记录数
finalintcurrentPage=PageBean.countCurrentPage(page);//当前页
Listlist=memberDao.queryForPage(hql,offset,length);//
//把分页信息保存到Bean当中
PageBeanpageBean=newPageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
returnpageBean;
}
6.然后我们为了不影响上一个例子,我们新创建一个ListUserAction2.java:
packagecn.zbvc.action.user;
importjava.util.List;
importcom.opensymphony.xwork2.ActionSupport;
importcn.zbvc.bean.User;
importcn.zbvc.service.UserService;
importcn.zbvc.util.PageBean;
publicclassListUserAction2extendsActionSupport{
privateUserServiceservice;//通过Spring创建业务层对象使用set方法依赖注入
privatePageBeanpageBean;//封装了分页信息和数据内容的pageBean
privateListlistUser;//用于储存pageBean当中被封装的User信息
privateintpage=1;//表示从网页中返回的当前页的值默认为1表示默认显示第一页内容
publicintgetPage(){
returnpage;
}
publicvoidsetPage(intpage){
this.page=page;
}
publicListgetListUser(){
returnlistUser;
}
publicvoidsetListUser(ListlistUser){
this.listUser=listUser;
}
publicPageBeangetPageBean(){
returnpageBean;
}
publicvoidsetPageBean(PageBeanpageBean){
this.pageBean=pageBean;
}
publicvoidsetService(UserServiceservice){
this.service=service;
}
publicStringexecute()throwsException{
this.pageBean=service.queryForPage(5,page);//获取封装了分页信息和数据的pageBean
this.listUser=this.pageBean.getList();//获取数据
returnSUCCESS;
}
}
7.配置applicationContext.xml和struts.xml的相关信息,这里省略了。
8.在listUser2.jsp页面中添加分页内容:
iteratorvalue="pageBean">
共propertyvalue="allRow"/>条记录
共propertyvalue="totalPage"/>页
当前第propertyvalue="currentPage"/>页
iftest="%{currentPage==1}">
第一页上一页
if>
--currentPage为当前页-->
else>
page=1">第一页
page=propertyvalue="%{currentPage-1}"/>">上一页
else>
iftest="%{currentPage!
=totalPage}">
page=propertyvalue="%{currentPage+1}"/>">下一页
page=propertyvalue="totalPage"/>">最后一页
if>
else>
下一页最后一页
else>
|
iterator>
9.查看效果:
10.思考总结
关于分页功能实现,应该是有有很多种解决方法,我介绍的这种解决方案是为了给大家一个
范例,让大家明白分页功能实现的原理,其中,大部分的内容借鉴了之前提到的网址。
接下来的时间,我会继续学习关于分页功能的其它实现方式,然后分享给大家,另外,还会继续的整理SSH的整合。