javaweb实现分页(二)

在这里插入图片描述

前言:我们都知道,实现分页需要三个步骤。第一,确定页大小(每页显示的数据量)。第二,计算显示的总页数。第三,写分页的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;
	
	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	@Override
	public 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;
	}

	//登陆
	@Override
	public 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;
	}

	//查询总记录数
	@Override
	public 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;
	}
	
	//分页查询
	@Override
	public 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();
	
	
	@Override
	public int addStudent(Student stu) {
		return sDao.addStudent(stu);
	}

	@Override
	public int updateStudent(Student stu) {
		return sDao.updateStudent(stu);
	}

	@Override
	public int delStudent(int sid) {
		return sDao.delStudent(sid);
	}

	@Override
	public Student findStudentById(int sid) {
		return sDao.findStudentById(sid);
	}

	@Override
	public List<Student> findStudentAll() {
		return sDao.findStudentAll();
	}

	@Override
	public Student login(String name, String pass) {
		return sDao.login(name, pass);
	}

	@Override
	public int findAllStudentCount() {
		return sDao.findAllStudentCount();
	}

	//分页查询
	@Override
	public 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的作用是用来记录当前页。

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

//查询总记录数
	@Override
	public 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;
	}
	
	//分页查询
	@Override
	public 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("管理员")) {
		//获取当前页,
		//如果是空,默认是1
		String 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,则当前页等于1
			currIndex = 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里面的方法进行分页查询。
在这里插入图片描述
运行效果如下所示:
在这里插入图片描述
最后欢迎关注作者公众号:雄雄的小课堂

posted @ 2020-11-25 16:35  穆雄雄  阅读(188)  评论(0编辑  收藏  举报