一、原理:
1、用pager-taglib做前台页面,向后台传入pagesize,offset参数
2、添加PagerFilter做分页过滤器,在里面接收pagesize,offset参数,并设置到类型为ThreadLocal的 pagesize和offset中
3、在DAO层,sql语句中,用SystemContext.getPagesize()取出pagesize,用SystemContext.getOffset()取出offset,进行数据库的分页查询
二、具体实现:
1、 前台
(1)、引入pager-taglib的jar包
(2)、JSP页面
<pg:pager items="${pm.total }" url="user.do" port="currentPageNumber=pageNumber">
<pg:param name="method" value="listUsers"/>
<pg:first><a href="${pageUrl}">首页</a></pg:first>
<pg:prev><a href="${pageUrl }">前页</a></pg:prev>
<pg:pages>
<c:choose>
<c:when test="${ currentPageNumber eq pageNumber}">
<font color="red">${pageNumber}</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next><a href="${pageUrl }">下页</a></pg:next>
<pg:last><a href="${pageUrl }">尾页</a></pg:last>
</pg:pager>
2、 用一个SystemContext类封装pagesize和offset
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 os = (Integer)offset.get();
if(os == null){
return 0;
}
return os;
}
public static void removeOffset(){
offset.remove();
}
public static void setPagesize(int _pagesize){
pagesize.set(_pagesize);
}
public static int getPagesize(){
Integer ps = (Integer)pagesize.get();
if(ps == null){
return Integer.MAX_VALUE;
}
return ps;
}
public static void removePagesize(){
pagesize.remove();
}
}
3、 实现一个过滤器,接收pagesize和offset两个参数,并设置到SystemContext相应的属性中
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 static final String PAGE_SIZE_NAME = "ps";
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"));
} catch (Exception ignore) {
}
return offset;
}
private int getPagesize(HttpServletRequest httpRequest){
// return 10;
//首先判断request中是否有pagesize参数,如果有这个参数,证明客户端正在请求改变每页显示的行数
String psvalue = httpRequest.getParameter("pagesize");
if(psvalue != null && !psvalue.trim().equals("")){
Integer ps = 0;
try {
ps = Integer.parseInt(psvalue);
} catch (Exception e) {
}
if(ps != 0){
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, ps);
}
}
//判断当前session中是否有pagesize的值
Integer pagesize = (Integer)httpRequest.getSession().getAttribute(PAGE_SIZE_NAME);
if(pagesize == null){
httpRequest.getSession().setAttribute(PAGE_SIZE_NAME, 10);
return 10;
}
return pagesize;
}
public void init(FilterConfig arg0) throws ServletException {
}
}
4、 在DAO层的sql语句中,取出pagesize和offset实现分页查询