目录
1、首页图书表单的显示
package web;
import pojo.Book;
import pojo.Page;
import service.BookService;
import service.impl.BookServiceImpl;
import utils.WebUtils;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ClientBookServlet extends BaseServlet{
private BookService bookService = new BookServiceImpl();
protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 获取请求的参数pageNo和pageSize
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),1);
int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
// 2 调用bookService.page(int pageNo,int pageSize)==Page,获取Page对象
Page<Book> page = bookService.page(pageNo,pageSize);
// 3 将page保存到域对象中
req.setAttribute("page",page);
// 4 请求转发到pages/client/index.jsp页面
req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
}
}
<servlet>
<servlet-name>ClientBookServlet</servlet-name>
<servlet-class>web.ClientBookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ClientBookServlet</servlet-name>
<url-pattern>/client/bookServlet</url-pattern>
</servlet-mapping>
<jsp:forward page="/client/bookServlet?action=page"></jsp:forward>
<%--开始显示图书--%>
<c:forEach items="${requestScope.page.items}" var="book">
<div class="b_list">
<div class="img_div">
<img class="book_img" alt="" src="static/img/default.jpg" />
</div>
<div class="book_info">
<div class="book_name">
<span class="sp1">书名:</span>
<span class="sp2">${book.name}</span>
</div>
<div class="book_author">
<span class="sp1">作者:</span>
<span class="sp2">${book.author}</span>
</div>
<div class="book_price">
<span class="sp1">价格:</span>
<span class="sp2">¥${book.price}</span>
</div>
<div class="book_sales">
<span class="sp1">销量:</span>
<span class="sp2">${book.sales}</span>
</div>
<div class="book_amount">
<span class="sp1">库存:</span>
<span class="sp2">${book.stock}</span>
</div>
<div class="book_add">
<button>加入购物车</button>
</div>
</div>
</div>
</c:forEach>
<%--结束显示图书--%>
2、分页代码的优化
- 在类Page中创建属性url
// 页码引用地址
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
- 将图书管理模块与首页模块分页功能的引用地址更改
<a href="${requestScope.page.url}&pageNo=1">首页</a>
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo-1}">上一页</a>
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo+1}">下一页</a>
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageTotal}">末页</a>
location.href="${pageScope.basePath}${requestScope.page.url}&pageNo=" + pageNo;
- 在Servlet模块中给url赋值
// 设置页码的引用地址
page.setUrl("manager/bookServlet?action=page");
// 设置页码的引用地址
page.setUrl("client/bookServlet?action=page");
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--分页条的开始--%>
<div id="page_nav">
<%--页码大于1,才显示首页和上一页--%>
<c:if test="${requestScope.page.pageNo > 1}">
<a href="${requestScope.page.url}&pageNo=1">首页</a>
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo-1}">上一页</a>
</c:if>
<%--页码输出开始--%>
<c:choose>
<%--情况1:总的页码数小于等于5--%>
<c:when test="${requestScope.page.pageTotal <= 5}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${requestScope.page.pageTotal}"></c:set>
</c:when>
<%--情况2:总的页码数大于5页--%>
<c:when test="${requestScope.page.pageTotal > 5}">
<c:choose>
<%--子情况1:当前页面在前三页--%>
<c:when test="${requestScope.page.pageNo <= 3}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="5"></c:set>
</c:when>
<%--子情况2:当前页面在最后三页--%>
<c:when test="${requestScope.page.pageNo > requestScope.page.pageTotal - 4}">
<c:set var="begin" value="${requestScope.page.pageTotal - 4}"></c:set>
<c:set var="end" value="${requestScope.page.pageTotal}"></c:set>
</c:when>
<%--子情况3:当前页面在中间--%>
<c:otherwise>
<c:set var="begin" value="${requestScope.page.pageNo - 2}"></c:set>
<c:set var="end" value="${requestScope.page.pageNo + 2}"></c:set>
</c:otherwise>
</c:choose>
</c:when>
</c:choose>
<c:forEach begin="${begin}" end="${end}" var="i">
<c:if test="${requestScope.page.pageNo == i}">
【${i}】
</c:if>
<c:if test="${requestScope.page.pageNo != i}">
<a href="${requestScope.page.url}&pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
<%--页码输出结束--%>
<%--页码小于总页码,才显示末页和下一页--%>
<c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo+1}">下一页</a>
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageTotal}">末页</a>
</c:if>
共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
到第<input value="${param.pageNo}" name="pn" id="pn_input"/>页
<input id="searchPageBtn" type="button" value="确定">
<script type="text/javascript">
$(function () {
$("#searchPageBtn").click(function () {
var pageNo = $("#pn_input").val();
location.href="${pageScope.basePath}${requestScope.page.url}&pageNo=" + pageNo;
});
});
</script>
</div>
<%--分页条的结束--%>
<%--静态包含分页功能--%>
<%@ include file="/pages/common/page_nav.jsp"%>
3、价格筛选功能的实现
-
BookDao
Integer queryForPageTotalCountByPrice(int min, int max);
List<Book> queryForPageItemsByPrice(int begin, int pageSize, int min, int max);
- BookDaoImpl
@Override
public Integer queryForPageTotalCountByPrice(int min, int max) {
String sql = "select count(*) from t_book where price between ? and ?";
Number count = (Number) queryForSingleValue(sql,min,max);
return count.intValue();
}
@Override
public List<Book> queryForPageItemsByPrice(int begin, int pageSize, int min, int max) {
String sql = "select `id`,`name`,`author`,`price`,`sales`,`stock`,`img_path` `imgPath` " +
"from t_book where price between ? and ? order by price limit ?,?";
List<Book> books = queryForList(Book.class, sql,min,max,begin, pageSize);
return books;
}
- 测试
@Test
public void queryForPageTotalCountByPrice() {
System.out.println(bookDao.queryForPageTotalCountByPrice(5,50));
}
@Test
public void queryForPageItemsByPrice() {
for (Book book : bookDao.queryForPageItemsByPrice(0, 4,5,50)) {
System.out.println(book);
}
}
- BookService
Page<Book> pageByPrice(int pageNo, int pageSize, int min, int max);
- BookServiceImpl
@Override
public Page<Book> pageByPrice(int pageNo, int pageSize, int min, int max) {
Page<Book> page = new Page<Book>();
page.setPageSize(pageSize);
// 1 求总的记录数
Integer pageTotalCount = bookDao.queryForPageTotalCountByPrice(min,max);
page.setPageTotalCount(pageTotalCount);
// 2 求总的页码
Integer pageTotal = pageTotalCount / pageSize;
if (pageTotalCount % pageSize > 0) {
pageTotal++;
}
page.setPageTotal(pageTotal);
// 数据边界的有效检查
if(pageNo < 1) {
pageNo = 1;
}
if (pageNo > pageTotal) {
pageNo = pageTotal;
}
page.setPageNo(pageNo);
// 3 求当前页数据
// 设置开始索引位置
int begin = (pageNo - 1) * Page.PAGE_SIZE;
List<Book> items = bookDao.queryForPageItemsByPrice(begin,pageSize,min,max);
page.setItems(items);
return page;
}
- 测试
@Test
public void pageByPrice() {
System.out.println(bookService.pageByPrice(1, 4,5,50));
}
- ClientBookServlet
protected void pageByPrice(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 获取请求的参数pageNo、ageSize、min、max
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),1);
int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
int min = WebUtils.parseInt(req.getParameter("min"),0);
int max = WebUtils.parseInt(req.getParameter("max"),Integer.MAX_VALUE);
// 2 调用bookService.pageByPrice(int pageNo,int pageSize,min,max)==Page,获取Page对象
Page<Book> page = bookService.pageByPrice(pageNo,pageSize,min,max);
// 设置页码的引用地址
page.setUrl("client/bookServlet?action=pageByPrice");
// 3 将page保存到域对象中
req.setAttribute("page",page);
// 4 请求转发到pages/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/client/index.jsp").forward(req,resp);
}
- 修改表单的提交地址、增加隐藏输入框指明调用的方法、价格搜索框数据的回显
<form action="client/bookServlet" method="get">
<input type="hidden" name="action" value="pageByPrice">
价格:<input id="min" type="text" name="min" value="${param.min}"> 元 -
<input id="max" type="text" name="max" value="${param.max}"> 元
<input type="submit" value="查询" />
</form>
- ClientBookServlet中的pageByPrice方法
// 设置页码的引用地址
StringBuilder stringBuilder = new StringBuilder("client/bookServlet?action=pageByPrice");
if (req.getParameter("min") != null) {
stringBuilder.append("&min=").append(req.getParameter("min"));
}
if (req.getParameter("max") != null) {
stringBuilder.append("&max=").append(req.getParameter("max"));
}
page.setUrl(stringBuilder.toString());
注:本文章所含内容来源于尚硅谷教育,仅供学习参考使用。