0
点赞
收藏
分享

微信扫一扫

《尚硅谷》JavaWeb课程书城项目笔记——第五阶段(3):书城首页模块

静守幸福 2022-02-02 阅读 62

目录

1、首页图书表单的显示

2、分页代码的优化

3、价格筛选功能的实现


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());


 

注:本文章所含内容来源于尚硅谷教育,仅供学习参考使用。

举报

相关推荐

0 条评论