pasar - ¿Cómo paso el elemento actual al método de Java haciendo clic en un hipervínculo o botón en la página JSP?
pasar datos a un jsp (1)
La manera más simple: simplemente deje que el enlace apunte a una página JSP y pase la identificación de fila como parámetro:
<a href="delete.jsp?id=1">delete</a>
Y en delete.jsp
(dejo de lado la comprobación / validación obvia de parámetros de solicitud) :
<% dao.delete(Long.valueOf(request.getParameter("id"))); %>
Sin embargo, esta es una práctica bastante pobre (que todavía era una subestimación) y debido a dos razones:
Las solicitudes HTTP que modifican los datos en el lado del servidor no deberían ser realizadas por GET , sino por POST . Los enlaces son GET implícitos. Imagine lo que sucedería cuando un rastreador web como googlebot intente seguir todos los enlaces de eliminación. Debe usar un
<form method="post">
y un<button type="submit">
para la acción de eliminación. Sin embargo, puede usar CSS para darle un estilo al botón para que parezca un enlace. Los enlaces de edición que solo precargan el elemento para rellenar el formulario de edición pueden obtenerse de manera segura.Se desaconseja poner lógica de negocios ( funciones como se le llama) en un JSP usando scriptlets (esas cosas
<% %>
%%<% %>
). Debe usar un Servlet para controlar, preprocesar y posprocesar las solicitudes HTTP.
Como no dijo una palabra acerca de un servlet en su pregunta, sospecho que ya está usando scriptlets para cargar datos de DB y mostrarlos en una tabla. Eso también debería ser hecho por un servlet.
Aquí hay un ejemplo básico de inicio cómo hacerlo todo. No tengo idea de qué representan los datos de la tabla, así que tomemos el Product
como ejemplo.
public class Product {
private Long id;
private String name;
private String description;
private BigDecimal price;
// Add/generate public getters and setters.
}
Y luego el archivo JSP que usa JSTL (simplemente suelte jstl-1.2.jar en /WEB-INF/lib
para instalarlo) para mostrar los productos en una tabla con un enlace de edición y un botón de eliminar en cada fila:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<form action="products" method="post">
<table>
<c:forEach items="${products}" var="product">
<tr>
<td><c:out value="${fn:escapeXml(product.name)}" /></td>
<td><c:out value="${product.description}" /></td>
<td><fmt:formatNumber value="${product.price}" type="currency" currencyCode="USD" /></td>
<td><a href="${pageContext.request.contextPath}/product?edit=${product.id}">edit</a></td>
<td><button type="submit" name="delete" value="${product.id}">delete</button></td>
</tr>
</c:forEach>
</table>
<a href="${pageContext.request.contextPath}/product">add</a>
</form>
Denomínelo products.jsp
y /WEB-INF
carpeta /WEB-INF
para que no se pueda acceder a él directamente por URL (de modo que el usuario final se vea obligado a llamar al servlet).
Así es como se ve el servlet aproximadamente (la validación se omite por brevedad):
@WebServlet("/products")
public class ProductsServlet extends HttpServlet {
private ProductDAO productDAO; // EJB, plain DAO, etc.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Product> products = productDAO.list();
request.setAttribute("products", products); // Will be available as ${products} in JSP.
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String delete = request.getParameter("delete");
if (delete != null) { // Is the delete button pressed?
productDAO.delete(Long.valueOf(delete));
}
response.sendRedirect(request.getContextPath() + "/products"); // Refresh page with table.
}
}
Así es como se puede ver el formulario de agregar / editar en /WEB-INF/product.jsp
:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<form action="product" method="post">
<label for="name">Name</label>
<input id="name" name="name" value="${fn:escapeXml(product.name)}" />
<br/>
<label for="description">Description</label>
<input id="description" name="description" value="${fn:escapeXml(product.description)}" />
<br/>
<label for="price">Price</label>
<input id="price" name="price" value="${fn:escapeXml(product.price)}" />
<br/>
<button type="submit" name="save" value="${product.id}">save</button>
</form>
El fn:escapeXml()
está ahí para evitar ataques XSS cuando se vuelven a mostrar los datos de edición, hace exactamente lo mismo que <c:out>
, solo que es más adecuado para su uso en attribus.
Así es como se ve el servlet del product
(de nuevo, la conversión / validación se omite por brevedad):
@WebServlet("/product")
public class ProductServlet extends HttpServlet {
private ProductDAO productDAO; // EJB, plain DAO, etc.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String edit = request.getParameter("edit");
if (edit != null) { // Is the edit link clicked?
Product product = productDAO.find(Long.valueOf(delete));
request.setAttribute("product", product); // Will be available as ${product} in JSP.
}
request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String save = request.getParameter("save");
if (save != null) { // Is the save button pressed? (note: if empty then no product ID was supplied, which means that it''s "add product".
Product product = (save.isEmpty()) ? new Product() : productDAO.find(Long.valueOf(save));
product.setName(request.getParameter("name"));
product.setDescription(request.getParameter("description"));
product.setPrice(new BigDecimal(request.getParameter("price")));
productDAO.save(product);
}
response.sendRedirect(request.getContextPath() + "/products"); // Go to page with table.
}
}
Implementar y ejecutarlo. Puede abrir la tabla en http://example.com/contextname/products .
Ver también:
- Nuestra página wiki servlets (también contiene un ejemplo con validación)
- doGet y doPost en Servlets
- Mostrar JDBC ResultSet en HTML en la página JSP usando el patrón MVC y DAO
Tengo una tabla HTML con filas extraídas de una base de datos que se muestra en esa tabla. Quiero que el usuario pueda eliminar una fila haciendo clic en un hipervínculo o botón de eliminación además de cada fila.
¿Cómo invoco una función JSP en la página, cuando el usuario hace clic en cada uno de esos hipervínculos o botón de eliminación, para poder eliminar la entrada de esa fila de la base de datos? ¿Qué debería exactamente tener la etiqueta <a>
o <button>
para llamar a la función JSP?
Tenga en cuenta que necesito llamar a una función JSP, no a una función de JavaScript.