昨天做了获取图书信息的功能,今天呢,来实现分页的功能!
首先要建立个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 }¤tPage=${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 } 页
<c:if test="${requestScope.currentPagePageBean.currentPage != 1}">
<a href="catalogPageServlet?currentPage=1">首页</a>
<a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.currentPage - 1 }">上一页</a>
</c:if>
<c:if test="${requestScope.currentPagePageBean.currentPage != requestScope.currentPagePageBean.totalPageNumber}">
<a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.currentPage + 1 }">下一页</a>
<a href="catalogPageServlet?currentPage=${requestScope.currentPagePageBean.totalPageNumber }">末页</a>
</c:if>
转到第 <input type="text" name="currentPage" onchange="trunToPage();" size="2" /> 页
</form>
<myBookStore:showCookieBook/>
</center>
</body>
</html>
其实呢,分页这个功能模块,在我们的生活中可以体会的到的,只要我们浏览网页的都应该映象很深刻的。最典型的就是淘宝网的网页,你购买的东西的时候,
购物车内东西放多了,肯定看了不是很舒服,让你一页显示多少条记录,这样让人一目了然,以便查询,查看。
通过以上一系列的功能实现,对于购物的车的整体有了个清楚的认识,至于购物的车的功能,明天的时候再来实现。