• 序言 : 我们经常在网站上见过或者平常生活中自己就用过,当展示的页面数据过多时,我们都是分页查看。这样既方便又会降低视觉疲劳。今天这只菜鸟就写一个分页的demo,巩固一下这知识。
  1. 技术: je22,jdbc,jstl
  2. 数据库 :mysql
  3. 开发工具:eclipse,Navicat
  4. 设计思想:mvc设计模式

一:分页思想:一般的分页界面都是:尾页->上一页->显示的页数(比如1,2,3,4,5页)->下一页->尾页。因此我们首先定义这几个数据对象

  • pageNow; // 当前页
  • totolRecord; // 总记录条数
  • pageSize;   // 页面数据条数
  • pageTol;    // 页面总数
  • startIndex; // 数据库查询的初始位置(0为初始值)
  • start;    // 页面显示的首页(设为1)
  • end;   // 页面显示的尾页
  • List<Student> list;  //将每页要显示的数据放在list集合中

   /**

   *  比如当前页为第4页,此时界面上显示2,3,4,5,6页 (每次都只有5页共点击查询)。start就为2,end就为6
  */

先看显示效果:这里因为数据有限但为了页面效果显示,我把pagesize设为1,pageRecord为10。

java后端分页怎么实现 java web 分页_java后端分页怎么实现

 

二:Bean对象:上面八个属性: 

  • pageNow、pageSize、totalRecord:通过构造方法就能得到。
  • pageNow请求页面提交过来的参数,pageSize自己设置,totalRecord是查询数据库得到。
  • totalPage、startIndex、start、end是通过算法得出。
  • list需要通过查询数据库再通过set方式得到。

三:数据库设计:由于只是一个分页小demo,只要一张表就够了,里面存储学生信息。

java后端分页怎么实现 java web 分页_java_02

四:项目架构:先看项目视图

java后端分页怎么实现 java web 分页_java后端分页怎么实现_03

     

java后端分页怎么实现 java web 分页_当前页_04

  

这里其实就体现了mvc的设计模式;大体分为三层: 显示层(jsp),bean层(dao,entity),控制层(service,servlet)

讲讲这里这些包里面的东西以及作用:

  • dao: 一些与数据库相关的操作,比如crud操作。(这里我将数据库基本crud,以及数据库连接操作封装到一个BaseDAO类,供其它DAO进行调用)
  • daoImpl::dao层接口的具体实现;这样方便对接口编程,用来将具体实现与业务分开。
  • entity:一些实体属性:就是对数据库字段的封装。
  • service:其实就是在该层将我们所需要的PageBean对象构建好,返回给上一层。
  • serveceImpl:不多讲,就是对service的实现。
  • servlet:控制层,响应服务,与jsp进行“交互”。
  • test:这个就是对项目的测试,我们常说的“白盒测试”就是像这样在项目中进行测试,debug等操作。
  • util:工具包:这里主要就是封装了一些一些操作,避免代码冗余,对项目健壮性有较好的支持。
  • resource:配置 属性文件,数据库连接时直接从这读取信息。(程序中的不可变量,非集合形态的可以写成静态常量;集合形态的可以写成enum类;程序初始化参数,本地可更改变量,数据较少可以存放于properties文件。大量数据可以选择XML,便于解析与更改。
    大型的数据集合应存放与数据库中,数据库可以良好的管理大型数据集合,并且加快索引速度)。当然要是学了框架,这就是常规操作了。

五:JSP中显示数据,构建分页导航。

因为将我们所有需要的数据都封装在了pageBean中,pageBean对象又在request域中,所以在jsp页面中,我们只需要拿到我们所需要的数据,进行显示即可,
注意:逻辑要搞清楚,想要显示什么不想显示什么,全屏自己控制了,只需要记住,在请求Servlet时,需要把请求的页码交给服务器。
不然服务器不知道你要获得第几页的数据。     

  • 显示所有员工数量、总页数
  • 首先超链接 
  • 如果当前页为第一页时,就没有上一页这个超链接显示
  • 如果当前页不是第一页也不是最后一页,则有上一页和下一页这个超链接显示
  • 如果当前页是最后一页,则只有上一页这个超链接显示,下一页没有

将项目详细列表贴出: 

java后端分页怎么实现 java web 分页_数据_05

六:代码:

分页实体:

package com.entity;

import java.util.List;

public class Page<T> {
	private int pageNow; // 当前页
	private int totolRecord; // 总记录
	private int pageSize; // 页面条数
	private int pageTol; // 页面总数
	private int startIndex; // 数据库记录的初始位置(0为初始值)
	/**
	 * 分页显示的页数,比如在页面上显示1,2,3,4,5页,start就为1,end就为5
	 */
	private int start; // 页面显示的首页(设为1)
	private int end; // 页面显示的尾页
	private List<Student> list;  //将每页要显示的数据放在list集合中

	public Page() {
		super();
	}

	public Page(int pageNow, int totolRecord, int pageSize) { // 构造方法传入当前页,每页条数,zong'ji'lu's
		super();
		this.pageNow = pageNow;
		this.totolRecord = totolRecord;
		this.pageSize = pageSize;
		this.start = 1;  // 显示初始页为1
		this.end = 5;   //  页数为5
		this.pageTol = totolRecord % pageSize == 0 ? totolRecord / pageSize : totolRecord / pageSize + 1; // 页面总数
		this.startIndex = (this.pageNow - 1) * this.pageSize; // 开始索引
		if (pageTol <= 5) {  // 总页数小于5,那么end就为总页数的值了。
			this.end = pageTol;
		}else {
			this.start = pageNow - 2;
			this.end   = pageNow + 2;
			if (start <= 0) {  // 起始页为第1或2页
				this.start = 1;
				this.end = 5;
			}
			if (end > pageTol) { // 尾页大于页面总数
				this.start = this.end - 5;
				this.end = pageTol;
			}
		}
	}

	public int getPageNow() {
		return pageNow;
	}
	
	public void setPageNow(int pageNow) {
		this.pageNow = pageNow;
	}

	public int getTotolRecord() {
		return totolRecord;
	}

	public void setTotolRecord(int totolRecord) {
		this.totolRecord = totolRecord;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getPageTol() {
		return pageTol;
	}

	public void setPageTol(int pageTol) {
		this.pageTol = pageTol;
	}

	public int getStartIndex() {
		return startIndex;
	}

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

	public int getStart() {
		return start;
	}

	public void setStart(int start) {
		this.start = start;
	}

	public int getEnd() {
		return end;
	}
	
	public void setEnd(int end) {
		this.end = end;
	}

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

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

}

servlet代码:

package com.servlet;

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

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

import com.entity.Page;
import com.entity.Student;
import com.service.PageService;
import com.serviceImpl.PageServiceImpl;
@WebServlet("/stuList")
public class PageServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	 this.doPost(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	 req.setCharacterEncoding("utf-8");        //设置请求编码,防止乱码
		 resp.setContentType("text/html;charset=utf-8");
    	 int pageNow  = Integer.valueOf(req.getParameter("pageNow")); //获取当前页面
    	 int pageSize = 1;  //每页数据条数     
    	 PageService pageSevice = new PageServiceImpl();  
    	 Page<Student> page =  pageSevice.getPageStudent(pageNow, pageSize);
    	 List<Student> list =  page.getList();  	 
    	 req.setAttribute("page",page);     //页面总属性
    	 req.setAttribute("list",list);    //当前页面数据属性
    	 req.getRequestDispatcher("main.jsp").forward(req,resp);  //转发到主页面
    } 
}

 jsp显示代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>学生页面展示</title>
</head>
<body> 
       <form action = "${pageContext.request.contextPath}/stuList?pageNow=1" method = "post">
                <table style="width:500px; margin:80px auto" align = "center" cellspacing = "0px" cellpadding = "10px" border = "1">
                        <tr><th colspan = "5">学生信息列表</th></tr>
                        <tr>
                           <th>学号</th>
                           <th>姓名</th>
                           <th>性别</th>
                           <th>年龄</th>
                           <th>院系</th>
                        </tr> 
				 <c:forEach items="${list}" var="stu">
					  <tr> 
						   <td>${stu.id } </td>
						   <td>${stu.name }</td>
						   <td>${stu.sex }</td>
						   <td>${stu.age }</td>
						   <td>${stu.grade}</td>
					  </tr>
				</c:forEach>   
				<tr><td colspan = "5" align = "center"><input type = "submit" value = "检索"></input></td></tr>  
              </table>
      </form>   
     <div align = "center">
             <%-- 构建分页导航 --%>
               <c:if test="${requestScope.page.pageNow>0}"> <!--用户有动作显示信息-->
               共有${requestScope.page.totolRecord}个员工,共${requestScope.page.pageTol}页,当前为第${requestScope.page.pageNow}页
            <br/> 
            <a href="${pageContext.request.contextPath}/stuList?pageNow=1">首页</a>
            <%--如果当前页为第一页时,就没有上一页这个超链接显示 --%>
           
            <c:if test="${requestScope.page.pageNow==1}">
                <c:forEach begin="${requestScope.page.start}" end="${requestScope.page.end}" step="1" var="i">
                    <!--对当前页加强判断并显示页数-->
                    <c:if test="${requestScope.page.pageNow == i}">
                        ${i}
                    </c:if>                
                    <c:if test="${requestScope.page.pageNow != i}">
                        <a href="${pageContext.request.contextPath}/stuList?pageNow=${i}">${i}</a>                                        
                    </c:if>                        
                </c:forEach>
                <a href="${pageContext.request.contextPath}/stuList?pageNow=${requestScope.page.pageNow+1}">下一页</a>                    
            </c:if>
 
            <%--如果当前页不是第一页也不是最后一页,则有上一页和下一页这个超链接显示 --%>
            <c:if test="${requestScope.page.pageNow>1 && requestScope.page.pageNow < requestScope.page.pageTol}">
                <a href="${pageContext.request.contextPath}/stuList?pageNow=${requestScope.page.pageNow-1}">上一页</a>
                <c:forEach begin="${requestScope.page.start}" end="${requestScope.page.end}" step="1" var="i">    
                    <c:if test="${requestScope.page.pageNow == i}">
                        ${i}
                    </c:if>            
                    <c:if test="${requestScope.page.pageNow != i}">
                        <a href="${pageContext.request.contextPath}/stuList?pageNow=${i}">${i}</a>                                        
                    </c:if>                        
                </c:forEach>
                <a href="${pageContext.request.contextPath}/stuList?pageNow=${requestScope.page.pageNow+1}">下一页</a>    
            </c:if>
            
         <!-- 如果当前页是最后一页,则只有上一页这个超链接显示,下一页没有 -->
           <%--  <c:if test="${requestScope.page.pageNow == requestScope.pagen.pageTal}">
               <a href="${pageContext.request.contextPath}/stuList?pageNow=${requestScope.page.pageNow+1}">上一页</a>
                <c:forEach begin="${requestScope.page.start}" end="${requestScope.page.end}" step="1" var="i">
                    <c:if test="${requestScope.page.pageNow == i}">  
                        ${i}
                    </c:if>
                    <c:if test="${requestScope.page.pageNow != i}">
                        <a href="${pageContext.request.contextPath}/stuList?pageNow=${i}">${i}</a>                                        
                    </c:if>                
                </c:forEach>  
            </c:if>   --%>
            <%--尾页 --%>
            <a href="${pageContext.request.contextPath}/stuList?pageNow=${requestScope.page.pageTol}">尾页</a>
            </c:if>
        </div>     
</body>
</html>