You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlet仅对首个自动生成HTML元素生效的问题

购物车仅首个商品行操作生效的问题修复

问题背景

我是一名学生,正在开发餐饮服务Web应用,采用Java Servlet作为后端、JSP作为前端。会话中存储的Narudzbina(订单)对象包含HashMap<Proizvod, Integer>类型的stavkeNarudzbine属性,购物车JSP通过遍历该HashMap的keySet自动生成商品行。

每个商品行包含商品名称、数量输入框、修改按钮和删除按钮:修改按钮的href通过onchange事件触发updateUrl函数动态拼接请求参数;删除按钮的href为静态拼接参数。所有按钮均能正确调用Korpa Servlet,请求状态码为302且无异常抛出,但仅首个生成的商品行可成功修改数量或删除商品,其余商品行的操作无法更新会话中的数据。删除首个商品后,新的首个商品行可正常执行操作。

注:此过程未涉及数据库交互。

问题根源

核心问题出在Narudzbina类的izmeniKolicinu方法中:break语句被错误地放在了if代码块外部,导致循环仅遍历HashMap中的第一个商品就直接终止。无论传入的商品ID是否匹配,循环都只会执行一次,因此只有首个商品能被修改。删除功能出现同样问题,大概率是因为Servlet中的删除逻辑存在相同的循环终止过早问题。

修复方案

1. 修复修改数量的方法逻辑

将break语句移至if代码块内部,找到匹配的商品并完成数量更新后再终止循环,确保能遍历所有商品直到找到目标项:

// 修改商品数量:参数为商品ID、新数量
public void izmeniKolicinu(int proizvodID, int novaKolicina) {
    for (Proizvod prod : stavkeNarudzbine.keySet()) {
        if (prod.getProizvodID() == proizvodID) {
            stavkeNarudzbine.put(prod, novaKolicina);
            break; // 找到匹配项后再终止循环
        }
    }
}

2. 修复删除商品的Servlet逻辑

若删除功能的Servlet代码存在类似循环问题,需调整为遍历找到目标商品后再执行删除操作,建议使用Iterator避免遍历中修改集合引发的异常:

// 删除商品的Servlet核心逻辑示例
Narudzbina narudzbina = (Narudzbina)session.getAttribute("Narudzbina");
int proizvodID = Integer.valueOf(request.getParameter("Proizvod"));

Iterator<Proizvod> iterator = narudzbina.getStavkeNarudzbine().keySet().iterator();
while (iterator.hasNext()) {
    Proizvod prod = iterator.next();
    if (prod.getProizvodID() == proizvodID) {
        iterator.remove();
        break;
    }
}

session.setAttribute("Narudzbina", narudzbina);
response.sendRedirect("Profil?User=" + session.getAttribute("User").toString() + "&View=Korpa");

3. 前端参数验证(可选)

可通过浏览器开发者工具的网络面板,检查每个操作的请求参数是否正确携带了目标商品ID和数量,确认前端参数传递无异常。

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:54:20