数据分页模块系列 (一) 利用工具Pager-taglib轻松实现分页技术

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


    3. 上面代码是分页简单实现,通过查查资料很容易理解,注意一点是url属性这个属性一定要设置成首页的跟访问地址,如果没有设置这个属性,那么鼠标单击“首页”时显示的是该页JSP文件所在的路径,不会去访问action不能够提交请求,可能会找不到路径。
  3. 抽象分页模块
    1. 在一个数据库中会涉及到很多种信息,例如学生信息、班级信息、年级信息,这些信息都需要分页显示为了提高代码的复用性就需要提取出来一个公共的分页模块来分页,该模块需要返回pager-taglib需要的参数信息或者页面分页所需要的参数信息,用pager-taglib分页只需要知道总记录数以及记录结果集两个参数。下面是一个抽象的分页。
    2. package com.bjsxt.oa.manager.impl;
      
      import java.util.List;
      import org.hibernate.Query;
      import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
      import com.bjsxt.oa.PageModel;
      import com.bjsxt.oa.SystemContext;
      import com.bjsxt.oa.manager.SystemException;
      /**
       * 抽象的公共分页类
       * @author lilongsheng
       *
       */
      public class AbstractManager extends HibernateDaoSupport {
      	/**
      	 * 带hql查询语句的查询方法
      	 * @param hql
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql){
      		return searchPaginated(hql,null,SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 带hql查询语句和一个参数的方法
      	 * @param hql
      	 * @param param
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,Object param){
      		return searchPaginated(hql,new Object[]{param},SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 带hql查询语句和若干参数的方法
      	 * @param hql
      	 * @param params
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,Object[] params){
      		return searchPaginated(hql,params,SystemContext.getOffset(),SystemContext.getPagesize());
      	}
      	/**
      	 * 不带参数的查询语句
      	 * @param hql
      	 * @param offset
      	 * @param pagesize
      	 * @return
      	 */
      	public PageModel searchPaginated(String hql,int offset,int pagesize){
      		return searchPaginated(hql,null, offset, pagesize);
      	}
      	/**
      	 * 
      	 * 带一个参数的分页查询
      	 */
      	public PageModel searchPaginated(String hql,Object obj,int offset,int pagesize){
      		return searchPaginated(hql, new Object[]{obj}, offset, pagesize);
      	}
      	
      	/**
      	 * 根据HQL语句进行分页查询
      	 * @param hql HQL语句
      	 * @param params HQL语句带的多个参数值
      	 * @param offset 从第几条记录开始查询
      	 * @param pagesize 每页显示多少行
      	 * @return
      	 */
      	public PageModel 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]);
      			}
      		}
      		List datas=query.setFirstResult(offset)
      						.setMaxResults(pagesize)
      						.list();
      		PageModel pm=new PageModel();
      		pm.setTotal(total);
      		pm.setDatas(datas);
      		
      		return pm;
      		
      	}
      	
      	/**
      	 * 根据HQL语句,获得查找总记录数的HQL语句
      	 * 如:
      	 * select ... from Orgnization o where o.parent is null
      	 * 经过转换,可以得到:
      	 * select count(*) from Orgnization o where o.parent is null
      	 * @param hql
      	 * @return
      	 */
      	private String getCountQuery(String hql){
      		
      		int index=hql.indexOf("from");
      		
      		if (index!=-1) {
      			return "select count(*) "+ hql.substring(index);
      		}
      		
      		throw new SystemException("无效的HQL查询语句!");
      	
      	}
      }
      


    3. 该类中有很多重名的方法名,好处是提高了该类和接口的复用性,接口中有时不会提供这么参数的方法,因此使用的时候就会有限制在类里面多了接口就容易实现接口中方法。
    4. 参数怎么传递?下图为参数传输的两种方式
      1. 数据分页模块系列 (一) 利用工具Pager-taglib轻松实现分页技术_第1张图片
    5. SystemContext
    6. package com.bjsxt.oa;
      
      
      public class SystemContext {
      
      	private static ThreadLocal offset=new ThreadLocal();
      	
      	private static ThreadLocal pagesize=new ThreadLocal();
      
      	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();
      	}
      	
      }
      


  4. 在写代码或者设计类图时候,多建立一些抽象模块可以增加设计的灵活性,类之间关系不要太过松散,分页的工具还有很多大家可以自行尝试。

你可能感兴趣的:(数据分页模块系列 (一) 利用工具Pager-taglib轻松实现分页技术)