如何在 Java ee 中单击每个按钮时创建新对象?

How to create new object on each button click in Java ee?

我正在练习 Java ee,我在 jsp 中制作了两个输入字段和按钮。单击“添加”按钮时,我想将这两个字段添加到列表中,并在我的 jsp 页面上显示它们。现在每次我点击按钮时它只显示一个结果。我做错了什么?

这是我的 jsp:

<body>
    <form action="addtocart" method="GET">
        Title: <input type="text" name="title"> <br>
        Price: <input type="text" name="price"> <br>
        <button type="subtmit">Add</button>
    </form>
    <c:forEach var="bookList" items="${book}"> 
        <ul>
            <li>${bookList.name}</li>
            <li>${bookList.price}</li>
        </ul>          
    </c:forEach>
</body>

这是我的 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"));
        ArrayList<Book> list = new ArrayList<>();    
        list.add(new Book(title,price));   
        session.setAttribute("book", list);      
        RequestDispatcher rd = request.getRequestDispatcher("home.jsp");
        rd.forward(request, response);
    }

每次语句 session.setAttribute("book", list); 运行时,它都会用新列表替换会话中的先前列表。

您应该首先尝试获取现有列表,然后将您当前的图书对象添加到其中。

ArrayList<Book> list =(ArrayList<Book>)session.getAttribute("book");  // get the current list from the session
list.add(new Book(...));
session.setAttribute("book", list);  // store list in session

这应该会为您提供所需的输出。确保您处理了在列表中添加元素时可能抛出的 NullPointerException

问题

您将在每次调用 doGet 时创建一个新的 ArrayList<Book> 并将其设置到会话中。因此,在每次调用 doGet 时,列表都会被重置。

解决方案

从会话中获取现有列表并向其中添加一本书。仅在会话中不存在时才创建新列表。

@WebServlet("/addtocart")
public class BooklistServlet extends HttpServlet {
    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"));
        ArrayList<Book> list = (ArrayList<Book>) session.getAttribute("book");
        if (list == null) {
            list = new ArrayList<Book>();
        }
        list.add(new Book(title, price));
        session.setAttribute("book", list);
        RequestDispatcher view = request.getRequestDispatcher("home.jsp");
        view.forward(request, response);
    }
}

此外,我建议您仅在列表不为空时才显示列表,如下所示:

<body>
    <form action="addtocart" method="GET">
        Title: <input type="text" name="title"> <br> Price: <input
            type="text" name="price"> <br>
        <button type="submit">Add</button>
    </form>
    <c:forEach var="bookList" items="${book}">
        <c:if test="${not empty book}">
            <ul>
                <li>${bookList.title}</li>
                <li>${bookList.price}</li>
            </ul>
        </c:if>
    </c:forEach>
</body>

如您所见,我添加了检查 <c:if test="${not empty book}"> 作为列表可见性的条件。