javaweb 分页基本构造(分页封装)

本文介绍了一种基于Java的通用分页查询实现方案,包括前端页面展示和后端数据处理流程。详细展示了Page类的设计,该类能够根据前端传来的参数计算出所需的分页信息,并返回给前端用于展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端需要传递的参数:pageNumber(页码,必填默认为1),pageSize(每页显示的记录数)

后台的封装Page类为以下代码:

public class Pager<T> {
	private List<T> list; // 对象记录结果集
	private int total = 0; // 总记录数
	private int limit = 10; // 每页显示记录数
	private int start = 0;// 起始点
	private int pages = 1; // 总页数
	private int pageNumber = 1; // 当前页

	private boolean isFirstPage = false; // 是否为第一页
	private boolean isLastPage = false; // 是否为最后一页
	private boolean hasPreviousPage = false; // 是否有前一页
	private boolean hasNextPage = false; // 是否有下一页

	private int navigatePages = 8; // 导航页码数
	private int[] navigatePageNumbers; // 所有导航页号

	public Pager() {

	}

	public Pager(int total, int pageNumber) {
		init(total, pageNumber, limit);
	}

	public Pager(int total, int pageNumber, int limit) {
		init(total, pageNumber, limit);
	}

	private void init(int total, int pageNumber, int limit) {
		// 设置基本参数
		this.total = total;
		this.limit = limit;
		this.pages = (this.total - 1) / this.limit + 1;
		// 根据输入可能错误的当前号码进行自动纠正
		if (pageNumber < 1) {
			this.pageNumber = 1;
		} else if (pageNumber > this.pages) {
			this.pageNumber = this.pages;
		} else {
			this.pageNumber = pageNumber;
		}

		this.start = (this.pageNumber - 1) * this.limit;

		// 基本参数设定之后进行导航页面的计算
		calcNavigatePageNumbers();

		// 以及页面边界的判定
		judgePageBoudary();
	}

	/**
	 * 计算导航页
	 */
	private void calcNavigatePageNumbers() {
		// 当总页数小于或等于导航页码数时
		if (pages <= navigatePages) {
			navigatePageNumbers = new int[pages];
			for (int i = 0; i < pages; i++) {
				navigatePageNumbers[i] = i + 1;
			}
		} else { // 当总页数大于导航页码数时
			navigatePageNumbers = new int[navigatePages];
			int startNum = pageNumber - navigatePages / 2;
			int endNum = pageNumber + navigatePages / 2;

			if (startNum < 1) {
				startNum = 1;
				// (最前navPageCount页
				for (int i = 0; i < navigatePages; i++) {
					navigatePageNumbers[i] = startNum++;
				}
			} else if (endNum > pages) {
				endNum = pages;
				// 最后navPageCount页
				for (int i = navigatePages - 1; i >= 0; i--) {
					navigatePageNumbers[i] = endNum--;
				}
			} else {
				// 所有中间页
				for (int i = 0; i < navigatePages; i++) {
					navigatePageNumbers[i] = startNum++;
				}
			}
		}
	}

	/**
	 * 判定页面边界
	 */
	private void judgePageBoudary() {
		isFirstPage = pageNumber == 1;
		isLastPage = pageNumber == pages && pageNumber != 1;
		hasPreviousPage = pageNumber != 1;
		hasNextPage = pageNumber != pages;
	}
<span style="white-space:pre">	</span>//省去get()set()方法
}


后台先统计要被展示的总记录条数,total,例如:

// 总记录数(根据不同框架代码样式有所不同,总之就是要获取需要查询的记录总数)
int total = XXXDAO.getXXXTotal(params);

获取总记录数后即可通过以下代码生成page类
//total(记录总数),page(查询页码,前端传递获得),pageSize(每页显示记录数,前端获取亦可,后端定义亦可),XXX表示展示需要封装的类(例如:需要展示User信息,XXX即U//SER类)
Pager<XXX> pager = new Pager<XXX>(total,page,pageSize);

在sql语句中加入查询的开始条数以及结束条数字段,这两个字段可以从以下代码获取

 pager.getStart();//开始记录数
 pager.getLimit();//结束记录数


通过sql获取记录集,记住一定要限制条数语句
select * from xxx limit #{start},#{limit}

将结果集放入page中

pager.setList(list);
return pager;


前端JSP代码:(忽略样式)

<span style="white-space:pre">	</span><div class="am-cf">
<span style="white-space:pre">	</span>共 ${pager.total} 条记录,当前${pager.pageNumber}页
	<span style="white-space:pre">	</span><div class="am-fr">
			<ul class="am-pagination">
				<c:if test="${pager.hasPreviousPage}">
					<li><a onclick="pageDataCountForCUser('${pager.pageNumber-1}')">«</a></li>
				</c:if>
				<c:if test="${!pager.hasPreviousPage} ">
					<li><a href="javascript:">«</a></li>
				</c:if>
				<c:forEach items="${pager.navigatePageNumbers}" var="num">
					<li><a onclick="pageDataCountForCUser('${num}') " ${pager.pageNumber == num ? "style='background-color: #4086CB;co<span style="white-space:pre">	</span>lor: white;font-weight: bold'" : "" }>${num}</a></li>
				</c:forEach>
				<c:if test="${pager.hasNextPage}">
					<li><a onclick="pageDataCountForCUser('${pager.pageNumber+1}')">»</a></li>
				</c:if>
				<c:if test="${!pager.hasNextPage}">
					<li><a href="javascript:void(0)">»</a></li>
				</c:if>
			</ul>
		</div>
	</div>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值