SSH的分页网上有不少的例子,有利用session的,有利用分页组件的。我几个师兄原来搞的SSH项目也有一个成熟的分页插件。

具体业务实现类中的分页方法:

复制代码
public  List get ***** ( int  pageNO){
            DetachedCriteria dc 
=  DetachedCriteria.forClass( **** . class );            
            List list
=***** Dao.getList(dc,pageNO, 15 );
            
int  a  =   0 ;
            
if  (list.equals( null )){a = 1 ;}
            
return  list;
        }
复制代码
复制代码
public  PageBean getBean( int  pageNO)
        {
            
*****  jg;
             DetachedCriteria dc 
=  DetachedCriteria.forClass( ***** . class );
            PageBean pb
= collegeDao.getPageBean(dc,pageNO, 15 );        
            
return  pb;
        }
复制代码

 

然后是一个PageBean的工具类,负责创建分页属性和基本逻辑。

然后是页面的bean获取输出信息及分页属性。

我觉得单纯的拷贝,自己用的不是很顺手。于是自己也搞了一个,个人认为可以清晰的分层,实现这个分页。分层还是传统的SSH七层结构。

SSH结构思想参考我的另一篇随笔SSH思想之我见!

下面是分页思想,一个初始化方法和一个分页实现方法:

分页的util类:

复制代码
package  com.sy.util;

import  java.util.List;
@SuppressWarnings(
" unchecked " )
public   class  Page {

    
private   int  pageSize;
    
private   int  totalPage; 
    
private   int  rowCount;
    
private   int  currentPage;
    
private   int  prePage; 
    
private   int  nextPage;
    
private   boolean  hasNextPage;
    
private   boolean  hasPreviousPage;
    
private  List list;

    
public  Page() {
        
this .pageSize = 10 ;
    }

    
public   int  getPageSize() {
        
return  pageSize;
    }

    
public   void  setPageSize( int  pageSize) {
        
this .pageSize  =  pageSize;
    }

    
public   int  getTotalPage() {
        
return  totalPage;
    }

    
public   void  setTotalPage( int  totalPage) {
        
this .totalPage  =  totalPage;
    }

    
public   int  getRowCount() {
        
return  rowCount;
    }

    
public   void  setRowCount( int  rowCount) {
        
this .rowCount  =  rowCount;
    }

    
public   int  getCurrentPage() {
        
return  currentPage;
    }

    
public   void  setCurrentPage( int  currentPage) {
        
this .currentPage  =  currentPage;
    }

    
public   int  getPrePage() {
        
return  prePage;
    }

    
public   void  setPrePage( int  prePage) {
        
this .prePage  =  prePage;
    }

    
public   int  getNextPage() {
        
return  nextPage;
    }

    
public   void  setNextPage( int  nextPage) {
        
this .nextPage  =  nextPage;
    }

    
public   boolean  isHasNextPage() {
        
return  hasNextPage;
    }

    
public   void  setHasNextPage( boolean  hasNextPage) {
        
this .hasNextPage  =  hasNextPage;
    }

    
public   boolean  isHasPreviousPage() {
        
return  hasPreviousPage;
    }

    
public   void  setHasPreviousPage( boolean  hasPreviousPage) {
        
this .hasPreviousPage  =  hasPreviousPage;
    }

    
public  List getList() {
        
return  list;
    }

    
public   void  setList(List list) {
        
this .list  =  list;
    }
    

}
复制代码

 

分页的数据库操作和逻辑判断我把他单独用一个PageDaoImpl来实现:

复制代码
/*
 * 施杨的分页daoimpl类 
 * 
*/
package  com.sy.dao.impl;

import  java.sql.SQLException;
import  java.util.List;

import  org.hibernate.HibernateException;
import  org.hibernate.Query;
import  org.hibernate.Session;
import  org.springframework.orm.hibernate3.HibernateCallback;
import  org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import  com.sy.dao.BaseDao;
import  com.sy.util.Page;

@SuppressWarnings(
" unchecked " )
public   class  PageDaoImpl  extends  HibernateDaoSupport {

    
private  String hql;
    
public  Page page;
    
public   int  start;
    
public  BaseDao dao;
    
public   void  setDao(BaseDao dao) {
        
this .dao  =  dao;
    }

    
public   void  init( int  start,String tableName){     //  ͨ��init����ʵ����ij�ʼ��
       page  =   new  Page();
       
this .hql  =   " from  " + tableName;
       
this .start  =  start;
       setRowCount();
       setTotalPage();
       setCurrentPage();
       setPrePage();
       setNextPage();
       setPreOrNextBoolean();
    }

    
public   int  getRowCount(){
       List list 
=  dao.find(hql);
       
if (list.isEmpty()){
        
return   0 ;
       }
       
return  list.size();
    }

    
public  Page getPage(){
       List list 
=  (List)getHibernateTemplate().execute( new  HibernateCallback(){
        
public  Object doInHibernate(Session session)  throws  HibernateException, SQLException {
         Query query 
=  session.createQuery(hql);
         query.setFirstResult(getStartIndex());
         query.setMaxResults(page.getPageSize());
         
return  query.list();
        }   
       });
       page.setList(list);
       
return  page;
    }
    
    
public   void  setPreOrNextBoolean() {
        
if  (page.getCurrentPage()  <=   1 ) {
            page.setHasPreviousPage(
false );
        } 
else  {
            page.setHasPreviousPage(
true );
        }
        
if  (page.getCurrentPage()  >=  page.getTotalPage()) {
            page.setHasNextPage(
false );
        } 
else  {
            page.setHasNextPage(
true );
        }
    }

    
public   void  setCurrentPage() {
        
if  (start  <   1 ) {
            page.setCurrentPage(
1 );
        }
        
if  (start  >  page.getTotalPage()) {
            page.setCurrentPage(page.getTotalPage());
        }
        page.setCurrentPage(start);
    }

    
public   void  setPrePage() {
        page.setPrePage(page.getCurrentPage() 
-   1 );
    }

    
public   void  setNextPage() {
        page.setNextPage(page.getCurrentPage() 
+   1 );
    }

    
public   void  setTotalPage() {
        
int  rowCount  =  getRowCount();
        
int  pageSize  =  page.getPageSize();
        
if  (rowCount  >  pageSize) {
            
if  (rowCount  %  pageSize  ==   0 ) {
                page.setTotalPage(rowCount 
/  pageSize);
            } 
else  {
                page.setTotalPage(
1   +  (rowCount  /  pageSize));
            }
        } 
else  {
            page.setTotalPage(
1 );
        }
    }

    
public   void  setRowCount() {
        page.setRowCount(getRowCount());
    }

    
public   int  getStartIndex() {
        
int  startIndex  =   0 ;
        
if  (start  <   0 ) {
            startIndex 
=   0 ;
        } 
else  {
            
if  (start  >  page.getTotalPage()) {
                startIndex 
=  page.getPageSize()  *  (page.getTotalPage()  -   1 );
            } 
else  {
                startIndex 
=  page.getPageSize()  *  (start  -   1 );
            }
        }
        
return  startIndex;
    }
}
复制代码

 

然后是业务层接口,举例AdminService.java

 

复制代码
// 管理员service层接口
package  com.sy.service;

import  java.util.List;

import  com.sy.util.Page;
import  com.sy.vo.Admin;

public   interface  AdminService  extends  BaseService{

    
    
// 分页初始化
     public   void  init( int  pno);
// 分页实现
     public  Page getPage();
    
}
复制代码

 

实现类AdminServiceImpl.java

 

复制代码
// 管理员service层实现类
package  com.sy.service.impl;

import  java.util.List;

import  com.sy.dao.impl.AdminDaoImpl;
import  com.sy.dao.impl.PageDaoImpl;
import  com.sy.service.AdminService;
import  com.sy.util.Page;
import  com.sy.vo.Admin;

@SuppressWarnings(
" unchecked " )
public   class  AdminServiceImpl  extends  BaseServiceImpl  implements  AdminService {

        .

    
public  Page getPage() {
        
return  Pdao.getPage();
    }
    
public   void  init( int  pno) {
        String tableName
= " Admin " ;
        Pdao.init(pno,tableName);
    }
}
复制代码

 

 struts的action层AdminAction.java

 

复制代码
// 管理员action实现类
package  com.sy.action;

import  java.util.List;

import  javax.servlet.http.HttpServletRequest;
import  javax.servlet.http.HttpServletResponse;
import  javax.servlet.http.HttpSession;

import  org.apache.struts.action.ActionForm;
import  org.apache.struts.action.ActionForward;
import  org.apache.struts.action.ActionMapping;
import  org.apache.struts.action.ActionMessage;
import  org.apache.struts.action.ActionMessages;

import  com.sy.form.AdminForm;
import  com.sy.form.LoginForm;
import  com.sy.service.AdminService;
import  com.sy.util.MD5;
import  com.sy.util.Page;
import  com.sy.vo.Admin;
@SuppressWarnings(
" unchecked " )
public   class  AdminAction  extends  BaseAction {

        .
// 查看管理员
     public  ActionForward listAdmins(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        AdminService as
= (AdminService) super .getBean( " AdminService " );
           
int  pno  =  ( new  Integer(request.getParameter( " pno " ))).intValue();
           as.init(pno);
           Page myPage 
=  as.getPage();
           List myList 
=  as.getPage().getList(); 
           request.setAttribute(
" myPage " , myPage);
           request.setAttribute(
" AdminList " , myList);
           
return  mapping.findForward( " show " );
           
    }
}
复制代码

 

结构清晰,也很实用。

页面lookAdmin.jsp

 

复制代码
<% @ page language = " java "  pageEncoding = " UTF-8 " %>
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<% @ taglib uri = " http://java.sun.com/jsp/jstl/core "  prefix = " c " %>
<% @ taglib uri = " http://struts.apache.org/tags-bean "  prefix = " bean "   %>
<% @ taglib uri = " http://struts.apache.org/tags-html "  prefix = " html "   %>
<% @ taglib uri = " http://struts.apache.org/tags-logic "  prefix = " logic "   %>
<% @ taglib uri = " http://struts.apache.org/tags-tiles "  prefix = " tiles "   %>
< html >
    
< head >
        
< meta  http-equiv ="Content-Language"  content ="zh-cn" >
        
< meta  http-equiv ="Content-Type"  content ="text/html; charset=utf-8" >
        
< title > 施杨SSH新闻发布 </ title >
    
</ head >
    
< body >
        
< center >
            
< h3 >
                查看管理员
            
</ h3 >
            
< br >
            
< href ="./admin/addAdmin.jsp" > 添加管理员 </ a >
            
< br >
            
< href ="./NewsPage2.do?pno=1" > 查看新闻 </ a >
            
< br >
            
< table  border ="2"  width ="600" >
                
< tr >
                    
< td >
                        用户名
                    
</ td >
                    
< td >
                        密码
                    
</ td >
                    
< td >
                        操作
                    
</ td >
                
</ tr >
    
< c:forEach  items ="${requestScope['AdminList']}"  var ="admin" >
            
< tr  align ="center" >
              
< td  width ="20%"  height ="10" >< c:out  value ="${admin.aname}"   /></ td >
              
< td  width ="20%"  height ="10" >< c:out  value ="${admin.apassword}"   /></ td >
              
< td >
                
< href ="./editAdmin.do?aid=<c:out value=" ${admin.aid}" /> ">修改 </ a >
                
&nbsp;&nbsp;
                
< href ="./deleteAdmin.do?aid=<c:out value=" ${admin.aid}" /> " οnclick="javascript:return confirm('您确定删除吗?')">删除 </ a >
              
</ td >
            
</ tr >
    
</ c:forEach >
    
</ table >
    
< table  align ="center"  width ="500" >
    
< tr >
       
< td  align ="center"  colspan ="10" >
          
< logic:present  name ="myPage" >
            
< html:link  page ="/AdminPage.do?pno=1" > 首页 </ html:link >
          
< logic:equal  name ="myPage"  property ="hasPreviousPage"  value ="false" > 上一页 </ logic:equal >
          
< logic:equal  name ="myPage"  property ="hasPreviousPage"  value ="true" >
           
< href ="./AdminPage.do?pno=<bean:write name=" myPage" property ="prePage" /> ">上一页 </ a >
      
</ logic:equal >
           
           每页
< bean:write  name ="myPage"  property ="pageSize" /> 条记录
           共
< bean:write  name ="myPage"  property ="rowCount" /> 条记录
                当前第(
< bean:write  name ="myPage"  property ="currentPage" /> / < bean:write  name ="myPage"  property ="totalPage" /> )页
        
< logic:equal  name ="myPage"  property ="hasNextPage"  value ="false" > 下一页 </ logic:equal >
        
< logic:equal  name ="myPage"  property ="hasNextPage"  value ="true" >
         
< href ="./AdminPage.do?pno=<bean:write name=" myPage" property ="nextPage" /> ">下一页 </ a >
        
</ logic:equal >
           
< href ="./AdminPage.do?pno=<bean:write name='myPage' property='totalPage'/>" > 末页 </ a >
        
</ logic:present >
      
</ td >
      
</ tr >
    
</ table >
        
</ center >
    
</ body >
</ html >
复制代码

 本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/06/1349099.html,如需转载请自行联系原作者

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐