如何在JavaEE中的每个按钮单击上创建新对象?
我正在练习JavaEE,我在jsp中创建了两个输入字段和按钮。当点击“添加”按钮时,我想在列表中添加这两个字段,并在我的jsp页面上显示它们。现在,每次我点击按钮时,它只显示一个结果。我做错了什么 这是我的jsp:如何在JavaEE中的每个按钮单击上创建新对象?,java,servlets,java-ee-7,Java,Servlets,Java Ee 7,我正在练习JavaEE,我在jsp中创建了两个输入字段和按钮。当点击“添加”按钮时,我想在列表中添加这两个字段,并在我的jsp页面上显示它们。现在,每次我点击按钮时,它只显示一个结果。我做错了什么 这是我的jsp: <body> <form action="addtocart" method="GET"> Title: <input type="text" name="ti
<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>
标题:
价格:
添加
- ${bookList.name}
- ${bookList.price}
这是我的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);
}
protectedvoid doGet(HttpServletRequest请求,HttpServletResponse响应)
抛出ServletException,IOException{
HttpSession session=request.getSession(true);
字符串title=request.getParameter(“title”);
double price=double.parseDouble(request.getParameter(“price”));
ArrayList=新建ArrayList();
增加(新书(书名、价格);
session.setAttribute(“book”,list);
RequestDispatcher rd=request.getRequestDispatcher(“home.jsp”);
转发(请求、响应);
}
每次语句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
ArrayList list=(ArrayList)session.getAttribute(“book”);//从会话中获取当前列表
添加(新书(…);
session.setAttribute(“book”,list);//在会话中存储列表
这将为您提供所需的输出。。确保处理在列表中添加元素时可能引发的NullPointerException。每次执行语句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
ArrayList list=(ArrayList)session.getAttribute(“book”);//从会话中获取当前列表
添加(新书(…);
session.setAttribute(“book”,list);//在会话中存储列表
这将为您提供所需的输出。。确保处理在列表中添加元素时可能引发的NullPointerException。问题
在每次调用doGet
时,您都会创建一个新的ArrayList
,并将其设置到会话中。因此,每次调用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);
}
}
@WebServlet(“/addtocart”)
公共类BooklistServlet扩展了HttpServlet{
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
HttpSession session=request.getSession(true);
字符串title=request.getParameter(“title”);
double price=double.parseDouble(request.getParameter(“price”));
ArrayList=(ArrayList)session.getAttribute(“book”);
if(list==null){
列表=新的ArrayList();
}
增加(新书(书名、价格);
session.setAttribute(“book”,list);
RequestDispatcher视图=request.getRequestDispatcher(“home.jsp”);
视图。转发(请求、响应);
}
}
此外,我建议您仅在列表不为空时显示列表,如下所示:
<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>
标题:
价格:
添加
- ${bookList.title}
- ${bookList.price}
如您所见,我添加了检查
作为列表可见性的条件。问题
在每次调用doGet
时,您都会创建一个新的ArrayList
,并将其设置到会话中。因此,每次调用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);
}
}
@WebServlet(“/addtocart”)
公共类BooklistServlet扩展了HttpServlet{
受保护的void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
HttpSession session=request.getSession(true);
字符串title=request.getParameter(“title”);
double price=double.parseDouble(request.getParameter(“price”));
ArrayList=(ArrayList)session.getAttribute(“book”);
if(list==null){
列表=新的ArrayList();
}
增加(新书(书名、价格);
session.setAttribute(“book”,list);
RequestDispatcher视图=request.getRequestDispatcher(“home.jsp”);
视图。转发(请求、响应);
}
}
此外,我建议您仅在列表不为空时显示列表,如下所示:
<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>
标题:
价格:
添加
- ${bookList.title}
- ${bookList.price}
如您所见,我添加了检查
作为列表可见性的条件。他使用的是会话存储。您正在为所有用户创建共享存储@格雷菲尔-我已经在代码中修复了这个问题。我可以看到你编辑了尼廷·帕雷克的答案。请确保将null
选中,否则该代码将抛出NPE。@ArvindKumarAvinash嘿,它现在可以工作了,谢谢!我只是很难理解这一行(ArrayList)session.getAttribute(“book”);在会话中设置属性之前,如何获取属性?@NemJov-在行中,ArrayList list=(Arr)