后端分页显示

分页工具类与序列化详解
本文详细介绍了分页工具类的实现方法,包括如何计算当前索引和总页数,以及如何在DAO、Service和Web层实现分页查询。同时,深入探讨了序列化的重要性,解释了序列化与反序列化的过程,以及在分布式应用和数据持久化中的作用。

分页工具类

public class PageBean<T> implements Serializable{
	//起始索引
	private int startIndex;
	//当前页码
	private int pageNumber;
	//每页显示条数
	private int pageSize = 3;
	//总记录数
	private int total;
	//总页数
	private int totalPage;
	//查询到的数据
	private List<T> result;
	public int getStartIndex() {
		return (getPageNumber()-1)*getPageSize();
	}
	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}
	public int getPageNumber() {
		return pageNumber;
	}
	public void setPageNumber(int pageNumber) {
		this.pageNumber = pageNumber;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}
	public int getTotalPage() {
		return getTotal()%getPageSize() ==0 ?(getTotal()/getPageSize()):(getTotal()/getPageSize()+1);
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public List<T> getResult() {
		return result;
	}
	public void setResult(List<T> result) {
		this.result = result;
	}
}

两个重要公式
获取当前索引:当前索引 = (当前页码-1)*每页显示条数
获取总页数:总页数 = 总条数 / 每页显示条数 如果未除尽则要加上1
什么是序列化?
序列化是将对象状态转换为可保持或传输的格式的过程,将对象转化成流的形式。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据
引用自https://baijiahao.baidu.com/s?id=1633305649182361563&wfr=spider&for=pc
为什么要进行序列化?
1、将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本;2、按值将对象从一个应用程序域发送至另一个应用程序域。实现serializabel接口的作用是就是可以把对象存到字节流,然后可以恢复,所以你想如果你的对象没实现序列化怎么才能进行持久化和网络传输呢,要持久化和网络传输就得转为字节流,所以在分布式应用中及设计数据持久化的场景中,你就得实现序列化
引用自https://www.cnblogs.com/hhhshct/p/9664390.html
持久化一般指将数据持久化保存,如存到数据库中或写到文件中
为什么要是用泛型?
使用泛型可以高自由度,我们可以借助工具类实现对user的分页,也可以实现对item(商品)的分类

实现初步分页

注意:分页条数在工具类里写成3 也可以在页面获取
在这里插入图片描述
dao层

//分页查询所有用户
	public List<User> getUsersByPage(PageBean<User> page) {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from user limit ?,?";
		Object [] params = {page.getStartIndex(),page.getPageSize()};
		try {
			return qr.query(sql, new BeanListHandler<User>(User.class),params);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}

service层

public PageBean<User> getUsersByPage(PageBean<User> page) {
		List<User> users = userDao.getUsersByPage(page);
		page.setResult(users);
		return page;
	}

web层

//分页查询所有用户
	public String getUsersByPage(HttpServletRequest request, HttpServletResponse response){
		//获取当前页码
		String pageNumber = request.getParameter("pageNumber");
		//创建分页工具类对象
		PageBean<User> page = new PageBean<User>();
		page.setPageNumber(Integer.valueOf(pageNumber));//设置当前页码
		//调用业务层处理
		UserService userService = new UserServiceImpl();
		page = userService.getUsersByPage(page);
		request.getSession().setAttribute("page", page);//把查询结果存入session域
		return "amin/user_list";//请求转发
	}

实现总记录数、总页数、加入索引页

处于第一页不显示上一页

处于最后一页不显示下一页

显示不显示的实现主要是c:if判断语句
索引页的实现,foreach遍历
begin和end标签

<c:forEach begin="1" end="${page.totalPage}" var="i">
	<li class="paginItem"><a href="${pageContext.request.contextPath}/user?method=getUsersByPage&pageNumber=${i}">${i}</a></li>
</c:forEach>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ScalarHandler:将单个值封装、例如select count(*),求内容的条数
dao层

//分页查询所有用户
	public List<User> getUsersByPage(PageBean<User> page) {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select * from user limit ?,?";
		Object [] params = {page.getStartIndex(),page.getPageSize()};
		try {
			return qr.query(sql, new BeanListHandler<User>(User.class),params);
		} catch (SQLException e) {
			e.printStackTrace();
			return null;
		}
	}
	//查询总条数
	public int selectTotal() {
		QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
		String sql = "select count(*) from user";
		try {
			Long total = (long) qr.query(sql,new ScalarHandler());//ScalarHandler()将单个值封装
			return total.intValue();
		} catch (SQLException e) {
			e.printStackTrace();
			return 0;
		}
	}

service层

public PageBean<User> getUsersByPage(PageBean<User> page) {
		List<User> users = userDao.getUsersByPage(page);
		page.setResult(users);
		int total = userDao.selectTotal();
		page.setTotal(total);
		return page;
	}

web层

//分页查询所有用户
	public String getUsersByPage(HttpServletRequest request, HttpServletResponse response){
		//获取当前页码
		String pageNumber = request.getParameter("pageNumber");
		//创建分页工具类对象
		PageBean<User> page = new PageBean<User>();
		page.setPageNumber(Integer.valueOf(pageNumber));//传入当前页码
		//调用业务层处理
		UserService userService = new UserServiceImpl();
		page = userService.getUsersByPage(page);
		request.getSession().setAttribute("page", page);//把查询结果存入session域
		return "admin/user_list";//请求转发
	}

小结

后端分页主要是把数据、页码信息封装进一个返回类中,返回给前端
后端每次只返回一页的信息
前端只需要把页面和条数传递给后端即可

<think>好的,用户想了解后端分页的实现教程和示例代码。首先,我需要整理一下已有的引用内容。 根据引用[1],前端分页后端分页的实现方式不同,用户需要的是后端分页,也就是在服务器端处理分页逻辑,只返回当前页的数据。引用[2]提到后端分页需要后端返回所有数据,但看起来可能有矛盾,需要确认。不过引用[4]中的前端分页例子显示后端返回所有数据,而引用[3]指出后端分页应该由后端处理数据分片,只返回当前页的数据,所以可能需要进一步理清。 接下来,我需要从这些引用中提取与后端分页相关的内容。引用[3]提到后端分页需要计算总页数、处理分页参数,这应该是关键点。同时,引用[4]中的前端分页案例可能对后端分页的对比有帮助,但用户需要的是后端分页,所以重点应放在后端处理逻辑上。 用户需要教程和示例代码,所以应该分步骤讲解后端分页的实现步骤,并给出代码示例。比如,处理分页参数(页码、每页条数),计算偏移量,使用SQL的LIMIT和OFFSET,返回总记录数和当前页数据。同时,需要确保引用的内容正确对应步骤,比如引用[3]提到的总页数计算和分页参数处理。 可能存在的疑问是,引用[2]提到后端返回所有数据,但这其实是前端分页的情况,所以需要明确区分。用户可能混淆了前后端分页的区别,因此在回答中要明确说明后端分页的特点,即后端只返回当前页的数据,而不是全部。 然后,需要检查是否有遗漏的引用内容,比如引用[1]中的前端分页代码是否对后端分页有帮助,可能不需要,但可以对比说明。此外,引用[3]提到页面展示的部分,虽然主要在前端,但后端需要提供总记录数等信息,以便前端显示分页控件。 最后,生成相关问题时要围绕后端分页的实现、优化、框架支持等,确保问题与主题相关,并帮助用户深入理解。</think>### 后端分页实现教程与示例 #### 核心步骤与原理 后端分页的核心是通过数据库查询语句(如`LIMIT`和`OFFSET`)实现数据切片,仅返回当前页所需数据。以下是具体实现步骤: 1. **接收分页参数** 前端传递`currentPage`(当前页码)和`pageSize`(每页数据量)。例如:`/api/data?page=2&size=10` 后端需验证参数的合法性(如非负整数)。 2. **计算偏移量** 偏移量公式: $$offset = (currentPage - 1) \times pageSize$$ 例如,第3页每页10条数据时,偏移量为20。 3. **执行分页查询** 使用SQL语句(以MySQL为例): ```sql SELECT * FROM table_name LIMIT pageSize OFFSET offset; ``` 同时查询总记录数以计算总页数: ```sql SELECT COUNT(*) FROM table_name; ``` 4. **返回分页结果** 响应结构需包含: - `data`(当前页数据列表) - `total`(总记录数) - `currentPage`(当前页码) - `pageSize`(每页数据量) #### Java后端代码示例 ```java // 分页请求参数封装类 public class PageRequest { private int page; // 当前页码 private int size; // 每页数据量 // Getter/Setter省略 } // 分页响应结果封装类 public class PageResult<T> { private List<T> data; private int total; private int currentPage; private int pageSize; // Getter/Setter省略 } // 分页服务实现 @Service public class DataService { @Autowired private JdbcTemplate jdbcTemplate; public PageResult<Data> getPagedData(PageRequest request) { // 1. 计算偏移量 int offset = (request.getPage() - 1) * request.getSize(); // 2. 查询当前页数据 String dataSql = "SELECT * FROM data_table LIMIT ? OFFSET ?"; List<Data> dataList = jdbcTemplate.query( dataSql, new Object[]{request.getSize(), offset}, new BeanPropertyRowMapper<>(Data.class) ); // 3. 查询总记录数 String countSql = "SELECT COUNT(*) FROM data_table"; int total = jdbcTemplate.queryForObject(countSql, Integer.class); // 4. 构造分页结果 return new PageResult<>(dataList, total, request.getPage(), request.getSize()); } } ``` #### 优化建议 - **索引优化**:对排序字段和查询条件字段建立索引,避免全表扫描[^3] - **参数校验**:限制`pageSize`最大值(如100条/页)防止恶意请求 - **缓存策略**:对高频静态数据的总记录数进行缓存,减少重复查询[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值