gpt4 book ai didi

jsp - 如何通过单击 JSP 页面中的超链接或按钮将当前项目传递给 Java 方法?

转载 作者:行者123 更新时间:2023-12-04 15:57:48 27 4
gpt4 key购买 nike

我有一个 HTML 表,其中包含从该表中显示的数据库中提取的行。我希望用户能够通过单击每行旁边的删除超链接或按钮来删除一行。

当用户单击每个删除超链接或按钮时,如何调用页面上的 JSP 函数,以便我可以从数据库中删除该行的条目? <a>究竟应该怎么做?或 <button>标签必须调用JSP函数吗?

请注意,我需要调用 JSP 函数,而不是 JavaScript 函数。

最佳答案

最简单的方法:让链接指向一个 JSP 页面并将行 ID 作为参数传递:

<a href="delete.jsp?id=1">delete</a>
而在 delete.jsp (我将明显的请求参数检查/验证放在一边):
<% dao.delete(Long.valueOf(request.getParameter("id"))); %>
然而,这是一个漂亮的 poor practice (这仍然是轻描淡写)并且由于两个原因:
  • 修改服务器端数据的 HTTP 请求不应该由 GET 来完成,但来自 POST .链接是隐式 GET。想象一下当像 googlebot 这样的网络爬虫试图跟踪所有删除链接时会发生什么。您应该使用 <form method="post">和一个 <button type="submit">对于删除操作。但是,您可以使用 CSS 将按钮的样式设置为看起来像一个链接。仅预加载项目以预填充编辑表单的编辑链接可以安全地获取。
  • 不鼓励使用 scriptlet(那些 <% %> 东西)将业务逻辑(如您所称的函数)放在 JSP 中。您应该使用 Servlet 来控制、预处理和后处理 HTTP 请求。

  • 由于您没有在问题中提及任何有关 servlet 的信息,我怀疑您已经在使用 scriptlet 从 DB 加载数据并将其显示在表中。这也应该由 servlet 来完成。
    这是一个基本的启动示例如何完成所有操作。我不知道表数据代表什么,所以让我们拿 Product举个例子。
    public class Product {
    private Long id;
    private String name;
    private String description;
    private BigDecimal price;
    // Add/generate public getters and setters.
    }
    然后是使用 JSTL 的 JSP 文件(只需将 jstl-1.2.jar 放入 /WEB-INF/lib 即可安装)以在表格中显示产品,每行都有一个编辑链接和一个删除按钮:
    <%@ 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>
    请注意方法的不同之处:编辑链接会使用项目的唯一标识符作为请求参数触发 GET 请求。但是,删除按钮会触发 POST 请求,从而将项目的唯一标识符作为按钮本身的值传递。
    另存为 products.jsp并将其放入 /WEB-INF文件夹,以便它不能通过 URL 直接访问(因此最终用户被迫为此调用 servlet)。
    下面是 servlet 的大致样子(为简洁起见,省略了验证):
    @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.
    }

    }
    以下是 /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>
    fn:escapeXml()只是为了防止 XSS attacks当编辑数据重新显示时,它的作用与 <c:out> 完全相同,只更适合在属性中使用。
    以下是 product servlet 看起来像(同样,为简洁起见,省略了转换/验证):
    @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.
    }

    }
    部署并运行它。您可以通过 http://example.com/contextname/products打开表格.
    另见:
  • Our servlets wiki page (还包含一个带有验证的示例)
  • doGet and doPost in Servlets
  • Show JDBC ResultSet in HTML in JSP page using MVC and DAO pattern
  • 关于jsp - 如何通过单击 JSP 页面中的超链接或按钮将当前项目传递给 Java 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3078701/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com