У меня проблема с созданием списка на Servlet. У меня есть следующий код:
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
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
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);
}
}
Проблема заключается в том, что я все время сохраняю одно и то же значение. Я не знаю, можно ли сбросить строки "componentiente" и "action", которые я создал, и позволить пользователю выбрать другое значение из JSP.
Благодарю.
Это JSP:
'<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<form action="./optionServlet" method="POST">
<table border="1">
<form action="demo_form.asp" autocomplete="on">
<th><FONT FACE="Times New Roman" SIZE=3> Ingredientes: </th>
<td><input type="text" name="Ingredientes" value="${Receta.Ingredientes}" list="datalist1" /></td>
<datalist id="datalist1">
<option value="Aceite"><option value="AceiteOliva"> <option value="AceitunasNegras"><option value="Ajo"><option value="Albahaca">
<option value="AlbahacaFresca"><option value="Azucar"><option value="CarnePicada"><option value="Cebolla"><option value="CebollaMorada">
<option value="Croutons"><option value="DienteDeAjo"><option value="Espinaca"><option value="FileteSalmon"><option value="Guisantes">
<option value="Harina"><option value="Huevo"><option value="LaminaParaCanelones"><option value="Lechuga"><option value="Macarrones">
<option value="Mantequilla"><option value="MasaPizza"><option value="Miel"><option value="Mostaza"><option value="Oregano">
<option value="PanRallado"><option value="Patata"><option value="PechugaPollo"><option value="Pepino"><option value="Perejil"><option value="Pimienta">
<option value="PimientoRojo"><option value="QuesoFeta"><option value="QuesoMozzarella"><option value="QuesoParmesano"><option value="QuesoRicota">
<option value="Sal"><option value="SalsaQueso"><option value="Tomate"><option value="TomateTriturado"><option value="Zanahoria">
</datalist>
<button><input type="submit" name="action" value="Buscar todas las recetas" /></button>
<button><input type="submit" name="action" value="Buscar por ingredientes" /></button>
<button><input type="submit" name="action" value="Agregar ingrediente" /></button>
<table>
<tr>
<td> <font color="#74DF00"><b><c:out value="${mensajesOK}"/></b></font> </td>'
Это правильный код:
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");
}
}
Проблема в том, что вы создаете новый List
при каждом запросе.
List lIngredients = new ArrayList<>();
Поскольку это локальная переменная, она перестает существовать, как только этот запрос завершается. Так, что предыдущие значения доступны, когда пользователь решает, наконец, искать рецепты, вы должны сохраняться ингредиентом List
на сессию.
HttpSession session = request.getSession();
List lIngredients = (List) session.getAttribute("Ingredientes");
if (lIngredients == null) {
List lIngredients = new ArrayList<>();
session.setAttribute("Ingredientes", lIngredientes);
}
session
тоже. В противном случае session.getAttribute()
всегда будет возвращать null
. Я пропустил это и обновил это в своем ответе сейчас.