大家好,欢迎来到雄雄的小课堂,昨天分享了关于分页查询的理论知识,今天我们就来结合代码和案例实际的应用一下,方便大家理解。
前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的sql语句。这三步已经在昨天的推文中详细说明,需要的可以点击这里快速浏览:javaweb中实现分页,持续更新……
01
开发环境
Myeclipse 10.5
Mysql 5.5
Tomcat 7.0
JDK 1.7
Chrome浏览器
02
数据库和表结构:
下面是表中的测试数据,需要说明的是saddress这一列,本来是当做地址的,现在有其他的需求,就当成了角色使用,但是并不影响分页。
03
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<Student>集合,每页显示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中放入的数据,然后以表格的形式展示出来。
04
翻页解析
首页,很简单,当前页码必定是1,所以直接写currIndex=1即可。
上一页,假如当前也是2,那么上一页就是当前也减去1,所以上一页就是currIndex-1。
下一页,正好和上一页相反,即currIndex+1。
尾页,假如一共有5页,那么尾页就是5,即currIndex=5。
当前页和总页数由于我们在doPage都放在了PageUtils中,所以直接从PageUtils中获取即可。
注意我们无论是点击上一页还是下一页,或者首页尾页,均是跳转至doPage.jsp中操作,在doPage.jsp中,直接获取currIndex的值,然后在调用Service里面的方法进行分页查询。
运行结果如下:
往期精彩
javaweb中实现分页,持续更新……
2020-11-24
一个简单的分页工具类
2020-11-23
javaWeb中,如何通过Commons-FileUpload组件上传文件
2020-11-22
多功能语音播放器
2020-11-21
CSS动画示例(上一篇是CSS过渡…)
2020-11-20
CSS3中的动画示例
2020-11-19
点分享
点点赞
点在看