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