`

ssh分页(多个例子)

阅读更多

---------------------------------------------------------------------
先是一个page的bean:

package com.leatherstore.other; 

public class Page { 

    /** 是否有上一页 */ 
    private boolean hasPrePage; 
    
    /** 是否有下一页 */ 
    private boolean hasNextPage; 
        
    /** 每页的数量 */ 
    private int everyPage; 
    
    /** 总页数 */ 
    private int totalPage; 
        
    /** 当前页*/ 
    private int currentPage; 
    
    /** 起始点 */ 
    private int beginIndex; 
    
    /** 总记录数*/ 
    private int totalCount; 
    
    /** 
* @return totalCount 
*/ 
public int getTotalCount() { 
return totalCount; 
} 

/** 
* @param totalCount 要设置的 totalCount 
*/ 
public void setTotalCount(int totalCount) { 
this.totalCount = totalCount; 
} 

/** The default constructor */ 
    public Page(){ 
        
    } 
    
    /** construct the page by everyPage 
     * @param everyPage 
     * */ 
    public Page(int everyPage){ 
        this.everyPage = everyPage; 
    } 
    
    /** The whole constructor */ 
    public Page(boolean hasPrePage, boolean hasNextPage,  
                    int everyPage, int totalPage, 
                    int currentPage, int beginIndex,int totalCount) { 
        this.hasPrePage = hasPrePage; 
        this.hasNextPage = hasNextPage; 
        this.everyPage = everyPage; 
        this.totalPage = totalPage; 
        this.currentPage = currentPage; 
        this.beginIndex = beginIndex; 
        this.totalCount = totalCount; 
    } 

    /** 
     * @return 
     * Returns the beginIndex. 
     */ 
    public int getBeginIndex() { 
        return beginIndex; 
    } 
    
    /** 
     * @param beginIndex 
     * The beginIndex to set. 
     */ 
    public void setBeginIndex(int beginIndex) { 
        this.beginIndex = beginIndex; 
    } 
    
    /** 
     * @return 
     * Returns the currentPage. 
     */ 
    public int getCurrentPage() { 
        return currentPage; 
    } 
    
    /** 
     * @param currentPage 
     * The currentPage to set. 
     */ 
    public void setCurrentPage(int currentPage) { 
        this.currentPage = currentPage; 
    } 
    
    /** 
     * @return 
     * Returns the everyPage. 
     */ 
    public int getEveryPage() { 
        return everyPage; 
    } 
    
    /** 
     * @param everyPage 
     * The everyPage to set. 
     */ 
    public void setEveryPage(int everyPage) { 
        this.everyPage = everyPage; 
    } 
    
    /** 
     * @return 
     * Returns the hasNextPage. 
     */ 
    public boolean getHasNextPage() { 
        return hasNextPage; 
    } 
    
    /** 
     * @param hasNextPage 
     * The hasNextPage to set. 
     */ 
    public void setHasNextPage(boolean hasNextPage) { 
        this.hasNextPage = hasNextPage; 
    } 
    
    /** 
     * @return 
     * Returns the hasPrePage. 
     */ 
    public boolean getHasPrePage() { 
        return hasPrePage; 
    } 
    
    /** 
     * @param hasPrePage 
     * The hasPrePage to set. 
     */ 
    public void setHasPrePage(boolean hasPrePage) { 
        this.hasPrePage = hasPrePage; 
    } 
    
    /** 
     * @return Returns the totalPage. 
     * 
     */ 
    public int getTotalPage() { 
        return totalPage; 
    } 
    
    /** 
     * @param totalPage 
     * The totalPage to set. 
     */ 
    public void setTotalPage(int totalPage) { 
        this.totalPage = totalPage; 
    } 
} 
然后构建一个page的工厂PageUtil: 
package com.leatherstore.other; 

public class PageUtil { 
/** 
* Use the origin page to create a new page 
* 
* @param page 
* @param totalRecords 
* @return 
*/ 
public static Page createPage(Page page, int totalRecords) { 
return createPage(page.getEveryPage(), page.getCurrentPage(), 
totalRecords); 
} 

/** 
* the basic page utils not including exception handler 
* 
* @param everyPage 
* @param currentPage 
* @param totalRecords 
* @return page 
*/ 
public static Page createPage(int everyPage, int currentPage, 
int totalRecords) { 
everyPage = getEveryPage(everyPage); 
currentPage = getCurrentPage(currentPage); 
int beginIndex = getBeginIndex(everyPage, currentPage); 
int totalPage = getTotalPage(everyPage, totalRecords); 
boolean hasNextPage = hasNextPage(currentPage, totalPage); 
boolean hasPrePage = hasPrePage(currentPage); 

return new Page(hasPrePage, hasNextPage, everyPage, totalPage, 
currentPage, beginIndex, totalRecords); 
} 

private static int getEveryPage(int everyPage) { 
return everyPage == 0 ? 10 : everyPage; 
} 

private static int getCurrentPage(int currentPage) { 
return currentPage == 0 ? 1 : currentPage; 
} 

private static int getBeginIndex(int everyPage, int currentPage) { 
return (currentPage - 1) * everyPage; 
} 

private static int getTotalPage(int everyPage, int totalRecords) { 
int totalPage = 0; 

if (totalRecords % everyPage == 0) 
totalPage = totalRecords / everyPage; 
else 
totalPage = totalRecords / everyPage + 1; 

return totalPage; 
} 

private static boolean hasPrePage(int currentPage) { 
return currentPage == 1 ? false : true; 
} 

private static boolean hasNextPage(int currentPage, int totalPage) { 
return currentPage == totalPage || totalPage == 0 ? false : true; 
} 

} 
然后建一个专用的bean: 
package com.leatherstore.hibernate.domain; 

import java.util.List; 

import com.leatherstore.other.Page; 

public class Result { 
private Page page;  //分页信息 
private List content;  //每页显示的集合 
/** 
     * The default constructor 
     */ 
    public Result() { 
        super(); 
    } 

    /** 
     * The constructor using fields 
     * 
     * @param page 
     * @param content 
     */ 
    public Result(Page page, List content) { 
        this.page = page; 
        this.content = content; 
    } 

    /** 
     * @return Returns the content. 
     */ 
    public List getContent() { 
        return content; 
    } 

    /** 
     * @return Returns the page. 
     */ 
    public Page getPage() { 
        return page; 
    } 

    /** 
     * @param content 
     *            The content to set. 
     */ 
    public void setContent(List content) { 
        this.content = content; 
    } 

    /** 
     * @param page 
     *            The page to set. 
     */ 
    public void setPage(Page page) { 
        this.page = page; 
    } 
} 

然后在数据访问层写两个方法: 
ProductDAO: 
public List getProductByPage(Page page);  
public int getProductCount();  //返回数据的总数 
ProductDAO的接口实现ProductDAOImpl: 
//为了在spring里统一编程风格:我用的回调的方法 
public List getProductByPage(final Page page) { 
return this.getHibernateTemplate().executeFind(new HibernateCallback(){ 
public Object doInHibernate(Session session) throws HibernateException, SQLException { 
Query query=session.createQuery("from Productinfo"); 
query.setFirstResult(page.getBeginIndex()); //hibernate分页的精髓   呵呵 
    query.setMaxResults(page.getEveryPage()); 
    return query.list(); 
} 
}); 
} 

public int getProductCount() { 
List list=this.getHibernateTemplate().find("select count(*) from Productinfo"); 
return ((Integer)list.iterator().next()).intValue(); 
} 
然后是业务层: 
IProduct: 
public Result listProduct(Page page); 
然后IProduct接口的实现:IProductImpl: 
private ProductDAO productDAO; 
public void setProductDAO(ProductDAO productDAO){ 
this.productDAO=productDAO; 
} 

public Result listProduct(Page page) { 
int totalRecords = this.productDAO.getProductCount(); 
page = PageUtil.createPage(page, totalRecords); 
        List products = this.productDAO.getProductByPage(page);      
        return new Result(page, products); 
} 
然后再代理层: 
ProductProxy: 
IProduct pro=(IProduct)AppContext.getInstance().getappcontext().getBean("productServicewithTran"); 

public Result productlist(Page page){ 
try{ 
return pro.listProduct(page); 
}catch(DataAccessException ex){ 
ex.printStackTrace(); 
return null; 
} 
} 
呵呵 终于到productAction啦 
显示前方法的代码 
Page page = new Page();   //实例化一个page对象 
page.setEveryPage(10);    //设置每页显示的条数 
page.setCurrentPage(1);    //为第一页 
Result result = pdp.productlist(page); 
request.setAttribute("page", pageinfo); 
request.setAttribute("productlist", list); 
return mapping.findForward("showProduct"); 
接着就是jsp页面了 
<logic:iterate id="product" name="productlist"> 
//中间迭代所要显示的数据 
</logic:iterate> 
<tr> 
    <td width="80" height="30">&nbsp;</td> 
    <logic:equal value="true" name="page" property="hasPrePage"> 
    <td width="150" height="30"><div align="right"><a href="../product.do?method=showProductByTag&index=first&msg=${msg }">首页</a></div></td> 
    <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=prew&pageno=${page.currentPage -1}&msg=${msg }">上一页</a></div></td> 
    </logic:equal> 
    <logic:notEqual value="true" name="page" property="hasPrePage"> 
    <td width="150" height="30"><div align="right">首页</div></td> 
    <td width="80" height="30"><div align="center">上一页</div></td> 
    </logic:notEqual> 
    <logic:equal value="true" name="page" property="hasNextPage"> 
    <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=next&pageno=${page.currentPage +1 }&msg=${msg }">下一页</a></div></td> 
    <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=end&pageno=${page.totalPage }&msg=${msg }">尾页</a></div></td> 
    </logic:equal> 
    <logic:notEqual value="true" name="page" property="hasNextPage"> 
    <td width="80" height="30"><div align="center">下一页</div></td> 
    <td width="80" height="30"><div align="center">尾页</div></td> 
    </logic:notEqual> 
    <td height="30" colspan="3"><div align="center">页次${page.currentPage }/${page.totalPage }&nbsp;&nbsp;&nbsp;共${page.totalCount }条记录</div>      <div align="center"></div></td> 
  </tr> 
可以显示相应的页面信息 
然后productAction里面的showProductByTag代码如下: 
Page page = new Page(); 
page.setEveryPage(10); 
String pagemark = request.getParameter("goto"); 
if (pagemark == null) { 
String state = request.getParameter("index"); 
String pageno = request.getParameter("pageno"); 
System.out.println("pageno=" + pageno); 
if ("first".equals(state)) { 
page.setCurrentPage(1); 
Result result = pdp.productlist(page); 
request.setAttribute("page", result.getPage()); 
request.setAttribute("productlist", result.getContent()); 
} else if ("prew".equals(state)) { 
page.setCurrentPage(Integer.parseInt(pageno)); 
Result result = pdp.productlist(page); 
request.setAttribute("page", result.getPage()); 
request.setAttribute("productlist", result.getContent()); 
} else if ("next".equals(state)) { 
page.setCurrentPage(Integer.parseInt(pageno)); 
Result result = pdp.productlist(page); 
request.setAttribute("page", result.getPage()); 
request.setAttribute("productlist", result.getContent()); 
} else if ("end".equals(state)) { 
page.setCurrentPage(Integer.parseInt(pageno)); 
Result result = pdp.productlist(page); 
request.setAttribute("page", result.getPage()); 
request.setAttribute("productlist", result.getContent()); 
} 
} else { 
page.setCurrentPage(Integer.parseInt(pagemark)); 
Result result = pdp.productlist(page); 
request.setAttribute("page", result.getPage()); 
request.setAttribute("productlist", result.getContent()); 
} 
return mapping.findForward("showProduct"); 

 

-------------------------------------------------------------------

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> 
            <a href="./admin/addAdmin.jsp">添加管理员</a> 
            <br> 
            <a 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> 
                <a href="./editAdmin.do?aid=<c:out value="${admin.aid}"/>">修改</a> 
                &nbsp;&nbsp; 
                <a href="./deleteAdmin.do?aid=<c:out value="${admin.aid}"/>" onclick="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"> 
           <a 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"> 
         <a href="./AdminPage.do?pno=<bean:write name="myPage" property="nextPage"/>">下一页</a> 
        </logic:equal> 
           <a href="./AdminPage.do?pno=<bean:write name='myPage' property='totalPage'/>">末页</a> 
        </logic:present> 
      </td> 
      </tr> 
    </table> 
        </center> 
    </body> 
</html> 

 
----------------------------------------------------------------------

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics