我的分页有两个部分组成
这是我的分页类
PageList.java
/**
*
* 用于保存分页信息和负责分页逻辑运算的类,这个类配合标签使用最佳!
* 这个类不是线程安全的
*
*
* 使用方法:
* PagedList pList=new PagedList();
* pList.setPageIndex();//当前页的页码
* pList.setPageSize();//每页的大小
*
* pList.setRowCount(dao.count(...));//获取数据库里的总记录数
* pList.setList(dao.list(...));//从数据库获取当前页的数据
*
* pList.addParam("category","5");//设置其他的url参数
* request.setAttribute("pagedList",pList);//放入request
* 至此,PagedList的数据填充就完成了,下一步是在JSP页面内做显示
*
* 使用标签的时候,只需要这样:
*
*
* @author Jonney
*/
public class PagedList {
/**
* 当前页码
*/
private int pageIndex;
/**
* 页大小
*/
private int pageSize;
/**
* 页数量
*/
private int pageCount;
/**
* 行数量
*/
private long rowCount;
/**
* 目标页的uri
*/
private String uri;
/**
* 数据列表
*/
private List list;
private String paramEncoding = "utf-8";
private List paramList = new ArrayList();
/**
* 唯一的构造器,强制设置pageSize和pageIndex,这样才能保证setRowCount(int)不会出错
*
* @param pageIndex
* 当前页码
* @param pageSize
* 页大小
*/
public PagedList(int pageIndex, int pageSize) {
this.pageIndex = pageIndex < 1 ? 1 : pageIndex;
this.pageSize = pageSize;
}
//一些setter getter 方法
/**
*
* @param key
* @param value
*/
public void addParam(String key, String value) {
if (key == null) {
return;
}
if (value == null) {
value = "";
}
Param p = new Param(key, value);
paramList.add(p);
}
/**
*
* @return
*/
public String getParams() {
StringBuilder sb = new StringBuilder();
try {
for (Param p : paramList) {
sb.append('&');
sb.append(URLEncoder.encode(p.key, paramEncoding));
sb.append('=');
sb.append(URLEncoder.encode(p.value, paramEncoding));
}
} catch (UnsupportedEncodingException e) {
// throw new RuntimeException(e);
}
return sb.toString();
}
/**
* 取当前页的第一行数据在数据库中的行号,在操作数据库的时候有用
*
* @return
*/
public int getFirstRowInThisPage() {
return (pageIndex - 1) * pageSize;
}
/**
* 是否第一页
*
* @return
*/
public boolean isFirstPage() {
return pageIndex <= 1 ? true : false;
}
/**
* 是否最后一页
*
* @return
*/
public boolean isLastPage() {
return pageIndex >= pageCount ? true : false;
}
private class Param {
public String key;
public String value;
public Param(String key, String value) {
this.key = key;
this.value = value;
}
}
public static void main(String[] args) {
PagedList p = new PagedList(3, 4);
p.addParam("1", "中文");
p.addParam("2", "22");
p.addParam("3", "33");
System.out.println(p.getParams());
p.setRowCount(40);
System.out.println(p.getPageCount());
}
}
还有一个就是tag 也就是显示的样式
<%@ tag body-content="scriptless" pageEncoding="utf-8" isELIgnored="false"%>
<%@ attribute name="pagedList" required="true" type="generator.common.pagination.PagedList" %>
<%@ attribute name="pageIndexKey" required="false" type="java.lang.String" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${pageIndexKey==null}">
<c:set var="pageIndexKey" value="pageIndex" />
</c:if>
<div id="page" class="pagination">
<table><tbody><tr>
<c:choose>
<c:when test="${pagedList.firstPage}">
<td><a href="javascript:void(0);"><img class="page-first" src="/images/crud/page-first-disabled.gif"></a></td>
</c:when>
<c:otherwise>
<c:url var="previousPage" value="${pagedList.uri}">
<c:param name="${pageIndexKey}" value="1"/>
</c:url>
<td><a href="${previousPage}${pagedList.params}"><img class="page-first" src="/images/crud/page-first.gif"></a></td>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${pagedList.firstPage}">
<td><a href="javascript:void(0);"><img class="page-prev" src="/images/crud/page-prev-disabled.gif"></a></td>
</c:when>
<c:otherwise>
<c:url var="previousPage" value="${pagedList.uri}">
<c:param name="${pageIndexKey}" value="${pagedList.pageIndex-1}"/>
</c:url>
<td><a href="${previousPage}${pagedList.params}"><img class="page-prev" src="/images/crud/page-prev.gif"></a></td>
</c:otherwise>
</c:choose>
<td><span>第<input type="text" class="page-num" value="${pagedList.pageIndex}" size="2" οnkeydοwn="if(event.keyCode==13) {window.location='${pagedList.uri}?${pageIndexKey}='+this.value+'${pagedList.params}'; return false;}" >页/共${pagedList.pageCount}页</span></td>
<c:choose>
<c:when test="${pagedList.lastPage}">
<td><a href="javascript:void(0);"><img class="page-next" src="/images/crud/page-next-disabled.gif"></a></td>
</c:when>
<c:otherwise>
<c:url var="nextPage" value="${pagedList.uri}">
<c:param name="${pageIndexKey}" value="${pagedList.pageIndex+1}"/>
</c:url>
<td><a href="${nextPage}${pagedList.params}"><img class="page-next" src="/images/crud/page-next.gif"></a></td>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${pagedList.lastPage}">
<td><a href="javascript:void(0);"><img class="page-last" src="/images/crud/page-last-disabled.gif"></a></td>
</c:when>
<c:otherwise>
<c:url var="nextPage" value="${pagedList.uri}">
<c:param name="${pageIndexKey}" value="${pagedList.pageCount}"/>
</c:url>
<td><a href="${nextPage}${pagedList.params}"><img class="page-next" src="/images/crud/page-last.gif"></a></td>
</c:otherwise>
</c:choose>
<td><span style="padding-left:20px;">共 ${pagedList.rowCount} 记录</span></td>
</tr>
</tbody>
</table>
</div>
然后你action里
private Integer page =1; //第几页
private Integer pageSize=20;//每页显示多少条
private PagedList<News> pagedList;
public void setPage(Integer page){
this.page = page;
}
public PagedList<News> getPagedList(){
return pagedList;
}
//业务代码
pagedList = new PagedList<News>(page, pageSize);
//pagedList.addParam("category","5");
newsProxy.fillNewsList(pagedList);
proxy里代码
public void fillNewsList(PagedList<News> pagedList){
pagedList.setRowCount(newsDao.count());
pagedList.setList(newsDao.find(pagedList.getFirstRowInThisPage(),pagedList.getPageSize()));
}
jsp代码
<ext:defaultPagination pagedList="${pagedList}" pageIndexKey="page"/>