ThreadLocalページングパラメータの消去

6395 ワード

package com.renrendai.pmes;

public class PaginationContext {

	private PaginationContext() {}
	
	private static final ThreadLocal<Integer> pageNoThreadLocal = new ThreadLocal<Integer>();
	
	private static final ThreadLocal<Integer> pageSizeThreadLocal = new ThreadLocal<Integer>();
	
	public static void setPageNo(int pageNo) {
		pageNoThreadLocal.set(pageNo);
	}
	
	public static void setPageSize(int pageSize) {
		pageSizeThreadLocal.set(pageSize);
	}
	
	public static int getPageNo() {
		return pageNoThreadLocal.get();
	} 
	
	public static int getPageSize() {
		return pageSizeThreadLocal.get();
	}
	
	public static void removePageNo() {
		pageNoThreadLocal.remove();
	}
	
	public static void removePageSize() {
		pageSizeThreadLocal.remove();
	}
}

 
 
package com.renrendai.pmes;

import java.util.List;

public class PaginationVO<T> {

	private int total;
	
	private List<T> list;

	public int getTotal() {
		return total;
	}

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

	public List<T> getList() {
		return list;
	}

	public void setList(List<T> list) {
		this.list = list;
	}
	
	
}

 
 
package com.renrendai.pmes.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;

/**
 *  
 * @author Administrator
 *
 */
public abstract class FilterAdapter implements Filter {

	@Override
	public void destroy() {
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}

	@Override
	public abstract void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException;
}

 
 
 
package com.renrendai.pmes.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.renrendai.pmes.PaginationContext;

//public class PaginationFilter implements Filter {
public class PaginationFilter extends FilterAdapter {

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest)request;
		int pageNo = 1;
		if (req.getParameter("pageNo") != null) {
			pageNo = Integer.parseInt(req.getParameter("pageNo"));
		}
		int pageSize = Integer.parseInt(req.getSession().getServletContext().getInitParameter("pageSize"));
		// threadlocal 
		PaginationContext.setPageNo(pageNo);
		PaginationContext.setPageSize(pageSize);
		try {
			// 
			chain.doFilter(req, response);
		}finally {
			PaginationContext.removePageNo();
			PaginationContext.removePageSize();
		}
	}
}

 
 
使用
package com.renrendai.pmes.dao.impl;

import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.renrendai.pmes.PaginationContext;
import com.renrendai.pmes.PaginationVO;

public class BaseDao extends HibernateDaoSupport {

	@SuppressWarnings("unchecked")
	protected PaginationVO pagination(String queryString) {
		return pagination(queryString, (Object[]) null);
	}
	
	@SuppressWarnings("unchecked")
	protected PaginationVO pagination(String queryString, Object value) {
		return pagination(queryString, new Object[]{value});
	}
	
	@SuppressWarnings("unchecked")
	protected PaginationVO pagination(final String queryString, final Object[] values) {
		List list = getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException,
					SQLException {
				Query query = session.createQuery(queryString);
				if (values != null) {
					for (int i=0; i<values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				query.setFirstResult((PaginationContext.getPageNo()-1) * PaginationContext.getPageSize());
				query.setMaxResults(PaginationContext.getPageSize());
				return query.list();
			}
		});
		
		Long total = (Long)getHibernateTemplate().execute(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException,
					SQLException {
				String countHql = "select count(*) " + queryString.substring(queryString.indexOf("from"), queryString.length());
				countHql = countHql.replaceAll("fetch", "");
				Query query = session.createQuery(countHql);
				if (values != null) {
					for (int i=0; i<values.length; i++) {
						query.setParameter(i, values[i]);
					}
				}
				return query.uniqueResult();				
			}
		});
		PaginationVO paginationVO = new PaginationVO();
		paginationVO.setList(list);
		paginationVO.setTotal(total.intValue());
		return paginationVO;		
	}	
	
}