Pager-taglib在项目中的使用

      在上篇文章Pager-taglib分页 对其有了一个基本的了解,接下来我们将会对pager-taglib如何在项目中使用进行一个比较详细的说明.

 

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

     代码如下

  1. <SPAN style="FONT-SIZE: 18px">  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.     }  
  51. </SPAN>  
<span style="FONT-SIZE: 18px">	package com.tgb.oa;
	/**
	 * 
	 *    采用ThreadLocal来存储分页变量.
	 * @author   jnqqls
	 * @group    TGB
	 * @version  1.0
	 * @comments
	 */
	public class SystemContext {
		private static ThreadLocal offset = new ThreadLocal();
		private static ThreadLocal pagesize = new ThreadLocal();
		
		/**
		 * 从线程中获取offset字段
		 * @return
		 */
		public static int getOffset(){
			Integer os = (Integer)offset.get();
			if(os == null){
				return 0;
			}
			return os;
		}
		
		public static void setOffset(int offsetvalue){
			offset.set(offsetvalue);
		}
		
		public static void removeOffset(){
			offset.remove();
		}
		
		public static int getPagesize(){
			Integer ps = (Integer)pagesize.get();
			if(ps == null){
				return Integer.MAX_VALUE;
			}
			return ps;
		}
		
		public static void setPagesize(int pagesizevalue){
			pagesize.set(pagesizevalue);
		}
		
		public static void removePagesize(){
			pagesize.remove();
		}
		
	}
</span>


 

 

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>  
<span style="FONT-SIZE: 18px">	package com.tgb.oa.web;
	
	import java.io.IOException;
	
	import javax.servlet.Filter;
	import javax.servlet.FilterChain;
	import javax.servlet.FilterConfig;
	import javax.servlet.ServletException;
	import javax.servlet.ServletRequest;
	import javax.servlet.ServletResponse;
	import javax.servlet.http.HttpServletRequest;
	
	import com.tgb.oa.SystemContext;
	/**
	 * 
	 * @oa_02    过滤器,获取相关分页数据.
	 * @author   jnqqls
	 * @group    TGB
	 * @version  1.0
	  * @comments
	 */
	public class PagerFilter implements Filter {
	
		public void destroy() {
		}
	
		public void doFilter(ServletRequest request, ServletResponse response,
				FilterChain chain) throws IOException, ServletException {
			
			HttpServletRequest httpRequest = (HttpServletRequest)request;
			SystemContext.setOffset(getOffset(httpRequest)); 
			SystemContext.setPagesize(getPagesize(httpRequest));
			
			try{
				chain.doFilter(request, response);
			}finally{
				//清空ThreadLocal中的值,避免类的溢出.
				SystemContext.removeOffset();
				SystemContext.removePagesize();
			}
			
		}
		
		protected int getOffset(HttpServletRequest request){
			int offset = 0;
			try {
				offset = Integer.parseInt(request.getParameter("pager.offset"));
			} catch (NumberFormatException ignore) {
			}
			return offset;
		}
		
		protected int getPagesize(HttpServletRequest request){
			return 10;
		}
	
		public void init(FilterConfig arg0) throws ServletException {
		}
	
	}
</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>  
<span style="FONT-SIZE: 18px">		<!-- 定义分页Filter -->
		  <filter>
		      <filter-name>PagerFilter</filter-name>
		      <filter-class>com.tgb.oa.web.PagerFilter</filter-class>
		  </filter>
		  
		  <filter-mapping>
		      <filter-name>PagerFilter</filter-name>
		      <url-pattern>/*</url-pattern>
		  </filter-mapping>
		
</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>  
<span style="FONT-SIZE: 18px">	package com.tgb.oa.manager.impl;
	import java.util.List;
	import org.hibernate.Query;
	import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
	
	import com.tgb.oa.PagerModel;
	import com.tgb.oa.SystemContext;
	import com.tgb.oa.manager.SystemException;
	
	/**
	 * 
	 *     抽象分页查询.
	 * @author   jnqqls
	 * @group    TGB
	 * @version  1.0
	  * @comments
	 */
	public class AbstractManager extends HibernateDaoSupport {
		
		
		public PagerModel searchPaginated(String hql){
			return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
		}
		
		public PagerModel searchPaginated(String hql,Object param){
			return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
		}
		
		public PagerModel searchPaginated(String hql,Object[] params){
			return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
		}
		/**
		 * 没有参数
		 * @param hql
		 * @param offset
		 * @param pagesize
		 * @return
		 */
		public PagerModel searchPaginated(String hql,int offset,int pagesize){
			return searchPaginated(hql,null,offset,pagesize);
		}
		/**
		 * 只有一个参数
		 * @param hql
		 * @param obj
		 * @param offset
		 * @param pagesize
		 * @return
		 */
		public PagerModel searchPaginated(String hql,Object obj,int offset,int pagesize){
			return searchPaginated(hql,new Object[]{obj},offset,pagesize);
		}
		
		
		/**
		 * 根据hql语句进行分页查询
		 * @param hql
		 * @param params  HQL语句带的多个参数值.
		 * @param offset  从第几条记录开始查询
		 * @param pagesize 总共要显示的页数.
		 * @return
		 */
		public PagerModel searchPaginated(String hql,Object[] params,int offset,int pagesize){
			
			//第一步:获取总记录数.
			//获取总数的查询语句
			String countHql=getCountQuery(hql);
			//创建查询对象.
			Query query =getSession().createQuery(countHql);
			//通过循环将参数设置到语句中.
			if(params != null && params.length>0){
				for(int i=0;i<params.length;i++){
					query.setParameter(i, params[i]);
				}
			}
			//获取总的记录数
			int total = ((Long)query.uniqueResult()).intValue();
			
			
			//获取当前的结果集
			query = getSession().createQuery(hql);
			if(params != null && params.length>0){
				for(int i=0;i<params.length;i++){
					query.setParameter(i, params[i]);
				}
			}
			//设置参数
			query.setFirstResult(offset);
			query.setMaxResults(pagesize);
			//获取结果集.
			List datas=query.list();
			
			//创建PagerModel对象.
			
			PagerModel pm = new PagerModel();
			pm.setDatas(datas);
			pm.setTotal(total);
					
			return pm;
		}
		
		
		/**
		 * 根据HQL语句,获得查找总记录数的HQL语句.
		 * @param hql
		 * @return
		 */
		private String getCountQuery(String hql) {
			
			
			
			//根据from字截取查询语句.
			int index = hql.indexOf("from");
			if(index != -1){
				return "select count(*) " + hql.substring(index);
			}
			
			throw new SystemException("无效的HQL查询语句!");
		}
		
	}
</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>  
<span style="FONT-SIZE: 18px">		package com.tgb.oa.manager.impl;
		
		import java.util.List;
		
		import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
		
		import com.tgb.oa.PagerModel;
		import com.tgb.oa.manager.OrgManager;
		import com.tgb.oa.model.Orgnization;
		
		/**
		 * 
		 * @ 实现组织机构管理接口
		 * @author jnqqls
		 * @group TGB
		 * @version 1.0
		  * @comments
		 */
		public class OrgManagerImpl extends AbstractManager implements OrgManager {
		
		
			@Override
			public PagerModel findOrgs(int parentId) {
				//如果parentId=0,则查找顶级机构列表
					if(parentId == 0){
						return searchPaginated("from Orgnization o where o.parent is null");
					}
					return searchPaginated("from Orgnization o where o.parent.id = ?", parentId);
		
			}
		
		}
</span>

 

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

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值