分页简介
分页功能是网页中非常常见的功能,其功能是将数据分为多个页面以供显示。
当我们不使用分页功能时,我们将面临许多问题:
分页类别
分页的实现分为两种类型,即真正分页和错误分页,即物理分页和逻辑分页。
1.真实分页(物理分页):
2.假分页(逻辑分页):
传统分页方法
错误分页的实现非常简单。您只需要准备一个集合来保存从数据库中检索到的所有数据,然后根据当前页面的代码号,取出相应的数据范围并显示出来。这里我们是基于物理分页实现的。
分页原理
可以发现需要通过SQL语句查询页面函数所需的两个数据:一个是页面上显示的数据列表,另一个是数据totalCount的总数,对应于以下内容两个分别的SQL语句:
通过计算获得的数据是:
用户传递的数据:
我们可以创建一个Page工具作为备份:
public class Page {
int start; // 开始数据的索引
int count; // 每一页的数量
int total; // 总共的数据量
/**
* 提供一个构造方法
* @param start
* @param count
*/
public Page(int start, int count) {
super();
this.start = start;
this.count = count;
}
/**
* 判断是否有上一页
* @return
*/
public boolean isHasPreviouse(){
if(start==0)
return false;
return true;
}
/**
* 判断是否有下一页
* @return
*/
public boolean isHasNext(){
if(start==getLast())
return false;
return true;
}
/**
* 计算得到总页数
* @return
*/
public int getTotalPage(){
int totalPage;
// 假设总数是50,是能够被5整除的,那么就有10页
if (0 == total % count)
totalPage = total /count;
// 假设总数是51,不能够被5整除的,那么就有11页
else
totalPage = total / count + 1;
if(0==totalPage)
totalPage = 1;
return totalPage;
}
/**
* 计算得到尾页
* @return
*/
public int getLast(){
int last;
// 假设总数是50,是能够被5整除的,那么最后一页的开始就是45
if (0 == total % count)
last = total - count;
// 假设总数是51,不能够被5整除的,那么最后一页的开始就是50
else
last = total - total % count;
last = last<0?0:last;
return last;
}
/* getter and setter */
}
前台的分页设计
首先,我们需要完成前台分页栏的设计。这里我们可以直接介绍Bootstrap来完成:
以上是使用Bootstrap实现分页栏的简单示例。如果您不熟悉童鞋,可以在新手教程中进行检查:单击此处
页面栏的简单版本
为了便于理解,我们首先实现分页栏的简单版本:
页面栏的改进版本
1.写头和尾巴
.....
2.写«‹这两个功能按钮
使用标签增加边界判断,如果没有上一页,则将其设置为禁用状态
class="disabled">
«
class="disabled">
‹
使用JavaScript代码完成禁用功能:
3.完成中间页码的书写
从0循环到page.totalPage-1,varStatus等效于循环变量
后台分页
主页在项目中引入了上述的Page工具类Axure教程,然后我们在DAO类中使用LIMIT关键字来查询数据库中的信息:
public Listlist() {
return list(0, Short.MAX_VALUE);
}
public Listlist(int start, int count) {
Liststudents = new ArrayList<>();
String sql = "SELECT * FROM student ORDER BY student_id desc limit ?,?";
try (Connection c = DBUtil.getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
ps.setInt(1, start);
ps.setInt(2, count);
// 获取结果集...
} catch (SQLException e) {
e.printStackTrace();
}
return students;
}
在Servlet中获取分页参数web页,并使用页面参数获取显示在主页上的StudentList:
// 获取分页参数
int start = 0;
int count = 10;
try {
start = Integer.parseInt(req.getParameter("page.start"));
count = Integer.parseInt(req.getParameter("page.count"));
} catch (Exception e) {
}
Page page = new Page(start, count);
Liststudents = studentDAO.list(page.getStart(), page.getCount());
....
// 共享数据
req.setAttribute("page", page);
req.setAttribute("students", students);
以上可以完成分页功能电商后台原型,但这是基于Servlet的版本。该方法实际上在先前编写的项目(学生管理系统(简化版))中使用。如果您有兴趣,可以查看一下。
SSM中的分页
在SSM项目中web页,我们可以使用MyBatis:PageHelper的分页插件来帮助我们更轻松地完成分页需求,官方网站在这里:PageHelper
在这里,我们演示如何使用上述工具来重建我们之前编写的SSM项目-学生管理系统-SSM版本
第一步:添加相关的jar依赖项
PageHelper需要依赖两个jar包,我们直接在pom.xml中添加两个jar包依赖项:
com.github.pagehelper
pagehelper
5.1.2-beta
com.github.jsqlparser
jsqlparser
1.0
第2步:配置相关环境
在MyBatis的SessionFactory配置中添加新的属性名称插件配置:
第3步:重构项目
首先,让我们摆脱映射文件中的LIMIT关键字:
SELECT * FROM student ORDER BY student_id desc
然后注释掉查询数据总数的SQL语句:
修改Dao类和Service类中的相应位置:
然后在StudentController中修改方法:
@RequestMapping("/listStudent")
public String listStudent(HttpServletRequest request, HttpServletResponse response) {
// 获取分页参数
int start = 0;
int count = 10;
try {
start = Integer.parseInt(request.getParameter("page.start"));
count = Integer.parseInt(request.getParameter("page.count"));
} catch (Exception e) {
}
Page page = new Page(start, count);
// 使用 PageHelper 来设置分页
PageHelper.offsetPage(page.getStart(),page.getCount());
Liststudents = studentService.list();
// 使用 PageHelper 来获取总数
int total = (int) new PageInfo<>(students).getTotal();
page.setTotal(total);
request.setAttribute("students", students);
request.setAttribute("page", page);
return "listStudent";
}
重新启动服务器,您可以正确看到并使用分页功能。
摘要
实际上,我对该工具相对不敏感。因为它仅削弱了该功能的一小部分,所以它并不像我想象的那样“智能”,并且我还没有看到任何可以帮助我理解的优秀博客文章。 。希望所有认识的人都能无私分享measure,谢谢!!