一、显示数据库中的多条数据为什么要用分页

在真正的开发中,数据库中所存储的数据绝对不像我们平时所写的那样,仅仅有几条数据,而是有几十条甚至上百条,像淘宝京东的用户把都是上几十万甚至百万的。如果这时候在将所有的数据都显示出来那肯定是不现实的,第一、浏览器的页面就那么大,肯定显示不全;第二、一次将这些数据全部查询出来再进行操作,那对于整个数据库的消耗那是相当大的。

因此,实际开发中使用分页来显示数据是十分有必要的。话不多说,进入今天咱们的话题:分页的具体实现步骤。(这里以我自己做的一个小程序为例)

二、让我们先来看一下分页之后的效果。

这是我自己做的一个jsp显示出来的,没有加多少css样式,很简单,有点丑,各位就凑合看吧,毕竟今天咱们的重点不是这!

从这张图中我么你可以看出来,本页面实现了分页的功能,一共分为7页,每页5条记录。这里面的超链接以及文本框都是可以操作的。

三、具体的实现步骤

1、首先你需要有一个类,Student.java用来生成学生的各种属性以及它们的get、set方法。还需要有一个page类,用来存储Student对象列表以及总记录数、当前页、每页的记录条数等属性以及它们的get、set方法。如图:

加了注释的那两个属性我们不可以对其进行set,因此只有它们的get方法。

之所以这么写这两个的get方法想必不用我多说了吧,稍微懂点脑子就能计算出来。

2、你需要连接数据库

3、进入重点部分,即Dao层的编写(这里只说与分页有关的)

public List<Student> limitAll(int index,int pageSize){
Connection conn=DBUtils.getConnection();
String sql="select * from student limit ?,?";
PreparedStatement ps = null;
List<Student> list = null;
ResultSet rs = null;
try {
ps=conn.prepareStatement(sql);
ps.setInt(1, index);
ps.setInt(2, pageSize);
rs = ps.executeQuery();
list=new ArrayList<Student>();
while(rs.next()){
Student student=new Student();
student.setId(rs.getInt(1));
student.setName(rs.getString(2));
student.setNumber(rs.getString(3));
student.setSchool(rs.getString(4));
student.setEmail(rs.getString(5));
list.add(student);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
DBUtils.colse(conn, ps, rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
} public int getTotalRecord(){
Connection conn=DBUtils.getConnection();
String sql="select count(*) as total from student";
PreparedStatement ps = null;
ResultSet rs = null;
int total=0;
try {
ps=conn.prepareStatement(sql);
rs = ps.executeQuery();
if(rs.next()){
total=rs.getInt("total");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
DBUtils.colse(conn, ps, rs);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return total;
}

  select * from student limit ?,?;

这句代码是数据库中的分页查询的语句。第一个“?”为索引值,第二个“?”为每页的记录数。
例如:select * from student limit 0,3 便是输出表中的前三条数据。
第一个函数通过输入索引值和每页的记录数,返回一个Student的List;第二个函数计算出此表的总记录数。
4、service层的编写:
public Page<Student> limitAll(int pageNumber,int pageSize){
int totalRecord=studentDao.getTotalRecord();
Page<Student> page=new Page<Student>();
page.setPageSize(pageSize);
page.setTotalRecord(totalRecord);
if(pageNumber<1){
pageNumber=1;
}else if(pageNumber>page.getTotalPage()){
pageNumber=page.getTotalPage();
}
page.setPageNumber(pageNumber);
List<Student> list=studentDao.limitAll(page.getIndex(), pageSize);
page.setData(list);
return page;
}

  通过这一部分的编写,我们可以在servlet中只需输入两个参数:当前页和每页的记录条数。就能将整个分页后当前页student的List得到。

5、Servlet层的编写

private static int pagesize=5;
private static int pagenum=1;

这里我们声明两个static的变量,即默认显示的当前页为第一页,每页的记录条数为5条。

通过:Page<Student> page=service.limitAll(pagenum, pagesize);

我们可以生成当前五条记录的一个学生信息的列表。当然这里你需要有一个登录页面来登录进去。此时我们就得到了开始的那个页面。

6、对jsp页面的编写:

<body>
<div id="find">
<form action="Servlet?oper=findByNameOrId" method="post">
<input type="text" name="find">
<input type="submit" value="查找">
</form>
</div>
<div id="tablee">
<table border="1" align="center">
<tr>
<th>姓名</th>
<th>学号</th>
<th>学校</th>
<th>邮箱</th>
<th colspan="2">操作</th>
</tr>
<c:forEach items="${page.data}" var="student">
<tr>
<td>${student.name}</td>
<td>${student.number}</td>
<td>${student.school}</td>
<td>${student.email}</td>
<td><a href="Servlet?id=${student.id}&oper=update&fnum=two&pagenum=${page.pageNumber}">修改</a></td>
<td><a href="Servlet?id=${student.id}&oper=delete&fnum=two&pagenum=${page.pageNumber}">删除</a></td>
</tr>
</c:forEach>
<tr>
<th colspan="4"><a href="Servlet?oper=register&fnum=two&pagenum=${page.pageNumber}">添加</a></th>
</tr>
</table>

  这是整个table,包含学生信息和修改,删除,添加等超链接。

<div id="page">
<a href="Servlet?pagenum=1&oper=login&fnum=two&fl=1">首页</a>
<a href="Servlet?pagenum=${page.pageNumber-1}&oper=login&fl=1&fnum=two&fl=1">上一页</a>
<c:choose>
<c:when test="${page.totalPage<=5}">
<c:forEach begin="1" end="${page.totalPage}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:when>
<c:when test="${page.totalPage>5}">
<c:if test="${page.pageNumber<=3}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="5"></c:set>
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
<c:if test="${page.pageNumber>3}">
<c:set var="begin" value="${page.pageNumber-2}"></c:set>
<c:set var="end" value="${page.pageNumber+2}"></c:set>
<c:if test="${page.pageNumber>=page.totalPage-2}">
<c:set var="begin" value="${page.totalPage-4}"></c:set>
<c:set var="end" value="${page.totalPage}"></c:set>
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
<c:if test="${page.pageNumber<page.totalPage-2}">
<c:forEach begin="${begin}" end="${end}" var="num">
<c:if test="${page.pageNumber==num }">
[${num}]
</c:if>
<c:if test="${page.pageNumber!=num}">
<a href="Servlet?pagenum=${num}&fnum=two&oper=login&fl=1"> ${num}</a>
</c:if>
</c:forEach>
</c:if>
</c:if>
</c:when>
</c:choose> <a href="Servlet?pagenum=${page.pageNumber+1}&fnum=two&oper=login&fl=1">下一页</a>
<a href="Servlet?pagenum=${page.totalPage}&fnum=two&oper=login&fl=1">末页</a>
共${page.totalPage}页 ${page.totalRecord}条记录
去第<input type="text" id="num">页
<input type="button" value="确定" id="btn_id">
<script type="text/javascript">
$("#btn_id").click(function(){
var num1=$("#num").val();
window.location="Servlet?oper=login&fl=1&fnum=two&pagenum="+num1;
});
</script>
</div>

这是显示table下面关于分页的显示以及超链接代码。
说道这,有关分页的特别核心的内容已经说完。剩下的代码就需要各位小伙伴们自己去写了。
如果还有不懂的地方或者还需要完整的代码可以留言!

 

分页(将数据库中的多条数据一页一页的显示在jsp页面中)的更多相关文章

  1. 关于jsp页面中时间显示问题

    首先说明一下情况,在MySQL数据库中获取的时间显示在jsp页面中不是按指定格式显示,显示的是类似于这种--Tue Jun 18 00:00:00 CST 2013.而想要的仅仅是年月日而已. 对于这 ...

  2. JSP页面中的指令标识

    JSP页面中的指令标识 制作人:全心全意 指令标识主要用于设定整个JSP页面范围内都有效的相关信息,它是被服务器解释并执行的,不会产生任何内容输出到网页中.也就是说,指令标识对于客户端浏览器是不可见的 ...

  3. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...

  4. jsp篇 之 jsp页面中的路径问题

    jsp页面中的路径问题: 一般情况下,jsp中路径问题是和我们之前在servlet中讨论的html里面的路径问题是一 样的,但是在[jsp中可以动态获得该项目的url]. 如果在jsp页面的上面写了这 ...

  5. 使用JDBC向数据库中插入一条数据

    原谅我是初学者,这个方法写的很烂,以后不会改进,谢谢 /** * 通过JDBC向数据库中插入一条数据 1.Statement 用于执行SQL语句的对象 1.1 通过Connection 的 * cre ...

  6. 方法:查询MongoDB数据库中最新一条数据(JAVA)

    使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...

  7. 数据库一次性插入10w条数据,怎么插入效率快

    在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Insert不仅效率低,而且会导致SQL一系统性能问题 下面介绍SQL Server支持的两种批量 ...

  8. 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)

    我们常常会用到通过图书的名称来查询图书那么这种话我们也就会使用到从数据库中搜索出数据而且载入到自己的Jsp页面中 这种话我们须要将从数据库中获取到的数据放进响应中然后通过%=request.getAt ...

  9. mysql 数据库查询最后两条数据

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011925175/article/details/24186917  有一个mysql数据库的 ...

随机推荐

  1. Java IO在实际开发中的应用

    IO是java绕不过去的槛,在开发中io无处不在, 正如同 世界上本没有路,java io写多了,也就知道了大体是什么意思,在读完thinking in java 感觉就更清晰了,结合具体的业务场景, ...

  2. Kinect用体感来实现UI控件的点击

    用体感来实现UI控件的点击,如点击按钮. 做法:用一个图片表示左手手掌,图片位置追踪左手手掌移动,当手掌位于UI控件的矩形内时,握拳表示点击该控件. using UnityEngine; using ...

  3. Python: Pandas运算的效率探讨以及如何选择高效的运算方式

    本文就Pandas的运行效率作一个对比的测试,来探讨用哪些方式,会使得运行效率较好. 测试环境如下: windows 7, 64位 python 3.5 pandas 0.19.2 numpy 1.1 ...

  4. [基础架构]PeopleSoft都有哪些进程运行在进程服务器上

    PSPRCSRV:(PSPRCSRV.EXE) 该进程负责启动所有服务进程. 每隔15s,该进程就会去看进程调度器中是否有需要运行的进程请求.如果没有需要运行的则sleep15s,然后再次检查. 如果 ...

  5. gulp静态资源构建、压缩、版本号添加

    公司移动端商城使用前后分离方案,前台nginx静态文件,js使用requirejs模式,使用gulp压缩添加版本号时发现问题, 问题1.在公共的js配置中,引用的路径是写死的,缓存会一直存在. 解决方 ...

  6. MySQL5.6.36 linux rpm包安装配置文档

    一.卸载自带mysql,删除MySQL的lib库,服务文件 [root@localhost ~]#rpm -qa|grep mysql qt-mysql-4.6.2-26.el6_4.x86_64 m ...

  7. Akka(15): 持久化模式:AtLeastOnceDelivery-消息保证送达模式

    消息保证送达是指消息发送方保证在任何情况下都会至少一次确定的消息送达.AtleastOnceDelivery是一个独立的trait,主要作用是对不确定已送达的消息进行补发,这是一种自动的操作,无需用户 ...

  8. nopCommerce 3.9 大波浪系列 之 事件机制(生产者、消费者)

    一.nop事件机制简介 应用场景:客户支付成功后,需要发送短信.邮件告知客户订单支付成功(短信.邮件由不同模块实现) 实现方法: 1.定义支付成功OrderPaidEvent事件. 2.定义短信,邮箱 ...

  9. Python学习之数据类型

    整数 Python可以处理任意大小的整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 用十六进制表示整数比较方便,十六进制用0x前缀和0-9,a-f表示,例如: ...

  10. spring boot 配置文件application

    场景:在项目部署的过程中,对于spring boot的配置文件一直不很了解,直到项目出现一个莫名其妙的问题——工程classes中的配置文件被覆盖,程序启动总是报错! 1  配置文件的优先级 appl ...