分页

分页的使用非常普遍,现在一步步的把分页功能实现出来,先看看已经写好的效果:

该页面的所有数据都存放在一个javaBean对象(PageBean)里,每次访问该页面时,Serlvet就会把pageBean传到该页面。

model模型

首先需要创建一个PageBean类,里面封装了所有的分页信息,页面上显示的就是pageBean里的值。

其中pageSize、currentPage是自己设置的,其余的属性都由计算得到。

pageBean:

package com.kindleheart.model;

import java.util.List;

public class PageBean<T> {
private List<T> pageList;//分页的记录信息
private int pageSize;//页面大小
private int rowCount;//总记录数
private int pageCount;//总页面数
private int currentPage;//当前页面
private int previousPage;//前一页的页数
private int nextPage;//后一页的页数
private int rowStart;//记录起始处
private int startPage;//开始页码
private int endPage;//结束页码 public PageBean(int currentPage, int rowCount, int pageSize) {
this.currentPage = currentPage;
this.rowCount = rowCount;
this.pageSize = pageSize;
//总页面数
pageCount = (rowCount+pageSize-1)/pageSize;
//记录起始处
rowStart = (currentPage-1)*pageSize; startPage = currentPage - 2;
endPage = currentPage + 2; if(pageCount > 5) {
if(startPage < 1) {
startPage = 1;
endPage = startPage + 4;
}
if(endPage > pageCount) {
endPage = rowCount;
startPage = endPage - 4;
}
} else {
startPage = 1;
endPage = pageCount;
} } public List<T> getPageList() {
return pageList;
} public void setPageList(List<T> pageList) {
this.pageList = pageList;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public int getRowCount() {
return rowCount;
} public void setRowCount(int rowCount) {
this.rowCount = rowCount;
} public int getPageCount() {
return pageCount;
} public void setPageCount(int pageCount) {
this.pageCount = pageCount;
} public int getCurrentPage() {
return currentPage;
} public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
} public int getPreviousPage() {
previousPage = currentPage - 1;
if(previousPage < 1) previousPage = 1;
return previousPage;
} public void setPreviousPage(int previousPage) {
this.previousPage = previousPage;
} public int getNextPage() {
nextPage = currentPage + 1;
if(nextPage > pageCount) nextPage = pageCount;
return nextPage;
} public void setNextPage(int nextPage) {
this.nextPage = nextPage;
} public int getRowStart() {
return rowStart;
} public void setRowStart(int rowStart) {
this.rowStart = rowStart;
} public int getStartPage() {
return startPage;
} public void setStartPage(int startPage) {
this.startPage = startPage;
} public int getEndPage() {
return endPage;
} public void setEndPage(int endPage) {
this.endPage = endPage;
}
}

还需要创建一个存储分页的记录信息的model类,也就是Student类。

package com.kindleheart.model;

public class Student {
private int id;
private String scold;
private String name;
private String sex; public Student(int id, String scold, String name, String sex) {
this.id = id;
this.scold = scold;
this.name = name;
this.sex = sex;
} public Student() {
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getScold() {
return scold;
} public void setScold(String scold) {
this.scold = scold;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} }

servlet控制层

在Servlet中有三个任务:

  • 获取从网页传来的currentPage(当前页面)  
  • 把pageSize、currentPage传入到service层里的方法中,从service层获取封装好所有数据的PageBean对象
  • 把得到的PageBean对象放到request域里
package com.kindleheart.servlet;

import com.kindleheart.model.PageBean;
import com.kindleheart.service.StudentService;
import com.kindleheart.service.impl.StudentServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException; @WebServlet(name = "StudentServlet", urlPatterns = "/student.do")
public class StudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//得到当前页面
int currentPage = Integer.parseInt(request.getParameter("currentPage")); //得到封装好所有数据的PageBean对象
StudentService studentService = new StudentServiceImpl();
PageBean pageBean = null;
try {
pageBean = studentService.getStudentsWithPage(currentPage, 3);
} catch (SQLException e) {
e.printStackTrace();
} //把pageBean对象放到request域里
request.setAttribute("pageBean", pageBean);
request.getRequestDispatcher("jsp/stulist.jsp").forward(request, response);
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}

service业务逻辑层

在service层里只有一个任务,就是返回封装好所有信息的PageBean对象到Servlet中。

StudentService:

package com.kindleheart.service;

import com.kindleheart.model.PageBean;
import java.sql.SQLException; public interface StudentService {
PageBean getStudentsWithPage(int currentPage, int pageSize) throws SQLException;
}

StudentServiceImpl:

package com.kindleheart.service.impl;

import com.kindleheart.dao.StudentDao;
import com.kindleheart.dao.impl.StudentDaoImpl;
import com.kindleheart.model.PageBean;
import com.kindleheart.model.Student;
import com.kindleheart.service.StudentService;
import java.sql.SQLException;
import java.util.List; public class StudentServiceImpl implements StudentService {
private StudentDao studentDao = new StudentDaoImpl();
@Override
public PageBean getStudentsWithPage(int currentPage, int pageSize) throws SQLException {
//得到总记录数
int rowCount = studentDao.getRowCount();
//创建pageBean对象,并传入值
PageBean pageBean = new PageBean(currentPage, rowCount, pageSize);
//把查到的分页信息传入到pageBean中
List<Student> list = studentDao.getStudentsWithPage(pageBean.getRowStart(), pageSize);
pageBean.setPageList(list);
return pageBean;
}
}

dao数据访问层

在dao层里有两个任务:

  • 得到总记录数

  • 得到分页的记录信息

StudentDao:

package com.kindleheart.dao;

import com.kindleheart.model.Student;
import java.sql.SQLException;
import java.util.List; public interface StudentDao {
int getRowCount() throws SQLException;
List<Student> getStudentsWithPage(int rowStart, int pageSize) throws SQLException;
}

StudentDaoImpl:

package com.kindleheart.dao.impl;

import com.kindleheart.dao.StudentDao;
import com.kindleheart.model.Student;
import com.kindleheart.utils.JDBCUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.SQLException;
import java.util.List; public class StudentDaoImpl implements StudentDao {
@Override
public int getRowCount() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
String sql = "select count(*) from stuifo";
Object obj = queryRunner.query(sql, new ScalarHandler<>());
Long num = (Long)obj;
return num.intValue();
} @Override
public List<Student> getStudentsWithPage(int rowStart, int pageSize) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtil.getDataSource());
String sql = "select * from stuifo limit ?,?";
return queryRunner.query(sql, new BeanListHandler<>(Student.class), rowStart, pageSize);
} }

JSP页面

在JSP页面显示所有的分页信息。

stulist:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<title>stulist</title>
<base href="<%=basePath%>"/>
</head>
<body>
<div>
<p id="p">学生信息</p>
<table border="1px" width="500px">
<tr>
<td>学生id</td>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
</tr>
<c:forEach var="student" items="${pageBean.pageList}">
<tr>
<td>${student.id}</td>
<td>${student.scold}</td>
<td>${student.name}</td>
<td>${student.sex}</td>
</tr>
</c:forEach>
<tr>
<td colspan="4">
当前页数:[${pageBean.currentPage}/${pageBean.pageCount}]
<a href="student.do?currentPage=1">首页</a>
<a href="student.do?currentPage=${pageBean.nextPage}">下一页</a>
<c:forEach begin="${pageBean.startPage}" end="${pageBean.endPage}" var="pageNum">
<c:if test="${pageNum == pageBean.currentPage}">
${pageNum}
</c:if>
<c:if test="${pageNum != pageBean.currentPage}">
<a href="student.do?currentPage=${pageNum}">${pageNum}</a>
</c:if>
</c:forEach>
<a href="student.do?currentPage=${pageBean.previousPage}">上一页</a>
<a href="student.do?currentPage=${pageBean.pageCount}">尾页</a>
</td>
</tr>
</table>
</div>
</body>
</html>

静下心去理解并且实现出来,会发现并不是很难的。

分页完整项目下载(github):点我下载

Java Web(十) 分页功能的更多相关文章

  1. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  2. Java Web(十一) 分页功能的实现

    虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果自己手写是一个怎样的流程的?今天就来说说它,手动实现分页效果. --WH 一.分页的思路 首先我们得知道写分页代码时的思 ...

  3. Java Web(十四) 编写MyBookStore项目的总结

    这几天一直没有发博文,原因是在写一个书城的小项目,作为web学习的最后沉淀,接下来就要到框架的学习了. --WH 一.项目介绍 从网上找的一个培训机构的小项目,名称叫做 书城购物网站 吧,其中就是分前 ...

  4. Java Web之分页的实现(通用)

    一.用到的工具类的封装 为了实现代码的重用性,我们将经常用到的代码封装到工具类中,以便在任何地方都可以调用 1.获取路径工具 在jsp页面中,我们经常会向Servlet发送请求,并通过反射,实现通过传 ...

  5. (转)java web自定义分页标签

    转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...

  6. Java Web(十) JDBC的增删改查,C3P0等连接池,dbutils框架的使用

    前面做了一个非常垃圾的小demo,真的无法直面它,菜的抠脚啊,真的菜,好好努力把.菜鸡. --WH 一.JDBC是什么? Java Data Base Connectivity,java数据库连接,在 ...

  7. Java Web(十二) JavaMail发送邮件

    发送邮件的原理 概叙 邮件服务器: 要在 Internet 上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在 Internet 很多 提供邮件服务的厂商:sina.sohu.163 等等他们都 ...

  8. java web 开发 购物车功能的实现

    为了方便自己以后复习,所以写的比较仔细,记录下自己的成长..... 既然是做购物车,那么前提条件是首先需要一系列商品,也就是要建一个实体,这里建了一个商品表. 通过查询在浏览器上显示 基本显示已经做好 ...

  9. Java Web(十二) commons-fileupload上传下载

    今天心态正常...继续努力.. --WH 一.上传原理和代码分析. 上传:我们把需要上传的资源,发送给服务器,在服务器上保存下来. 下载:下载某一个资源时,将服务器上的该资源发送给浏览器. 难点:服务 ...

随机推荐

  1. SpringBoot整合Graylog3.0

    Graylog简介 Graylog是一个开源的完整的日志管理工具,功能和ELK类似,安装部署更方便. 官方网站 https://www.graylog.org 搭建 使用docker快速搭建 参考 h ...

  2. JDK中关于BIO,NIO,AIO,同步,异步介绍

    在理解什么是BIO,NIO,AIO之前,我们首先需要了解什么是同步,异步,阻塞,非阻塞.假如我们现在要去银行取钱: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写) ...

  3. leecode第一百零四题(二叉树的最大深度)

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  4. linux基础05-管道及IO重定向

    (1)I/O重定向:Linux:>: 覆盖输出>>:追加输出 (2)set -C: 禁止对已经存在文件使用覆盖重定向: 强制覆盖输出,则使用 >|set +C: 关闭上述功能 ...

  5. vue2总结

    1.ref可跨页面取.vue文件的所有内容: <!--echart图自定义公用模板--> <echar-tem ref="echar"> </echa ...

  6. 虚拟机中不能连接usb设备解决办法

    虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...

  7. java maven项目 pom.xml plugin 报错, build path 找不到 jconsole-1.8.0.jar 和 tools-1.8.0.jar 包

    maven项目pom.xml突然报错,在Java Build Path 中并没有引用的jar包出现在了Maven Dependencies的依赖包中. 这个错误直接导致了pom.xml文件中 < ...

  8. springboot---->获取不到yml配置文件指定的值

    import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.Spr ...

  9. Lab 5-1

    Analyze the malware found in the file Lab05-01.dll using only IDA Pro. The goal of this lab is to gi ...

  10. LeetCode--455--分发饼干

    问题描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j , ...