ssh+pager taglib分页实现

pager-taglib分页封装整合SSH

   使用ThreadLocal 模式,将分页大小及分页开始条数保存下来

public class SystemContext {

 private static ThreadLocal offset = new ThreadLocal();
 private static ThreadLocal pagesize = new ThreadLocal();
 
 public static void setOffset(int _offset){
  offset.set(_offset);
 }
 
 public static int getOffset(){
  Integer _offset = (Integer)offset.get();
  if(_offset == null){
   return 0;
  }
  return _offset;
 }
 
 public static void removeOffset(){
  offset.remove();
 }
 
 public static void setPagesize(int _pagesize){
  pagesize.set(_pagesize);
 }
 
 public static int getPagesize(){
  Integer _pagesize = (Integer)pagesize.get();
  if(_pagesize == null){
   return Integer.MAX_VALUE;
  }
  return _pagesize;
 }
 
 public static void removePagesize(){
  pagesize.remove();
 }
}

 

建立PagerFilter,是每次页面请求,都被PagerFilter截获,设置分页的参数大小!

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{
   SystemContext.removeOffset();
   SystemContext.removePagesize();
  }
 }
 
 private int getOffset(HttpServletRequest request){
  int offset = 0;
  try {
   offset = Integer.parseInt(request.getParameter("pager.offset"));  //pager-taglib分页的参数
  } catch (Exception ignore) {
  }
  return offset;
 }
 
 private int getPagesize(HttpServletRequest request){
  return 10;
 }

 public void init(FilterConfig arg0) throws ServletException {
 }

}

 

使用Hibernate 实现通用的分页实现

public abstract class AbstractDao extends HibernateDaoSupport {
 
 public PagerModel searchPaginated(String hql){
  return searchPaginated(hql, null);
 }
 
 public PagerModel searchPaginated(String hql,Object value){
  return searchPaginated(hql, new Object[]{value});
 }
 
 public PagerModel searchPaginated(String hql,Object[] values){
  return searchPaginated(hql, values, SystemContext.getOffset(), SystemContext.getPagesize());
 }

 
 
 public PagerModel searchPaginated(String hql,int offset,int pagesize) {
  return this.searchPaginated(hql, null, offset, pagesize);
 }
 
 public PagerModel searchPaginated(String hql,Object value,int offset,int pagesize) {
  return this.searchPaginated(hql,  new Object[]{value}, offset, pagesize);
 }

 /**
  *
  * @param hql
  * @param values
  * @param offset
  * @param pagesize
  * @return
  */
 @SuppressWarnings("unchecked")
 public PagerModel searchPaginated(String hql,Object[] values,int offset,int pagesize) {
  //获得总记录数
  String countHql = getCountQuery(hql);
  Query query = this.getSession().createQuery(countHql);
  if(values != null && values.length>0) {
   for (int i=0; i<values.length;i++) {
    query.setParameter(i, values[i]);
   }
  }
  int total = ((Long)query.uniqueResult()).intValue();
  
  //获得当前页的数据
  query = this.getSession().createQuery(hql);
  if(values != null && values.length>0) {
   for (int i=0; i<values.length;i++) {
    query.setParameter(i, values[i]);
   }
  }
  query.setFirstResult(offset);
  query.setMaxResults(pagesize);
  List datas =query.list();
  PagerModel pm = new PagerModel();
  pm.setTotal(total);
  pm.setDatas(datas);
  return pm; 
 }
 
 /**
  * 根据HQL语句,获得查询总记录数的HQL语句
  * 如:
  * select o from Organization o where o.parent is null
  * 经过转换,得到
  * select count(*) from Organization o where o.parent is null
  * @param hql
  * @return
  */
 private String getCountQuery(String hql) {
  int beginIndex = hql.indexOf("from");
  
  if(beginIndex != -1) {
   String countHql= "select count(*) " + hql.substring(beginIndex);
   return countHql;
  }else {
   throw new SystemException("无效的HQL查询语句【"+hql+"】");
  }
 }
 
 
}

 

public class PagerModel {
 
 private int total;
 
 private List datas;

 public int getTotal() {
  return total;
 }

 public void setTotal(int total) {
  this.total = total;
 }

 public List getDatas() {
  return datas;
 }

 public void setDatas(List datas) {
  this.datas = datas;
 }

}

你可能感兴趣的:(Hibernate,ssh)