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

2023-12-02

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

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

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


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

<a href="delete.jsp?id=1">delete</a>

And in delete.jsp (我将明显的请求参数检查/验证放在一边):

<% dao.delete(Long.valueOf(request.getParameter("id"))); %>

然而,这是一个漂亮的不良做法(这仍然是轻描淡写),有两个原因:

  1. 修改服务器端数据的 HTTP 请求不应由GET,但是通过POST。链接是隐式 GET。想象一下,当像 googlebot 这样的网络爬虫尝试跟踪所有删除链接时会发生什么。你应该使用<form method="post"> and a <button type="submit">用于删除操作。不过,您可以使用 CSS 将按钮设置为看起来像链接的样式。可以安全地获取仅预加载项目以预填写编辑表单的编辑链接。

  2. 将业务逻辑(功能正如你所说的那样)在 JSP 中使用小脚本 (those <% %>的事情)感到气馁。你应该使用Servlet控制、预处理和后处理 HTTP 请求。

由于您在问题中没有提及有关 servlet 的任何信息,因此我怀疑您已经在使用 scriptlet 从数据库加载数据并将其显示在表中。这也应该由 servlet 来完成。

这是一个基本的启动示例,说明如何完成这一切。我不知道表数据代表什么,所以让我们看看Product举个例子。

public class Product {
    private Long id;
    private String name;
    private String description;
    private BigDecimal price;
    // Add/generate public getters and setters.
}

然后JSP文件使用JSTL(只需放下jstl-1.2.jar in /WEB-INF/lib安装它)以显示products在每行都有一个编辑链接和一个删除按钮的表格中:

<%@ 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>

The fn:escapeXml()只是为了防止XSS攻击当编辑数据重新显示时,它的作用与<c:out>,只更适合在属性中使用。

以下是如何productservlet 可以看起来像(再次,为简洁起见,省略了转换/验证):

@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.

也可以看看:

  • 我们的 servlet wiki 页面(还包含一个验证示例)
  • Servlet 中的 doGet 和 doPost
  • 使用 MVC 和 DAO 模式在 JSP 页面中的 HTML 中显示 JDBC 结果集
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何在flutter中获得像facebook一样的微光效果?

    我正在尝试创建一个视频流应用程序并想要像 facebook 那样的微光效果 有什么建议如何获得它吗 微光 1 0 1 开启https pub dev packages shimmer 一个包提供了在Flutter项目中添加微光效果的简单方法
  • didSelectViewController 在某些情况下不会被调用

    我遇到了很多人已经报告过的问题 didSelectViewController不会被调用 但就我而言 有时会被调用 我有三个选项卡和三个视图控制器 每次用户按下第二个或第三个选项卡时 我都需要执行一些代码 在我的 SecondViewCon
  • 在android中使用webview将CSS注入到网站

    例如我想改变背景颜色www google comto red 我用过webview 和我的style css文件位于assest folder 我想注入这个style css文件至www google com 我的代码有什么问题吗 请为我写
  • 使用 jQuery 的 .focus() 在 Mac 上的 Firefox 中设置焦点

    我想得到 focus 在 Mac 上使用 Firefox 版本 33 1 1 一些类似的问题提到了具有以下效果的解决方案 focus 没有视觉效果 通过下面的每项测试 我什至无法完成这一任务 下面列出的各种测试都适用于 Chrome 但不适
  • 如何开始使用 directshow?

    我很难理解this 编译 运行 directshow 应用程序的最少设置是什么 我已经安装了 Visual C 2008 Express 你好世界会很好 RGS 设置您的环境 设置环境是一个繁琐的过程 因为 DirectShow 现在已经深
  • 如何判断api是否返回数据?

    如何检查我的 api 请求是否返回任何数据fetchData功能 我想返回boolean 或其他东西 给我的Index vue并在加载数据时显示加载程序 但是当加载数据时我想使用 this router push admin dashboa
  • 如何在窗口中安排 Oracle DBMS 作业

    我想创建一个 Oracle DBMS 作业 该作业在每个工作日 不是周末 的 09 00 到 20 00 每 10 分钟运行一次 我想知道我是否可以做到这一点FREQ作业定义的参数 否则我必须创建一个New Maintenance Wind
  • java中用数组常量定义的枚举

    我想知道是否可以用数组定义枚举作为常量 请参阅以下代码摘录 编译时不会出现非法表达式开始错误 有人可以帮助我吗 非常感谢 public enum Currency PENNY 1 one oneone NICKLE 5 five DIME
  • VSTS 安装后将代理状态从离线更改为在线

    我遇到 VSTS 代理状态离线的问题 我通过 cmd 在正确的池下安装了代理并在之后下载 但它仍然离线 请提供任何帮助吗 如果构建代理以交互模式运行 您需要通过运行来启动代理run cmd file 以管理员身份打开命令行 Run run
  • Visual Studio 减慢应用程序速度

    这是一个模糊的问题 但是对于 Visual Studio 减慢应用程序速度我能做些什么吗 如果我在 Visual Studio 之外运行可执行文件 它会以非常可接受的速度运行 如果我在启用调试器的情况下在 Visual Studio 中运行
  • .sheet:仅显示一次,然后不再显示

    使用Beta4 似乎该错误仍然存 在 以下视图序列 列表 其中点击列表条目可打开另一个列表 允许呈现ListView正好一次 这onDisappear从未被调用过 所以showModal标志发生变化 但不会触发重新显示ListView再次点
  • 如何从 Information_Schema.Columns 获取列的主键或键约束详细信息?

    如何从 Information Schema Columns 获取列的主键或键约束详细信息 我从 sys indexes 获取输出 但是在使用 Information Schema 加入查询时 我得到重复的记录 SELECT COLUMN
  • Git 推送仅适用于裸存储库?

    当我尝试 git push origin master 到外部磁盘上的远程存储库时 出现 git 警告 指出在下一个版本的 git 中 pusing 签出存储库将默认被拒绝 在外部磁盘上 我已签出项目 并且我想将我在计算机上所做的更改发送到
  • 在 PowerShell 2.0 中将编码设置为 ANSI

    我想使用参数将文件的编码设置为 ANSI Encoding of the Set Contentcmdlet 我尝试了这个 但它不起作用 Set Content LiteralPath filePath Encoding Default P
  • 当被测试者在 Perl 中使用 TAP 失败退出时,是否可以测试预期的错误?

    假设您正在运行一些单元测试 并且您想查看正在测试的方法 或脚本或函数或其他内容 是否失败 如何设置这样的测试 我希望有这样的事情 ok obj gt method my bad params DEATH method dies as exp
  • _=> 这个下划线在 Lambda 表达式中是什么意思?

    lambda 表达式是什么样的 gt expr mean 目的是什么 作为 lambda 的输入 Example int count 0 list ForEach gt count 1 这是当您不关心参数时使用的约定
  • 如何在 Android 中启用 GPS

    如何在 Android 中打开 GPS 关闭时检索当前位置 我测试了两种方法 private void turnGPSOn String provider Settings Secure getString getContentResolv
  • 重新排列方程

    我的 C 代码中有以下等式 k dl 1 0 pHold centre pHold pHold 2 0 centre centre square 2 0 centre 我知道浮点除法比乘法昂贵得多 我已经为此苦苦挣扎了一段时间 有没有什么办
  • 等待函数完成执行并使用结​​果

    这是场景 我有一个活动 A 它有一个按钮和文本视图 我有另一个类 B 其中包含执行各种功能的方法 创建类 B 的实例后 当单击按钮时 会从 A 调用它的公共方法之一 该方法需要一段时间来执行 它调用类中另一个耗时的私有方法 并返回类 B 的
  • 如何通过单击 JSP 页面中的超链接或按钮将当前项目传递给 Java 方法?

    我有一个 HTML 表 其中显示从数据库中获取的行 我希望用户能够通过单击每行旁边的删除超链接或按钮来删除行 当用户单击每个删除超链接或按钮时 如何在页面上调用 JSP 函数 以便我可以从数据库中删除该行的条目 到底应该做什么 a or a