在页面中使用分页查询

 1当一个页面中数据比较多的时候,如果显示到一个页面将导致页面非常庞大而冗长,所以
   需要将数据进行分页显示。就叫分页。
     分页需要考虑以下两点:
        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;
	}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值