啥也不说直接上代码
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.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.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.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>
运行结果图:
- page.rar (105.4 KB)
- 描述: 源文件下载
- 下载次数: 0
- 大小: 16.1 KB
- 大小: 20.8 KB
- 大小: 13.9 KB
- 大小: 19.3 KB
- 大小: 24.8 KB
- 大小: 22.1 KB
- 大小: 18.4 KB