目录
1、首页图书表单的显示
2、分页代码的优化
3、价格筛选功能的实现
1、首页图书表单的显示
新建ClientBookServlet类
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 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);
}
}
ClientBookServlet
web.ClientBookServlet
ClientBookServlet
/client/bookServlet
由index.jsp跳转到ClientBookServlet
由ClientBookServlet查询分页数据并在client/index.jsp显示
<%--开始显示图书--%>
书名:
${book.name}
作者:
${book.author}
价格:
¥${book.price}
销量:
${book.sales}
库存:
${book.stock}
<%--结束显示图书--%>
2、分页代码的优化
将分页代码中的请求地址抽取成page类中的url属性
新建ClientBookServlet类
由index.jsp跳转到ClientBookServlet
由ClientBookServlet查询分页数据并在client/index.jsp显示
将分页代码中的请求地址抽取成page类中的url属性
在类Page中创建属性url
// 页码引用地址
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
将图书管理模块与首页模块分页功能的引用地址更改
首页 上一页
下一页 末页
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" %>
<%--分页条的开始--%>
<%--页码大于1,才显示首页和上一页--%>
首页
上一页
<%--页码输出开始--%>
<%--情况1:总的页码数小于等于5--%>
<%--情况2:总的页码数大于5页--%>
<%--子情况1:当前页面在前三页--%>
<%--子情况2:当前页面在最后三页--%>
<%--子情况3:当前页面在中间--%>
【${i}】
${i}
<%--页码输出结束--%>
<%--页码小于总页码,才显示末页和下一页--%>
下一页
末页
共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
到第页
<%--分页条的结束--%>
<%--静态包含分页功能--%> <%@ include file="/pages/common/page_nav.jsp"%>
3、价格筛选功能的实现
Dao层代码编写
Dao层代码编写
BookDao
Integer queryForPageTotalCountByPrice(int min, int max);
List 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 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 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);
}
}
Service层代码编写
BookService
PagepageByPrice(int pageNo, int pageSize, int min, int max);
BookServiceImpl
@Override
public Page pageByPrice(int pageNo, int pageSize, int min, int max) {
Page page = new Page();
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 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));
}
Servlet层代码编写
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 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);
}
显示页面的修改
修改表单的提交地址、增加隐藏输入框指明调用的方法、价格搜索框数据的回显
设置筛选数据的页码跳转
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());
注:本文章所含内容来源于尚硅谷教育,仅供学习参考使用。



