我有以下代码:
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");
}
}
答案 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运行中发生变化。由于它不会改变,这是一个无限循环。
您必须首先检查会话中是否保存了列表,如果有,只需添加即可。如果没有,请创建一个。但是你只需要添加一个项目,然后你必须再次显示表格并完成。