`
lovinchan
  • 浏览: 31086 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

小小分页帮助程序

阅读更多
import java.util.List;

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

/**
 * 程序目的:  
 *    在 Action 里调用的时候传几个参数进去,然后就可以到跳转过后的页面里面取出分页的必须
 * 参数,达到分页的功能。
 * 
 * 前台页面实例代码:
 * 遍历 list
 * <c:forEach var="i" items="${requestScope.list}" 
 * 		begin="${requestScope.beginPoint}" 
 * 		end="${requestScope.endPoint}" >
 * 
 * 		list 中的内容
 * 		...
 * </c:forEach>
 * 
 * 页面跳转链接代码:
 * <A href="actionName.do&page=1">第一页</A>
 * <A href="action.do&page=${requestScope.curPage - 1}">上一页</A>
 * <A href="action.do&page=${requestScope.curPage + 1}">下一页</A>
 * <A href="action.do&page=${requestScope.totalPage}">最后一页</A>
 * 
 * 显示页码及链接
 * <c:forEach var="i" begin="${requestScope.pageFirst}" 
 * 						end="${requestScope.pageLast}">
 * 		<c:choose>
 *			<c:when test="${requestScope.curPage == i}">
 *				${i}
 *			</c:when>
 *			<c:when test="${requestScope.curPage != i}">
 *				<A href="actionName.do?page=${i}">${i}</A>
 *			</c:when>
 *		</c:choose>
 * </c:forEach>
 * 
 * @author LovinChan
 *
 *     看到网上有很多分页的实例代码,觉得都写得很不错,不过对于大侠们写的那些代码,本人觉得
 * 他们要展示的不过就是一种计算页面的方法,如果看懂了就看懂了,如果没看懂还是不知道用。至少
 * 要我去用的话会有点困难,那些东西很多地方都要大改动。
 *    http://displaytag.sourceforge.net/11/ 可以下到 displaytag,这确实是个好东
 * 西,只要有个list,就可以跟你把页数,页面链接,当前页面,需要显示的表格等等东西都给
 * display出来,如果用 displaytag 用得熟的话对于这种将数据都取出来存进一个list里面然后传
 * 到前台页面上去分页应该可以说是一点问题都没有了。
 *    本人看了网上很多帖子偶得一点灵感,自己写一个工具类供别人调用,只需要传几个参数,就可
 * 以得到分页展示必须的参数,然后只要在前台的jsp页面里面调用就可以了。
 *    
 *    但是这个方法对别人用起来可能会觉得有点烂,呵呵,至少我自己用着觉得蛮好的了,对于一次
 * 将数据都取出来然后分页的方法用这个还是蛮顺手的,在这里也想请各位大侠多多指出其中的不足之
 * 处,多加以批评,让我也可以早点改正一些我还没发现的bug。
 *
 *    程序的注释我尽量写得详细一点,如果觉得这个程序哪里有问题或者是哪里有改进的  
 * 地方欢迎随时跟我交流。
 * 
 * 我的msn:egg.chenlw@gmail.com  
 *    QQ:372133556(注上为什么加我就可以了)  
 * 我的blog:http://hi.baidu.com/egg_chen  
 * 欢迎交流  
 */ 
public class PagingUtil {
	
	/**
	 * 需要显示的页码段的数量,当前 PAGE_SIZE 表示最多在前台页面上显示 10 个页码数
	 */
	public final static int PAGE_SIZE = 10;
	
	/**
	 *    用户可以在 Action 中传入下面的参数,然后就可以直接到前台 jsp 页面中将这些参数
	 * 取出并加以显示出来。
	 * @param pageSize 每页需要显示物品的数量
	 * @param list 由后台传来用来显示的list
	 * @param request Action 里面的 request 参数
	 * @param response Action 里面的 response 参数
	 */
	public static void pagingList(int pageSize, List<?> list,
			HttpServletRequest request, HttpServletResponse response) {

		// 总共有多少页
		int totalPage;
		// 当前页数
		int curPage;
		// 取得 Action 里传入的 list 的长度
		int listSize = list.size();
		// 如果这个 list 里面没有东西,则返回的所有的跟页面有关的参数都是 0 
		if(listSize == 0) {
			request.setAttribute("begin", 0);
			request.setAttribute("end", 0);
			request.setAttribute("list", 0);
			request.setAttribute("curPage", 0);
			request.setAttribute("totalPage", 0);
			return;
		}
		// 计算总共有多少页
		if(listSize % pageSize != 0) {
			totalPage = listSize / pageSize + 1;
		} else {
			totalPage = listSize / pageSize;
		}
		// 从 request 参数中取出将要显示的页数
		// request 参数是由前台页面传入 Action,再从 Action 中传过来的,
		String _curPage = (String) request.getParameter("page");
		
		// 将从 request 中取出的数转换成整型,并保存在当前页数里面
		if(null == _curPage) {
			curPage = 1;
		} else {
			
			// 如果转换过程出现异常,则指定 curPage 为 1
			try {
				curPage = Integer.parseInt(_curPage);
			} catch (Exception e) {
				curPage = 1;
			}
			
			// 如果请求的参数比总页数大,则返回总页数,如果小于1,则返回1
			if(curPage > totalPage) {
				curPage = totalPage;
			} else if(curPage <= 0) {
				curPage = 1;
			}
		}
		
		// 由于这个分页是采用对一个 list 来进行分页,所以需要计算出分页展示的
		// list 段的长度,然后再在前台页面上循环 这个长度段上的 list 
		
		// 定义每一页需要显示的 list 段根据当前页数变化来变化
		int beginPoint = pageSize * curPage - pageSize;
		int endPoint = beginPoint + pageSize;
		// 如果结束的 list 位置比当前 list 的长度还大,则指定 endPage 为当前 list 长度
		if(endPoint > listSize) {
			endPoint = listSize;
		}
		
		// 如果前台页面上需要显示部分页码
		//(例如在页面右下角显示页码 ... 6 7 8 9 10 11 ... 54页)
		// 以下就是用来计算部分页码的代码
		
		// 需要显示的页码段的第一页页码(如上的 6)
		int pageFirst;
		// 需要显示的页码段的最后一页页码(如上的 11)
		int pageLast;
		
		// 让 curPage 显示的时候是居中显示
		if(PAGE_SIZE % 2 == 0) {
			pageFirst = curPage - PAGE_SIZE / 2 - 1;
			pageLast = curPage + PAGE_SIZE / 2;
		} else {
			pageFirst = curPage - PAGE_SIZE / 2;
			pageLast = curPage + PAGE_SIZE / 2;
		}
		
		if(pageFirst <= 0) {
			pageFirst = 1;
		}
		if(pageLast >= totalPage) {
			pageLast = totalPage;
		}
		
		// 设置 list 开始位置
		request.setAttribute("beginPoint", beginPoint);
		// 设置 list 结束位置
		request.setAttribute("endPoint", endPoint - 1);
		// 当前传入的 list
		request.setAttribute("list", list);
		// 将要显示的页面数
		request.setAttribute("curPage", curPage);
		// 总共的页面数
		request.setAttribute("totalPage", totalPage);
		// 显示的开始页码
		request.setAttribute("pageFirst", pageFirst);
		// 显示的结束页码
		request.setAttribute("pageLast", pageLast);
	}
}

 

5
3
分享到:
评论
7 楼 racnow 2008-08-26  
:(  发烧了,不写代码,就逛论坛,不知道老板会不会哭
6 楼 h_yz 2008-08-26  
楼主把代码打成包,方便大伙下载,谢谢了
5 楼 lovinchan 2008-08-26  
分页,要考虑两方面的问题
1.是否效率第一,就可放内存,
2.是否性能第一,在数据库中用sql分,
  对于更新频率高的表,更要多考虑,根据实际情况,制定分页策略。
4 楼 ALLEN仔 2008-08-26  
不错,顶你一下
3 楼 yeowin 2008-08-25  
  以后分页的话,就直接cp你的,heh
2 楼 ayis 2008-08-25  
很好,有试用期吧,回去拿你的试用以下再说,现在信息中心
1 楼 every_best 2008-08-25  
分页的 没有怎么仔细 看过。
看你的,很清晰。
嘿嘿,不错~~

相关推荐

Global site tag (gtag.js) - Google Analytics