黑马day13 分页思路&实现

分页的总体思想:

分页包含什么:

1.当前页,每页显示的记录数,总的记录数,总的页码,集合List存放的是JavaBean,首页, 尾页,上一页,下一页

传递的參数:当前页,每页显示的记录数.这两个本来就是有的。

数据库中查询的:总的记录数,集合List存放的是JavaBean。这两个是从数据库中查询的。

通过已知的属性计算:首页,
尾页,上一页,下一页,总的页码 这些是通过计算得到了。

因此javaBean Page能够写成:

package com.itheima.domain;

import java.util.List;

public class Page {
	private int thispage;//当前页
	private int rowperpage;//每页显示的记录数
	private int countrow;//总的记录数
	private int countpage;//总的页数
	private int firstpage;//首页
	private int lastpage;//尾页
	private int prepage;//上一页
	private int nextpage;//下一页
	private List<Customer> list;
	public int getThispage() {
		return thispage;
	}
	public void setThispage(int thispage) {
		this.thispage = thispage;
	}
	public int getRowperpage() {
		return rowperpage;
	}
	public void setRowperpage(int rowperpage) {
		this.rowperpage = rowperpage;
	}
	public int getCountrow() {
		return countrow;
	}
	public void setCountrow(int countrow) {
		this.countrow = countrow;
	}
	public int getCountpage() {
		return countpage;
	}
	public void setCountpage(int countpage) {
		this.countpage = countpage;
	}
	public int getFirstpage() {
		return firstpage;
	}
	public void setFirstpage(int firstpage) {
		this.firstpage = firstpage;
	}
	public int getLastpage() {
		return lastpage;
	}
	public void setLastpage(int lastpage) {
		this.lastpage = lastpage;
	}
	public int getPrepage() {
		return prepage;
	}
	public void setPrepage(int prepage) {
		this.prepage = prepage;
	}
	public int getNextpage() {
		return nextpage;
	}
	public void setNextpage(int nextpage) {
		this.nextpage = nextpage;
	}
	public List<Customer> getList() {
		return list;
	}
	public void setList(List<Customer> list) {
		this.list = list;
	}
}

2.首先要进行分页须要在cn.itheima.web包中写一个分页的Servlet,PageCustomerServlet

这个类的主要步骤是:

(1).得到传递的參数默认是首页

(2).每页显示的记录数,这里默认的是5

(3).调用service中分页的函数返回Page

(4).将Page放到request域中

(5).重定向到要实现分页的jsp进行显示分页

package com.itheima.web;

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;

import com.itheima.domain.Customer;
import com.itheima.domain.Page;
import com.itheima.factory.BasicFactory;
import com.itheima.service.CustomerService;

public class PageCustomerServlet extends HttpServlet {
	CustomerService service =BasicFactory.getFactory().getInstance(CustomerService.class);
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.获取当前页每页显示的记录
		int thispage=Integer.parseInt(request.getParameter("thispage"));
		int rowperpage=5;
		//2.调用service的方法
		Page page=service.findCustomerByPage(thispage,rowperpage);
		request.setAttribute("page", page);
		//3.请求转发到pageList.jsp
		request.getRequestDispatcher("/pageList.jsp").forward(request, response);
	}

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

}

3.service实现类代码主要完毕的功能:

计算Page中的属性,设置到Page中

public Page findCustomerByPage(int thispage, int rowperpage) {
		Page page=new Page();
		//设置当前页
		page.setThispage(thispage);
		//每页显示的记录数 默认是5条
		page.setRowperpage(rowperpage);
		//查询数据库一共同拥有多少行
		int countrow=dao.getCount();
		page.setCountrow(countrow);
		//一共同拥有多少页
		int countpage=(countrow-1)/rowperpage+1;
		page.setCountpage(countpage);
		//设置首页
		page.setFirstpage(1);
		//设置尾页
		page.setLastpage(countpage);
		//前一页
		page.setPrepage(thispage==1?1:thispage-1);
		//下一页
		page.setNextpage(thispage==countpage?countpage:thispage+1);
		//
		List<Customer> list=dao.getCustomerByPage((thispage-1)*rowperpage,rowperpage);
		page.setList(list);
		return page;
	}

4.数据库中使用limitkeyword进行查询

public List<Customer> getCustomerByPage(int from, int count) {
		String sql="select * from customer limit ?,?";
		QueryRunner runner=new QueryRunner(DataSourceUtil.getSource());
		try {
			return runner.query(sql, new BeanListHandler<Customer>(Customer.class),from,count);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
	}

5.jsp页面中显示:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <script type="text/javascript">
  	function selectAll(all){
  		var del=document.getElementsByName("del");
  		for(var i=0;i<del.length;i++){
  		del[i].checked=all.checked;
  		}
  	}
  </script>
    <title></title>

	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    

  </head>

 <body style="text-align: center">
  <h1>客户管理系统_显示列表</h1><hr>
  <div align="center">
  <form action="${pageContext.request.contextPath }/servlet/FindCustomerByConditionServlet" method="post">
  	姓名:<input type="text" name="name" value="${param.name }"/>
  	性别:<input type="radio" name="gender" value="男"
  		<c:if test="${param.gender==‘男‘}">checked="checked"</c:if>
  	/>男
    <input type="radio" name="gender" value="女"
    	<c:if test="${param.gender==‘女‘}">checked="checked"</c:if>
    />女
            客户类型:
    <select name="type">
    	<option value=""/>
		<option value="钻石用户"
			<c:if test="${param.type==‘钻石用户‘}">selected="selected"</c:if>
		>钻石用户</option>
		<option  value="黄金用户"
			<c:if test="${param.type==‘黄金用户‘}">selected="selected"</c:if>
		>黄金用户</option>
		<option  value="普通用户"
			<c:if test="${param.type==‘普通用户‘}">selected="selected"</c:if>
		>普通用户</option>
    </select>
    <input type="submit" value="条件查询">
  </form>
  <form action="${pageContext.request.contextPath}/servlet/BatchDeleteCustomer" method="post">
    <table border="1" width="100%" cellpadding="0" cellspacing="0" style="text-align: center">
    	<tr>
    		<th><input type="checkbox" onclick="selectAll(this)">全选</th>
    		<th>客户姓名</th>
    		<th>客户性别</th>
    		<th>客户生日</th>
    		<th>客户电话</th>
    		<th>电子邮箱</th>
    		<th>客户爱好</th>
    		<th>客户类型</th>
    		<th>具体描写叙述</th>
    		<th colspan="2">操作类型</th>
    	</tr>
    	<c:forEach items="${requestScope.page.list}" var="li">
    	<tr>
    			<td><input type="checkbox" name="del" value="${li.id}"/></td>
    			<td><c:out value="${li.name}"></c:out></td>
    			<td><c:out value="${li.gender}"></c:out></td>
    			<td><c:out value="${li.birthday }"></c:out></td>
    			<td><c:out value="${li.cellphone }"></c:out></td>
    			<td><c:out value="${li.email }"></c:out></td>
    			<td><c:out value="${li.preference }"></c:out></td>
    			<td><c:out value="${li.type }"></c:out></td>
    			<td><c:out value="${li.description }"></c:out></td>
    			<td><a href="${pageContext.request.contextPath }/servlet/CustomerInfoServlet?id=${li.id}">改动</a></td>
    			<td><a href="${pageContext.request.contextPath }/servlet/DeleteCustomerServlet?id=${li.id}">删除</a></td>
    	</tr>
    	</c:forEach>
    </table>
    <input type="submit" value="批量删除"/>
    </form>
    </div>
     ${requestScope.page.countrow }条数据
     共${requestScope.page.countpage} 页

    <a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.firstpage}">首页</a>
     <a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.prepage}">上一页</a>
     <!-- 分页逻辑 -->
     <c:if test="${page.countpage<=5}">
  		<c:set var="begin" value="1" scope="page"></c:set>
  		<c:set var="end" value="${page.countpage}" scope="page"></c:set>
  	</c:if>

  	 <c:if test="${page.countpage>5}">
  	 <c:choose>
  		<c:when test="${page.thispage<=3}">
  			<c:set var="begin" value="1" scope="page"></c:set>
  			<c:set var="end" value="5" scope="page"></c:set>
  		</c:when>
  		<c:when test="${page.thispage>=page.countpage-2}">
  			<c:set var="begin" value="${page.countpage-4}" scope="page"></c:set>
  			<c:set var="end" value="${page.countpage}" scope="page"></c:set>
  		</c:when>
  		<c:otherwise>
  			<c:set var="begin" value="${page.thispage-2}" scope="page"></c:set>
  			<c:set var="end" value="${page.thispage+2}" scope="page"></c:set>
  		</c:otherwise>
  		</c:choose>
  	</c:if>

  	<c:forEach begin="${begin}" end="${end}" step="1" var="i">
  		<c:if test="${i==page.thispage}"><!-- 当前页就不是超链接 -->
  			<font color="black">${i}</font>
  		</c:if>
  		<c:if test="${i!=page.thispage}"><!-- 非当前页就是超链接 -->
  			<a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?

thispage=${i}"><font color="red">${i}</font></a>
  		</c:if>
  	</c:forEach>
  	<!-- 分页逻辑结束 -->
    <a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.nextpage}">下一页</a>
    <a href="${pageContext.request.contextPath }/servlet/PageCustomerServlet?thispage=${page.lastpage}">尾页</a>
  </body><br>
   <a href="${pageContext.request.contextPath }/">返回到主页</a>
</html>

分页伪代码:

6.分页展示:

时间: 2024-10-14 18:49:32

黑马day13 分页思路&amp;实现的相关文章

黑马day13 分页思路&amp;实现

分页的整体思想: 分页包括什么: 1.当前页,每页显示的记录数,总的记录数,总的页码,集合List存放的是JavaBean,首页, 尾页,上一页,下一页 传递的参数:当前页,每页显示的记录数.这两个本来就是有的. 数据库中查询的:总的记录数,集合List存放的是JavaBean.这两个是从数据库中查询的. 通过已知的属性计算:首页, 尾页,上一页,下一页,总的页码 这些是通过计算得到了. 因此javaBean Page可以写成: package com.itheima.domain; impor

分页思路

页面分页思路: 1.sql语句:SELECT * FROM users LIMIT num1,num2 PS:num1为开始索引 ,num2为页面数据量.num1=5,num2=10,则显示6-15共10条数据 2.“上一页”与“下一个”越界控制 <c:if test="${currentpage>1 }"> <a href='<c:url value="/page.jsp?page=${currentpage-1 }"/>'&g

前端分页 思路

$scope.allNum = $scope.listData.length;$scope.allPage = Math.ceil($scope.allNum / 10);console.log($scope.listData); //分页$scope.defaultPage = 1;$scope.nowArr = [];for(var i=0; i<($scope.allNum < 10?$scope.allNum:10);i++){ $scope.nowArr.push($scope.li

整理 java 分页思路

今天刚学分页还有些不是很清楚 想整理一下.. 1.要先创建数据库 把要显示的数据存入表里 2.就要开始写代码了 写一个JavaBean 创建数据库属性 用于存取 3.创建一个数据库查询类 这个类里有两个方法 一个方法返回数据表里的属性值和设置显示方法(用sql 语句设置为:select top "  每页显示的行数 " *from userinfo where id not in (select top " ((当前页面 - 1) * 每页的行数) "id from

百万级数据分页展示

整理自: http://www.cnblogs.com/ajun/archive/2012/12/12/2814780.html http://bbs.csdn.net/topics/310162095 分页思路: https://segmentfault.com/q/1010000003485063/a-1020000003486645

Freemarker自定义分页工具类

[#--分页思路1 每页显示固定的页数 尽量保持当前页在显示的中央部位 1. 如果当前页号小于或者等于页面要显示的页数的一半 则按照以下算法计算显示 如果总页数小于或者等于页面要显示的页数   则从第一页显示到总页数(最后一页) 如果总页数大于页面要显示的页数  则从第一页显示到页面要显示的页数 2. 如果当前页号大于页面要显示的页数的一半,则按照以下算法计算显示 如果总页数小于或者等于(当前页 + 页面要显示的页数的一半) 则从(当前页号-页面要显示的页数的一半) 显示到 总页数 如果总页数大

JUI分页使用

分页介绍 分页思路服务器返回当前页的数据,总条数,再由js来生成分页标签.分页是配合服务器端来处理的, 不是存js做的分页. 因为如果数据量很大,比如有好几百页,性能很慢. 分页组件参数要由服务器传过来targetType,totalCount,numPerPage,pageNumShown,currentPage .框架会自动把下面的form中pageNum修改后,ajax重新发请求.下面这个form是用来存查询条件的 <form id="pagerForm" action=&

使用redis完成搜索/分页/排序

功能:根据用户展示pn的相关信息,能搜索具体的pn, 可以分页 思路:redis常用结构第一就想到了hash,可以搜索和存储信息:Sorted Set 可以搜索和截取 将Pn存储在两种结构中,先从set分页后,在去hash获取具体内容 数据格式: '用户ID1' => [ 'pnNumber1' => [ 'pnName' => 'E', 'pnCategory' => 'A', 'pnDesc' => 'C' ], 'pnNumber2' => [ 'pnName'

非常不错的一个JS分页效果代码

这里分享一个不错的js分页代码. 代码中cpage是页面计数,应为全局变量,可以随处调用它: totalpage是总页数. 与asp分页代码很类似,也是先取得记录总数,然后实现分页,基本的分页思路与原理还是相通的,感兴趣的朋友做个参考吧. 例子,js分页效果代码. <!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-t