前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里快速浏览:javaweb实现分页(一)

开发环境:
Myeclipse 10.5,Mysql 5.5,Tomcat 7.0,JDK 1.7,Chrome浏览器

数据库和表结构:

下面是表中的测试数据,需要说明的是saddress这一列,本来是当做地址的,现在有其他的需求,就当成了角色使用,但是并不影响分页。

Javaweb代码:
Java代码是以分层开发的思想来实现的,其中有实体类:Student,Dao类和接口:BaseDaoNew,IStudentDao,Dao层实现类StudentDaoImpl:Service接口和实现类IStudentService,StudentService以及最后的工具类PageUtils

代码如下:
实体类:Student

package org.entity;/*** * @author 24519* 学生的实体类**/
public class Student {private   int         sid;private     String      sname;private   String      sphone;private  String      spass;private   String      saddress;private    int         sage;//封装public int getSid() {return sid;}public void setSid(int sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSphone() {return sphone;}public void setSphone(String sphone) {this.sphone = sphone;}public String getSpass() {return spass;}public void setSpass(String spass) {this.spass = spass;}public String getSaddress() {return saddress;}public void setSaddress(String saddress) {this.saddress = saddress;}public int getSage() {return sage;}public void setSage(int sage) {this.sage = sage;}}

BaseDaoNew:

package org.dao;import java.sql.*;
import java.util.List;import com.sun.org.glassfish.external.statistics.annotations.Reset;/*** * @author 24519* 连接数据库的工作类**/
public  class BaseDaoNew {private Connection conn = null;private PreparedStatement pre;private ResultSet rs;//连接数据库public Connection getConn(){try{//加载驱动Class.forName("com.mysql.jdbc.Driver");//数据库连接字符串String url= "jdbc:mysql://localhost:3306/schooldb?user=root&password=root";//连接数据库conn = DriverManager.getConnection(url);}catch(Exception ex){ex.printStackTrace();}return conn;}//增删改public int ExecuteUpdate(String sql,List params) throws SQLException{int rel = 0;conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}rel = pre.executeUpdate();return rel;}//查询public ResultSet ExecuteQuerty(String sql,List params) throws SQLException{conn = getConn();pre = conn.prepareStatement(sql);if(params!=null){for(int i = 0;i<params.size();i++){pre.setObject(i+1, params.get(i));}}return pre.executeQuery();}//关闭连接public void closeConn(Connection conn,PreparedStatement pre,ResultSet rs){try {if(rs!=null){rs.close();}if(pre!=null){pre.close();}if(conn!=null){conn.close();}} catch (SQLException e) {e.printStackTrace();}}}

IStudentDao:

package org.dao;import java.util.List;import org.entity.Student;//学生信息的接口
public interface IStudentDao {//增加学生信息public int addStudent(Student stu);//修改学生信息public int updateStudent(Student stu);//删除学生信息public int delStudent(int sid);//根据编号查询学生信息public Student findStudentById(int sid);//查询全部学生信息public List<Student> findStudentAll();//登录public Student login(String name,String pass);//总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);
}

StudentDaoImpl:

package org.dao.impl;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;import org.dao.BaseDao;
import org.dao.BaseDaoNew;
import org.dao.IStudentDao;
import org.entity.Student;import com.sun.xml.internal.ws.Closeable;/*** * @author 24519* 学生信息的实现类**/
public class StudentDaoImpl implements IStudentDao {BaseDao base = new BaseDao();private Connection conn = base.getConn();PreparedStatement pre = null;ResultSet rs =  null;@Overridepublic int addStudent(Student stu) {int rel = 0;String sql = "insert into Student values(?,?,?,?,?,?);";try {List<Object> params = new ArrayList<Object>();params.add(stu.getSid());params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int updateStudent(Student stu) {String sql = "update student set sname = ?," +"sphone = ?,spass=?,saddress=?,sage=? where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(stu.getSname());params.add(stu.getSphone());params.add(stu.getSpass());params.add(stu.getSaddress());params.add(stu.getSage());params.add(stu.getSid());rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic int delStudent(int sid) {String sql = "delete from Student where sid = ?";int rel = 0;try {List<Object> params = new ArrayList<Object>();params.add(sid);rel = base.ExecuteUpdate(sql, params);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return rel;}@Overridepublic Student findStudentById(int sid) {Student student = new Student();String sql = "select * from student where sid = ?";try {List<Object> params = new ArrayList<Object>();params.add(sid);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString("saddress"));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return student;}@Overridepublic List<Student> findStudentAll() {List<Student> stus = new ArrayList<Student>();String sql = "select * from Student";try {rs = base.ExecuteQuery(sql, null);while(rs.next()){Student student = new Student();student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));stus.add(student);//将信息放入集合中}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return stus;}//登陆@Overridepublic Student login(String name, String pass) {Student student = new Student();String sql = "select * from student where sname  = ? and spass = ?;";try {List<Object> params = new ArrayList<Object>();params.add(name);params.add(pass);rs = base.ExecuteQuery(sql, params);while(rs.next()){student.setSid(rs.getInt(1));student.setSname(rs.getString(2));student.setSphone(rs.getString(3));student.setSpass(rs.getString(4));student.setSaddress(rs.getString(5));student.setSage(rs.getInt(6));}} catch (SQLException e) {e.printStackTrace();}return student;}//查询总记录数@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs =  base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}}

IStudentService:

package org.service;import java.util.List;import org.entity.Student;public interface IStudentService {//增加学生信息public int addStudent(Student stu);//修改学生信息public int updateStudent(Student stu);//删除学生信息public int delStudent(int sid);//根据编号查询学生信息public Student findStudentById(int sid);//查询全部学生信息public List<Student> findStudentAll();//登录public Student login(String name,String pass);//计算总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);}

StudentService:

package org.service.impl;import java.util.List;import org.dao.IStudentDao;
import org.dao.impl.StudentDaoImpl;
import org.entity.Student;
import org.service.IStudentService;public class StudentServiceImpl implements IStudentService {//创建Dao层的对象private IStudentDao sDao = new StudentDaoImpl();@Overridepublic int addStudent(Student stu) {return sDao.addStudent(stu);}@Overridepublic int updateStudent(Student stu) {return sDao.updateStudent(stu);}@Overridepublic int delStudent(int sid) {return sDao.delStudent(sid);}@Overridepublic Student findStudentById(int sid) {return sDao.findStudentById(sid);}@Overridepublic List<Student> findStudentAll() {return sDao.findStudentAll();}@Overridepublic Student login(String name, String pass) {return sDao.login(name, pass);}@Overridepublic int findAllStudentCount() {return sDao.findAllStudentCount();}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {return sDao.findStudentByPage(currIndex, pageSize);}}

PageUtils:

package org.utils;import java.util.List;import org.entity.Student;/*** * @author 24519* 分页的工具类**/
public class PageUtils {//页大小(每页显示多少条记录)private int pageSize;//当前页private int currIndex;//总记录数private int totalCount;//总页数private int totalPage;//每页显示的数据List<Student> sList;public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getCurrIndex() {return currIndex;}//设置当前页public void setCurrIndex(int currIndex) {//判断当前页是否小于0,如果是,则默认第一页if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}public int getTotalCount() {return totalCount;}//计算总页数public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}public int getTotalPage() {return totalPage;}public void setTotalPage(int totalPage) {this.totalPage = totalPage;}public List<Student> getsList() {return sList;}public void setsList(List<Student> sList) {this.sList = sList;}}

代码解析:我们可以看到,在IStudentDao中,除了有增删改和登录的接口外,还有两个接口,一个是查询总记录数,另一个为分页查询数据.

//总记录数public int findAllStudentCount();//分页查询public List<Student> findStudentByPage(int currIndex,int pageSize);

总记录数的作用就是对总页数进行计算,公式为,总页数=总记录数%页大小==0?总记录数/页大小:总记录数/页大小+1

分页查询的数据,由于是多条,即返回List集合,每页显示5条数据,那我们就查询5条,即参数pageSize的值为5.currIndex的作用是用来记录当前页。

实现类对于这两个接口的关键代码如下:

//查询总记录数@Overridepublic int findAllStudentCount() {String sql = "select count(*) from student";int count = 0;try {rs =  base.ExecuteQuery(sql, null);rs.next();count = rs.getInt(1);} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return count;}//分页查询@Overridepublic List<Student> findStudentByPage(int currIndex, int pageSize) {String sql = "select * from student limit ? ,?";int one = (currIndex-1)*pageSize;List<Object> params = new ArrayList<Object>();params.add(one);params.add(pageSize);List<Student> sList = new ArrayList<Student>();try {rs = base.ExecuteQuery(sql, params);while(rs.next()){Student stu = new Student();stu.setSid(rs.getInt(1));stu.setSname(rs.getString(2));stu.setSphone(rs.getString(3));stu.setSpass(rs.getString(4));stu.setSaddress(rs.getString(5));stu.setSage(rs.getInt(6));sList.add(stu);}} catch (SQLException e) {e.printStackTrace();}finally{base.closeConn(conn, pre, rs);}return sList;}

PageUtils类的我们需要注意,在设置当前页currIndex的值时,要对齐进行判断,因为当前页永远永远的不可能小于0 或者大于总页数,设置的关键代码如下:

//设置当前页public void setCurrIndex(int currIndex) {//判断当前页是否小于0,如果是,则默认第一页if(currIndex<=0){this.currIndex = 1;}else{this.currIndex = currIndex;}}

设置总记录数的关键代码如下:顺便对总页数进行计算

//计算总页数public void setTotalCount(int totalCount) {this.totalCount = totalCount;int pages = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;totalPage = pages;}

接下来就可以在表现层进行分页,我们在进分页查询的页面之前,先进doPage.jsp对数据进行处理,将所有需要用到的分页数据全部封装至PageUtils类中,完整实现代码如下:各个关键步骤均有注释

<%@page import="org.entity.Student"%>
<%@page import="org.service.impl.StudentServiceImpl"%>
<%@page import="org.service.IStudentService"%>
<%@page import="org.utils.PageUtils"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%//Student stu = (Student) request.getAttribute("student");//判断是否是管理员//if (stu.getSaddress().equals("管理员")) {//获取当前页,//如果是空,默认是1String curr = request.getParameter("currIndex");if (curr == null) {curr = "1";}Integer currIndex = Integer.parseInt(curr);PageUtils p = new PageUtils();p.setPageSize(5);//计算总记录数IStudentService s = new StudentServiceImpl();//从数据库中查询总记录数p.setTotalCount(s.findAllStudentCount());//如果当前页大于等于总页数,那当前页就是总页数if (currIndex >= p.getTotalPage()) {currIndex = p.getTotalPage();} else if (currIndex <= 0) {//如果当前页小于等于0,则当前页等于1currIndex = 1;}p.setCurrIndex(currIndex);//从数据库中查询每页显示的数据放在集合中List<Student> sList = s.findStudentByPage(currIndex, 5);p.setsList(sList);//将p对象放在request作用域中,在请求的页面中获取request.setAttribute("p", p);//跳转到分页的页面request.getRequestDispatcher("findStudentPage.jsp").forward(request, response);//} else {//普通员工//跳转到查询自己信息的页面/* request.setAttribute("stu", stu);request.getRequestDispatcher("shouInfo.jsp").forward(request,response); }*/
%>

注意看这一行代码,当我们将一切处理完之后,通过这行代码转发至分页显示信息的页面,
request.getRequestDispatcher(“findStudentPage.jsp”).forward(request, response);

下面就是分页显示数据的页面了:

<%@page import="org.utils.PageUtils"%>
<%@page import="org.entity.Student"%>
<%@page import="org.service.impl.StudentServiceImpl"%>
<%@page import="org.service.IStudentService"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><base href="<%=basePath%>"><title>My JSP 'FindStudentPage.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><%//获取所有的数据PageUtils p = (PageUtils)request.getAttribute("p");//从工具类中获取每页显示的数据List<Student> sList =p.getsList() ;%><table border="1"><tr><td>编号</td><td>姓名</td><td>电话</td><td>密码</td><td>地址</td><td>年龄</td></tr><%for(Student stu :sList){%><tr><td><%=stu.getSid() %></td><td><%=stu.getSname() %></td><td><%=stu.getSphone() %></td><td><%=stu.getSpass() %></td><td><%=stu.getSaddress()%></td><td><%=stu.getSage() %></td></tr><%}%>
</table><a href="doPage.jsp?currIndex=1">首页</a><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()-1%>">上一页</a><%=p.getCurrIndex()%> / <%=p.getTotalPage()%><a href="doPage.jsp?currIndex=<%=p.getCurrIndex()+1%>">下一页</a><a href="doPage.jsp?currIndex=<%=p.getTotalPage()%>">末页</a><br/><form action="doPage.jsp" method="post">至<input type="number" max="<%=p.getTotalPage() %>" min="1" value="<%=p.getCurrIndex() %>" style="display:inline-block; width:50px" name="currIndex"/>页<input type="submit" value="跳转"></form></body>
</html>

代码解析:
先从request中获取doPage.jsp中放入的数据,然后以表格的形式展示出来。

翻页解析:
首页,很简单,当前页码必定是1,所以直接写currIndex=1即可。
上一页,假如当前也是2,那么上一页就是当前也减去1,所以上一页就是currIndex-1。
下一页,正好和上一页相反,即currIndex+1。
尾页,假如一共有5页,那么尾页就是5,即currIndex=5。
当前页和总页数由于我们在doPage都放在了PageUtils中,所以直接从PageUtils中获取即可。

注意我们无论是点击上一页还是下一页,或者首页尾页,均是跳转至doPage.jsp中操作,在doPage.jsp中,直接获取currIndex的值,然后在调用Service里面的方法进行分页查询。

运行效果如下所示:

最后欢迎关注作者公众号:雄雄的小课堂

javaweb实现分页(二)相关推荐

  1. 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

  2. javaweb实现分页查询(一)

    大家好,欢迎来到雄雄的小课堂,昨天分享了个分页工具类,其实,也是为今天的分享做的铺垫,今天,给大家带来的是javaweb实现分页的全过程! 前言:为什么需要分页?假设某大学有人数一万人,学生信息管理系 ...

  3. 【转载】 javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册 - 孤傲苍狼 - 博 http://www.cnblogs.com/xdp-gacl/

    javaweb学习总结(二十二)--基于Servlet+JSP+JavaBean开发模式的用户登录注册 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+Ja ...

  4. JavaWeb实现分页哦

    JavaWeb实现分页哦 分页是现在项目必备的功能,那我们来看看哦 1.首先分析分页需要哪些数据??? 1.总记录数totalpageCountsql语句 select count(*)from 表名 ...

  5. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  6. JavaWeb实现分页的四种方法

    一.借助数组进行分页 原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录. 实现: 首先在dao层,创建 ...

  7. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  8. javaweb学习总结(二十一)——JavaWeb的两种开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...

  9. javaweb学习总结(二十三):jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

最新文章

  1. 【干货】百度联合清华大学发布国内首个基于AI实践的《产业智能化白皮书》(附报告全文)...
  2. ubuntu18 python_ubuntu18.0.4 python 开发环境
  3. 基于内容推荐系统中的常识 [ACM暑校]
  4. 如何 打包整合linux系统文件夹 用于刷机包等等, 其中包括打包 句号开头 . 开头的文件, 排除系统文件 等...
  5. 解决 PowerDesigner 错误 The generation has been cancelled…
  6. Eclipse中的集成Git插件删除线上远程分支
  7. 学习日报 day03 实体与标识符 变量与数据类型
  8. 学生电脑哪个牌子好_电脑桌哪个牌子好?如何选购电脑桌?2020年值得选购的电脑桌品牌推荐...
  9. [Tools] JD-GUI(Java Decompiler)
  10. 印花制版技术及工艺流程
  11. 复利计算——单元测试
  12. iOS上传应用到AppStore出现Authenticating with the iTunes store
  13. 【光学】基于Matlab模拟光流场
  14. 第二章,用矩阵解线性方程组,01-高斯消元法
  15. VPS性能优劣与使用
  16. 印度BIS认证产品范围和注意事项
  17. 2022年安全员-B证考试题库及安全员-B证模拟试题
  18. python自动获取某网站二次元图片下载
  19. 使用图像处理技术和卷积神经网络(CNN)的作物病害检测
  20. 最大流的Ford-Fulkerson 标号法

热门文章

  1. LeetCode 965单值二叉树-简单
  2. android环境搭建出错,androidstudio配置环境遇到的各种错误(持续更新中)
  3. django mysql connector,MySQL Connector / python在Django中不起作用
  4. mac vim python3_VIM学习笔记 编译源码(Compile Code)-Python
  5. python二分法求方程的根_Python查找函数f(x)=0根的解决方法
  6. CF1156F. Card Bag
  7. CF1208D Restore Permutation
  8. AcWing 320. 能量项链
  9. [数据结构专训][GXOI/GZOI2019]旧词,[hdu5118]GRE Words Once More!,[hdu6333]Problem B. Harvest of Apples
  10. AT2164-[AGC006C]Rabbit Exercise【差分,倍增,数学期望】