简易购物车---分页

这篇博客介绍了如何在Java中实现图书信息的分页功能。首先定义了一个PageBean类,包含当前页码、总页数、每页显示数量等属性。接着创建了BookDAO类,用于与数据库交互,实现分页查询。最后通过Servlet处理HTTP请求,根据当前页码获取图书列表并展示在页面上。

 昨天做了获取图书信息的功能,今天呢,来实现分页的功能!
首先要建立个javabean.
public class PageBean {
 //当前页的页码
 private int currentPage;
 //共多少页
 private int totalPageNumber;
 //当前页需要显示的 List
 private List currentPageList;
 //共多少条记录
 private int totalItemNumer; 
 //当前页开始的索引
 private int fromIndex; 
 //当前页结束的索引
 private int toIndex;
 //每页显示多少条记录
 private static final int PER_PAGE_ITEM_NUMBER = 8;
 
 //构造器, 接受 currentPage 和 totalItemNumber, 注意 currentPage 前面的 "this"
 public PageBean(int currentPage, int totalItemNumer) {
  this.currentPage = currentPage;
  this.totalItemNumer = totalItemNumer;
  
  //确定共多少页.
  totalPageNumber = totalItemNumer % PER_PAGE_ITEM_NUMBER == 0 ?
    totalItemNumer / PER_PAGE_ITEM_NUMBER :  (totalItemNumer / PER_PAGE_ITEM_NUMBER + 1);
  
  //重新确定当前页的页码, 当前页的页码不能小于 1, 也不能大于 totalPageNumber
  if(currentPage < 1)
   this.currentPage = 1;
  if(currentPage > totalPageNumber)
   this.currentPage = totalPageNumber;
  
  //确定开始的索引
  fromIndex = (this.currentPage - 1) * PER_PAGE_ITEM_NUMBER;
  
  //结束结束的索引, 需要判断是不是最后一页
  if(this.currentPage == totalPageNumber){
   toIndex = totalItemNumer;
  }else{
   toIndex = fromIndex + PER_PAGE_ITEM_NUMBER;
  }
  
  //System.out.println("currentPage: " + currentPage);
  //System.out.println("this.currentPage: " + this.currentPage);
 }

 public int getCurrentPage() {
  return currentPage;
 }

 public void setCurrentPage(int currentPage) {
  this.currentPage = currentPage;
 }

 public int getTotalPageNumber() {
  return totalPageNumber;
 }

 public void setTotalPageNumber(int totalPageNumber) {
  this.totalPageNumber = totalPageNumber;
 }

 public List getCurrentPageList() {
  return currentPageList;
 }

 public void setCurrentPageList(List currentPageList) {
  this.currentPageList = currentPageList;
 }

 public int getTotalItemNumer() {
  return totalItemNumer;
 }

 public void setTotalItemNumer(int totalItemNumer) {
  this.totalItemNumer = totalItemNumer;
 }

 public int getFromIndex() {
  return fromIndex;
 }

 public void setFromIndex(int fromIndex) {
  this.fromIndex = fromIndex;
 }

 public int getToIndex() {
  return toIndex;
 }

 public void setToIndex(int toIndex) {
  this.toIndex = toIndex;
 }
}
2.建立DAO ,与数据库连接.
public class BookDAO {
 
 //分页需要的 queryPerPagePageBean 方法
 //sql: SELECT * FROM 表名称 LIMIT M,N --> 从数据库表中 M 条记录开始检索N条记录的语句:
 public PageBean queryPerPagePageBean(int currentPageNumber){
  System.out.println("queryPerPagePageBean");
  
  PageBean pageBean = null;
  
  //获取 books 表中有多少条记录
  int totalItemNumber = 0;
  totalItemNumber = this.getBookTotalItemNumber();
  
  pageBean = new PageBean(currentPageNumber, totalItemNumber);
  
  //查询数据库, 获取当前页需要的 List
  //1. 获取一个数据库连接: 调用 DBHelper.getConnection() 方法
  Connection conn = null;
  conn = DBHelper.getConnection();
  
  //2. 定义一个 Sql 语句: SELECT id, name, title, price, yr, description, saleAmount FROM books LIMIT m, n
  //2.1 确定 m 的值
  int fromIndex = pageBean.getFromIndex();
  
  //2.2 确定 n 的值
  int n = pageBean.getToIndex() - pageBean.getFromIndex();
  
  String sql = "SELECT id, name, title, price, yr, description, saleAmount FROM books LIMIT ?, ?";
  
  //3. 定义需要传递给 QueryRunner 对象的 query 方法第三个参数的 Object[]
  Object [] params = new Object[]{fromIndex, n};
  
  //4. 创建 dbutils 中的 QueryRunner 对象
  QueryRunner queryRunner = null;
  queryRunner = new QueryRunner();
  
  //5. 调用 QueryRunner 对象 的 query(Connection, sql, params, new BeanListHandler(Book.class)); 返回一个 List
  //   将返回值赋给 books
  List books = null;
  try {
   books = (List) queryRunner.query(conn, sql, params, new BeanListHandler(Book.class));
  } catch (SQLException e) {
   e.printStackTrace();
   //5.1 若出现异常信息以 RuntimeException 的形式抛出去, 类似于 DBHelper
      //    封装后的异常信息为 MyBookStoreConstants.QUERY_BOOK_LIST_PER_PAGE_EXCEPTION
   throw new RuntimeException(MyBookStoreConstants.QUERY_BOOK_LIST_PER_PAGE_EXCEPTION);
  }
  
  //6. 为 pageBean 的 currentPageList 属性赋值
  pageBean.setCurrentPageList(books);
  
  return pageBean;
 }

 //获取 books 表中有多少条记录
 private int getBookTotalItemNumber() {
  int totalItemNumber = 0;
  
  //1. 获取一个数据库连接: 调用 DBHelper.getConnection() 方法
  Connection conn = DBHelper.getConnection();
  
  //2. 定义一个 Sql 语句: SELECT count(*) FROM books
  String sql = "SELECT count(*) FROM books";
  
  //3. 创建 dbutils 中的 QueryRunner 对象
  QueryRunner queryRunner = null;
  queryRunner = new QueryRunner();
  
  //4. 调用 QueryRunner 对象 的 query(Connection, sql, params, new ResultHandler(){}); 返回一个 Integer 对象
  //   将返回值赋给 totalItemNumber
  try {
   totalItemNumber = (Integer) queryRunner.query(conn, sql, new ResultSetHandler(){
    public Object handle(ResultSet resultSet) throws SQLException {
     if(resultSet != null && resultSet.next())
      return resultSet.getInt(1);
     return 0;
    }
   });
  } catch (SQLException e) {
   e.printStackTrace();
   //4.1 若出现异常信息以 RuntimeException 的形式抛出去, 类似于 DBHelper
      //    封装后的异常信息为 MyBookStoreConstants.QUERY_BOOKSTABLE_TOTAL_ITEM_NUMBER_EXCEPTION
   throw new RuntimeException(MyBookStoreConstants.QUERY_BOOKSTABLE_TOTAL_ITEM_NUMBER_EXCEPTION);
  }
  
  //5. 返回 totalItemNumber
  return totalItemNumber;
 }
}
3.建立业务逻辑:实现分页的功能.
这里只是部分代码,而其他的代码,昨天已经写出!
BookService.java
public PageBean getBooksByCurrentPageNumber(int currentPage) {
  BookDAO bookDAO = new BookDAO();
  PageBean pageBean = null;
  pageBean = bookDAO.queryPerPagePageBean(currentPage);
  
  //3. 返回
  return pageBean;
 }
}
4.这是很重要的一步,写Servlet
 CatalogPageServlet.java
public class CatalogPageServlet extends HttpServlet {

 public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  //分页问题:
  
  //1. 获取当前页的页码
  String currentPageStr = request.getParameter("currentPage");
  
  //2. 若 currentPageStr == null, 则应显示第一页
  if(currentPageStr == null)
   currentPageStr = "1";
  
  int currentPage = Integer.parseInt(currentPageStr);
  
  //3. 根据跟定的页码值, 获取当前页面使用的 List
  BookService bookService = new BookService();
  //List books = bookService.getBooksByCurrentPageNumber(currentPage);
  
  PageBean pageBean = bookService.getBooksByCurrentPageNumber(currentPage);
  
  //4. 派发页面
  String forwardPage = "/WEB-INF/jsp/catalog.jsp";
  
  
  
  request.setAttribute(MyBookStoreConstants.CURRENT_PAGE_PAGE_BEAN, pageBean);
  
  //4. 派发页面
  RequestDispatcher dispatcher = null;
  dispatcher = request.getRequestDispatcher(forwardPage);
  dispatcher.forward(request, response);
 }

}
5.显示页面:catalog.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="myBookStore" uri="/WEB-INF/tld/myBookStore.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'catalog.jsp' starting page</title>
    <script type="text/javascript">
     function trunToPage(){
      var pageForm = document.getElementByIdx("pageForm");
      
   pageForm.submit();
     }
    </script>
  </head>
 
  <body>
    <center>
     <c:if test="${requestScope.addToShoppingCartBookTitle != null}">
      <br><br>
      <font color="red">您已经将 ${requestScope.addToShoppingCartBookTitle} 加入到了购物车中</font>
     </c:if>
     <br><br>
     请选择您要购买的书:
     <br><br>
     <table cellpadding="5" cellspacing="0">
      <c:forEach items="${requestScope.currentPagePageBean.currentPageList}" var="book">
       <tr>
        <td>
         <a href="${pageContext.request.contextPath }/bookDetailServlet?bookId=${book.id }&currentPage=${requestScope.currentPagePageBean.currentPage }">${book.title }</a><br>
         ${book.name }
        </td>
        <td>${book.price }</td>
        <td><a href="${pageContext.request.contextPath }/addToShoppingCartServlet?bookId=${book.id }">加入购物车</a></td>
       </tr>
      </c:forEach>
     </table>
     
     <br><br>
     
     <form action="catalogPageServlet" id="pageForm">
      当前 ${requestScope.currentPagePageBean.currentPage } / ${requestScope.currentPagePageBean.totalPageNumber } 页 &nbsp;&nbsp;
      <c:if test="${requestScope.currentPagePageBean.currentPage != 1}">
       <a href="catalogPageServlet?currentPage=1">首页</a> &nbsp;&nbsp;
       <a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.currentPage - 1 }">上一页</a> &nbsp;&nbsp;
      </c:if>
      
      <c:if test="${requestScope.currentPagePageBean.currentPage != requestScope.currentPagePageBean.totalPageNumber}">
       <a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.currentPage + 1 }">下一页</a> &nbsp;&nbsp;
       <a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.totalPageNumber }">末页</a> &nbsp;&nbsp;
      </c:if>
     
      转到第 <input type="text" name="currentPage" onchange="trunToPage();" size="2" /> 页
     </form>
     
     <myBookStore:showCookieBook/>
    </center>
  </body>
</html>
    其实呢,分页这个功能模块,在我们的生活中可以体会的到的,只要我们浏览网页的都应该映象很深刻的。最典型的就是淘宝网的网页,你购买的东西的时候,
    购物车内东西放多了,肯定看了不是很舒服,让你一页显示多少条记录,这样让人一目了然,以便查询,查看。
    通过以上一系列的功能实现,对于购物的车的整体有了个清楚的认识,至于购物的车的功能,明天的时候再来实现。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值