项目效果
实现步骤
1.封装数据
要做到上图效果需先准备好所需要的数据。我们需要的数据有:当前页的页码pageNumber,数据库表中的数据的总条数totalNumber,每一页显示的数据条数pageSize,通过查数据库所得到的教师数据的集合list,将这些数据封装到Page类当中。代码如下
package com.school.domain;
import com.school.dao.TeacherDao;
import com.school.dao.impl.TeacherDaoimpl;
import com.school.utils.ReadFileDemo;
import java.io.Serializable;
import java.util.List;
/**
* 封装分页显示的数据
*/
public class Page implements Serializable {
private int pageSize = 10;//自定义查询的数据条数
private int totalNumber;//从数据库查出总长度
private int pageNumber;//显示当前页数(前台)
private int totalPageNumber;//总页数
private int startIndex;
private int startPageNumber;//起始位置
private int endPageNumber;
private String splitUrl;//处理数据的servlet
private List<?> list = null;
public Page(int pageNumber, int totalNumber, int pageSize, String splitUrl) {
this.pageNumber = pageNumber;
this.totalNumber = totalNumber;
this.pageSize = pageSize;
this.splitUrl = splitUrl;
//通过总长度和数据条数计算总页数
if (totalNumber % pageSize == 0){
totalPageNumber = totalNumber/pageSize;
}else {
totalPageNumber = totalNumber/pageSize + 1;
}
//下一页所需的数据起始值
startIndex = (pageNumber-1)*pageSize;
//总页数小于5的情况
if (totalPageNumber < 5){
startPageNumber = 1;
endPageNumber = totalPageNumber;
}else {
//控制显示数字
if (pageNumber < 3){
startPageNumber = 1;
endPageNumber = 5;
}else {
if (pageNumber > (totalPageNumber - 3)){
startPageNumber = totalPageNumber - 4;
endPageNumber = totalPageNumber;
}else {
startPageNumber = pageNumber - 2;
endPageNumber = pageNumber + 2;
}
}
}
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(int totalNumber) {
this.totalNumber = totalNumber;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
public int getTotalPageNumber() {
return totalPageNumber;
}
public void setTotalPageNumber(int totalPageNumber) {
this.totalPageNumber = totalPageNumber;
}
public int getStartPageNumber() {
return startPageNumber;
}
public void setStartPageNumber(int startPageNumber) {
this.startPageNumber = startPageNumber;
}
public int getEndPageNumber() {
return endPageNumber;
}
public void setEndPageNumber(int endPageNumber) {
this.endPageNumber = endPageNumber;
}
public List<?> getList() {
return list;
}
public void setList(List<?> list) {
this.list = list;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public String getSplitUrl() {
return splitUrl;
}
public void setSplitUrl(String splitUrl) {
this.splitUrl = splitUrl;
}
@Override
public String toString() {
return "Page{" +
"pageSize=" + pageSize +
", totalNumber=" + totalNumber +
", pageNumber=" + pageNumber +
", totalPageNumber=" + totalPageNumber +
", startIndex=" + startIndex +
", startPageNumber=" + startPageNumber +
", endPageNumber=" + endPageNumber +
", splitUrl='" + splitUrl + '\'' +
", list=" + list +
'}';
}
}
2.Dao层对数据库查询获得结果集(list)
/**
* 分页查询数据
*
*/
@Override
public List<Teacher> findPagingTeacher(int startPageNumber,int pageSize) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = null;
List<Teacher> teachers = new ArrayList();
try {
conn = DBUtils.getConnection();
sql = "select id,name,password,email,gender,remark from teacher limit ?,?";
ps = conn.prepareStatement(sql);
ps.setInt(1,startPageNumber);
ps.setInt(2,pageSize);
rs = ps.executeQuery();
while (rs.next()){
Teacher teacher = new Teacher();
teacher.setId(rs.getInt(1));
teacher.setName(rs.getString(2));
teacher.setPassword(rs.getString(3));
teacher.setEmail(rs.getString(4));
teacher.setGender(rs.getString(5));
teacher.setRemark(rs.getString(6));
teachers.add(teacher);
}
} catch (SQLException e) {
e.printStackTrace();
}
//关闭连接
DBUtils.closeDB(conn,ps,rs);
return teachers;
}
/**
* 查询所有数据数量
*/
@Override
public int findCountTeacher() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
String sql = null;
int sum = 0;
try {
conn = DBUtils.getConnection();
sql = "select count(*) from teacher";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()){
sum = rs.getInt(1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return sum;
}
3. Service层调用数据库方法实现业务
/**
* 分页
*/
@Override
public Page paging(String splitUrl,int pageNumber, int pageSize) {
TeacherDao teacherDao = new TeacherDaoimpl();
int countTeacher = teacherDao.findCountTeacher();
Page page = new Page(pageNumber,countTeacher,pageSize,splitUrl);
List<Teacher> teachers = teacherDao.findPagingTeacher(page.getStartIndex();
page.getPageSize());
page.setList(teachers);
return page;
}
4.Controller层调用Service层方法给前台传递数据
package com.school.web.controller;
import com.school.domain.Page;
import com.school.service.TeacherService;
import com.school.service.impl.TeacherServiceimpl;
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 java.io.IOException;
@WebServlet("/SplitpageController")
public class SplitpageController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String Action = req.getParameter("Action");
//设置每页显示数
if ("pagesize".equals(Action)){
//获得前台传递的数据
int pageSize = Integer.parseInt(req.getParameter("pageSize"));
req.getSession().setAttribute("pageSize",pageSize);
//调用Service层的方法
TeacherService teacherService = new TeacherServiceimpl();
Page page = teacherService.paging("SplitpageController",1,pageSize);
//将数据传给前台
req.setAttribute("page",page);
req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
}
//分页
if ("splitpage".equals(Action)){
//获得前台传递的数据
int pageNumber = Integer.parseInt(req.getParameter("pageNumber"));
Object pageSize = req.getSession().getAttribute("pageSize");
//判断每页显示的数据个数,如果是空就设置为默认值10
if (pageSize==null){
TeacherService teacherService = new TeacherServiceimpl();
Page page = teacherService.paging("SplitpageController",pageNumber,10);
req.setAttribute("page",page);
req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
}else {
TeacherService teacherService = new TeacherServiceimpl();
Page page = teacherService.paging("SplitpageController",pageNumber,(int)pageSize);
req.setAttribute("page",page);
req.getRequestDispatcher("/pages/admin_teacher.jsp").forward(req,resp);
}
}
}
}
5.jsp页面的数据显示
考虑到通用性所以新建一个jsp文件写分页的代码。
<div class="box-footer">
<div class="pull-left">
<div class="form-group form-inline">
总共${page.totalPageNumber}页,共${page.totalNumber}条数据。<br>
<form action="${page.splitUrl}" id="formpage" method="post" onchange="fun1()">
每页${page.pageSize}条数据
设置:<select class="form-control" name="pageSize">
<%--<option value="0">0</option>--%>
<option value="0">0</option>
<option value="8">8</option>
<option value="10">10</option>
<option value="15">15</option>
<option value="20">20</option>
<%--<option></option>--%>
</select> 条
<input type="hidden" name="Action" value="pagesize">
</form>
</div>
</div>
<div class="box-tools pull-right">
<ul class="pagination">
<li>
<a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=1&teacherkey=${teacherkey}&teachervalue=${teachervalue}" aria-label="Previous">首页</a>
</li>
<c:if test="${page.pageNumber>1}">
<li>
<a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.pageNumber-1}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">上一页</a>
</li>
</c:if>
<c:forEach begin="${page.startPageNumber}" end="${page.endPageNumber}" var="pageNumber">
<li>
<a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${pageNumber}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">${pageNumber}</a>
</li>
</c:forEach>
<c:if test="${page.pageNumber < page.endPageNumber}">
<li>
<a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.pageNumber+1}&teacherkey=${teacherkey}&teachervalue=${teachervalue}">下一页</a>
</li>
</c:if>
<li>
<a href="${pageContext.request.contextPath}/${page.splitUrl}?Action=splitpage&pageNumber=${page.totalPageNumber}&teacherkey=${teacherkey}&teachervalue=${teachervalue}" aria-label="Next">尾页</a>
</li>
</ul>
</div>
</div>
<script>
function fun1() {
var formpage = document.getElementById("formpage");
formpage.submit();
}
</script>
将分页功能的网页使用动态包含进显示数据的网页
<table id="dataList" class="table table-bordered table-striped table-hover dataTable">
<thead>
<tr>
<th class="" style="padding-right:0px;">
<input id="selall" type="checkbox" class="icheckbox_square-blue">
</th>
<th class="sorting_asc">ID</th>
<th class="sorting_desc">姓名</th>
<th class="sorting_asc sorting_asc_disabled">密码 </th>
<th class="sorting">邮箱 </th>
<th class="sorting_desc sorting_desc_disabled">性别</th>
<th class="text-center sorting">备注</th>
<th class="text-center">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${page.list}" var="teacher">
<tr>
<td><input name="ids" type="checkbox" class="boxs" value="${teacher.id}"></td>
<td>${teacher.id}</td>
<td>${teacher.name}</td>
<td>${teacher.password}</td>
<td>${teacher.email}</td>
<td>${teacher.gender}</td>
<td class="text-center">${teacher.remark}</td>
<td class="text-center">
<a href="TeacherController?Action=showback_teacher&pageSize=${page.pageSize}&pageNumber=${page.pageNumber}&id=${teacher.id}"><button type="button" class="btn bg-olive btn-xs">编辑</button></a>
<a href="TeacherController?Action=deleteteacher&pageSize=${page.pageSize}&pageNumber=${page.pageNumber}&id=${teacher.id}"><button type="button" class="btn bg-olive btn-xs">删除</button></a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
//动态包含
<jsp:include page="splitpage.jsp"></jsp:include>