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

Java EE点击按钮新增对象至列表仅显示单个结果的问题排查

问题分析与解决方案

哦,这个问题我太熟啦!你每次点击Add按钮只能显示一个结果的核心原因是:每次请求Servlet时,你都创建了一个全新的ArrayList,完全覆盖了之前Session里保存的列表。

具体问题点:

在你的Servlet代码里,这行代码是关键问题:

ArrayList<Book> list = new ArrayList<>();

每次点击按钮触发请求,都会新建一个空列表,然后只加入当前的书籍,再把这个新列表存到Session里——这样之前添加的内容就全丢了,自然只能看到最新的那一条。

修复步骤:

  1. 先从Session获取已有列表:如果Session里还没有book列表(也就是第一次点击的时候),再创建新的ArrayList;如果已经存在,就直接用这个列表。
  2. 修正HTML按钮的拼写错误:你的按钮type写成了subtmit,正确应该是submit,不然可能导致表单提交异常。

修改后的代码:

1. 修正后的Servlet代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    HttpSession session = request.getSession(true);
    String title = request.getParameter("title");
    double price = Double.parseDouble(request.getParameter("price"));

    // 先从Session获取已有的列表,不存在则新建
    ArrayList<Book> list = (ArrayList<Book>) session.getAttribute("book");
    if (list == null) {
        list = new ArrayList<>();
    }

    // 添加新书籍到列表
    list.add(new Book(title, price));
    // 把更新后的列表存回Session
    session.setAttribute("book", list);

    RequestDispatcher rd = request.getRequestDispatcher("home.jsp");
    rd.forward(request, response);
}

2. 修正后的JSP表单按钮:

<button type="submit">Add</button>

验证效果:

现在每次点击Add按钮,Servlet会先取出Session里已有的书籍列表(如果是第一次则新建),把新的书籍添加进去,再存回Session。JSP页面的c:forEach标签就能遍历所有添加过的书籍,显示完整的列表啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:57:54