jsp表单在不改变页面的情况下将数据发送到servlet

Ger*_*ero 6 java jsp servlets

我使用jsp + servlets并有一个表单.如何在不离开包含表单的实际页面的情况下将表单数据发送到servlet(到doPost()方法)?

我想按下"提交"按钮,应该发送数据,我想仍然保留在带有表单的页面上.我宁愿不使用javascript.

我有 http://localhost/myproject/

<form action="http://localhost/myproject/anotherpage" method="POST">
First Name: <input type="text" name="first_name">
<br />
Last Name: <input type="text" name="last_name" />
<input type="submit" value="Submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

单击提交按钮时,我会转到以下页面: http://localhost/myproject/anotherpage

但我想留下来

http://localhost/myproject/
Run Code Online (Sandbox Code Playgroud)

编辑:现在我要写

request.getRequestDispatcher("/index.jsp").forward(request, response);
Run Code Online (Sandbox Code Playgroud)

在doPost()方法中

小智 6

您的JSP 中应该有一个带有method="POST"的表单

    <form method="post">
        <input type="number" name="number1" id="number1" />
        +
        <input type="number" name="number2" id="number2" />

        <input type="submit" />
    </form>
Run Code Online (Sandbox Code Playgroud)

然后在您的servlet 中,在doPost方法中,您必须使用getParameter("name")获取表单的参数,在其上执行您想要的操作,然后将其重新发送到您的 JSP ( setAttribute )。不要忘记与您的 jsp链接(我示例的最后一行)

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String textNumber1 = request.getParameter("number1");
        String textNumber2 = request.getParameter("number2");
        int number1 = (!textNumber1.isEmpty() ? Integer.parseInt(textNumber1) : 0);
        int number2 = (!textNumber2.isEmpty() ? Integer.parseInt(textNumber2) : 0);
        int result = number1 + number2;

        request.setAttribute("result", Integer.toString(result));

        request.setAttribute("number1", Integer.toString(number1));
        request.setAttribute("number2", Integer.toString(number2));

        this.getServletContext().getRequestDispatcher("/WEB-INF/calc.jsp").forward(request, response);
    }
Run Code Online (Sandbox Code Playgroud)

最后,在您的JSP 上,从您的 servlet 中获取您想要使用getAttribute在同一页面上显示的属性

<%
    String number1 = (String) request.getAttribute("number1");
    String number2 = (String) request.getAttribute("number2");
    String result  = (String) request.getAttribute("result");

    if (number1 != null && number2 != null && result != null) {
        out.print(String.format("<p>Result of %s + %s = <strong>%s</strong></p>", number1, number2, result));
    }
%>
Run Code Online (Sandbox Code Playgroud)

这个例子是一个小计算器,它在表格的同一页上显示数字 1 + 数字 2 的结果;)


Ser*_*sta 5

我建议您不要从第二个页面转到初始页面,而是重定向到它以便遵循Post-Redirect-Get模式

如果您不这样做,则用户将在其URL栏中看到他发布数据的页面的地址,并且如果单击“后退”按钮,他将收到重复提交帖子的丑陋消息。

所以在你的doPost()方法只是:

response.sendRedirect("/back/to/your/page");
Run Code Online (Sandbox Code Playgroud)

方法之一是,你可以隐藏在servlet背后的JSP页面,并有servlet来直接推进到一个GET请求JSP页面,并做其工作的POST,然后要么前进到JSP或重定向到自身。在这种情况下,您不会在<form>标记中设置任何操作以将数据发布到相同的URL。

由于它将保持相同的URL,最终您可以简单地进行转发,但我仍然建议您进行重定向以避免后退按钮问题。


Sar*_*ari 4

在您的 servlet 上,定义您想要返回的 jsp。

RequestDispatcher requestDispatcher = req.getRequestDispatcher("/path/to/your/jsp");
    requestDispatcher.forward(req, res);
Run Code Online (Sandbox Code Playgroud)

如果您打算在不刷新当前页面的情况下发送数据,您可能需要考虑发送 ajax 请求。