相信大家在搭建后台的时候,经常会使用到分页功能,当然,目前有不少框架(如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>

Servlet实现后台分页查询的更多相关文章

  1. Servlet 分页保存查询条件

    第一种情况:一个页面走一个JSP页面和Servlet 解决办法: /** 把用户这一次选择的所有条件保存Map集合中,再把 map存到Session会话中,点击分页时进入将Servlet中再将Sess ...

  2. Servlet实现数据库查询(MyEclipse10,Tomcat7.0,JDK1.7,)——Java Web练习(三)

    1.MyEclipse | New Web Project :TestServlet01,修改index.jsp的代码: <%@ page language="java" i ...

  3. jsp+servlet实现模糊查询和分页效果

    ---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...

  4. 最简单的Servlet继承HttpServlet查询数据库登录验证

    <%-- Created by IntelliJ IDEA. User: yunqing Date: 2017-12-06 Time: 9:11 To change this template ...

  5. java使用插件pagehelper在mybatis中实现分页查询

    摘要: com.github.pagehelper.PageHelper是一款好用的开源免费的Mybatis第三方物理分页插件 PageHelper是国内牛人的一个开源项目,有兴趣的可以去看源码,都有 ...

  6. java servlet手机app访问接口(三)高德地图云存储及检索

    这篇关于高德地图的随笔内容会多一点, 一.业务说明     对应APP业务中的成员有两类,一是服务人员,二是被服务人员,  主要实现功能, 对APP中的服务人员位置进行时时定位, 然后通过被服务人员登 ...

  7. java servlet手机app访问接口(一)数据加密传输验证

    前面几篇关于servlet的随笔,算是拉通了 servlet的简单使用流程,接下去的文章将主要围绕手机APP访问接口这块出发续写,md5加密传输--->短信验证--->手机推送---> ...

  8. 基于jsp+servlet图书管理系统之后台用户信息删除操作

    上一篇的博客写的是修改操作,且附有源码和数据库,这篇博客写的是删除操作,附有从头至尾写的代码(详细的注释)和数据库! 此次删除操作的源码和数据库:http://download.csdn.net/de ...

  9. Servlet+jsp的分页案例

    查询的分页,在web中经常用到.一般,分页要维护的信息很多,我们把这些相关的信息,分装到一个类中,PageBean.具体如下: package cn.itcast.utils; import java ...

随机推荐

  1. 团队作业4--第一次项目冲刺(Alpha版本)7

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.完成全部基础功能 2.完成一些小改进与优化 四.困难与问题 软件基本是可以运行并且正常使用,但还没有实战过,遇到的问题与困 ...

  2. 【Beta】Daily Scrum Meeting——Day3

    站立式会议照片 1.本次会议为第三次Meeting会议: 2.本次会议在早上9:40,在陆大实验室召开,本次会议为25分钟讨论今天要完成的任务以及接下来的任务安排. 燃尽图 每个人的工作分配 遇到的困 ...

  3. 201521123108 《Java程序设计》第八周学习总结

    1. 本周学习总结 2. 书面作业 Q1.List中指定元素的删除(题目4-1) 1.1 实验总结 答:主要是应用到了list中的add和remove等方法,dan'sh但是这道题主要的考察点在于li ...

  4. Java 第六周总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖 ...

  5. 201521123085《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2.书面作业 Q1.注释的应用 使用类的注释与方法的注释为前面编写的类与方法进行注释,并在Eclipse中查看.(截图) Q2.面向对 ...

  6. 201521123030《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  7. 201521123067 《Java程序设计》第9周学习总结

    201521123067 <Java程序设计>第9周学习总结 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 Q1.常用异常(题目5-1 ...

  8. 201521123019 《java程序设计》 第13周学习总结

    1. 本章学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 访问cec ...

  9. 201521123115《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...

  10. 接口测试入门(2)--get和post初级请求/使用httpclient做一个获取信息list的请求(需要登录才可以)

    抛去测试自动化的架构来,直接写单个测试用例的思路如下: 1.获取测试case的接口,对每一个接口的请求方式(get/post/delete/put)进行分析,是否需要参数(不同的用例设置不同的参数,如 ...