JavaWeb实现商品列表的多条件查询和分页功能(超详细的~)

简介: JavaWeb实现商品列表的多条件查询和分页功能(超详细的~)

需求

1.在goods.txt文件夹中写入如下格式:
商品类型-商品名称-商品价格-商品数量
联想电脑-联想小新-6900-1000
写入52条数据
多条件搜索:根据商品类型和商品名称来搜索符合条件的商品
分页:一页显示5条数据,实现前一页,后一页翻页功能,实现点击跳转到指定页

先看看效果:

该项目整体代码层次:
在这里插入图片描述

Java源码采用分层来写:
bean:实体类放入该层,
util:文件工具放入该层
web:网络servlet层代码放入该层

多条件查询功能实现:

思路:获取所有商品集合,获取查询的条件,按个判断查询条件,一层层集合套,过滤出最后的结果

主要代码:

//获取查询条件
        String goodsType = req.getParameter("goods_type");
        String goodsName = req.getParameter("goods_name");
        //从文件读出商品集合
        List<Goods> goods = GoodsFileUtil.getGoodsList();
        //查询第一个条件
        List<Goods> typeGoods = new ArrayList<Goods>();
        if (null != goodsType && !"".equals(goodsType)) {
            for (Goods goods2 : goods) {
                if (goods2.getGoodsType().contains(goodsType)) {
                    typeGoods.add(goods2);
                }
            }
        } else {
            typeGoods = goods;
        }
        //查询第二个条件
        List<Goods> nameGoods = new ArrayList<Goods>();
        if (null != goodsName && !"".equals(goodsName)) {
            for (Goods goods2 : typeGoods) {
                if (goods2.getGoodsName().contains(goodsName)) {
                    nameGoods.add(goods2);
                }
            }
        } else {
            nameGoods = typeGoods;
        }

分页功能实现

分页功能实现思路:
1.输入条件,当前页,每页的数据记录条数,商品集合
2.封装分页类,属性有:pageNumb:当前页,pageSize:每页的数据数,rowCount:总共的商品数据条数,pageCount:总共有多少页,prePageNumb:上一页,nextPageNumb:下一页,currentList:当前页数展示的商品集合,提供有参构造方法,构造Pager类

Pager类

public class Pager {

    private Integer pageNumb;
    private Integer pageSize;
    
    private Integer rowCount;
    private Integer pageCount;
    private Integer prePageNumb;
    private Integer nextPageNumb;
    private List currentList;
    
    public Pager(Integer _pageNumb, Integer _pageSize, List _allList){
        //初始化每页的内容条数
        this.pageSize = _pageSize;
        
        //初始化总共的内容条数
        this.rowCount = _allList.size();
        
        //计算共有多少页
        if (this.rowCount % this.pageSize == 0) {
            this.pageCount = this.rowCount / this.pageSize;
        } else {
            this.pageCount = this.rowCount / this.pageSize + 1;
        }
        
        //修正当前页
        if (_pageNumb <= 0) {
            this.pageNumb = 1;
        } else if (_pageNumb > this.pageCount) {
            this.pageNumb = this.pageCount;
        } else {
            this.pageNumb = _pageNumb;
        }
        
        //处理前一页和后一页的页码
        this.prePageNumb = this.pageNumb - 1;
        if (this.prePageNumb <= 0) {
            this.prePageNumb = 1;
        }
        this.nextPageNumb = this.pageNumb + 1;
        if (this.nextPageNumb > this.pageCount) {
            this.nextPageNumb = this.pageCount;
        }
        
        //处理当前页的记录开始结束位置
        Integer fromIndex = (this.pageNumb - 1) * 5;
        Integer toIndex = this.pageNumb * 5;
        if (toIndex > this.rowCount) {
            toIndex = this.rowCount;
        }
        this.currentList = _allList.subList(fromIndex, toIndex);
    }

    public Integer getPageCount() {
        return pageCount;
    }

    public Integer getPageNumb() {
        return pageNumb;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public Integer getRowCount() {
        return rowCount;
    }

    public Integer getPrePageNumb() {
        return prePageNumb;
    }

    public Integer getNextPageNumb() {
        return nextPageNumb;
    }

    public List getCurrentList() {
        return currentList;
    }
    
    
}

GoodsList类对其进行构造

@WebServlet("/goodsList")
public class GoodsListServlet extends HttpServlet{

    public static final Integer PageSize = 5;
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取查询条件
        String goodsType = req.getParameter("goods_type");
        String goodsName = req.getParameter("goods_name");
        //从文件读出商品集合
        List<Goods> goods = GoodsFileUtil.getGoodsList();
        //查询第一个条件
        List<Goods> typeGoods = new ArrayList<Goods>();
        if (null != goodsType && !"".equals(goodsType)) {
            for (Goods goods2 : goods) {
                if (goods2.getGoodsType().contains(goodsType)) {
                    typeGoods.add(goods2);
                }
            }
        } else {
            typeGoods = goods;
        }
        //查询第二个条件
        List<Goods> nameGoods = new ArrayList<Goods>();
        if (null != goodsName && !"".equals(goodsName)) {
            for (Goods goods2 : typeGoods) {
                if (goods2.getGoodsName().contains(goodsName)) {
                    nameGoods.add(goods2);
                }
            }
        } else {
            nameGoods = typeGoods;
        }
        //获取当前页
        String strPageNumb = req.getParameter("pageNumb");
        Integer pageNumb = 1;
        if (null != strPageNumb && !"".equals(strPageNumb)) {
            pageNumb = Integer.valueOf(strPageNumb);
        }
        for (int i = 1; i <= goods.size(); i++) {
            Goods good = goods.get(i-1);
            good.setGoodsNum(i);
        }
        //初始化pager对象
        Pager page = new Pager(pageNumb, PageSize, nameGoods);
        req.setAttribute("page", page);
        req.setAttribute("goodsType", goodsType);
        req.setAttribute("goodsName", goodsName);
        req.getRequestDispatcher("/WEB-INF/page1.jsp")
        .forward(req, resp);
    }
}

page.jsp页面

<%@page import="com.wanshi.bean.Pager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">
<title>分页</title>
<style type="text/css">
    a{
        margin:15px 0;
        display: inline-block;
        width:60px;
        height:30px;
        background-color: #f6f6f6;
        text-align: center;
        line-height: 30px;
        text-decoration: none;
    }
    .goods-search{
        width:600px;
        margin:0 auto;
    }
    .goods-list{
        width:455px;
        margin:0 auto;
        text-align: center;
    }
</style>
</head>
<body>
    <div class="goods-search">
        <form method="get" action="${pageContext.request.contextPath }/goodsList">
            商品类别:<input type="text" name="goods_type" value="${goodsType }">&emsp;
            商品名称:<input type="text" name="goods_name" value="${goodsName }">&emsp;
            <input type="submit" value="查询" >
        </form>
    </div>
    <div class="goods-list">
        <h1>商品列表</h1>
        <table border="1">
            <tr><td>商品编号</td><td>商品类别</td><td>商品名称</td><td>商品单价</td><td>商品库存数量</td></tr>
            <c:forEach items="${page.currentList }" var="good">
                <tr><td>${good.goodsNum }</td><td>${good.goodsType }</td><td>${good.goodsName }</td><td>${good.goodsPrice }</td><td>${good.goodsCount }</td></tr>
            </c:forEach>
        </table>
        <a href="${pageContext.request.contextPath }/goodsList?pageNumb=${page.prePageNumb}">前一页</a>
        <%
            Object obj = request.getAttribute("page");
            Pager pager = (Pager)obj;
            for (int i = 1; i <= pager.getPageCount(); i++) {
        %>
        <a href="${pageContext.request.contextPath }/goodsList?pageNumb=<%=i%>"><%=i %></a>
        <%
            }
        %>                
        <a href="${pageContext.request.contextPath }/goodsList?pageNumb=${page.nextPageNumb}">后一页</a>
    </div>
</body>
</html>

ok,看下效果:

浏览器输入以下地址访问该网页:
在这里插入图片描述
搜索耳机
在这里插入图片描述
随意切换页面
在这里插入图片描述
OK,多条件查询和分页功能到此结束了,其中博主认为难以理解的是分页功能,读者若有问题,可随时联系我,
希望这篇博客可以帮助更多的人,到此功能告一段落,后期博主会出一个系统的完整增删改查,过滤器实现防跳墙,多条件查询,分页功能,感兴趣的小伙伴多多支持呀,我们下篇见!

相关文章
|
2月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
2月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
Java Stream API 的强大功能
|
3月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
433 211
|
3月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
153 6
|
3月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
209 2
|
3月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
3月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
487 64
|
Java 索引 编译器
|
1月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
153 1
|
1月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
168 1