JSP中分页功能的实现

分页原理

在这里插入图片描述

一共有三行数据,当执行select *from Member limit 1, 1,选取的是第二行数据,也就是说数据的行数是从0开始
在这里插入图片描述
当执行select *from Member limit 0, 1的时候,控制台显示的是第一行的数据
在这里插入图片描述

所以对于limit的用法,就是第一个startIndex参数为第几行数据,之后的pageSize为一页中可以包含多少行数据!

可以在dao层中创建方法 List<Member> pager(Long pageSize, Long pageNum);(方法灵活运用)
其中传入的两个参数pageSize为一页可以看多少行数据,pageNum为看第几页
startIndex则应该为startIndex=(pageNum-1)*pageSize

详细原理为:
在这里插入图片描述

dao层中创建方法

在这里插入图片描述
则在实现层中编写
在这里插入图片描述

如果在分页的基础上要进行查询功能,则可以用上述的第二的方法:
List<Member> pager(Long pageSize, Long pageNum, String name);
则在实现层中的代码编辑为:
在这里插入图片描述

使用类库

创建完dao层和impl层之后,使用类库PageItem
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

或者在WebContent->WEB-INF->lib中导入com.liuvei.common.jar私人类库

在这里插入图片描述
也需要导入jstl和standard的jar包
在这里插入图片描述

之后编辑需要分页的页面代码
在这里插入图片描述
使用地方:
在这里插入图片描述
count显示数据的条数,不清晰可以去另外我的博客的MySQL连接中有关于count方法的详细代码
在这里插入图片描述
对于这里的pagerItem,则是使用于**_pager.jsp**分页代码中,在request作用域中,可以直接使用el表达式获取

使用分页切换页面:__pager.jsp
相关代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<script>

	//修改url里的某个查询变量的值,如果不存在这个查询变量,则添加这个变量和值
	function changeUrlArg(url, arg, val) {
		var pattern = arg + '=([^&]*)';
		var replaceText = arg + '=' + val;
		return url= url.match(pattern) ? url.replace(eval('/(' + arg
				+ '=)([^&]*)/gi'), replaceText) : (url.match('[\?]') ? url
				+ '&' + replaceText : url + '?' + replaceText);
	}
	
	
</script>

<div class="paging">

	<div class="aleft" style="display: inline-block; float: left;">
		<span>共${pagerItem.rowCount }行,</span> </span><span><select
			onchange="location.href=changeUrlArg(changeUrlArg(location.href,'${pagerItem.paramPageSize }', this.options[this.options.selectedIndex].value),'${pagerItem.paramPageNum }', '1');">

				<c:forEach var="i" begin="1" end="100" step="1">

					<option value="${i }" ${pagerItem.pageSize==i?"selected":""}>${i }</option>
				</c:forEach>

		</select>行/页</span>
	</div>
	<div class="aright" style="display: inline-block; float: right;">


		<c:set value="${pagerItem.pageNum == 1}" var="isFisrtPage"
			scope="request" />
		<c:set value="${pagerItem.pageNum == pagerItem.pageCount}"
			var="isLastPage" scope="request" />


		<c:choose>
			<c:when test="${isFisrtPage}">
				&nbsp;<span style="color:#ccc">首页</span>
				&nbsp;<span style="color:#ccc">上一页</span>
			</c:when>
			<c:otherwise>
				&nbsp;<span><a href="${pagerItem.firstPageUrl }">首页</a></span>
				&nbsp;<span><a href="${pagerItem.prevPageUrl }">上一页</a></span>
			</c:otherwise>
		</c:choose>

		<c:choose>
			<c:when test="${isLastPage}">
				&nbsp;<span style="color:#ccc">下一页 </span>
				&nbsp;<span style="color:#ccc">尾页</span>
			</c:when>
			<c:otherwise>
				&nbsp;<span><a href="${pagerItem.nextPageUrl }">下一页</a></span>
				&nbsp;<span><a href="${pagerItem.lastPageUrl }">尾页</a></span>
			</c:otherwise>
		</c:choose>


		<span>&nbsp;&nbsp;&nbsp;&nbsp;跳到第 <select
			onchange="location.href=changeUrlArg(location.href,'${pagerItem.paramPageNum }', this.options[this.options.selectedIndex].value);">

				<c:forEach var="i" begin="1" end="${pagerItem.pageCount }">

					<option value="${i }"${pagerItem.pageNum==i?"selected":""}>${i }</option>
				</c:forEach>

		</select>页 /共${pagerItem.pageCount }页
	</div>
</div>

之后静态包含"__pager.jsp
在需要分页的页面,选择合适的位置静态包含
在这里插入图片描述


多加参数的代码处理

List<Member> pager(Long pageSize, Long pageNum, String name);

在servlet类中的处理代码,只是在得到集合的时候多传入用户输入的name值,如果name值为空,也不会有太多的影响.

protected void listDeal(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String userName = request.getParameter("userName");
		// 把userName放入作用域中,请求转发的页面直接可以使用el表达式进行获取
		request.setAttribute("userName", userName);

		List<Member> vDataList = null;
		// 分页步骤1:创建PagerItem对象,处理url传过来的pageSize和pageindex
		PagerItem pagerItem = new PagerItem();
		pagerItem.parsePageSize(request.getParameter(pagerItem.getParamPageSize()));
		pagerItem.parsePageNum(request.getParameter(pagerItem.getParamPageNum()));

		// 分页步骤2.1,根据条件,查找符合条件的所有记录数---count()要根据实际情况编写方法
		Long rowCount = 0L;

		if (!SysFun.isNullOrEmpty(userName)) {

			rowCount = memberService.countBySearch(userName).longValue();
			// 分页步骤2.2,将记录数赋给pagerItem,以便进行分页的各类计算
			pagerItem.changeRowCount(rowCount);
			// 分页步骤2.3,从数据库取指定的分页数据--pager()要根据实际情况编写
			vDataList = memberService.pagerByName(pagerItem.getPageSize(), pagerItem.getPageNum(), userName);

		} else {
			rowCount = memberService.count().longValue();
			// 分页步骤2.2,将记录数赋给pagerItem,以便进行分页的各类计算
			pagerItem.changeRowCount(rowCount);
			// 分页步骤2.3,从数据库取指定的分页数据--pager()要根据实际情况编写

			vDataList = memberService.pager(pagerItem.getPageSize(), pagerItem.getPageNum());
		}

		// 分页步骤2.4,设置页面的跳转url
		pagerItem.changeUrl(SysFun.generalUrl(request.getRequestURI(), request.getQueryString()));
		/**
		 * request.getRequestURI()获取的是全路径 request.getQueryString()获取查询字符串,即路径?后面跟的内容
		 */
		request.setAttribute("count", rowCount);
		request.setAttribute("pagerItem", pagerItem);
		request.setAttribute("DataList", vDataList);

		String toPage = "/WEB-INF/view00/Member_list.jsp";
		request.getRequestDispatcher(toPage).forward(request, response);
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你到底奶不奶我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值