Hibernate+Spring+Struts2整合开发中的一个分页显示方案分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:publicinterfaceMemberDao{//省略了其他的代码/***分页查询*@paramhql查询的条件*@paramoffset开始记录*@paramlength一次查询几条记录*@return*/publicListqueryForPage(finalStringhql,finalintoffset,finalintlength);/***查询所有记录数*@paramhql查询的条件*@return总记录数*/publicintgetAllRowCount(Stringhql);}2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:publicclassMemberDaoImplextendsHibernateDaoSupportimplementsMemberDao{//省略了其他的代码/***分页查询*@paramhql查询的条件*@paramoffset开始记录*@paramlength一次查询几条记录*@return*/publicListqueryForPage(finalStringhql,finalintoffset,finalintlength){Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{Queryquery=session.createQuery(hql);query.setFirstResult(offset);query.setMaxResults(length);Listlist=query.list();returnlist;}});returnlist;}/***查询所有记录数*@return总记录数*/publicintgetAllRowCount(Stringhql){returngetHibernateTemplate().find(hql).size();}}细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,getHibernateTemplate().executeFind(newHibernateCallback(){....})方法中的参数,我们使用了接口回调,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实现分页查询功能。3、下面我们来新建一个保存分页信息的类PageBean,具体代码如下:publicclassPageBean{privateListlist;//要返回的某一页的记录列表privateintallRow;//总记录数privateinttotalPage;//总页数privateintcurrentPage;//当前页privateintpageSize;//每页记录数privatebooleanisFirstPage;//是否为第一页privatebooleanisLastPage;//是否为最后一页privatebooleanhasPreviousPage;//是否有前一页privatebooleanhasNextPage;//是否有下一页publicListgetList(){returnlist;}publicvoidsetList(Listlist){this.list=list;}publicintgetAllRow(){returnallRow;}publicvoidsetAllRow(intallRow){this.allRow=allRow;}publicintgetTotalPage(){returntotalPage;}publicvoidsetTotalPage(inttotalPage){this.totalPage=totalPage;}publicintgetCurrentPage(){returncurrentPage;}publicvoidsetCurrentPage(intcurrentPage){this.currentPage=currentPage;}publicintgetPageSize(){returnpageSize;}publicvoidsetPageSize(intpageSize){this.pageSize=pageSize;}/***初始化分页信息*/publicvoidinit(){this.isFirstPage=isFirstPage();this.isLastPage=isLastPage();this.hasPreviousPage=isHasPreviousPage();this.hasNextPage=isHasNextPage();}/***以下判断页的信息,只需getter方法(is方法)即可*@return*/publicbooleanisFirstPage(){returncurrentPage==1;//如是当前页是第1页}publicbooleanisLastPage(){returncurrentPage==totalPage;//如果当前页是最后一页}publicbooleanisHasPreviousPage(){returncurrentPage!=1;//只要当前页不是第1页}publicbooleanisHasNextPage(){returncurrentPage!=totalPage;//只要当前页不是最后1页}/***计算总页数,静态方法,供外部直接通过类名调用*@parampageSize每页记录数*@paramallRow总记录数*@return总页数*/publicstaticintcountTotalPage(finalintpageSize,finalintallRow){inttotalPage=allRow%pageSize==0?allRow/pageSize:allRow/pageSize+1;returntotalPage;}/***计算当前页开始记录*@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、Service层接口的设计:publicinterfaceMemberService{//省略其他的代码/***分页查询*@paramcurrentPage当前第几页*@parampageSize每页大小*@return封闭了分页信息(包括记录集list)的Bean*/publicPageBeanqueryForPage(intpageSize,intcurrentPage);}5、Service层实现类的部分内码如下:publicclassMemberServiceImplimplementsMemberService{//通过applicationContext.xml配置文件注入MemberDao的值privateMemberDaomemberDao;publicvoidsetMemberDao(MemberDaomemberDao){this.memberDao=memberDao;}/***分页查询*@paramcurrentPage当前第几页*@parampageSize每页大小*@return封闭了分页信息(包括记录集list)的Bean*/publicPageBeanqueryForPage(intpageSize,intpage){finalStringhql=fromMember;//查询语句intallRow=memberDao.getAllRowCount(hql);//总记录数inttotalPage=PageBean.countTotalPage(pageSize,allRow);//总页数finalintoffset=PageBean.countOffset(pageSize,page);//当前页开始记录finalintlength=pageSize;//每页记录数finalintcurrentPage=PageBean.countCurrentPage(page);ListMemberlist=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、在Struts2中调用queryForPageMemberService层的queryForPage()方法即可return一个包含分页信息、符合条件的结果集list,代码如下:publicclassListMemberextendsActionSupport{//通过applicationContext.xml配置文件注入memberService的值privateMemberServicememberService;publicvoidsetMemberService(MemberServicememberService){this.memberService=memberService;}privateintpage;//第几页privatePageBeanpageBean;//包含分布信息的beanpublicintgetPage(){returnpage;}publicvoidsetPage(intpage){//若URL中无此参数,会默认为第1页this.page=page;}publicPageBeangetPageBean(){returnpageBean;}publicvoidsetPageBean(PageBeanpageBean){this.pageBean=pageBean;}@OverridepublicStringexecute()throwsException{//分页的pageBean,参数pageSize表示每页显示记录数,page为当前页this.pageBea