今天练习了一个购物车功能,其中有点难度的要数模糊查询下的分页功能,这里简单分析一下。
练习中没有用到数据库,而是本地缓存。
- 从页面开始分析:
对应的代码:
向后端传递page(当前页码),title
- servlet:当前页码,下一页,上一页,总页数,符合title的商品的总数量
public class ProductServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pageStr=req.getParameter("page"); String title=req.getParameter("title"); int page=1; if (pageStr!=null){ page=Integer.valueOf(pageStr); } //统计总共的条目 int totalProducts=LocalCache.getProductCount(title); //LocalCache类中处理 int totalPages=totalProducts%10==0?totalProducts/10:totalProducts/10+1; req.setAttribute("curPage",page); req.setAttribute("prePage",page>1?page-1:1); req.setAttribute("nextPage",page<totalPages?page+1:totalPages); req.setAttribute("totalPage",totalPages); req.setAttribute("title",title); req.setAttribute("products",LocalCache.getProducts(page,10,title));//根据当前页,每页显示的商品的数量,title进行查询出一个字列表,在LocalCache中处理 req.getRequestDispatcher("/WEB-INF/views/biz/list.jsp").forward(req,resp); } }
//LocalCache类中的方法
public static int getProductCount(String title){
List<Product> products=new ArrayList<>(); if (title!=null&&title.length()!=0){ productMap.values().forEach(product -> { //productMap.values()表示存储在Map中的所有商品 //lambda表达式 if (product.getTag().contains(title)){ //若商品的标签中包含了title,将它加入到新建的List中 products.add(product); } }); }else{ //若title为空,说明没有进行模糊搜索,将所有的商品放入List中 products.addAll(productMap.values()); } return products.size(); //返回商品的数量 }
//分页处理 public static List<Product> getProducts(int page, int size,String title){ List<Product> products=new ArrayList<>(); if (title!=null&&title.length()!=0){ productMap.values().forEach(product -> { //lambda表达式 if (product.getTag().contains(title)){ products.add(product); } }); }else{ products.addAll(productMap.values()); //与上一个方法相同,主要为了拿到添加完成之后的products对象 } //当前页数与当前页的第一个商品在集合中索引的关系,例如:10个数据分2页,第二页的第一个商品的索引值是5,(2-1)*5 int start=(page-1)*size; int end=products.size()>=page*size?page*size:products.size(); return products.subList(start,end); //实现分页的关键 }
在点击上一页/下一页进行查询的时候,要将id和title一同传到后台,这样才能正确查询,所以前台的页面:
<form method="post" action="/product/list.do" style="display: inline"> <input type="hidden" name="page" value="1"> <input type="hidden" name="title" value="${title}"> <input type="submit" value="首页" class="btn"> </form> <form method="post" action="/product/list.do" style="display: inline"> <input type="hidden" name="page" value="${prePage}"> <input type="hidden" name="title" value="${title}"> <input type="submit" value="上一页" class="btn"> </form> <form method="post" action="/product/list.do" style="display: inline"> <input type="hidden" name="page" value="${nextPage}"> <input type="hidden" name="title" value="${title}"> <input type="submit" value="下一页" class="btn"> </form> <form method="post" action="/product/list.do" style="display: inline"> <input type="hidden" name="page" value="${totalPage}"> <input type="hidden" name="title" value="${title}"> <input type="submit" value="尾页" class="btn">
希望能够理解!