SSH 分页收藏待看

先是一个page的bean:
Java代码 
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项目也有一个成熟的分页插件。

具体业务实现类中的分页方法:
Java代码 
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>  

原文地址:https://www.cnblogs.com/sailormoon/p/2831497.html