分页查询Demo

前言

因为学了框架之后,前面知识,也是快忘记差不多了,我觉得框架这些东西你用来用去,还是用的别人的,你说你一直使用框架带来的便捷,但是你只会使用框架,我感觉不能造出自己的框架,因为程序员写原生的写多了,这些人觉得麻烦才会去写个框架用,避免重复造轮子,重复造轮子的意思是:重复造轮子就是指别人都已经写好了,有现成的可以用,不过那些框架的思想还是可取的,精髓。一直使用别人的框架,我感觉自己会做不出框架给别人用

我在这篇文章表达我的看法

编程这个东西,都是慢慢来的,一步一个脚印走踏实,哔哩哔哩上面一些大up主,我看了很多,然后基本都说jsp不用学了,有人跟我说直接学springboot的也有,是这个外面微服务很火,这是事实,但是你的基础没打好,我觉得走都没学会,难道还跑啊,当然这里只是表达我得个人看法,不会不可怕,可怕得是你不会还不知道去学,这才是最可怕得,人最大得敌人是自己,本人也是好多从网上学习的资源,我希望能共同进步

效果图

在这里插入图片描述

分页

为什么要分页,一个页面就那么大,如果你的数据有一千条一万条,用户是不是得一直往下翻,翻到什么时候去,对不对,分页这个场景在项目开发中用得还是比较多得,分页还有个好处是,减轻服务器的开销

创建数据库
数据库 采用mysql 5.7
在这里插入图片描述
打开你的cmd 或者sqlYog,或者Navicat,至于IDEA直接在里面操作就可以了,eclipse我忘记了,反正都是工具,记起来再说,-u代表 username 用户名,-p passowrd 密码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果你懒得写,把sql复制,粘贴,运行,我怕小白,所以我还是去演示下吧😀,我还是挺喜欢小白的,本人也不是什么大佬啊,我只是喜欢记录自己的学习历程,当某然一天还能看见自己在博客上写的代码,😂,哈哈哈,这篇文章可能有点长

-- 创建一个分页案列得数据库
create database pagingcase;
use  pagingcase;
-- 创建一个用户的表 id 主键自增长,姓名 不为空,性别,年龄,地址,邮箱
-- varchar 一个汉字占两个字符。英文和数字占一个字符,int最大长度是11位在mysql中
create table user(
     id int primary key auto_increment,
     name varchar(20) not null,
   	 sex varchar(5),
     age int,
     address varchar(32),
     email varchar(50)
);
-- 添加测试数据 因为id,自增长,就不用写了
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','[email protected]');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','[email protected]');

我这里就直接原生吧cmd执行 🤪,至于我这个表情怎么打出来的,用ctrl + Shift +b 就可以了,相信,其他博客主也会弄,或者你是什么其他输入法,找到表情就可以了,我是windows自带的输入法,没换过,蛮好用的还🤣

开发

开发工具:eclipseSTS,跟eclipse开不多,只不过就是增加了spring集成插件
环境:tomcat8.5
数据库:mysql 5.7
前端技术bootstarp
jar包mysql-connector-java-5.1.26,jsp的标签库的jar包
管他,三七二十一,既然我没用SSM和springboot就先创建动态Web项目再说,Dynamic(动态的)
在这里插入图片描述
上面的目录结构你们可能有点不清楚,我也不想去管这些,这个目录不晓得你们熟悉不,按照这个目录结构来
在这里插入图片描述
目录结构解释

  1. 项目名
  2. src 存放源代码,自己写controller(这里有人叫Web,反正我喜欢叫controller(视图层)servlet也可以),service(服务层),utils(工具类),dao(持久层),
  3. JRE System Library[版本信息jdk.1.8],运行时环境,你把这个remove掉,你会发现你啥玩不了,
    在这里插入图片描述
    我来补充下加上去
    在这里插入图片描述
    Apache Tomcat8.5 是指这个项目所依赖的服务器

Web App Libraries 这个是等下拷贝进来的jar包目录,是自己导入的项目依赖 jar 包,Web App Libraries 下的所有 jar 包都可以在本地的项目名\WebContent\WEB-INF\lib 中找到。如果你直接在WEB-INF/lib文件夹下,拷贝一个 jar 包,刷新一下,会自动编译到 Web App Library 中。图上没有,我还没开始干

build目录是eclipse新建的 Dynamic web project 默认是将类编译在 build 文件夹下的。可以在本地的项目路径\项目要名\build\classes 下查看

WebContent:一般我们用 eclipse 的时候创建一个 Web Project,就会生成 WebContent 文件夹,用 MyEclipse 的时候创建一个 Web Project,就会生成 WebRoot 文件夹,这两个文件夹作用一样只是名称不同而已。WebContent 用来存放 JSP,JS,CSS,图片等文件,是项目访问的默认路径,也是工程的发布文件夹,发布时会把该文件夹发布到 tomcat 的 webapps 里。

META-INF目录的出现:META-INF相当于一个信息包,目录中的文件和目录获得Java 2平台的认可与解释,用来配置应用程序、扩展程序、类加载器和服务manifest.mf文件,在用jar打包时自动生成。

WEB-INF:WEB-INF 目录是一个专用区域, 容器不能把此目录中的内容提供给用户。这个目录下的文件只供容器使用,里面包含不应该由客户直接下载的资源。Web 容器要求在你的应用程序中必须有 WEB-INF 目录。WEB-INF 中包含着发布描述符(也就是 web.xml 文件), 一个 classes 目录和一个 lib目录, 以及其它内容。注意: 如果你的 Web 应用程序中没有包含这个目录, 它可能将无法工作 ,这个也是一个保护的目录,不能被直接访问,web project 网页放在WEB-INF下面受保护,不能直接访问,

web.xml:发布描述符(deployment descriptors)是 J2EE Web 应用程序不可分割的一部分(也就是说是它的最小部分, 必不可缺的一部分)。它们在应用程序发布之后帮助管理 Web 应用程序的配置。

WEB-INF/classes 目录,编译后的 Java类,这个文件夹是可选的。有一些配置文件需要放到 WEB-INF 的 classes 文件夹下,所以,通常的做法是手动在工程的 WEB-INF 文件夹下建立 classes 文件夹。如果不在工程的 WEB-INF 下手动建立 classes,发布到 tomcat 时 tomcat 里的WEB-INF 中也会有 classes 文件夹。

WEB-INF/lib 目录存放jar包

相关文章参考

  1. 目录参考文章
  2. META-INF参考文章
  3. WEB-IF参考文章

上面也有我自己的总结
关于mysql-connector的jr包怎么获取我已经在文章写过了,在我的JDBC这篇文章写了
至于这个jstl的jar包哪里找呢,我带你看,这个界面
百度搜索tomcat就可以了

tomcat官方地址
在这里插入图片描述
这个界面熟悉吧,taglibs(标签库的意思 tag标签的意思 lib英文翻译过来可不是库哦),点击Download
在这里插入图片描述
我觉得还是放下这个,看看,以后也方便自己
在这里插入图片描述
在这里插入图片描述
jar包放在这个目录放在这里,eclipse会帮我们加载上去,如果不想要哪个jar包直接在这里右键delete删除掉就可以了
在这里插入图片描述
不需要去下载两个jar包standard.jar 和 jstl.jar,只需要其中一个因为,由于JSTL 1.1已经过时,Apache已将其置于存档中。选择jakarta-taglibs-standard-current.zip文件。但是,如果您正在运行Servlet 2.5兼容容器并且web.xml声明为至少Servlet 2.5,那么您应该能够使用新的JSTL 1.2。需要注意的是JSTL 1.2并没有要求standard.jar,这里我上面选择xml版本得时候 选得很高,Web.xml文件有2.3、2.4、2.5、3.0版本,其中有一个很重要的配置差异:
在Servlet 2.5 版本中可以这样配置,多个url映射到同一个servlet。具体如下。

<servlet-mapping>
	<servlet-name>servletName</servlet-name>
	<url-pattern>/index</url-pattern>
	<url-pattern>/login</url-pattern>
</servlet-mapping>

参考文章关于引入得问题
参考文章web.xml版本

这些问题我都碰到过,具体得话,我就只能参考,我也说不清楚,反正,也忘记得差不多了,具体得话,可以自己去查下,知识太多了,好了现在jar包也有了,再去弄前端界面,导入前端界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!-- 网页使用的语言  这里我直接引入的在线网址 bootstarp的css,js,jq -->
<head>
    <!-- 指定字符集 -->
    <meta charset="utf-8">
    <!-- 使用Edge最新的浏览器的渲染方式 -->
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <!-- 
    	viewport视口:网页可以根据设置的宽度自动进行适配,在浏览器的内部虚拟一个容器,容器的宽度与设备的宽度相同。
   		width: 默认宽度与设备的宽度相同
    	initial-scale: 初始的缩放比,为1:1
   	-->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <title>用户分页查询</title>
    <!-- 1. 导入CSS的全局样式 -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css	" rel="stylesheet">
    <!-- 2. 
    		jQuery导入,建议使用1.9以上的版本 
    		jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边)
    -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
    <!-- 3. 导入bootstrap的js文件 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"></script>
    <style type="text/css">
        td, th {
            text-align: center;
        }
    </style>
</head>
<body>
<div class="container">
    <h3 style="text-align: center">用户信息列表</h3>
    <table border="1" class="table table-bordered table-hover">
        <tr class="success">
            <th>编号</th>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>地址</th>
            <th>邮箱</th>
        </tr>
        <!-- 数据展示 -->
        <c:forEach items="${usersPage.list}" var="u">
        	<tr>
                <td>${u.id}</td>
                <td>${u.name}</td>
                <td>${u.sex}</td>
                <td>${u.age}</td>
                <td>${u.address}</td>
                <td>${u.email}</td>
            </tr>
        </c:forEach>
    </table>
    <ul class="pagination">
    	<!-- 首页功能 -->
    	<li>
    		<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=1&rows=5">
	       		 <span>首页</span>
	       	</a>
    	</li>
    	<!-- 首页禁用和激活状态 -->
    	<c:if test="${usersPage.currentPage == 1}">
        			<li class="disabled">
        </c:if>	
        <c:if test="${usersPage.currentPage != 1}">
        			<li>
        </c:if>	
	      <a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage-1 <= 0 ? 1 :usersPage.currentPage-1}&rows=5" aria-label="Previous" >
	        <span aria-hidden="true" class="glyphicon glyphicon-minus" style="font-size:20px"></span>
	      </a>
	    </li>
	    <!-- 展示多少页 -->
	    <c:forEach begin="1" end="${usersPage.totalPage}" var="i">
       		<c:if test="${usersPage.currentPage == i}">
       			<li class="active"><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
       		</c:if>	
       		<c:if test="${usersPage.currentPage != i}">
       			<li><a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${i}&rows=5">${i}</a></li>
       		</c:if>	
      		</c:forEach>
       	<!-- 尾页禁用和激活状态 -->
       	<c:if test="${usersPage.currentPage == usersPage.totalPage }">
        			<li class="disabled">
        </c:if>	
        <c:if test="${usersPage.currentPage != usersPage.totalPage}">
        			<li>
        </c:if>	
	      <a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.currentPage+1 > usersPage.totalPage ? usersPage.totalPage:usersPage.currentPage+1}&rows=5" aria-label="Previous">
	        <span aria-hidden="true" class="glyphicon glyphicon-plus" style="font-size:20px"></span>
	      </a>
	    </li>	
   		<!-- 点击跳转尾页的功能 -->
	    <li>
    		<a href="${pageContext.request.contextPath}/UserPagingCaseServlet?currentPage=${usersPage.totalPage}&rows=5">
	       		 <span>尾页</span>
	       	</a>
    	</li>
  	</ul>
  	<!-- bootstarp中的清除浮动 -->
  	<div class="clearfix"></div>
  	<span class="glyphicon glyphicon-user">总记录数(${usersPage.totalCount})<span class="glyphicon glyphicon-minus"></span>(${usersPage.totalPage})</span>
</div>
</body>
</html>

这里有两个jsp,因为我的目的是为了打开这个界面就有数据,这里因为是要直接跳转到一个servlet,controller调用servce再调用dao去查询数据库,查到了保存在request作用域中,然后在转发进入的页面就可以获取到你的值,返回到jsp页面上

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<jsp:forward page="/UserPagingCaseServlet"></jsp:forward>

web.xml的配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <!-- 因为换了版本 你写servlet的时候 不会帮你自动创建 显示项目名称  对了 xml 的文件第一行注释不能写的,有严格规范的-->
  <display-name>pagingcase</display-name>
  
  <!-- 表示默认打开的页面,如果找不到,就会报404错误 -->
  <welcome-file-list>
    <welcome-file>my.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 
  	这里的两个servlet-name名称
  	 必须相同,不相同的情况我忘记了,你们可以留言,这里什么名字可以随便取
  	servlet-class 是你写的servlet 包名	
  	url-pattern 路径	
   -->
  <servlet>
  	<servlet-name>UserPagingCaseServlet</servlet-name>
  	<servlet-class>club.adger.controller.UserPagingCaseServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>UserPagingCaseServlet</servlet-name>
  	<url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

前端界面有了,jar包也有了,数据库,库,表都有了,加上去了,写代码咯🙃,开始掉头发咯,这里因为自己提前写过了,下面的界面是我提前已经写好的了,依次来说
在这里插入图片描述
这里,建的包相信都能看懂,MVC设计模式,跟三层架构的概念,我不写那么多了,有时间我自己抽时间去写,简单一张黑马的图,来说明下
MVC开发模式
在这里插入图片描述
三层架构
在这里插入图片描述

我的第一步,先写的Utils,这里为什么没有写什么db.properties啥的,我觉得原生的写更牛点,一点点敲出来,静态代码块,随着类的的加载而执行,而且只执行一次

package club.adger.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class MyJdbcUtils {
	/**
	 * @author adger
	 * 因为是工具类 所以方法 基本为静态
	 * */
	private final static String URL = "jdbc:mysql:///pagingcase?useUnicode=true&characterEncoding=utf-8";
	private final static String USERNAME = "root";
	private final static String PASSWORD = "root";
		
	static{
		//加载驱动
		try{
			Class.forName("com.mysql.jdbc.Driver");
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//获取连接
	public static Connection getConnection(){
		//创建连接对象
		Connection con = null;
		try {
			con = DriverManager.getConnection(URL,USERNAME,PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return con;
	}
			
	/**
	 * 关闭的方法
	 * */
	public static void close(ResultSet res,PreparedStatement ps,Connection con){
		try{
			if(res != null)
				res.close();
			if(ps != null)
				ps.close();
			if(con != null)
				con.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

然后去测试自己,写的工具类,怎么样

package club.adger.test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import club.adger.utils.MyJdbcUtils;

public class TestMyJdbcUtils {
	/**
	 * 测试自己MyJdbcUtils能不能用
	 * */
	public static void testMyJdbcUtils(){
		Connection con = MyJdbcUtils.getConnection();
		System.out.println(con);
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = "select * from user";
		try {
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				 System.out.println(rs.getInt(1)+"\t"+rs.getString(2)+"\t\t"+rs.getString(3));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			MyJdbcUtils.close(rs, ps, con);
			//下面是我调皮 自己搞的
			System.out.println("\t\t\t\t\t\t▬▬▬▬.◙.▬▬▬▬\n" +
	                "\t\t\t\t\t\t     ▂▄▄▓▄▄▂\n" +
	                "\t\t\t\t\t\t◢◤ █▀▀████▄▄▄▄◢◤ \n" +
	                "\t\t\t\t\t\t█关闭!测试成功!█▀▀▀▀╬     \n" +
	                "\t\t\t\t\t\t◥██████◤\n" +
	                "\t\t\t\t\t\t══╩══╩═");
		}
	}
	
	public static void main(String[] args) {
		testMyJdbcUtils();
	}
	
}

在这里插入图片描述
ok,😋,能用了,香啊,自己写的
再去写实体类,javaBean

package club.adger.entity;
/**
 * @author adger
 * 这是一个用户得实体类
 * */
public class User {
	private Integer id; //	用户id
	private String name;// 用户名
	private String sex; //性别
	private Integer age;//年龄
	private String address;// 地址
	private String email; // 邮箱
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	//方便自己去看数据
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + ", address=" + address
				+ ", email=" + email + "]";
	}
}

接下来就是重点了
这个PageBean是每一个都是关键,这里你要清楚你的思想,然后才去写代码,你要写分页功能,对吧,分页中有什么功能呢,前端展示的界面已经告送我们了,我框出的功能都是要写的,这个上面的数据是我没改的
在这里插入图片描述

总共多少多少页,你是不是只要sql语句这么编写就可以了,查到了16条数据,对吧

select count(*) from user;

在这里插入图片描述
那分页呢,是不是sql语句只要这么编写啊,注意这里索引是从0开始的,不然你查数据就是这么查的,这个查询语句只适用于MySQL

select * from user limit 0,5;
-- LIMIT 首行行号,要返回的结果集的最大数目

在这里插入图片描述
那如果第二页呢,第三页呢
在这里插入图片描述
好的,现在清楚了,PageBean应该写哪几个属性,PageBean就是一个模型,到时候分页的部分看成各个对象,从模型中取出数据就可以了

package club.adger.entity;

import java.util.List;

/**
 * 分页对象
 * 这里 加上泛型 是因为 当如果 订单模块的列表需要去分页,就可以直接使用放便 比如 List <User>,List <Order>
 * */
public class PageBean<T> {
	private int	totalCount;	//	从数据库 查的总记录数 select count(*) from user; 
	private int totalPage; //总页码 查的总记录条数 / 每页显示的条数 
	private List<T> list; // 每页的数据 
	private int currentPage; //当前页码 select * from limit ?,?; 代表前面的?
	private int rows; //每页显示的条数 select * from limit ?,?; rows代表后面的?
	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 List<T> getList() {
		return list;
	}
	public void setList(List<T> list) {
		this.list = list;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getRows() {
		return rows;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
	
	/**
	 * 方便自己观察数据,加上一个toString方法
	 * */
	@Override
	public String toString() {
		return "PageUtils [totalCount=" + totalCount + ", totalPage=" + totalPage + ", list=" + list + ", currentPage="
				+ currentPage + ", rows=" + rows + "]";
	}
}

然后在逐步分析,我习惯是从控制层(controller)开始写起,要分页功能是吧,好的

  1. 接受用户穿过来的参数,就是用户一打开要看到,第一页的数据啊,几条呢,不可能,打开就是,第3页,5条数据,我就不信,用户能知道我的参数变量,除非研究了
  2. 调用服务层(service)
  3. 服务层去调用持久层(dao),就没了啊
package club.adger.controller;

import java.io.IOException;
import java.util.List;

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 club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;
import club.adger.service.impl.UserPagingCaseServiceImpl;

@WebServlet("/UserPagingCaseServlet")
public class UserPagingCaseServlet extends HttpServlet {
   
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   	//1.获取参数 当前页码的参数
   	String currentPage = request.getParameter("currentPage"); 
   	//每页显示的条数
   	String rows = request.getParameter("rows");
   	if(currentPage == null || "".equals(currentPage)){
   		currentPage = "1";
   	}
   	if(rows == null || "".equals(rows)){
   		rows = "5";
   	}
   	int cp = Integer.parseInt(currentPage);
   	int nowrows = Integer.parseInt(rows);
   	//转换 因为需要int 类型的
   	//2.调用service
   	UserPagingCaseService userService = new UserPagingCaseServiceImpl();
   	PageBean<User> userPage = userService.findUserByPage(cp,nowrows);
   	//2.将list存入request域中
   	request.setAttribute("usersPage", userPage);
   	//3.转发到index.jsp 转发不需要写虚拟目录
   	request.getRequestDispatcher("/index.jsp").forward(request, response);
   }
}

service接口跟实现类

package club.adger.service;

import club.adger.entity.PageBean;
import club.adger.entity.User;

public interface UserPagingCaseService {
	/**
	 * 查询所有用户信息
	 * @return
	 * */
	public PageBean<User> findUserByPage(int currentPage,int rows);
}

实现类

package club.adger.service.impl;

import java.util.ArrayList;
import java.util.List;

import club.adger.dao.UserPagingCaseDao;
import club.adger.dao.impl.UserPagingCaseDaoImpl;
import club.adger.entity.PageBean;
import club.adger.entity.User;
import club.adger.service.UserPagingCaseService;

public class UserPagingCaseServiceImpl implements UserPagingCaseService {
	private UserPagingCaseDao userDao = new UserPagingCaseDaoImpl();
	
	@Override
	public PageBean<User> findUserByPage(int currentPage,int rows) {
		List<User> list = new ArrayList<User>();
		System.out.println(list);
		//1.创建空的pageBean对象
		PageBean<User> page = new PageBean<User>();
		//3.调用Dao查询总记录数  需要展示总页码的数量
		int totalCount = userDao.findTotalCount();
		page.setTotalCount(totalCount);
		//4.调用dao查询list集合 计算开始记录索引 
		int start = (currentPage-1)*rows;
		//5.封装到List集合里面去
		List<User> lis = userDao.findByPage(start,rows);
		page.setList(lis);
		// 因为 总记录条数 / 每页几条 如果每页展示不下 就加 1 条显示
		int totalPage = totalCount % rows == 0  ?  totalCount/rows : totalCount/rows + 1;
		System.out.println(totalPage+"页码数");
		page.setTotalPage(totalPage);
		System.out.println(page);
		page.setCurrentPage(currentPage);
		page.setRows(rows);
		return page;
	}

}

dao的接口跟实现类

package club.adger.dao;

import java.util.List;

import club.adger.entity.User;

/**
 * 用户的dao
 * */
public interface UserPagingCaseDao {
	
	/**
	 * 查询总记录数
	 * */
	public int findTotalCount();
	
	/**
	 * 分页查询每页记录数
	 * */
	public List<User> findByPage(int start, int rows);
}

impl实现

package club.adger.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 club.adger.dao.UserPagingCaseDao;
import club.adger.entity.User;
import club.adger.utils.MyJdbcUtils;

public class UserPagingCaseDaoImpl implements UserPagingCaseDao {
	/**
	 * 查询总记录数
	 * */
	@Override
	public int findTotalCount() {
		//1.注册驱动 因为自己写的工具类 已经 用静态代码块了 所以不用写了 调用MyJdbcUtils的时候 就加载了
		//2.建立链接
		//这里定义个变量 int count 是为了等下拿数据库查到的值 放在外面 也好返回
		int count = 0;
		Connection con = MyJdbcUtils.getConnection();
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//3.执行SQL语句
			String sql = "select count(*) from user";
			ps = con.prepareStatement(sql);
			rs = ps.executeQuery();
			//4.遍历结果集
			if(rs.next()){
				count = rs.getInt(1);
				System.out.println(count);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			//5.关闭数据库
			MyJdbcUtils.close(rs, ps, con);
		}
		return count;
	}
	
	/**
	 * 分页查询每页记录数
	 * */
	@Override
	public List<User> findByPage(int start, int rows) {
				List<User> list = new ArrayList<User>();
				Connection con = MyJdbcUtils.getConnection();
				PreparedStatement ps = null;
				ResultSet rs = null;
				try {
					String sql = "select * from user limit ?,?";
					ps = con.prepareStatement(sql);
					ps.setInt(1, start);
					ps.setInt(2, rows);
					rs = ps.executeQuery();
					while(rs.next()){
						User u = new User();
						u.setId(rs.getInt("id"));
						u.setName(rs.getString("name"));
						u.setSex(rs.getString("sex"));
						u.setAge(rs.getInt("age"));
						u.setAddress(rs.getString("address"));
						u.setEmail(rs.getString("email"));
						System.out.println(u);
						list.add(u);
						System.out.println(list);
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}finally{
					MyJdbcUtils.close(rs, ps, con);
				}
		return list;
	}
	
}

在这里插入图片描述
因为,我觉得我的文字解释,可能没有就是自己口上说的好,这些代码我能说出来什么什么意思,有一些底层还是不懂得,现在运行吧
在这里插入图片描述
效果图,已经展示了,在这篇文章得开头
在这里插入图片描述
这里留一个问题,给你们,嘻嘻,就是如果,页数太多了,那那个是不是得很多页12345678910 11 12 12 13啥的对不对,其实我也没看懂,网上说的,就是利用前端插件,bootstarp的分页插件,等我钻研出来了再写吧,我也是回顾下,当然模糊查询分页类似差不多,如果这个分页 有不懂的可以问我,当然我也在学习

欢迎加群,一起学习交流
在这里插入图片描述

有趣的事

这里换个编辑器,因为培训机构的开发工具事,eclipse所以为了适应,我上面用的eclipse,最近我在github找了一套不错的博客系统蛮好的源码,还有第三方接口,短信,微信,QQ
在这里插入图片描述
博客系统地址,开源的
博客系统源码能跑起来
前台
在这里插入图片描述
后台
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章