对分页的封装
package com.bjsxt.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.bjsxt.oa.SystemContext;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 {}}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();}}
package com.bjsxt.oa.manager.impl;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.bjsxt.oa.PagerModel;import com.bjsxt.oa.SystemContext;import com.bjsxt.oa.manager.SystemException;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());}public PagerModel searchPaginated(String hql,int offset,int pagesize){return searchPaginated(hql,null,offset,pagesize);} public PagerModel 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 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);}}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);}}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 ... 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查询语句!");}}
package com.bjsxt.oa;import java.util.List;public class PagerModel {/** * 总记录数 */private int total;/** * 当前页结果集 */private List datas;public List getDatas() {return datas;}public void setDatas(List datas) {this.datas = datas;}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}}
页:
[1]