一. 编写页面对应的JavaBean对象
在pojo包下创建Page类
package server.pojo;
import java.util.List;
public class Page<T> {
public static final Integer PAGE_SIZE = 2;
private Integer pageNumber;
private Integer pageTotalNumber;
private Integer pageSize = PAGE_SIZE;
private Integer dataTotalCount;
private List<T> items;
public Integer getPageNumber() {
return pageNumber;
}
public void setPageNumber(Integer pageNumber) {
//防止跳到不在页码数范围内的其他页码
if(pageNumber < 1){
pageNumber = 1;
}
if(pageNumber > pageTotalNumber){
pageNumber = pageTotalNumber;
}
this.pageNumber = pageNumber;
}
public Integer getPageTotalNumber() {
return pageTotalNumber;
}
public void setPageTotalNumber(Integer pageTotalNumber) {
this.pageTotalNumber = pageTotalNumber;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getDataTotalCount() {
return dataTotalCount;
}
public void setDataTotalCount(Integer dataTotalCount) {
this.dataTotalCount = dataTotalCount;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
@Override
public String toString() {
return "Page{" +
"pageNumber=" + pageNumber +
", pageTotalNumber=" + pageTotalNumber +
", pageSize=" + pageSize +
", dataTotalCount=" + dataTotalCount +
", items=" + items +
'}';
}
}
二. Dao层
1. 在BookDao接口中添加以下两个方法
public Integer queryDataTotalCount();
public List<Book> queryPageItems(int begin, int pageSize);
2.在BookDaoImpl中实现上述接口中的两个方法
@Override
public Integer queryDataTotalCount() {
String sql = "select count(*) from book";
Number count = (Number) querySingleValue(sql);
return count.intValue();
}
@Override
public List<Book> queryPageItems(int begin, int pageSize) {
String sql = "select * from book limit ?,?";
return queryList(Book.class,sql,begin,pageSize);
}
三. Service层
1. 在BookService接口中添加以下方法
public Page<Book> page(int pageNumber, int pageSize);
2. 在BookServiceImpl中实现上述接口中的方法
@Override
public Page<Book> page(int pageNumber, int pageSize) {
Page<Book> page = new Page<>();
//设置每页显示的数量
page.setPageSize(pageSize);
//求总的记录数
Integer dataTotalCount = bookDao.queryDataTotalCount();
//设置总记录数
page.setDataTotalCount(dataTotalCount);
//求总页码数
Integer pageTotalNumber = dataTotalCount / pageSize;
if(dataTotalCount % pageSize > 0){
pageTotalNumber += 1;
}
//设置总页码数
page.setPageTotalNumber(pageTotalNumber);
//设置当前页码
page.setPageNumber(pageNumber);
//求当前页数据的开始索引
int begin = (page.getPageNumber() - 1) * pageSize;
//求当前页的数据
List<Book> items = bookDao.queryPageItems(begin,pageSize);
//设置当前页的每一个数据
page.setItems(items);
return page;
}
四. Web层
1.①在BookServlet中添加page方法,进行分页显示;②需要将删除、添加、修改方法里重定向的地址改为page,这样对其进行操作后才能够显示出来;③执行完添加操作后,需要显示最后一页,这样才能看到添加后的数据;④执行完删除操作后,需要跳到删除完之后的那一页,可以看到已经被删除;⑤修改完数据之后,需要显示被修改数据的那一页,可以看到已经被修改
package server.web;
import server.pojo.Book;
import server.pojo.Page;
import server.service.BookService;
import server.service.impl.BookServiceImpl;
import server.utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@WebServlet("/manager/bookServlet")
public class BookServlet extends BaseServlet{
private BookService bookService = new BookServiceImpl();
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//通过BookService查询全部书
List<Book> books = bookService.queryBooks();
//把全部图书保存到Request域中
req.setAttribute("books",books);
//请求转发到/pages/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的id
String id = req.getParameter("id");
//调用BookService类的deleteBookById()方法删除对应的图书
bookService.deleteBookById(Integer.parseInt(id));
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNumber="+req.getParameter("pageNumber"));
}
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int pageNumber = WebUtils.parseInt(req.getParameter("pageNumber"),0);
pageNumber += 1;
//获取请求的参数
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//调用BookService类的addBook()方法保存图书
bookService.addBook(book);
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNumber="+pageNumber);
}
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数(图书id)
String id = req.getParameter("id");
//调用BookService类的queryBookById()方法查询图书
Book book = bookService.queryBookById(Integer.parseInt(id));
//保存图书到Request作用域中
req.setAttribute("book",book);
//请求转发到/pages/manager/book_edit.jsp页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数
Book book = WebUtils.copyParamToBean(req.getParameterMap(),new Book());
//调用BookService类的updateBook()方法修改图书信息
bookService.updateBook(book);
//重定向到图书列表页面
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNumber="+req.getParameter("pageNumber"));
}
protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数pageNumber和pageSize
int pageNumber = WebUtils.parseInt(req.getParameter("pageNumber"),1);
int pageSize = WebUtils.parseInt(req.getParameter("pageSize"),Page.PAGE_SIZE);
//调用BookService类的Page(pageNumber,pageSize)方法
Page<Book> page = bookService.page(pageNumber,pageSize);
//保存Page对象到Request域中
req.setAttribute("page",page);
//重定向到/pages/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
}
}
在WebUtils下添加如下方法,将字符串转化成整数
public static int parseInt(String strInt,int defaultValue){
try {
return Integer.parseInt(strInt);
} catch (Exception e) {
e.printStackTrace();
}
return defaultValue;
}
2. 修改前端页面
①修改manager.jsp页面,将地址指向BookServlet中的page方法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div>
<h1>欢迎管理员进入后台管理系统</h1>
<a href="manager/bookServlet?action=page">图书管理</a>
<a href="index.jsp">返回首页</a>
</div>
</body>
</html>
②修改book_manager.jsp页面,来分页显示数据,并且可以执行上一页,下一页,跳到指定页码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<% //获取当前工程的路径
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<base href="<%=basePath%>">
<title>图书管理</title>
</head>
<body>
<div align="center">图书管理系统</div>
<table border = "1" width = "600" height = "300" cellspacing = "0" cellpadding = "10" align="center">
<tr align = "center" >
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<c:forEach items="${requestScope.page.items}" var="book">
<tr align = "center">
<td>${book.bookname}</td>
<td>${book.price}</td>
<td>${book.author}</td>
<td>${book.sale}</td>
<td>${book.stock}</td>
<td><a href="manager/bookServlet?action=getBook&id=${book.id}&method=update&pageNumber=${requestScope.page.pageNumber}">修改</a></td>
<td><a href="manager/bookServlet?action=delete&id=${book.id}&pageNumber=${requestScope.page.pageNumber}" onclick="return (confirm('确定删除吗?'));">删除</a></td>
</tr>
</c:forEach>
<tr align = "right">
<td colspan="7"><a href="pages/manager/book_edit.jsp?method=add&pageNumber=${requestScope.page.pageTotalNumber}">添加图书</a></td>
</tr>
</table>
<div align="center">
<%-- 如果当前页面是第一页,则不显示首页和上一页 --%>
<c:if test="${requestScope.page.pageNumber > 1}">
<a href = "manager/bookServlet?action=page&pageNumber=1">首页</a>
<a href = "manager/bookServlet?action=page&pageNumber=${requestScope.page.pageNumber-1}">上一页</a>
</c:if>
<%-- 页码输出的开始 --%>
<c:choose>
<%-- 情况1:如果总页码小于等于3,则显示页码的范围是:1 —— 总页码数 --%>
<c:when test="${requestScope.page.pageTotalNumber <= 3}">
<c:set var="begin" value="1"/>
<c:set var="end" value="${requestScope.page.pageTotalNumber}"/>
</c:when>
<%-- 情况2:如果总页码大于3 --%>
<c:when test="${requestScope.page.pageTotalNumber > 3}">
<c:choose>
<%-- 情况2.1:如果当前页码为前两页时,则显示页码的范围是:1 —— 3 --%>
<c:when test="${requestScope.page.pageNumber <= 2}">
<c:set var="begin" value="1"/>
<c:set var="end" value="3"/>
</c:when>
<%-- 情况2.2:如果当前页码为最后两页时,则显示页码的范围是:总页数减2 —— 最后一页 --%>
<c:when test="${requestScope.page.pageNumber >= requestScope.page.pageTotalNumber-2}">
<c:set var="begin" value="${requestScope.page.pageTotalNumber-2}"/>
<c:set var="end" value="${requestScope.page.pageTotalNumber}"/>
</c:when>
<%-- 情况2.3:如果当前页码为其他页码时,则显示页码的范围是:当前页码减1 —— 当前页码加1 --%>
<c:otherwise>
<c:set var="begin" value="${requestScope.page.pageNumber-1}"/>
<c:set var="end" value="${requestScope.page.pageNumber+1}"/>
</c:otherwise>
</c:choose>
</c:when>
</c:choose>
<c:forEach begin="${begin}" end="${end}" var="i">
<c:if test="${i == requestScope.page.pageNumber}">
【${i}】
</c:if>
<c:if test="${i != requestScope.page.pageNumber}">
<a href="manager/bookServlet?action=page&pageNumber=${i}">${i}</a>
</c:if>
</c:forEach>
<%-- 页码输出的结束 --%>
<%-- 如果当前页面已经是最后一页,则不显示下一页和末页 --%>
<c:if test="${requestScope.page.pageNumber < requestScope.page.pageTotalNumber}">
<a href = "manager/bookServlet?action=page&pageNumber=${requestScope.page.pageNumber+1}">下一页</a>
<a href = "manager/bookServlet?action=page&pageNumber=${requestScope.page.pageTotalNumber}">末页</a>
</c:if>
共${requestScope.page.pageTotalNumber}页,${requestScope.page.dataTotalCount}条记录,到第<input value="${param.pageNumber}" id="page_input">页
<input type="button" value="确定" onclick="location.href='manager/bookServlet?action=page&pageNumber='+document.getElementById('page_input').value">
<!--location.href表示链接的路径,document.getElementById('page_input').value表示获取输入框中的内容-->
</div>
</body>
</html>
②修改book_edit.jsp页面,来显示执行完添加、修改、删除操作后对应的页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<title>编辑图书</title>
<base href="http://localhost:8080/StudyProject_war_exploded/">
</head>
<body>
<div align="center">编辑图书</div>
<div align="center">
<form action="manager/bookServlet" method="post">
<input type="hidden" name="action" value="${param.method}">
<input type="hidden" name="pageNumber" value="${param.pageNumber}">
<input type="hidden" name="id" value="${requestScope.book.id}">
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input type="text" name="bookname" value="${requestScope.book.bookname}"/></td>
<td><input type="text" name="price" value="${requestScope.book.price}"/></td>
<td><input type="text" name="author" value="${requestScope.book.author}"/></td>
<td><input type="text" name="sale" value="${requestScope.book.sale}"/></td>
<td><input type="text" name="stock" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
</body>
</html>