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

