从接口信息创建列表

Create a list from interface information

我有以下代码:

    List lIngredients = new ArrayList<>();
    String ingrediente = request.getParameter("Ingredientes");
    String action = request.getParameter("action"); //elegimos a qué pantalla pasar en función de la acción que nos llegue de la interfaz

    //ingrediente = request.getParameter("Ingredientes");    
    //action = request.getParameter("action");
    if ("Buscar todas las recetas".equalsIgnoreCase(action)) {
        request.setAttribute("AllReceipes", RecetaDao.getAllReceipes());
        request.getRequestDispatcher("receipes.jsp").forward(request, response);
    } else if ("Buscar por ingredientes".equalsIgnoreCase(action)) {
        request.setAttribute("AllIngredients", RecetaDao.getSomeReceipes(ingrediente));
        request.getRequestDispatcher("perIngredient.jsp").forward(request, response);
    } else if ("Agregar ingrediente".equalsIgnoreCase(action)) {
        do {
            ingrediente = request.getParameter("Ingredientes");    
            action = request.getParameter("action");
            lIngredients.add(ingrediente);
        } while ("Agregar ingrediente".equalsIgnoreCase(action));
    }

我想从它做的是从界面中获取成分并将其保存在列表中。问题是每次我在列表中保存相同的成分。

这就是我想做的:

这是我的:

第一次之后,我得到了一个永无止境的循环,其中包含 Tomato,Tomato,Tomato,Tomato...

我该怎么做?

这是正确的代码:

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    HttpSession session = request.getSession();
    List lIngredients = (List) session.getAttribute("Ingredientes");
    response.setContentType("text/html;charset=UTF-8");
    if (lIngredients == null) {
       lIngredients = new ArrayList<>();
       session.setAttribute("Ingredientes", lIngredients);
    }
    String ingrediente = request.getParameter("Ingredientes");
    String action = request.getParameter("action"); //elegimos a qué pantalla pasar en función de la acción que nos llegue de la interfaz

    if ("Buscar todas las recetas".equalsIgnoreCase(action)) {
        request.setAttribute("AllReceipes", RecetaDao.getAllReceipes());
        request.getRequestDispatcher("receipes.jsp").forward(request, response);
    }else if ("Buscar por ingredientes".equalsIgnoreCase(action)){
              lIngredients.add(ingrediente);
              request.setAttribute("AllIngredients", RecetaDao.getSomeReceipes(lIngredients));
              request.getRequestDispatcher("perIngredient.jsp").forward(request, response);
    }else if ("Agregar ingrediente".equalsIgnoreCase(action)){
             lIngredients.add(ingrediente);
             request.getRequestDispatcher("option.jsp").forward(request, response);
             ingrediente = request.getParameter("Ingredientes");
             action = request.getParameter("action");
    }
}

这是一个网络应用程序。

Web 应用程序通过接受来自用户的数据并显示某种结果(可能包括新表单)来工作。 然后结束。 servlet 结束了,没有什么可做的了。除了请求中已有的信息,您无法从用户那里获得更多信息。

那么您如何与用户互动,通过多个输入构建一些东西?您当然不能像在控制台程序中那样在循环中执行此操作。

您所做的是将您已经获得的数据永久保存在某个地方。例如,在会话中。然后您使用 JSP 显示下一个输入的表单。然后你的 servlet 结束。

但是用户在他的浏览器上得到了那个表单。如果他决定继续工作,他会向您发送填有新信息的表格。他再次调用您的 servlet。您的 servlet 必须取回它在会话中保存的数据,并像在循环的下一次迭代中一样继续。

您的 servlet 如何知道它处于循环的哪一次迭代?好吧,如果没有保存的会话数据,那就是交互的开始。如果有保存的数据,应该有足够的数据继续。例如,如果您在会话中保存了列表的内容,那么下次调用 servlet 时,您将首先检查是否有列表。如果是这样,那么您将添加它。如果没有,您将创建一个新列表并将其保存在会话中。

底线:没有需要用户输入的循环。

现在,这就是你现在拥有的:

do {
        ingrediente = request.getParameter("Ingredientes");    
        action = request.getParameter("action");
        lIngredients.add(ingrediente);
} while ("Agregar ingrediente".equalsIgnoreCase(action));

您将信息添加到您创建的新列表中。但是你有一个无限循环,因为 action 在 servlet 的当前 运行 中永远不会改变。因为它不会改变,所以这是一个无限循环。

您必须首先检查您的会话中是否保存了列表,如果有,则添加到其中。如果没有,请创建一个。但是你只添加了一项,然后你必须再次显示表格并完成。