如何在JavaEE中的每个按钮单击上创建新对象?

如何在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

我正在练习JavaEE,我在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>

标题:
价格:
添加
  • ${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)