分页的一些实现的思想和方法(ThreadLocal+Filter+pager-taglib)

首先谈谈一些实现的思想:

1、实现分页主要需要向后台的DAO层传递两个参数:PageOffset(PageIndex)和PageSize,其中PageSize可以在后台中指定,比如可以再Filter的配置文件中带上初始化参数,PageOffset(PageIndex)是必须传递的参数;

2、ThreadLocal的作用:在前台和后台共享PageOffset(PageIndex)参数;

3、Filter的作用:拦截前台页面传递过来的参数,并且把得到的参数值放进ThreadLocal中,进而后台进行数据库查询的时候就可以使用ThreadLocal中的参数(也就是前台传递过来的参数);

4、需要穿件一个Pager对象,来包含PageIndex、pageSize、totalpage、totalItem、List<T>;

5、前台的页面根据传递过来的Pager对象进行分页:

方式A:自己简单的写一个分页:

方式B:使用pager-taglib框架:(参照一些项目)在使用Filter拦截获取参数的时候,http://localhost:8080/testPager/PageTagLib.jsp?pager.offset=0&pageIndex=20,必须首先获取pager.offset这个参数,当时是先获取PageIndex,导致pager.offset这个参数一直不能得到,相当蛋疼!!!


1建立LocalThread,对分页的常数进行封装

     代码如下

  1.  package com.tgb.oa;  
  2.     /** 
  3.      *  
  4.      *    采用ThreadLocal来存储分页变量. 
  5.      * @author   jnqqls 
  6.      * @group    TGB 
  7.      * @version  1.0 
  8.      * @comments 
  9.      */  
  10.     public class SystemContext {  
  11.         private static ThreadLocal offset = new ThreadLocal();  
  12.         private static ThreadLocal pagesize = new ThreadLocal();  
  13.           
  14.         /** 
  15.          * 从线程中获取offset字段 
  16.          * @return 
  17.          */  
  18.         public static int getOffset(){  
  19.             Integer os = (Integer)offset.get();  
  20.             if(os == null){  
  21.                 return 0;  
  22.             }  
  23.             return os;  
  24.         }  
  25.           
  26.         public static void setOffset(int offsetvalue){  
  27.             offset.set(offsetvalue);  
  28.         }  
  29.           
  30.         public static void removeOffset(){  
  31.             offset.remove();  
  32.         }  
  33.           
  34.         public static int getPagesize(){  
  35.             Integer ps = (Integer)pagesize.get();  
  36.             if(ps == null){  
  37.                 return Integer.MAX_VALUE;  
  38.             }  
  39.             return ps;  
  40.         }  
  41.           
  42.         public static void setPagesize(int pagesizevalue){  
  43.             pagesize.set(pagesizevalue);  
  44.         }  
  45.           
  46.         public static void removePagesize(){  
  47.             pagesize.remove();  
  48.         }  
  49.           
  50.     }  



 

 

2建立PagerFilter过滤器,将参数读取到ThreadLocal.

     代码如下:

  1. <span style="font-size:18px;">  package com.tgb.oa.web;  
  2.       
  3.     import java.io.IOException;  
  4.       
  5.     import javax.servlet.Filter;  
  6.     import javax.servlet.FilterChain;  
  7.     import javax.servlet.FilterConfig;  
  8.     import javax.servlet.ServletException;  
  9.     import javax.servlet.ServletRequest;  
  10.     import javax.servlet.ServletResponse;  
  11.     import javax.servlet.http.HttpServletRequest;  
  12.       
  13.     import com.tgb.oa.SystemContext;  
  14.     /** 
  15.      *  
  16.      * @oa_02    过滤器,获取相关分页数据. 
  17.      * @author   jnqqls 
  18.      * @group    TGB 
  19.      * @version  1.0 
  20.       * @comments 
  21.      */  
  22.     public class PagerFilter implements Filter {  
  23.       
  24.         public void destroy() {  
  25.         }  
  26.       
  27.         public void doFilter(ServletRequest request, ServletResponse response,  
  28.                 FilterChain chain) throws IOException, ServletException {  
  29.               
  30.             HttpServletRequest httpRequest = (HttpServletRequest)request;  
  31.             SystemContext.setOffset(getOffset(httpRequest));   
  32.             SystemContext.setPagesize(getPagesize(httpRequest));  
  33.               
  34.             try{  
  35.                 chain.doFilter(request, response);  
  36.             }finally{  
  37.                 //清空ThreadLocal中的值,避免类的溢出.  
  38.                 SystemContext.removeOffset();  
  39.                 SystemContext.removePagesize();  
  40.             }  
  41.               
  42.         }  
  43.           
  44.         protected int getOffset(HttpServletRequest request){  
  45.             int offset = 0;  
  46.             try {  
  47.                 offset = Integer.parseInt(request.getParameter("pager.offset"));  
  48.             } catch (NumberFormatException ignore) {  
  49.             }  
  50.             return offset;  
  51.         }  
  52.           
  53.         protected int getPagesize(HttpServletRequest request){  
  54.             return 10;  
  55.         }  
  56.       
  57.         public void init(FilterConfig arg0) throws ServletException {  
  58.         }  
  59.       
  60.     }  
  61. </span>  


 

3配置filterWEB.XML文件中

代码如下:

  1. <span style="font-size:18px;">      <!-- 定义分页Filter -->  
  2.           <filter>  
  3.               <filter-name>PagerFilter</filter-name>  
  4.               <filter-class>com.tgb.oa.web.PagerFilter</filter-class>  
  5.           </filter>  
  6.             
  7.           <filter-mapping>  
  8.               <filter-name>PagerFilter</filter-name>  
  9.               <url-pattern>/*</url-pattern>  
  10.           </filter-mapping>  
  11.           
  12. </span>  


 

 

4建立抽象类,将分页功能抽象成一个方案,可以在更多的场合下进行运用.

     代码如下:

  1. <span style="font-size:18px;">  package com.tgb.oa.manager.impl;  
  2.     import java.util.List;  
  3.     import org.hibernate.Query;  
  4.     import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  5.       
  6.     import com.tgb.oa.PagerModel;  
  7.     import com.tgb.oa.SystemContext;  
  8.     import com.tgb.oa.manager.SystemException;  
  9.       
  10.     /** 
  11.      *  
  12.      *     抽象分页查询. 
  13.      * @author   jnqqls 
  14.      * @group    TGB 
  15.      * @version  1.0 
  16.       * @comments 
  17.      */  
  18.     public class AbstractManager extends HibernateDaoSupport {  
  19.           
  20.           
  21.         public PagerModel searchPaginated(String hql){  
  22.             return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());  
  23.         }  
  24.           
  25.         public PagerModel searchPaginated(String hql,Object param){  
  26.             return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());  
  27.         }  
  28.           
  29.         public PagerModel searchPaginated(String hql,Object[] params){  
  30.             return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());  
  31.         }  
  32.         /** 
  33.          * 没有参数 
  34.          * @param hql 
  35.          * @param offset 
  36.          * @param pagesize 
  37.          * @return 
  38.          */  
  39.         public PagerModel searchPaginated(String hql,int offset,int pagesize){  
  40.             return searchPaginated(hql,null,offset,pagesize);  
  41.         }  
  42.         /** 
  43.          * 只有一个参数 
  44.          * @param hql 
  45.          * @param obj 
  46.          * @param offset 
  47.          * @param pagesize 
  48.          * @return 
  49.          */  
  50.         public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){  
  51.             return searchPaginated(hql,new Object[]{obj},offset,pagesize);  
  52.         }  
  53.           
  54.           
  55.         /** 
  56.          * 根据hql语句进行分页查询 
  57.          * @param hql 
  58.          * @param params  HQL语句带的多个参数值. 
  59.          * @param offset  从第几条记录开始查询 
  60.          * @param pagesize 总共要显示的页数. 
  61.          * @return 
  62.          */  
  63.         public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){  
  64.               
  65.             //第一步:获取总记录数.  
  66.             //获取总数的查询语句  
  67.             String countHql=getCountQuery(hql);  
  68.             //创建查询对象.  
  69.             Query query =getSession().createQuery(countHql);  
  70.             //通过循环将参数设置到语句中.  
  71.             if(params != null && params.length>0){  
  72.                 for(int i=0;i<params.length;i++){  
  73.                     query.setParameter(i, params[i]);  
  74.                 }  
  75.             }  
  76.             //获取总的记录数  
  77.             int total = ((Long)query.uniqueResult()).intValue();  
  78.               
  79.               
  80.             //获取当前的结果集  
  81.             query = getSession().createQuery(hql);  
  82.             if(params != null && params.length>0){  
  83.                 for(int i=0;i<params.length;i++){  
  84.                     query.setParameter(i, params[i]);  
  85.                 }  
  86.             }  
  87.             //设置参数  
  88.             query.setFirstResult(offset);  
  89.             query.setMaxResults(pagesize);  
  90.             //获取结果集.  
  91.             List datas=query.list();  
  92.               
  93.             //创建PagerModel对象.  
  94.               
  95.             PagerModel pm = new PagerModel();  
  96.             pm.setDatas(datas);  
  97.             pm.setTotal(total);  
  98.                       
  99.             return pm;  
  100.         }  
  101.           
  102.           
  103.         /** 
  104.          * 根据HQL语句,获得查找总记录数的HQL语句. 
  105.          * @param hql 
  106.          * @return 
  107.          */  
  108.         private String getCountQuery(String hql) {  
  109.               
  110.               
  111.               
  112.             //根据from字截取查询语句.  
  113.             int index = hql.indexOf("from");  
  114.             if(index != -1){  
  115.                 return "select count(*) " + hql.substring(index);  
  116.             }  
  117.               
  118.             throw new SystemException("无效的HQL查询语句!");  
  119.         }  
  120.           
  121.     }  
  122. </span>  


5实现抽象类,完成方法的调用.

代码如下:

  1. <span style="font-size:18px;">      package com.tgb.oa.manager.impl;  
  2.           
  3.         import java.util.List;  
  4.           
  5.         import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  6.           
  7.         import com.tgb.oa.PagerModel;  
  8.         import com.tgb.oa.manager.OrgManager;  
  9.         import com.tgb.oa.model.Orgnization;  
  10.           
  11.         /** 
  12.          *  
  13.          * @ 实现组织机构管理接口 
  14.          * @author jnqqls 
  15.          * @group TGB 
  16.          * @version 1.0 
  17.           * @comments 
  18.          */  
  19.         public class OrgManagerImpl extends AbstractManager implements OrgManager {  
  20.           
  21.           
  22.             @Override  
  23.             public PagerModel findOrgs(int parentId) {  
  24.                 //如果parentId=0,则查找顶级机构列表  
  25.                     if(parentId == 0){  
  26.                         return searchPaginated("from Orgnization o where o.parent is null");  
  27.                     }  
  28.                     return searchPaginated("from Orgnization o where o.parent.id = ?", parentId);  
  29.           
  30.             }  
  31.           
  32.         }  
  33. </span>  

 

   剩下的就是相关的 Action进行调用,配置jsp页面.以上便是pager-taglib在项目中后台的相关使用.

 

总结:pager-taglib是分页的一个好工具,经过简单的配置可以轻松实现分页功能,我们所需要学习的是它本身所具有封装思想.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值