文档章节

java分页技术

milin
 milin
发布于 2014/12/15 23:37
字数 1774
阅读 32
收藏 1
package cn.pdsu;

/**
 * 类说明:学生信息封装
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-11-9 下午02:30:50
 */
public class Student {
	private int id;
	private String name;
	private String sex;
	private String resume;

	public Student(int id, String name, String sex, String resume) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
		this.resume = resume;
	}

	public Student() {
		super();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getResume() {
		return resume;
	}

	public void setResume(String resume) {
		this.resume = resume;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", sex=" + sex
				+ ", resume=" + resume + "]";
	}

}
package cn.pdsu;

import java.io.IOException;
import java.util.List;

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

/**
 * 类说明:分页控制器
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-11-9 下午03:47:59
 */
public class ControlServlet extends HttpServlet {

	public ControlServlet() {
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		DataSourceDAO dataSourceDAO = new DataSourceDAO();
		int countRecord = dataSourceDAO.count();
		request.setCharacterEncoding("UTF-8");
		// 得到当前页
		String currentPage = request.getParameter("page");
		if (currentPage == null)
			currentPage = "1";
		int cp = Integer.parseInt(currentPage);// 当前页码
		Page<Student> p = new Page<Student>(cp, countRecord);
		// 数据库中的查询结果
		List<Student> list = dataSourceDAO.findStudent(p.getStartIndex(),
				p.getOnePageCount());
		p.setList(list);// 设置结果集
		// 设置页码显示类型
		PageModel<Student> pageModel = new PageModel<Student>(p,
				"servlet/ControlServlet", PageModel.NUM_MODEL);
		request.setAttribute("pageObject", pageModel);
		getServletContext().getRequestDispatcher("/show.jsp").forward(request,
				response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

package cn.pdsu;

import java.util.LinkedList;
import java.util.List;

/**
 * 类说明:数据的封装
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-11-9 下午02:28:27
 */
public class DataSourceDAO {
	private static List<Student> list = new LinkedList<Student>();
	static {
		for (int i = 0; i < 20; i++) {
			list.add(new Student(i, "张山" + i, "男", "学生" + i));
		}
	}

	/**
	 * 模拟数据库中分页查询
	 * 
	 * @param startIndex
	 *            要查询的开始索引
	 * @param count
	 *            查询的总记录数
	 * @return 查询出的学生记录
	 */
	public List<Student> findStudent(int startIndex, int count) {
		int num = count + startIndex;
		if (num > list.size())
			num = list.size();
		return list.subList(startIndex, num);
	}

	/**
	 * 模拟数据库中查询总记录数
	 * 
	 * @return 总的记录数
	 */
	public int count() {
		return list.size();
	}
}

package cn.pdsu;

import java.util.List;

/**
 * 类说明:分页方法封装
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-11-9 下午02:22:35
 */
public class Page<T> {
	/**
	 * 总页数,通过总记录数和每页显示记录条数计算获得
	 */
	private int countPage;
	/**
	 * 总记录数
	 */
	private int countRecord;
	/**
	 * 当前页,默认是第一页
	 */
	private int currentPage = 1;
	/**
	 * 结果列表
	 */
	private List<T> list = null;
	/**
	 * 每页显示记录条数 ,默认是每页显示13条记录
	 */
	private int onePageCount = 3;
	/**
	 * 开始索引,通过当前页和每页显示记录条数计算获得
	 */
	private int startIndex;

	public Page() {
	}

	/**
	 * 两个参数的构造方法,调用该构造方法需要另行设置结果list
	 * 
	 * @param currentPage
	 *            当前页
	 * @param countRecord
	 *            总页数
	 */
	public Page(int currentPage, int countRecord) {
		this.currentPage = currentPage;
		this.countRecord = countRecord;
		calculate();
	}

	/**
	 * 能够设置一页显示多少条记录的构造方法
	 * 
	 * @param currentPage
	 *            当前页
	 * @param countRecord
	 *            总记录数
	 * @param onePageCount
	 *            每页最多显示的记录条数
	 */
	public Page(int currentPage, int countRecord, int onePageCount) {
		super();
		this.countRecord = countRecord;
		this.currentPage = currentPage;
		this.onePageCount = onePageCount;
		calculate();
	}

	/**
	 * 计算开始索引和总页数
	 */
	private void calculate() {
		// 计算开始索引
		this.startIndex = (currentPage - 1) * onePageCount;
		// 计算总页数
		this.countPage = (countRecord % onePageCount == 0) ? (countRecord / onePageCount)
				: (countRecord / onePageCount + 1);
	}

	public int getCountPage() {
		return countPage;
	}

	public int getCountRecord() {
		return countRecord;
	}

	public int getCurrentPage() {
		return currentPage;
	}

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

	public int getOnePageCount() {
		return onePageCount;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setCountPage(int countPage) {
		this.countPage = countPage;
	}

	public void setCountRecord(int countRecord) {
		this.countRecord = countRecord;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

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

	public void setOnePageCount(int onePageCount) {
		this.onePageCount = onePageCount;
	}

	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}
}

package cn.pdsu;

/**
 * 开始页,结束页封装
 * 
 * @author 作者:user
 * @version 创建时间:2011-7-19 上午03:08:25
 */
public class PageIndex {
	/**
	 * 结束页
	 */
	private int endIndex;

	/**
	 * 开始页
	 */
	private int startIndex;

	/**
	 * 计算开始页和结束页
	 * 
	 * @param viewpagecount
	 *            页面中要显示的页面个数
	 * @param currentPage
	 *            当前页
	 * @param totalpage
	 *            总页面数
	 * @return PageIndex 记录开始页(startindex)和结束页(endindex)
	 */
	public static PageIndex getPageIndex(int viewpagecount, int currentPage,
			int totalpage) {
		int startpage = currentPage
				- (viewpagecount % 2 == 0 ? viewpagecount / 2 - 1
						: viewpagecount / 2);
		int endpage = currentPage + viewpagecount / 2;
		if (startpage < 1) {
			startpage = 1;
			if (totalpage >= viewpagecount)
				endpage = viewpagecount;
			else
				endpage = totalpage;
		}
		if (endpage > totalpage) {
			endpage = totalpage;
			if ((endpage - viewpagecount) > 0)
				startpage = endpage - viewpagecount + 1;
			else
				startpage = 1;
		}
		return new PageIndex(startpage, endpage);
	}

	public PageIndex(int startIndex, int endIndex) {
		this.startIndex = startIndex;
		this.endIndex = endIndex;
	}

	public int getEndIndex() {
		return endIndex;
	}

	public void setEndIndex(int endIndex) {
		this.endIndex = endIndex;
	}

	public int getStartIndex() {
		return startIndex;
	}

	public void setStartIndex(int startIndex) {
		this.startIndex = startIndex;
	}

}

package cn.pdsu;

import java.util.List;


/**
 * 类说明:页码显示效果类 。1:TextModel “第一页 上一页 下一页 最后一页”;2:NumModel “第一页 2 3 4 最后一页”;
 * 
 * @author 作者: LiuJunGuang
 * @version 创建时间:2011-11-9 下午04:09:22
 */
public class PageModel<T> {
	/**
	 * 文本类型:形如:“第一页 上一页 下一页 最后一页”
	 */
	public static final int TEXT_MODEL = 1;

	/**
	 * 数字类型:形如:NumModel “第一页 2 3 4 最后一页”
	 */
	public static final int NUM_MODEL = 2;
	/**
	 * 页码显示模型
	 */
	private int model = 1;
	/**
	 * 页码连接URL,不需要添加页码参数
	 */
	private String url;
	/**
	 * 页码信息的封装
	 */
	private Page page = null;
	/**
	 * 模型类型的页码
	 */
	private StringBuffer strHtml = null;

	/**
	 * 数字类型的页码模型中间数字显示个数,例如:第一页 1 2 3 4 5 最后一页,numCount = 5; 默认显示 5个数字
	 */
	private int numCount = 5;

	/**
	 * 页码的模式默认的文字类型的样式
	 * 
	 * @param page
	 *            页面信息
	 * @param url
	 *            页面的url地址
	 */
	public PageModel(Page page, String url) {
		super();
		this.url = url;
		this.page = page;
	}

	/**
	 * 页码的模型
	 * 
	 * @param page
	 *            页面信息
	 * @param url
	 *            页面的url地址
	 * @param model
	 *            页码的显示样式
	 */
	public PageModel(Page page, String url, int model) {
		super();
		this.model = model;
		this.url = url;
		this.page = page;
	}

	/**
	 * 页码的模型
	 * 
	 * @param page
	 *            页面信息
	 * @param url
	 *            页面的url地址
	 * @param model
	 *            页码的显示样式
	 * @param numCount
	 *            数字类型的页码,共显示的个数
	 */
	public PageModel(Page page, String url, int model, int numCount) {
		super();
		this.model = model;
		this.url = url;
		this.page = page;
		this.numCount = numCount;
	}

	/**
	 * 返回页面的模型
	 * 
	 * @return
	 */
	public String getPageModel() {
		// 组装页码模型
		createURL();
		return createModel();
	}

	/**
	 * 构建URL
	 */
	private void createURL() {
		url = url.contains("?") ? url + "&page=" : url + "?page=";
	}

	/**
	 * 组装页码模型
	 */
	private String createModel() {
		strHtml = new StringBuffer();
		switch (model) {
		case TEXT_MODEL:// 文本模型
			buildTextModel();
			break;
		case NUM_MODEL:// 数字模型
			buildNumModel();
			break;
		default:// 文本模型
			buildTextModel();
			break;
		}
		return strHtml.toString();
	}

	/**
	 * 组件数字类型的页码模型
	 */
	private void buildNumModel() {
		int currentPage = page.getCurrentPage();
		int countPage = page.getCountPage();
		strHtml.append(
				"<table width='100%'  border='0' cellspacing='0' cellpadding='0'>")
				.append("<tr><td height='24' align='center'>");
		// 构造格式:第一页 1 2 3 4 5 最后一页
		PageIndex pageIndex = PageIndex.getPageIndex(numCount, currentPage,
				countPage);
		// 不是第一页时,显示首页
		if (currentPage > 1) {
			strHtml.append("<a href='").append(url)
					.append("1'>首页</a>  ");
		}
		if (currentPage <= countPage) {
			for (int i = pageIndex.getStartIndex(); i <= pageIndex
					.getEndIndex(); i++) {
				// 当前页加粗
				if (currentPage == i) {
					strHtml.append("<b>").append(i).append("</b>  ");
				} else {
					strHtml.append("<a href='").append(url).append(i)
							.append("'>").append(i).append("</a>  ");
				}
			}
			// 不是最后一页显示末页
			if (currentPage < countPage) {
				strHtml.append("<a href='").append(url).append(countPage)
						.append("'>末页</a>");
			}
		}
		strHtml.append("</td></tr></table>");
	}

	/**
	 * 组件文本类型的页码
	 */
	private void buildTextModel() {
		int currentPage = page.getCurrentPage();
		int countPage = page.getCountPage();
		strHtml.append(
				"<table width='100%'  border='0' cellspacing='0' cellpadding='0'>")
				.append("<tr> <td height='24' align='center'>当前页数:[")
				.append(currentPage).append("/").append(countPage)
				.append("]  ");
		if (currentPage > 1) {
			strHtml.append("<a href='").append(url).append("1'>首页</a>")
					.append("  <a href='").append(url)
					.append(currentPage - 1).append("'>上一页</a>");
		}
		if (currentPage < countPage) {
			strHtml.append("  <a href='").append(url)
					.append(currentPage + 1)
					.append("'>下一页</a>  <a href='").append(url)
					.append(countPage).append("'>末页</a>");
		}
		strHtml.append("</td></tr></table>");
	}

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

显示页面:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>分页技术</title>
  </head>
  <body>
  <table border="1"  width="50%">
  <tr><th>ID</th><th>姓名</th><th>性别</th><th>简介</th></tr>
  <c:forEach items="${ pageObject.list}" var="student" >
  		<tr>
  			<td>${student.id }</td>
  			<td>${student.name }</td>
  			<td>${student.sex }</td>
  			<td>${student.resume }</td>
  		</tr>
  </c:forEach>
  </table>
  ${ pageObject.pageModel}
  </body>
</html>








源码下载:http://aimilin6688.iteye.com/blog/1249234(最下面附件部分)

另外csdn下载地址:http://download.csdn.net/detail/afgasdg/3776861(免资源分)


本文转载自:http://blog.csdn.net/afgasdg/article/details/6954525

共有 人打赏支持
milin
粉丝 10
博文 94
码字总数 19598
作品 0
郑州
高级程序员
私信 提问
分享几个JAVA程序员们最容易犯的错误,你中了几枪?

都说Java语言是一门简单的编程语言,基于C++演化而来,剔除了很多C++中的复杂特性,但这并不能保证Java程序员不会犯错。那么对于广大的Java程序员来说,它们最常犯的几个错误都是什么样的呢?...

启示录是真的
2018/05/25
0
0
请教Sharding-JDBC的分页的问题及优化方案?

初次接触到Sharding-JDBC,关于sharding-jdbc的分页问题请教。 关于Sharding-JDBC的部分贴子建议使用Sharding-JDBC的时候,尽量避免使用分页操作,因为分页操作会带来更多数据量的查询及结果...

晴朗天空
2017/06/27
355
1
Oracle和MySQL数据库的比较

本次使用Oracle11g和MySQL5.0作比较,目的是为了整理和巩固所学的数据库知识,也为了加深印象.(本人菜鸟,请大神们多多指教) 不同点 所占内存不同 Oracle11g在官网上下载的时候显示大约2g大小的...

青椒炒盖饭
2018/12/19
0
0
Hibernate实现分页查询的简要分析

本文向大家介绍Hibernate查询分页,可能好多人还不了解Hibernate查询分页,没有关系,下面有一个例子,从第2万条开始取出100条记录看完本文你肯定有不少收获,希望本文能教会你更多东西。 Ja...

xiangtao
2012/08/31
0
2
Dorado 7.2.0 发布,Ajax的Web开发平台

Dorado 7.1.20 发布,Dorado7的全称是Dorado展现中间件,是一款开源软件,致力于为Web应用提供更加丰富、友好的用户界面,同时大幅提高展现层的开发效率。 Dorado7由三个部分组成:浏览器端的...

vangie
2012/11/22
1K
6

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot2.x配置Cors跨域

SpringBoot2.x配置Cors跨域 1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html、Css、Js,然后在Js中通过Ajax访问C服务器的静态资源或请求。即:浏览器A从B服务器拿的资源,...

水木星辰
20分钟前
1
0
一文搞懂TCP与UDP的区别

**摘要:**计算机网络基础 作者:浪里行舟 Fundebug经授权转载,版权归原作者所有。 引言 网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TC...

Fundebug
21分钟前
2
0
Hanlp1.7版本的新增功能一览

Hanlp1.7版本在去年下半年的时候就随大快的DKH1.6版本同时发布了,截至目前1.7大版本也更新到了1.7.1了。本篇分别就1.7.0和1.7.1中新增的功能做一个简单的汇总介绍。 HanLP 是由一系列模型与...

左手的倒影
29分钟前
1
0
Linux之PAM可动态加载的认证模块

在Linux中执行有些程序时,这些程序在执行前首先要对启动它的用户进行认证,符合一定的要求之后才允许执行,例如login, su等。在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(P...

城市之雾
29分钟前
1
0
程序员接私活那些坑

前言 最近有很多人问我私活怎么样?有什么坑,我之前也是接了几个私活,当然也有稳定的收入。我们也来分享一下。前几天发现了一个帖子很不错,我们来分享一下 注:本文转自 : http://blog.cs...

终端研发部
37分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部