- 工具类:
package com.util;
import java.util.List;
/**
* 分页的三个基本属性
* 1.每页几条记录size 可以有默认值5
* 2.当前页号 index 可以有默认值1
* 3.记录总数totalCount:不可能有默认值,需要查询数据库获取真正的记录总数
*
* 4.一共多少页 :totalPageCount=totalCount/size+1
* 5 30 31 32 33 34 35
* 5.上一页 index-1 当前页1,上一页1
* 6.下一页 index+1 当前页是最后一页 下一页:还是最后一页
*
* 扩展
* 分页Bean还可以放要查询的数据 protected List<T> list;
* 分页Bean还可以放页码列表 [1] 2 3 4 5 private int[] numbers;
*
* @author Administrator
*
* @param <T>
*/
public class PageBean<T> {
private int size = 5;//每页显示记录 //
private int index = 1;// 当前页号
private int totalCount = 0;// 记录总数 ok
private int totalPageCount = 1;// 总页数 ok
private int[] numbers;//展示页数集合 //ok
protected List<T> list;//要显示到页面的数据集
/**
* 得到开始记录
* @return
*/
public int getStartRow() {
return (index - 1) * size;
}
/**
* 得到结束记录
* @return
*/
public int getEndRow() {
return index * size;
}
/**
* @return Returns the size.
*/
public int getSize() {
return size;
}
/**
* @param size
* The size to set.
*/
public void setSize(int size) {
if (size > 0) {
this.size = size;
}
}
/**
* @return Returns the currentPageNo.
*/
public int getIndex() {
if (totalPageCount == 0) {
return 0;
}
return index;
}
/**
* @param currentPageNo
* The currentPageNo to set.
*/
public void setIndex(int index) {
if (index > 0) {
this.index = index;
}
}
/**
* @return Returns the totalCount.
*/
public int getTotalCount() {
return totalCount;
}
/**
* @param totalCount
* The totalCount to set.
*/
public void setTotalCount(int totalCount) {
if (totalCount >= 0) {
this.totalCount = totalCount;
setTotalPageCountByRs();//根据总记录数计算总页�?
}
}
public int getTotalPageCount() {
return this.totalPageCount;
}
/**
* 根据总记录数计算总页�?
* 5
* 20 4
* 23 5
*/
private void setTotalPageCountByRs() {
if (this.size > 0 && this.totalCount > 0 && this.totalCount % this.size == 0) {
this.totalPageCount = this.totalCount / this.size;
} else if (this.size > 0 && this.totalCount > 0 && this.totalCount % this.size > 0) {
this.totalPageCount = (this.totalCount / this.size) + 1;
} else {
this.totalPageCount = 0;
}
setNumbers(totalPageCount);//获取展示页数集合
}
public int[] getNumbers() {
return numbers;
}
/**
* 设置显示页数集合
*
* 默认显示10个页码
* 41 42 43 44 [45 ] 46 47 48 49 50
*
*
* [1] 2 3 4 5 6 7 8 9 10
*
* 41 42 43 44 45 46 47 [48] 49 50
* @param totalPageCount
*/
public void setNumbers(int totalPageCount) {
if(totalPageCount>0){
//!.当前数组的长度
int[] numbers = new int[totalPageCount>10?10:totalPageCount];//页面要显示的页数集合
int k =0;
//
//1.数组长度<10 1 2 3 4 .... 7
//2.数组长度>=10
// 当前页<=6 1 2 3 4 10
// 当前页>=总页数-5 ......12 13 14 15
// 其他 5 6 7 8 9 当前页(10) 10 11 12 13
for(int i = 0;i < totalPageCount;i++){
//保证当前页为集合的中�?
if((i>=index- (numbers.length/2+1) || i >= totalPageCount-numbers.length) && k<numbers.length){
numbers[k] = i+1;
k++;
}else if(k>=numbers.length){
break;
}
}
this.numbers = numbers;
}
}
public void setNumbers(int[] numbers) {
this.numbers = numbers;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
/*
public static int getTotalPageCount(int iTotalRecordCount, int iPageSize) {
if (iPageSize == 0) {
return 0;
} else {
return (iTotalRecordCount % iPageSize) == 0 ? (iTotalRecordCount / iPageSize) : (iTotalRecordCount / iPageSize) + 1;
}
}*/
}
2.查询所有数据(oracle数据库)
public List<Student> findStu(int start, int end) {
Connection conn =DBUtil.getConnection();
Statement stmt =null;
ResultSet rs =null;
List <Student> stuList = new ArrayList<Student>();
try {
stmt =conn.createStatement();
String sql = "select * from (select rownum rn,stu2.* "
+ "from (select stu.* from student stu order by score desc ) stu2 "
+ "where rownum <="+end+" ) "
+ "where rn >"+start;
rs = stmt.executeQuery(sql);
while(rs.next()){
Student stu = new Student();
stu.setId(rs.getInt("id"));
stu.setName(rs.getString("name"));
stu.setAge(rs.getInt("age"));
stu.setScore(rs.getDouble("score"));
stuList.add(stu);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
DBUtil.closeAll(rs, stmt, conn);
}
return stuList;
}
3.业务处理
public void findStu(PageBean<Student> pageBean) {
//查询数据库表获取记录总数
//int totalCount = this.stuDao.findAll().size();//????
int totalCount = this.stuDao.findCount();
System.out.println("count="+totalCount);
//使用记录总数计算PageBean中的其他属性(totalCount,totalPageCount,numbers),就差list属性
pageBean.setTotalCount(totalCount);
//调用DAO层获取指定页的学生数据,并放入pageBean的list属性
/*
*每页size = 5条记录
* 第几页 起始记录号>= 结束记录号<= <
* 1 0 4 5
* 2 5 9 10
* 3 10 14 15
*
* index (index-1)*size index*size
*
*/
//int start = (pageBean.getIndex()-1)*pageBean.getSize();
//int end= pageBean.getIndex()*pageBean.getSize();
int start = pageBean.getStartRow();
int end = pageBean.getEndRow();
List<Student> list = this.stuDao.findStu(start,end);
pageBean.setList(list);
}
4.servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
// 1.1 接收从页面传入的当前页码index
String sindex = request.getParameter("index"); // null ""
int index = 1;// 默认当前页码数是1
try {
index = Integer.parseInt(sindex);//"5"
} catch (NumberFormatException e) {
e.printStackTrace();
}
// 1.2 接收从页面传入的每页的记录数
String ssize = request.getParameter("size"); // null ""
int size = 5;// 默认当前记录数数是5
try {
size = Integer.parseInt(ssize);//"5"
} catch (NumberFormatException e) {
e.printStackTrace();
}
//1.3查询条件:接收学生姓名
String name = request.getParameter("name");
//1.4查询条件:接收最低分数
String sminScore = request.getParameter("minScore"); //null "" "abc"
if(sminScore ==null){
sminScore = "";
}
double minScore =0;
try{
minScore = Double.parseDouble(sminScore);
}catch(NumberFormatException e){
e.printStackTrace();
}
// 2
PageBean<Student> pageBean = new PageBean<Student>();
pageBean.setIndex(index);
pageBean.setSize(size);
StudentService stuService = new StudentServiceImpl();
List<Student> stuList = stuService.findAll();
stuService.findStu(pageBean);//不需要返回stuList,因为经过业务层处理,所有的数据都在PageBean中
request.setAttribute("pageBean", pageBean);// !!!!!!!
// 3com
request.getRequestDispatcher("/jsp/showAll.jsp").forward(request,
response);
}
5.jsp页面实现
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
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>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript">
function changeIndex(index){
location.href="servlet/ShowAllServlet?index="+index;
}
function changeSize(size){
//alert(size);
location.href= "servlet/ShowAllServlet?size="+size;
}
function change(index,size){
location.href="servlet/ShowAllServlet?index="+index+"&size="+size;
}
</script>
</head>
<body>
<!-- 显示所有学生 /stumanager/ -->
<table align="center" border="1" width="60%">
<tr>
<th>学生 编号</th>
<th>学生姓名</th>
<th>学生年龄</th>
<th>学生成绩</th>
<th>vs.index</th>
<th>更新操作</th>
<th>删除操作</th>
</tr>
<c:forEach items="${pageBean.list}" var="stu" varStatus="vs">
<tr>
<td>${stu.id }</td>
<td>${stu.name }</td>
<td>${stu.age }</td>
<td>${stu.score }</td>
<td>${vs.index }</td>
<td><a href="/stumanager/servlet/StudentServlet?operate=preupdate&sid=${stu.id}">更新</a></td>
<td><a href="/stumanager/servlet/StudentServlet?operate=delete&sid=${stu.id}">删除</a></td>
</tr>
</c:forEach>
<tr>
<td colspan="11" align="center">
<a href="servlet/ShowAllServlet?index=1&size=${pageBean.size }">首页</a> <!-- 获取当前页的显示记录数 -->
<c:if test="${pageBean.index !=1 }"><!--判断是否时第一页 ,如果不是则下标减一,跳转到上一页,如果是,则不变 -->
<a href="servlet/ShowAllServlet?index=${pageBean.index-1 }&size=${pageBean.size }">上一页 </a>
</c:if>
<c:if test="${pageBean.index ==1 }">
上一页
</c:if>
<!-- number展示页面数量集合1,2,3,4,5,判断是否是当前页,如果是则标记当前页码 -->
<c:forEach items="${pageBean.numbers }" var="num">
<c:if test="${num ==pageBean.index }">
[<a href="servlet/ShowAllServlet?index=${num }&size=${pageBean.size }">${num }</a>]
</c:if>
<c:if test="${num != pageBean.index }">
<a href="servlet/ShowAllServlet?index=${num }&size=${pageBean.size }">${num }</a>
</c:if>
</c:forEach>
<!-- 判断当前页是否是总页数,如果是则不做变化,如果不是,则跳转到下一页 -->
<c:if test="${pageBean.index != pageBean.totalPageCount }">
<a href="servlet/ShowAllServlet?index=${pageBean.index+1 }&size=${pageBean.size }">下一页 </a>
</c:if>
<c:if test="${pageBean.index == pageBean.totalPageCount }">
下一页
</c:if>
<a href="servlet/ShowAllServlet?index=${pageBean.totalPageCount }&size=${pageBean.size }">末页</a>
每页
<!-- 判断当前页是否被选中,如果选中则标记为选中状态 -->
<select onchange="changeSize(this.value)">
<c:forEach begin="5" end="25" step="5" var="i">
<c:if test="${i==pageBean.size }">
<option value="${i }" selected="selected">${i }</option>
</c:if>
<c:if test="${i!=pageBean.size }">
<option value="${i }">${i }</option>
</c:if>
</c:forEach>
</select>
条记录
直接跳到第
<!-- 直接跳转到指定页面,跳转成功之后页面的码数改为选中状态 -->
<select onchange="change(this.value,${pageBean.size})">
<c:forEach begin="1" end="${ pageBean.totalPageCount }" var="num">
<c:if test="${num == pageBean.index }">
<option value="${num }" selected="selected">${num }</option>
</c:if>
<c:if test="${num != pageBean.index }">
<option value="${num }">${num }</option>
</c:if>
</c:forEach>
</select>
页
<!-- 查询总数 -->
共${pageBean.totalCount }条记录
</td>
</tr>
</table>
</body>
</html>