Pager-taglib分页

介绍
    分页是是使数据清晰展示出来的重要技术,生活中的信息也到处是分页呈现给大家的,我们平时看的书分了很多也,并且按着一定的顺序进行排序往往是简单、通俗的内容或者重要的排在前面,计算机中得分页也类似是将从数据库中查出来的数据一页一页的显示在浏览器或者桌面上,达到高的用户体验度。
    最初的分页需要自己手动编写代码,到现在已经有专业的分页实现我们只需要借鉴来使用即可,今天介绍一个常用的分页工具 pager -taglib ,使用的时候需要引入这个 jar 文件。
Pager-taglib使用
    pager 主要提供了很多用于分页的标签,每个标签都有不同的作用,先来看一下简单例子:
[java]  view plain copy print ?
  1. <pg:pager url="org.do"  items="${pm.total }" export="currentPageNumber=pageNumber">  
  2.     <pg:param name="parentId"/>  
  3.     <pg:first>  
  4.         <a href="${pageUrl}">首页</a>  
  5.     </pg:first>  
  6.     <pg:prev>  
  7.         <a href="${pageUrl }">前页</a>  
  8.     </pg:prev>  
  9.     <pg:pages>  
  10.         <c:choose>  
  11.             <c:when test="${currentPageNumber eq pageNumber }">  
  12.             <font color="red">${pageNumber }</font>  
  13.             </c:when>  
  14.             <c:otherwise>  
  15.                 <a href="${pageUrl }">${pageNumber }</a>  
  16.             </c:otherwise>  
  17.         </c:choose>  
  18.     </pg:pages>  
  19.     <pg:next>  
  20.         <a href="${pageUrl }">后页</a>  
  21.     </pg:next>  
  22.     <pg:last>  
  23.         <a href="${pageUrl }">尾页</a>  
  24.     </pg:last>  
  25. </pg:pager>  

    上面代码是分页简单实现,通过查查资料很容易理解,注意一点是 url 属性这个属性一定要设置成首页的跟访问地址,如果没有设置这个属性,那么鼠标单击“首页”时显示的是该页 JSP 文件所在的路径,不会去访问 action 不能够提交请求,可能会找不到路径。
抽象分页模块
    一个数据库中会涉及到很多种信息,例如学生信息、班级信息、年级信息,这些信息都需要分页显示为了提高代码的复用性就需要提取出来一个公共的分页模块来分页,该模块需要返回 pager -taglib 需要的参数信息或者页面分页所需要的参数信息,用 pager-taglib 分页只需要知道总记录数以及记录结果集两个参数。下面是一个抽象的分页。
[java]  view plain copy print ?
  1. package com.bjsxt.oa.manager.impl;  
  2.   
  3. import java.util.List;  
  4. import org.hibernate.Query;  
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  6. import com.bjsxt.oa.PageModel;  
  7. import com.bjsxt.oa.SystemContext;  
  8. import com.bjsxt.oa.manager.SystemException;  
  9. /** 
  10.  * 抽象的公共分页类 
  11.  * @author lilongsheng 
  12.  * 
  13.  */  
  14. public class AbstractManager extends HibernateDaoSupport {  
  15.     /** 
  16.      * 带hql查询语句的查询方法 
  17.      * @param hql 
  18.      * @return 
  19.      */  
  20.     public PageModel searchPaginated(String hql){  
  21.         return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());  
  22.     }  
  23.     /** 
  24.      * 带hql查询语句和一个参数的方法 
  25.      * @param hql 
  26.      * @param param 
  27.      * @return 
  28.      */  
  29.     public PageModel searchPaginated(String hql,Object param){  
  30.         return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());  
  31.     }  
  32.     /** 
  33.      * 带hql查询语句和若干参数的方法 
  34.      * @param hql 
  35.      * @param params 
  36.      * @return 
  37.      */  
  38.     public PageModel searchPaginated(String hql,Object[] params){  
  39.         return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());  
  40.     }  
  41.     /** 
  42.      * 不带参数的查询语句 
  43.      * @param hql 
  44.      * @param offset 
  45.      * @param pagesize 
  46.      * @return 
  47.      */  
  48.     public PageModel searchPaginated(String hql,int offset,int pagesize){  
  49.         return searchPaginated(hql,null, offset, pagesize);  
  50.     }  
  51.     /** 
  52.      *  
  53.      * 带一个参数的分页查询 
  54.      */  
  55.     public PageModel searchPaginated(String hql,Object obj,int offset,int pagesize){  
  56.         return searchPaginated(hql, new Object[]{obj}, offset, pagesize);  
  57.     }  
  58.       
  59.     /** 
  60.      * 根据HQL语句进行分页查询 
  61.      * @param hql HQL语句 
  62.      * @param params HQL语句带的多个参数值 
  63.      * @param offset 从第几条记录开始查询 
  64.      * @param pagesize 每页显示多少行 
  65.      * @return 
  66.      */  
  67.     public PageModel searchPaginated(String hql,Object[] params,int offset,int pagesize){  
  68.           
  69.         //获取记录总数  
  70.         String countHql=getCountQuery(hql);  
  71.           
  72.         Query query=getSession().createQuery(countHql);  
  73.           
  74.         if (params!=null && params.length>0) {  
  75.               
  76.             for(int i=0;i<params.length;i++){  
  77.                   
  78.                 query.setParameter(i, params[i]);  
  79.             }  
  80.               
  81.         }  
  82.         int total=((Long)query.uniqueResult()).intValue();  
  83.       
  84.         //获得记录结果集  
  85.         query = getSession().createQuery(hql);  
  86.         if(params != null && params.length > 0){  
  87.             for(int i=0; i<params.length; i++){  
  88.                 query.setParameter(i, params[i]);  
  89.             }  
  90.         }  
  91.         List datas=query.setFirstResult(offset)  
  92.                         .setMaxResults(pagesize)  
  93.                         .list();  
  94.         PageModel pm=new PageModel();  
  95.         pm.setTotal(total);  
  96.         pm.setDatas(datas);  
  97.           
  98.         return pm;  
  99.           
  100.     }  
  101.       
  102.     /** 
  103.      * 根据HQL语句,获得查找总记录数的HQL语句 
  104.      * 如: 
  105.      * select ... from Orgnization o where o.parent is null 
  106.      * 经过转换,可以得到: 
  107.      * select count(*) from Orgnization o where o.parent is null 
  108.      * @param hql 
  109.      * @return 
  110.      */  
  111.     private String getCountQuery(String hql){  
  112.           
  113.         int index=hql.indexOf("from");  
  114.           
  115.         if (index!=-1) {  
  116.             return "select count(*) "+ hql.substring(index);  
  117.         }  
  118.           
  119.         throw new SystemException("无效的HQL查询语句!");  
  120.       
  121.     }  
  122. }  


    该类中有很多重名的方法名,好处是提高了该类和接口的复用性,接口中有时不会提供这么参数的方法,因此使用的时候就会有限制在类里面多了接口就容易实现接口中方法。
    参数怎么传递?下图为参数传输的两种方式
Pager-taglib分页_第1张图片
    SystemContext

[java]  view plain copy print ?
  1. package com.bjsxt.oa;  
  2.   
  3.   
  4. public class SystemContext {  
  5.   
  6.     private static ThreadLocal offset=new ThreadLocal();  
  7.       
  8.     private static ThreadLocal pagesize=new ThreadLocal();  
  9.   
  10.     public static int getOffset(){  
  11.           
  12.         Integer os=(Integer)offset.get();  
  13.         if (os==null) {  
  14.             return 0;  
  15.         }  
  16.         return os;  
  17.           
  18.     }  
  19.       
  20.     public static void setOffset(int offsetvalue){  
  21.           
  22.         offset.set(offsetvalue);  
  23.           
  24.     }  
  25.       
  26.     public static void removeOffset(){  
  27.         offset.remove();  
  28.     }  
  29.       
  30.     public static int getPagesize(){  
  31.         Integer ps = (Integer)pagesize.get();  
  32.         if(ps == null){  
  33.             return Integer.MAX_VALUE;  
  34.         }  
  35.         return ps;  
  36.     }  
  37.       
  38.     public static void setPagesize(int pagesizevalue){  
  39.         pagesize.set(pagesizevalue);  
  40.     }  
  41.       
  42.     public static void removePagesize(){  
  43.         pagesize.remove();  
  44.     }  
  45.       
  46. }  
    在写代码或者设计类图时候,多建立一些抽象模块可以增加设计的灵活性,类之间关系不要太过松散,分页的工具还有很多大家可以自行尝试。

你可能感兴趣的:(Pager-taglib分页)