【问题标题】:How to create new object on each button click in Java ee?如何在 Java ee 中的每个按钮单击时创建新对象?
【发布时间】:2020-06-29 14:00:30
【问题描述】:

我正在练习 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);
    }

【问题讨论】:

  • 我做到了,谢谢你的回答!

标签: java servlets java-ee-7


【解决方案1】:

问题

您将在每次调用 doGet 时创建一个新的 ArrayList&lt;Book&gt;,并将其设置到会话中。因此,在每次调用 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>

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

【讨论】:

  • 他正在使用会话存储。您正在为所有用户创建共享存储!
  • @GreyFairer - 我已经在我的代码中解决了这个问题。我可以看到您已经编辑了 Nitin Pareek 的答案。确保你把null检查,否则代码会抛出NPE。
  • @ArvindKumarAvinash 嘿,现在可以使用了,谢谢!我只是很难理解这一行 (ArrayList) session.getAttribute("book");在 session 中设置属性之前如何获取属性?
  • @NemJov - 在ArrayList&lt;Book&gt; list = (ArrayList&lt;Book&gt;) session.getAttribute("book"); 行中,我们从会话中获取属性对象book。如果对象存在于会话中,它将被返回;否则,null 将被返回。因此,我们使用if (list == null) { list = new ArrayList&lt;Book&gt;(); } 进行检查,即如果listnull,则创建一个新的ArrayList 并将其分配给list。仅当list == null 时才会发生此分配,否则list 将具有从会话返回的对象。
  • 如有任何疑问,请随时发表评论。
【解决方案2】:

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

【讨论】:

  • Nitin - getAttribute 不会抛出 NPE;相反,它将返回null,随后当您调用list.add(...) 时,此调用将在null 引用上执行并引发错误。检查我的答案以了解它。
猜你喜欢
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2018-10-29
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多