Pager-taglib在项目中的使用

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

 

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

     代码如下

	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();
		}
		
	}


 

 

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

     代码如下:

	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 {
		}
	
	}


 

3配置filterWEB.XML文件中

代码如下:

		<!-- 定义分页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>
		


 

 

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

     代码如下:

	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查询语句!");
		}
		
	}


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

代码如下:

		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);
		
			}
		
		}

 

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

 

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

你可能感兴趣的:(Pager-taglib在项目中的使用)