相信大家在搭建后台的时候,经常会使用到分页功能,当然,目前有不少框架(如esayUI)都自带分页的实现,为了更好的理解分页原理,近期本人自己摸索了关于分页查询的一些心得。
归根结底,分页的核心还是在封装PageBean,并通过一定的算法对其进行判断,赋值
public class PageBean<T> implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private int currentPage; //当前第几页 ,请求传过来
private int pageCount; // 每页显示多少条数据
private int totalCount; //总记录数,查询数据获得 private int totalPage; //总页数, 通过 totalCount 和 pageCount计算获得 private int startIndex; //开始索引,与pageCount 组成 limit 条件 private List<T> pageData; //分页显示的页数,如 1,2,3,4
private int start;
private int end; public PageBean(int currentPage,int pageCount,int totalCount){
this.currentPage=currentPage;
this.pageCount=pageCount;
this.totalCount=totalCount; if(totalCount % pageCount==0){
this.totalPage = totalCount/ pageCount;
}else{
this.totalPage= totalCount/pageCount+1;
} this.startIndex = (currentPage-1)*pageCount; this.start=1;
this.end=5; if(pageCount<=5){
this.end= this.totalPage;
}else{ this.start=currentPage-2;
this.end = currentPage+2; if(start<=0){
this.start=1;
this.end=5;
}
if(this.end > this.totalPage){
this.end=totalPage;
this.start=end-4;
}
}
} public int getCurrentPage() {
return currentPage;
} public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
} public int getPageCount() {
return pageCount;
} public void setPageCount(int pageCount) {
this.pageCount = pageCount;
} public int getTotalCount() {
return totalCount;
} public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
} public int getTotalPage() {
return totalPage;
} public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
} public int getStartIndex() {
return startIndex;
} public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
} public List<T> getPageData() {
return pageData;
} public void setPageData(List<T> pageData) {
this.pageData = pageData;
} public int getStart() {
return start;
} public void setStart(int start) {
this.start = start;
} public int getEnd() {
return end;
} public void setEnd(int end) {
this.end = end;
} public static long getSerialversionuid() {
return serialVersionUID;
} }
Controller层
int currentPage = Integer.valueOf(request.getParameter("currentPage")); int pageCount=7; BlogTypeService blogType = new BlogTypeServiceImpl(); PageBean<BlogType> page = blogType.page(currentPage, pageCount);
request.setAttribute("page", page);
request.getRequestDispatcher("/jsp/blogType.jsp").forward(request, response);
service层
public PageBean<BlogType> page(int currentPage,int pageCount) {
int totalCount=blogType.getTotal(); PageBean<BlogType> pageBean = new PageBean<>(currentPage, pageCount, totalCount);
int startIndex = pageBean.getStartIndex();
pageBean.setPageData(blogType.page(startIndex, pageCount));
return pageBean;
}
dao层
public List<BlogType> page(int currentPage,int pageCount){
String sql = "select * from t_blogtype limit ?,?";
PageBean<BlogType> pageBean =null;
Connection conn =null;
PreparedStatement ps =null;
ResultSet rs =null;
BlogType blogType =null;
try {
conn =DBDao.connection();
ps=conn.prepareStatement(sql);
ps.setInt(1, currentPage);
ps.setInt(2, pageCount);
rs=ps.executeQuery();
List<BlogType> list =new ArrayList<BlogType>();
while(rs.next()){
blogType = new BlogType();
blogType.setId(rs.getInt("id"));
blogType.setTypeName(rs.getString("typeName"));
blogType.setOrderNum(pageCount);
list.add(blogType);
}
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} public int getTotal() {
String sql ="select count(id) from t_blogtype";
Connection conn =null;
PreparedStatement ps=null;
ResultSet rs=null;
int count=0;
try{
conn= DBDao.connection();
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
rs.next();
count=rs.getInt(1); }catch(Exception e){
e.printStackTrace();
}
return count; }
因为本文主要在说分页查询,所以关于 数据库的连接就一并放到dao里了!
(其实本人是不知道将数据库的连接放在哪里。。。。嘻嘻)
jsp
<body>
共有${page.totalCount }个分类,共有${page.pageCount }页,当前为第${page.currentPage }页,每页显示${page.pageCount }条
<table align="center" width="100%">
<thead>
<th>选择</th>
<th>序号</th>
<th>博客类别</th>
<th>博客排序</th>
<th>操作</th>
</thead>
<tbody align="center" border="1">
<c:forEach items="${page.pageData }" var="page">
<tr>
<td><input type="checkbox" name="id"/></td>
<td>${page.id }</td>
<td>${page.typeName }</td>
<td>${page.orderNum }</td>
<td><a>修改</a>|<a>删除</a></td>
<td></td>
</tr>
</c:forEach>
</tbody> </table>
<!-- 分页 -->
<div style="text-align:center;">
<a href="${pageContext.request.contextPath }/blogType?currentPage=1">首页</a>
<!-- 如果当前页为第一页,就没有上一页这个标签 -->
<c:if test="${page.currentPage==1 }">
<c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
<c:if test="${page.currentPage == i}">
${i}
</c:if>
<c:if test="${page.currentPage != i}">
<a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>
</c:if>
</c:forEach>
<a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage+1}">下一页</a>
</c:if>
<!-- 如果不是首页也不是尾页,就与上一页和下一页 -->
<c:if test="${page.currentPage>1 && page.currentPage<page.totalPage }">
<a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage-1}">上一页</a>
<c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
<c:if test="${page.currentPage == i}">
${i}
</c:if>
<c:if test="${page.currentPage != i}">
<a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>
</c:if>
</c:forEach>
<a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage+1}">下一页</a>
</c:if>
<!-- 如果是最后一页,则没有下一页 -->
<c:if test="${page.currentPage==page.totalPage }">
<a href="${pageContext.request.contextPath }/blogType?currentPage=${page.currentPage-1}">上一页</a>
<c:forEach begin="${page.start }" end="${page.end }" step="1" var="i">
<c:if test="${page.currentPage == i}">
${i}
</c:if>
<c:if test="${page.currentPage != i}">
<a href="${pageContext.request.contextPath}/blogType?currentPage=${i}">${i}</a>
</c:if>
</c:forEach> </c:if>
<a href="${pageContext.request.contextPath }/blogType?currentPage=${page.totalPage}">尾页</a>
</div> </body>