分页功能的实现

60 篇文章 1 订阅
9 篇文章 0 订阅
  1. 工具类:
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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值