前言
因为学了框架之后,前面知识,也是快忘记差不多了,我觉得框架这些东西你用来用去,还是用的别人的,你说你一直使用框架带来的便捷,但是你只会使用框架,我感觉不能造出自己的框架,因为程序员写原生的写多了,这些人觉得麻烦才会去写个框架用,避免重复造轮子,重复造轮子的意思是:重复造轮子就是指别人都已经写好了,有现成的可以用,不过那些框架的思想还是可取的,精髓。一直使用别人的框架,我感觉自己会做不出框架给别人用
我在这篇文章表达我的看法
编程这个东西,都是慢慢来的,一步一个脚印走踏实,哔哩哔哩上面一些大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,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('刘杰','男',19,'湖南','1423228256@qq.com');
insert into user(name,sex,age,address,email) values('adger','男',19,'湖南','1423228256@qq.com');
我这里就直接原生吧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(动态的)
上面的目录结构你们可能有点不清楚,我也不想去管这些,这个目录不晓得你们熟悉不,按照这个目录结构来
目录结构解释
- 项目名
- src 存放源代码,自己写controller(这里有人叫Web,反正我喜欢叫controller(视图层)servlet也可以),service(服务层),utils(工具类),dao(持久层),
- 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包
相关文章参考
上面也有我自己的总结
关于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>
这些问题我都碰到过,具体得话,我就只能参考,我也说不清楚,反正,也忘记得差不多了,具体得话,可以自己去查下,知识太多了,好了现在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/bootstrap@3.3.7/dist/css/bootstrap.min.css " rel="stylesheet">
<!-- 2.
jQuery导入,建议使用1.9以上的版本
jQuery (Bootstrap 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边)
-->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 3. 导入bootstrap的js文件 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/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)开始写起,要分页功能是吧,好的
- 接受用户穿过来的参数,就是用户一打开要看到,第一页的数据啊,几条呢,不可能,打开就是,第3页,5条数据,我就不信,用户能知道我的参数变量,除非研究了
- 调用服务层(service)
- 服务层去调用持久层(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
博客系统地址,开源的
博客系统源码能跑起来
前台
后台