- 序言 : 我们经常在网站上见过或者平常生活中自己就用过,当展示的页面数据过多时,我们都是分页查看。这样既方便又会降低视觉疲劳。今天这只菜鸟就写一个分页的demo,巩固一下这知识。
- 技术: je22,jdbc,jstl
- 数据库 :mysql
- 开发工具:eclipse,Navicat
- 设计思想: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。
二:Bean对象:上面八个属性:
- pageNow、pageSize、totalRecord:通过构造方法就能得到。
- pageNow请求页面提交过来的参数,pageSize自己设置,totalRecord是查询数据库得到。
- totalPage、startIndex、start、end是通过算法得出。
- list需要通过查询数据库再通过set方式得到。
三:数据库设计:由于只是一个分页小demo,只要一张表就够了,里面存储学生信息。
四:项目架构:先看项目视图
这里其实就体现了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时,需要把请求的页码交给服务器。
不然服务器不知道你要获得第几页的数据。
- 显示所有员工数量、总页数
- 首先超链接
- 如果当前页为第一页时,就没有上一页这个超链接显示
- 如果当前页不是第一页也不是最后一页,则有上一页和下一页这个超链接显示
- 如果当前页是最后一页,则只有上一页这个超链接显示,下一页没有
将项目详细列表贴出:
六:代码:
分页实体:
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>