pager-taglib分页处理的使用

本文介绍了一个轻量级的Java分页框架pager-taglib的使用方法,包括环境搭建、重要参数说明及项目实践。通过示例展示了如何在项目中引入并使用该框架完成分页功能。
pager-taglib是java中一个用于分页的小的框架。下面简单介绍一下它的具体使用。

一、环境的搭建:

       将pager-taglib-2.0.war包拷贝到Tomcat的webapps下。启动Tomcat后会将其解压成pager-taglib-2.0文件夹。

       从解压文件中的lib目录下拷贝pager-taglib.jar包到项目的lib下。

       在JSP页面中使用taglib指令引入pager-taglib标签库。

二、重要参数的说明:

     Offset:传过来的值是偏移量,是选择的页面的页数。比如你的记录/页pageSize=3,那么传过来的offset应该如下处理:offset/3+1   这样得到的就是要生成的页数!

       pg:pager设置分页的总体参数

       url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数,但不允许像给页面跳转的url那样,在后面直接添加参数,而参数的传递时需要使用pg:param来指定。

       items:总记录数,pager标签正是根据这个值来计算分页参数,很重要。

       maxPageItems:每页显示的行数,默认为10

       maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10      

pg:first 第一页的标签    

pg:pre 上一页标签

pg:next 下一页标签 

pg:last 最后一页标签

pg:pages 循环输出页码信息 

      对于上面的标签都有类似的export变量:

       pageUrl - 分页链接URL地址(最重要的export参数)

       pageNumber- 页码

       firstItem –对应页第一行的索引值

       lastItem -对应页最后一行的索引值     

 

三、项目中使用pager-taglib:

1、引入对应的标签库:

[html]  view plain copy
  1. <span style="font-size:18px"><%@taglibprefix="pg" uri="http://jsptags.com/tags/navigation/pager"%>  
  2.   
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %></span>  

 2、使用标签布置页面:

[html]  view plain copy
  1. <pg:pager url="org.do"items="${pm.total}"export="currentPageNumber=pageNumber">  
  2.   
  3.        <pg:paramnamepg:paramname="parentId"/>  
  4.   
  5.        <pg:first>  
  6.   
  7.               <ahrefahref="${pageUrl}">首页</a>  
  8.   
  9.        </pg:first>  
  10.   
  11.        <pg:prev>  
  12.   
  13.               <ahrefahref="${pageUrl }">前页</a>  
  14.   
  15.        </pg:prev>  
  16.   
  17.        <pg:pages>  
  18.   
  19.               <c:choose>  
  20.   
  21.                      <c:whentestc:whentest="${currentPageNumber eq pageNumber }">  
  22.   
  23.                      <fontcolorfontcolor="red">${pageNumber }</font>  
  24.   
  25.                      </c:when>  
  26.   
  27.                      <c:otherwise>  
  28.   
  29.                             <ahrefahref="${pageUrl }">${pageNumber }</a>  
  30.   
  31.                      </c:otherwise>  
  32.   
  33.               </c:choose>  
  34.   
  35.        </pg:pages>  
  36.   
  37.        <pg:next>  
  38.   
  39.               <ahrefahref="${pageUrl }">后页</a>  
  40.   
  41.        </pg:next>  
  42.   
  43.        <pg:last>  
  44.   
  45.               <ahrefahref="${pageUrl }">尾页</a>  
  46.   
  47.        </pg:last>  
  48.   
  49. </pg:pager>  
 

需要注意的是

       很多时候,在不同的页面中跳转的时候,需要传递一个id,在保持这个数据的时候,不能直接跟在url后面,需要使用<pg:param name="parentId"/>来传递。

为了给当前页添加一些特殊的效果,使用currentPageNumber给pageNumber指定了一个别名,这是为了test="${currentPageNumber eq pageNumber }判断的需要。

Items表示:返回来的总记录数,由此,该框架采用的是假分页。

url:指明了请求的入口地址,是与struts的配置文件struts-config.xml中的配置相关联。

      

3、设置offset和pagesize变量的值:

    比较好的做法是在系统变量类中,将其设置到ThreadLocal变量中。这里将其封装到了SystemContext类中:

[java]  view plain copy
  1. <span style="font-size:18px">public class SystemContext {  
  2.   
  3.        privatestatic ThreadLocal offset = new ThreadLocal();  
  4.   
  5.        privatestatic ThreadLocal pagesize = new ThreadLocal();  
  6.        
  7.   
  8.        publicstatic int getOffset(){  
  9.   
  10.               Integeros = (Integer)offset.get();  
  11.   
  12.               if(os== null){  
  13.   
  14.                      return0;  
  15.               }  
  16.               returnos;  
  17.        }  
  18.         
  19.   
  20.        publicstatic void setOffset(int offsetvalue){  
  21.   
  22.               offset.set(offsetvalue);  
  23.   
  24.        }  
  25.         
  26.   
  27.        publicstatic void removeOffset(){  
  28.               offset.remove();  
  29.        }  
  30.        
  31.   
  32.        publicstatic int getPagesize(){  
  33.   
  34.               Integerps = (Integer)pagesize.get();  
  35.   
  36.               if(ps== null){  
  37.   
  38.                      returnInteger.MAX_VALUE;  
  39.   
  40.               }  
  41.   
  42.               returnps;  
  43.   
  44.        }  
  45.         
  46.   
  47.        publicstatic void setPagesize(int pagesizevalue){  
  48.   
  49.               pagesize.set(pagesizevalue);  
  50.        }  
  51.        
  52.   
  53.        publicstatic void removePagesize(){  
  54.   
  55.               pagesize.remove();  
  56.        }  
  57.         
  58.   
  59. }</span>  
 

4、定义分页过滤器PagerFilter:

    该过滤器调用SystemContext类的方法,给offset和pagesize变量赋值。

[java]  view plain copy
  1. <span style="font-size:18px">publicclass PagerFilter implements Filter {  
  2.   
  3.   
  4.     @Override  
  5.   
  6.     publicvoid destroy() {  
  7.   
  8.     }   
  9.   
  10.     @Override  
  11.   
  12.     publicvoid doFilter(ServletRequest request, ServletResponseresponse,  
  13.   
  14.            FilterChain chain) throws IOException, ServletException{  
  15.        
  16.   
  17.        HttpServletRequest httpRequest = (HttpServletRequest)request;  
  18.   
  19.        SystemContext.setOffset(getOffset(httpRequest));  
  20.   
  21.        SystemContext.setPagesize(getPagesize(httpRequest));  
  22.        
  23.   
  24.        try{  
  25.   
  26.            chain.doFilter(request, response);  
  27.   
  28.        }finally{  
  29.   
  30.            //清空ThreadLocal中的值  
  31.   
  32.            SystemContext.removeOffset();  
  33.   
  34.            SystemContext.removePagesize();  
  35.   
  36.        }        
  37.   
  38.     }  
  39.      
  40.   
  41.     protectedint getOffset(HttpServletRequest request){  
  42.   
  43.        int offset = 0;  
  44.   
  45.        try {  
  46.   
  47.            offset = Integer.parseInt(request.getParameter("pager.offset"));  
  48.   
  49.        } catch (NumberFormatException ignore) {  
  50.   
  51.        }  
  52.   
  53.        return offset;  
  54.   
  55.     }  
  56.      
  57.   
  58.     protectedint getPagesize(HttpServletRequest request){  
  59.   
  60.        return 10;  
  61.   
  62.     }   
  63.   
  64.     @Override  
  65.   
  66.     publicvoid init(FilterConfig arg0) throws ServletException {  
  67.   
  68.     }   
  69.   
  70. }</span>  

offset = Integer.parseInt(request.getParameter("pager.offset"));中的参数是固定的。


5、将过滤器配置到web.xml文件中,使之生效:

[html]  view plain copy
  1. <filter>  
  2.   
  3.     <filter-name>pagerFilter</filter-name>  
  4.   
  5.     <filter-class>com.bjsxt.oa.web.PagerFilter</filter-class>  
  6.   
  7.  </filter>  
  8.   
  9.  <filter-mapping>  
  10.   
  11.     <filter-name>pagerFilter</filter-name>  
  12.   
  13.     <url-pattern>/*</url-pattern>  
  14.   
  15.  </filter-mapping>  
 

6、定义封装不同实体类数据的分页类PagerModel:

    该类使用List封装了返回的不同实体类型。这里如果使用泛型,可以在编程的时候检查类型及早给出提示,不使用也是可以的,根据个人的编程习惯吧。

[java]  view plain copy
  1. publicclass PagerModel{  
  2.    
  3.   
  4.     /** 
  5.  
  6.      * 总记录数 
  7.  
  8.      */  
  9.   
  10.     privateinttotal;  
  11.   
  12.      
  13.   
  14.     /** 
  15.  
  16.      * 当前页结果集 
  17.  
  18.      */  
  19.   
  20.     private List datas;  
  21.    
  22.   
  23.     public List getDatas() {  
  24.   
  25.        returndatas;  
  26.   
  27.     }  
  28.    
  29.   
  30.     publicvoid setDatas(List datas) {  
  31.   
  32.        this.datas = datas;  
  33.   
  34.     }  
  35.    
  36.   
  37.     publicint getTotal() {  
  38.   
  39.        returntotal;  
  40.   
  41.     }   
  42.   
  43.     publicvoid setTotal(int total) {  
  44.   
  45.        this.total = total;  
  46.   
  47.     }  
  48.   
  49. }  
 

7、抽象分页服务类AbstractManager:

    在业务逻辑的实现类中,只是传入的查询语句和参数不同,所以,可以对这个变化的部分抽象。

[java]  view plain copy
  1. publicclass AbstractManager extends HibernateDaoSupport {   
  2.   
  3.   
  4.     /** 
  5.  
  6.      * 私有的给查询语句赋值的方法 
  7.  
  8.      * @param query 
  9.  
  10.      * @param hql 
  11.  
  12.      * @param params 
  13.  
  14.      */  
  15.   
  16.     publicvoid setParams(Query query,String hql,Object[] params){      
  17.   
  18.        if(params!=null && params.length>0){  
  19.   
  20.            for(int i =0;i<params.length;i++){  
  21.   
  22.               query.setParameter(i, params[i]);  
  23.   
  24.            }           
  25.   
  26.        }       
  27.   
  28.     }   
  29.   
  30.      
  31.   
  32.     //*****************************************分页公共方法开始*****************************************  
  33.     
  34.   
  35.     public PagerModel searchPaginated(String hql){  
  36.   
  37.        return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());  
  38.     }  
  39.      
  40.   
  41.     public PagerModel searchPaginated(String hql,Object param){  
  42.   
  43.        return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());  
  44.   
  45.     }  
  46.      
  47.   
  48.     public PagerModel searchPaginated(String hql,Object[] params){  
  49.   
  50.        return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());  
  51.   
  52.     }  
  53.      
  54.   
  55.     public PagerModel searchPaginated(String hql,int offset,int pagesize){  
  56.   
  57.        return searchPaginated(hql,null,offset,pagesize);  
  58.   
  59.     }  
  60.        
  61.   
  62.     public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){  
  63.   
  64.        return searchPaginated(hql,new Object[]{obj},offset,pagesize);  
  65.   
  66.     }  
  67.   
  68.      
  69.   
  70.     /**  
  71.   
  72.      * 根据HQL语句进行分页查询  
  73.   
  74.      * @param hql HQL语句  
  75.   
  76.      * @param params HQL语句带的多个参数值  
  77.   
  78.      * @param offset 从第几条记录开始查询  
  79.   
  80.      * @param pagesize 每页显示多少行  
  81.   
  82.      * @return  
  83.   
  84.      */  
  85.     public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){  
  86.         
  87.   
  88.        //获取记录总数  
  89.   
  90.        String countHql = getCountQuery(hql);  
  91.   
  92.        Query query = getSession().createQuery(countHql);  
  93.   
  94.        if(params != null && params.length > 0){  
  95.   
  96.            for(int i=0; i<params.length; i++){  
  97.   
  98.               query.setParameter(i, params[i]);  
  99.   
  100.            }  
  101.   
  102.        }  
  103.   
  104.        int total = ((Long)query.uniqueResult()).intValue();  
  105.         
  106.   
  107.        //获取当前页的结果集  
  108.   
  109.        query = getSession().createQuery(hql);  
  110.   
  111.        if(params != null && params.length > 0){  
  112.   
  113.            for(int i=0; i<params.length; i++){  
  114.   
  115.               query.setParameter(i, params[i]);  
  116.   
  117.            }  
  118.   
  119.        }  
  120.         
  121.   
  122.        query.setFirstResult(offset);  
  123.   
  124.        query.setMaxResults(pagesize);  
  125.   
  126.        List datas = query.list();  
  127.   
  128.         
  129.   
  130.        PagerModel pm = new PagerModel();  
  131.   
  132.        pm.setTotal(total);  
  133.   
  134.        pm.setDatas(datas);  
  135.   
  136.        return pm;  
  137.   
  138.     }  
  139.      
  140.   
  141.     /** 
  142.  
  143.      * 根据HQL语句,获得查找总记录数的HQL语句 
  144.  
  145.      * 如: 
  146.  
  147.      * select ... from Orgnizationo where o.parent is null 
  148.  
  149.      * 经过转换,可以得到: 
  150.  
  151.      * select count(*) from Orgnizationo where o.parent is null 
  152.  
  153.      * @param hql 
  154.  
  155.      * @return 
  156.  
  157.      */  
  158.   
  159.     private String getCountQuery(String hql){  
  160.   
  161.        int index = hql.indexOf("from");  
  162.   
  163.        if(index != -1){  
  164.   
  165.            return"selectcount(*) " + hql.substring(index);  
  166.   
  167.        }  
  168.   
  169.         
  170.   
  171.        thrownew SystemException("无效的HQL查询语句!");  
  172.   
  173.     }     
  174.   
  175.     //*****************************************分页公共方法结束*****************************************  
  176.          
  177.   
  178. }  

当然这个类中还可以定义其他的服务方法,相当于.net中常用的sqlHelp类。

  

8、在业务逻辑实现类中查询分页数据:

[java]  view plain copy
  1. <span style="font-size:18px"@Override  
  2.   
  3.     public PagerModelfindOrgs(int parentId) {  
  4.   
  5.         
  6.   
  7.        //如果parentId=0,则查找顶级机构列表  
  8.   
  9.        if(parentId == 0){  
  10.   
  11.            return searchPaginated("from Organization owhere o.parent is null");  
  12.   
  13.        }  
  14.   
  15.        return searchPaginated("from Organization o where o.parent.id = ?", parentId);  
  16.   
  17.     }</span>  
    

我们可以看到经过上面的封装,分页查询变得如此简洁。

 

总结:

       上文中首先介绍了分页框架pager-taglib的环境搭建,然后介绍了一些重点参数的意义。

如然后结合一个项目中与之相关的部分进行了完整的代码展示。

       诸如此类的小的框架很多很多,有了ssh基础后,对这类框架的学习应该会看官方文档,并从一些简单的demo开始,学习使用起来应该是比较快的,这些框架就像是夜空中的星星给java程序添加一些灿烂的点缀。



实例:


<!-- 分页标签 -->
<div style="text-align: right; border: 0;padding: 4px 12px;" class="pageDiv">
<pg:pager url="${pager.pagerUrl}" items="${pager.total}"
export="currentPageNumber=pageNumber"
maxPageItems="${pager.pageSize}" maxIndexPages="10" isOffset="true">

总共:${pager.total}条,共:${pager.pagerSize}页
<%-- <pg:param name="key" value="${ }" />带条件的分页 --%>
<pg:first>
<a href="${pageUrl}" class="pageLink">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}" class="pageLink">上一页</a>
</pg:prev>
<%-- <pg:next>
<a href="${pageUrl}" class="pageLink">上一页</a>
</pg:next> --%>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber==pageNumber}">
<span class="selectPageLink">${pageNumber}</span>
</c:when>
<c:otherwise>
<a href="${pageUrl}" class="pageLink">${pageNumber}</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl}" class="pageLink">下一页</a>
</pg:next>
<pg:last>
<a href="${pageUrl}" class="pageLink">尾页</a>
</pg:last>
   
   <input type="text" id="pageno" name="pageno" style="width:32px;height:22px;"/>
   <a onclick="goto_page_no()" class="pageLink">GO</a>

</pg:pager>
<script type="text/javascript">


function goto_page_no()
{
    var pgno = $("#pageno").val();
    
    var pgsize = "${pager.pageSize}";
    
    var offset = pgsize*(pgno-1);
    window.location.href='${pageUrl}?pager.offset='+offset;
}


</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值