在页面中使用分页查询

来源:互联网 发布:英国研究生gpa算法 编辑:程序博客网 时间:2024/05/17 08:11
 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)" onclick="changePageA(${i})">${i}</a>    </c:if>   </c:forEach><%-- 分页逻辑结束 --%><a href="javascript:void(0)" onclick="changePageA(${page.nextpage})">下一页</a><a href="javascript:void(0)" onclick="changePageA(${page.countpage})">尾页</a>跳转到<input type="text" value="${page.thispage }" onblur="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
原创粉丝点击