需要将数据进行分页显示。就叫分页。
分页需要考虑以下两点:
1.如何查询当前页的数据。
2.如何在jsp页面进行显示。
2两种分页的方式
2.1逻辑分页!
在sql查询时,从数据库将所有的数据检索出来,放在一个结果集中.
在程序中,通过逻辑语句获取对应的分页数据
List<Product> prodList = service.findAll(key)
例如:检查从11-20条:List<Product> list = prodList.subList(10,20)
该分页方式用在数据很少改变,比如:城市。
2.2.物理分页!!!
在sql查询时,从数据库中只检索当前页的数据。
通常不同的数据库有不同的物理分页语句。
mysql物理分页,采用的limit关键字。
oracle物理分页,采用的rownum关键词。
例如:
检索11-20条
mysql: select * from products where ... limit 10,10
oracle:
select * from (select rownum rm,id,name from products where ... and rownum<=20) tb
where tb.rm>10
补充:like模糊查询时,一般和"%"、"_",
“%”表示n个字符(n>=0)
"_"表示一个字符
页面逻辑
首页 上一页 下一页 尾页 跳转至 2
首页 上一页 1 2 3 4 5 下一页 尾页 跳转至 2
if(总页数<=5){
全部显示
}else{//>5
if(当前页<=3){
显示前五页的页码
6,7,8,9,10
}else if(当前页>=总页数-2){
显示后五页的页码
}else{
cp-2,cp-1,cp,cp+1,cp+2
显示从当前页码-2 到 当前页码+2
}
}
具体实现在jsp中
<c:set var="begin" value="0" scope="page"/>
<c:set var="end" value="0" scope="page"/>
<c:if test="${page.countpage<=5 }">
<c:set var="begin" value="1" scope="page"/>
<c:set var="end" value="${page.countpage}" scope="page"/>
</c:if>
<c:if test="${page.countpage>5}">
<c:choose>
<c:when test="${page.thispage<=3 }">
<c:set var="begin" value="1" scope="page"/>
<c:set var="end" value="5" scope="page"/>
</c:when>
<c:when test="${page.thispage>=page.countpage-2 }">
<c:set var="begin" value="${page.countpage-4}" scope="page"/>
<c:set var="end" value="${page.countpage}" scope="page"/>
</c:when>
<c:otherwise>
<c:set var="begin" value="${page.thispage-2}" scope="page"/>
<c:set var="end" value="${page.thispage+2}" scope="page"/>
</c:otherwise>
</c:choose>
</c:if>
<%--遍历页码 --%>
<c:forEach begin="${begin}" end="${end}" step="1" var="i">
<c:if test="${page.thispage==i }">${i}</c:if>
<c:if test="${page.thispage!=i }">
<a href="javascript:void(0)" οnclick="changePageA(${i})">${i}</a>
</c:if>
</c:forEach>
<%-- 分页逻辑结束 --%>
<a href="javascript:void(0)" οnclick="changePageA(${page.nextpage})">下一页</a>
<a href="javascript:void(0)" οnclick="changePageA(${page.countpage})">尾页</a>
跳转到<input type="text" value="${page.thispage }" οnblur="changePage(this)"/>页
</div>
在页面中进行查询时,经常会附带查询条件,而页面跳转的链接并不在表单域域中,所以在表单域中设置两个隐藏域:
<input type="hidden" name="thispage" id="tp" value="1">
<input type="hidden" name="rowperpage" id="rpp" value="${page.rowperpage}">
提交表单的时候在js中进行:
function changePage(obj){
var tp = obj.value;
var reg = /^[1-9][0-9]*$/;
if(!reg.test(tp)){
alert("请您输入正确的页面");
obj.value = "${page.thispage}";
return;
}
//修改隐藏域thispage的值
document.getElementById("tp").value=tp;
//提交searchForm表单
document.getElementById("searchForm").submit();
}
表单进行的进行提交时,查询条件需要数据回显,但是如果商品的价格区间的类型设置为double,用户很有可能不去填满价格区间,这样double类型的默认值就会被设为0.0,这个0.0就会回显到输入框中,所以可以将商品的价格区间的类型设置为Double,这样默认值就是null,利用el表达式可以轻易输出数值。
分页处理逻辑:
public Page<Product> pageList(int thispage, int rowperpage, String name,
String category, double min, double max) {
Page<Product> page = new Page<Product>();
//将查询条件设置page中
page.setName(name);
page.setCategory(category);
if(min!=-1){
page.setMin(min);
}
if(max!=Double.MAX_VALUE){
page.setMax(max);
}
//将分析相关的数据设置
page.setThispage(thispage);//设置当前第几页
page.setRowperpage(rowperpage);//设置每页显示多少行
page.setPrepage(thispage==1?1:thispage-1);//设置上一页
//查询符合条件的总行数
int countrow = prodDao.getProdCountByKey(name,category,min,max);
//将总行数设置page中
page.setCountrow(countrow);
//计算总页数
int countpage = countrow/rowperpage +(countrow%rowperpage==0?0:1);
page.setCountpage(countpage);
//设置下一页
page.setNextpage(thispage==countpage?thispage:thispage+1);
//设置当前页的商品集合
page.setList(prodDao.findProdsByKeyLimit((thispage-1)*rowperpage,
rowperpage,name,category,min,max));
return page;
}