分页原理
一共有三行数据,当执行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}">
<span style="color:#ccc">首页</span>
<span style="color:#ccc">上一页</span>
</c:when>
<c:otherwise>
<span><a href="${pagerItem.firstPageUrl }">首页</a></span>
<span><a href="${pagerItem.prevPageUrl }">上一页</a></span>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${isLastPage}">
<span style="color:#ccc">下一页 </span>
<span style="color:#ccc">尾页</span>
</c:when>
<c:otherwise>
<span><a href="${pagerItem.nextPageUrl }">下一页</a></span>
<span><a href="${pagerItem.lastPageUrl }">尾页</a></span>
</c:otherwise>
</c:choose>
<span> 跳到第 <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);
}