分析通用分页的方案

首页在spring-mvc-context.xml 文件中加入拦截器 

<mvc:interceptors>
		<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
		<mvc:interceptor>
			<mvc:mapping path="/admin/system/**" />
			<bean class="com.zqgame.web.base.interceptors.PermissionInterceptor" />
		</mvc:interceptor>
		<mvc:interceptor>
			<mvc:mapping path="/**" />
			<bean class="com.zqgame.web.base.interceptors.InitialInterceptor" />
		</mvc:interceptor>
		<mvc:interceptor>
			<mvc:mapping path="/admin/**/*page/**" />
			<bean class="com.zqgame.web.base.interceptors.PaginationInterceptor">
				<property name="pageSize" value="15" />
			</bean>
		</mvc:interceptor>
	</mvc:interceptors>

最主要的是那一行分页的拦截器  分页拦截器会拦截带page的 映射 说明该controller中是要加入分页的处理

然后来看分页拦截器 分页拦截器的名称是PaginationIntercepteror

package com.zqgame.web.base.interceptors;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.noo.pagination.page.PageContext;
import org.noo.pagination.page.Pagination;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.zqgame.web.base.common.ParsePagination;

public class PaginationInterceptor extends HandlerInterceptorAdapter {
	private static final Logger LOG = LoggerFactory.getLogger(PaginationInterceptor.class);
	private int pageSize = 3;

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		Pagination pager = PageContext.getPageContext();
		ParsePagination pp = new ParsePagination(request);
		int ps = this.pageSize;
		int p = 1;
		if (pp.getPageSize() != 0) {
			ps = pp.getPageSize();
		}
		if (pp.getPage() != 1) {
			p = pp.getPage();
		}
		pager.setTotalRows(0);
		pager.setCurrentPage(p);
		pager.setPageSize(ps);
		return true;
	}

	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}
主要来看ParsePagination类干了些什么

package com.zqgame.web.base.common;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ParsePagination {
	private Map<String,String> cookieMap;
	private int pageSize = 0;
	private int page = 1;
	public static final String PAGE_SIZE_KEY = "page_size"; //前台传来的页大小的参数key
	public static final String PAGE_KEY = "page";//前台传来的页码的参数key

	public ParsePagination(HttpServletRequest request)
	{
		cookieMap  = new HashMap<String,String>();
		Cookie [] cookies = request.getCookies();
		parseCookies(cookies);
		String pageSize = request.getParameter(PAGE_SIZE_KEY);
		String page = request.getParameter(PAGE_KEY);
		String cookiePageSize = cookieMap.get(PAGE_SIZE_KEY);
		String cookiePage = cookieMap.get(PAGE_KEY);
		HttpSession session = request.getSession();
		String sessionPage = (String)session.getAttribute(PAGE_KEY);
		String sessionPageSize = (String)session.getAttribute(PAGE_SIZE_KEY);
		if(!StringUtils.isEmpty(pageSize)){
			this.pageSize = Integer.parseInt(pageSize);
		} else if(!StringUtils.isEmpty(cookiePageSize)) {
			this.pageSize = Integer.parseInt(cookiePageSize);
		} else if(!StringUtils.isEmpty(sessionPageSize)) {
			this.pageSize = Integer.parseInt(sessionPageSize);
		}
		if(!StringUtils.isEmpty(page)){
			this.page = Integer.parseInt(page);
		} else if(!StringUtils.isEmpty(cookiePage)) {
			this.page = Integer.parseInt(cookiePage);
		} else if(!StringUtils.isEmpty(sessionPage)) {
			this.page = Integer.parseInt(sessionPage);
		}
		PagerControl.getPagerControl().setRequest(request);
	}
	protected void parseCookies(Cookie [] cookies )
	{
		if(cookies != null) {
			for( Cookie cookie : cookies ) {
				cookieMap.put(cookie.getName(),cookie.getValue());
			}
		}
	}
	public String getCookieByName(String name)
	{
		return cookieMap.get(name);
	}
	
	public int getPageSize()
	{
		return pageSize;
	}
	public int getPage()
	{
		return page;
	}
	
	private static final Logger LOG = LoggerFactory.getLogger(ParsePagination.class);
}
该类主要对分页的两个重要参数做了处理

一个是当前页 一个是每页显示多少条记录

我们来看最后一句 分页有个很重要的东西就是 当查询以后再次点击下一页的时候需要把上次查询条件给带上这个是很头痛的问题  我们来看PagerControl的处理

package com.zqgame.web.base.common;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.noo.pagination.page.PageContext;

public class PagerControl {
	public final static String REQUEST_KEY = "page_pager"; //从request中获得自己的key.
	private String pageUri = "";// 页面url用于组装页脚
	private String pageKey = ParsePagination.PAGE_KEY;
	private String pageSizeKey = ParsePagination.PAGE_SIZE_KEY;
    private PageContext pageContext = PageContext.getPageContext();
	
    public int getPageSize()
    {
        return pageContext.getPageSize();
    }

    public int getPageStartRow()
    {
        return pageContext.getPageStartRow();
    }

    public int getTotalPages()
    {
        return pageContext.getTotalPages();
    }

    public int getTotalRows()
    {
        return pageContext.getTotalRows();
    }
	
    public int getCurrentPage(){
    	return pageContext.getCurrentPage();
    }
    
	public String getPageKey() {
		return pageKey;
	}

	public String getPageSizeKey() {
		return pageSizeKey;
	}

	public void removeURIParameter(String key) {
		if (otherParamsMap.containsKey(key)) {
			otherParamsMap.remove(key);
		}
	}

	public void setPageKey(String pageKey) {
		this.pageKey = pageKey;
	}
	
	public void setPageSizeKey(String pageSizeKey) {
		this.pageSizeKey = pageSizeKey;
	}
	
	public String getParameter() {
		removeURIParameter(ParsePagination.PAGE_KEY);
		removeURIParameter(ParsePagination.PAGE_SIZE_KEY);
		if (otherParamsBuilder.length() == 0) {
			for (Map.Entry<String, String> each : otherParamsMap.entrySet()) {
				otherParamsBuilder.append(each.getKey()).append("=").append(each.getValue()).append("&");
			}
		}
		return otherParamsBuilder.toString();
	}
	
	public String getPageUri() {
		return pageUri;
	}

	public void setRequest(HttpServletRequest request) {
		pageUri = request.getRequestURI();
		request.setAttribute(PagerControl.REQUEST_KEY, this);
		String query = request.getQueryString();
		if (query == null){
			return ;
		}
		String[] keyAndValueArray = StringUtils.split(query, "&");
		if (keyAndValueArray == null)
			return;
		for (String each : keyAndValueArray) {
			String[] eachKeyAndValueArray = StringUtils.split(each, "=");
			String key = "";
			String value = "";
			if (eachKeyAndValueArray.length == 2) {
				key = eachKeyAndValueArray[0];
				value = eachKeyAndValueArray[1];
			} else if (eachKeyAndValueArray.length == 1) {
				key = eachKeyAndValueArray[0];
			}
			if (StringUtils.isNotEmpty(key)) {
				otherParamsMap.put(key, value);
			}
		}
	}

    public static PagerControl getPagerControl()
    {
    	PagerControl ci = (PagerControl)CONTEXT.get();
        if(ci == null)
        {
            ci = new PagerControl();
            CONTEXT.set(ci);
        }
        return ci;
    }

    public static void removeContext()
    {
    	CONTEXT.remove();
    	PageContext.removeContext();
    }
    
    private static final ThreadLocal<PagerControl> CONTEXT = new ThreadLocal<PagerControl>();
	private Map<String, String> otherParamsMap = new HashMap<String, String>();
	private StringBuilder otherParamsBuilder = new StringBuilder();
}

在setRequest的时候是将参数保存起来的 然后在页面上

<%@ page import="com.zqgame.web.base.common.*" pageEncoding="UTF-8"%> 
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
{																		/*块作用域防止定义变量重复*/
	PagerControl.removeContext();										/*清理page对象, 此时ThreadLocal中的对象已经清理, 但request对象在引用,不会被回收*/
	Integer page_use_count = (Integer)request.getAttribute("page_use_count");
	if(page_use_count == null){											 /*用于标识页面引用的个数,用于给每个标签赋值不同的class和id*/
		page_use_count = 1;
		request.setAttribute("page_use_count", 1);
	}else{
		page_use_count += 1;
		request.setAttribute("page_use_count", page_use_count);
	}
	PagerControl pagertemplate = (PagerControl)request.getAttribute("pagertemplate");
	if(pagertemplate == null){											/*如果用户没有设置自己的pagerControl对象,则使用默认的key.*/
		pagertemplate = (PagerControl)request.getAttribute(PagerControl.REQUEST_KEY);
	} 
	String page_uri = pagertemplate.getPageUri();						/*page的URL*/
	String page_param = pagertemplate.getParameter();					/*page在URL中参数列表,已经去除pagesize和page*/
	String page_url = (page_uri)+"?"+(page_param==null?"":page_param);	/*page的URI+参数*/
	String page_size_key = pagertemplate.getPageSizeKey();				/*page_size在url中的参数名*/
	String page_key = pagertemplate.getPageKey();						/*page在url中的参数名*/
	int page_pageSize = pagertemplate.getPageSize();					/*每页记录数*/
	int page_totalRows = pagertemplate.getTotalRows();					/*总共记录数*/
	int page_totalPages = pagertemplate.getTotalPages();				/*总共页数*/
	int page_currentPage = pagertemplate.getCurrentPage();				/*当前页脚*/
%>
<% if(page_totalRows < 1){ %>
	<a class="aspNetDisabled margin-left" style="color: gray;">第一页</a> 
	<a class="aspNetDisabled margin-left" style="color: gray;">上一页</a> 
	<a class="aspNetDisabled margin-left" style="color: gray;">下一页</a> 
	<a class="aspNetDisabled margin-left" style="color: gray;">最后一页</a>   
	<select name="lstPageIndex<%=page_use_count%>" id="lstPageIndex<%=page_use_count%>" style="width:100px;">
		<option value="" >--暂无记录--</option>
	</select> 页  共0页,0条记录
  <%}else{%>
	<%if(page_currentPage != 1){%>
		<a class="aspNetDisabled margin-left" href="javascript:jumpToPageByClick('<%=page_url%>', <%=page_pageSize%>, 1);">第一页</a> 
		<a class="aspNetDisabled margin-left" href="javascript:jumpToPageByClick('<%=page_url%>', <%=page_pageSize%>, <%=page_currentPage-1%>)">上一页</a> 
	<%}else{%>
		<a class="aspNetDisabled margin-left" style="color: gray;">第一页</a> 
		<a class="aspNetDisabled margin-left" style="color: gray;">上一页</a> 
	<%}%>
	<%if(page_currentPage != page_totalPages){%>
		<a class="aspNetDisabled margin-left" href="javascript:jumpToPageByClick('<%=page_url%>', <%=page_pageSize%>, <%=page_currentPage+1%>)">下一页</a> 
		<a class="aspNetDisabled margin-left" href="javascript:jumpToPageByClick('<%=page_url%>', <%=page_pageSize%>, <%=page_totalPages%>)">最后一页</a>
	<%}else{%>
		<a class="aspNetDisabled margin-left" style="color: gray;">下一页</a>
		<a class="aspNetDisabled margin-left" style="color: gray;">最后一页</a>
	<%}%>
	<input οnclick="javascript:jumpToPageBySelect('<%=page_url%>', <%=page_pageSize%>, 'lstPageIndex<%=page_use_count%>')" name="btnOk<%=page_use_count%>" type="button" id="btnOk<%=page_use_count%>" class="forwardPage" style="width: 37px; height: 20px; margin-left:50px; margin-right:15px;" value="转到" />
	<select name="lstPageIndex<%=page_use_count%>" id="lstPageIndex<%=page_use_count%>" style="width:50px;">
		<%for(int topage = 1; topage <= page_totalPages; topage++){%>
			<option value="<%=topage%>" <%if(page_currentPage == topage){ %>selected<%}%>><%=topage%></option>
		<%}%>
	</select>
	 页  共<%=page_totalPages%>页,<%=page_totalRows%>条记录
	<script type="text/javascript">
	 <c:if test="${page_use_count == 1}">
	 	function jumpToPageByClick(url, pagesize, page){
	 		location.href=url+"&<%=page_size_key%>="+pagesize+"&<%=page_key%>="+page;
	 	}
	 	function jumpToPageBySelect(url, pagesize, id){
	 		location.href=url+"&<%=page_size_key%>="+pagesize+"&<%=page_key%>="+$("#"+id).val();
	 	}
	 </c:if>
	</script>
<%}}%>
pagertemplate.getParameter()页面上调用了这个方法再次将参数拿出来这样就解决了 参数回传的问题



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值