如何在 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}">
作为列表可见性的条件。
我正在练习 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}">
作为列表可见性的条件。