项目学习 —— 图书后台内容分页显示

一. 编写页面对应的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>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值