从界面信息创建列表

时间:2015-01-29 15:19:01

标签: java list jsp servlets interface

我有以下代码:

    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
  • 用户按下:agregar ingrediente(添加成分)

  • 用户写道:Salt

  • 列出信息:Tomato, Salt
  • 用户按下:agregar ingrediente(添加成分)

  • 用户写道:Butter

  • 列出信息:Tomato, Salt, Butter
  • 用户按下:agregar ingrediente(添加成分)

  • 用户写道:Lettuce

  • 列出信息:Tomato, Salt, Butter, Lettuce
  • 用户按:buscar por ingredientes

这就是我所拥有的:

  • 用户写道:Tomato
  • 列出信息:Tomato
  • 用户按:agregar ingrediente(添加成分)

第一次之后,我得到一个永不停止的循环,其中列出了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");
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个Web应用程序。

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运行中发生变化。由于它不会改变,这是一个无限循环。

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