使用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;
}
}