【问题标题】:jsp form send data to servlet without changing pagejsp表单将数据发送到servlet而不更改页面
【发布时间】:2015-08-31 21:50:33
【问题描述】:

我使用 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>

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

但我想留下来

http://localhost/myproject/

编辑:现在我要写了

request.getRequestDispatcher("/index.jsp").forward(request, response);

在 doPost() 方法中

【问题讨论】:

  • 但是你是如何通过发出 POST 请求离开页面的呢?
  • 尝试使用 ajax。例如jquery.ajax

标签: java jsp servlets


【解决方案1】:

您的 JSP

中应该有一个带有 method="POST" 的表单
    <form method="post">
        <input type="number" name="number1" id="number1" />
        +
        <input type="number" name="number2" id="number2" />

        <input type="submit" />
    </form>

然后在您的 servlets 中,在 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);
    }

最后在您的 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));
    }
%>

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

【讨论】:

    【解决方案2】:

    我建议您不要从第二个页面转发到初始页面,而是重定向到它以关注Post-Redirect-Get pattern

    如果你不这样做,用户将在他的 URL 栏中看到他发布数据的页面地址,如果他点击返回按钮,他会收到重复提交提交的丑陋消息。

    所以在你doPost() 方法中:

    response.sendRedirect("/back/to/your/page");
    

    作为替代方案,您可以隐藏 servlet 后面的 JSP 页面,并让 servlet 直接转发到 JSP 页面以获取 GET 请求,然后完成其工作 对于 POST,然后转发到 JSP 或重定向到自身。在这种情况下,您不会在 &lt;form&gt; 标记中设置任何操作来将数据发布到相同的 URL。

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

    【讨论】:

      【解决方案3】:

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

      RequestDispatcher requestDispatcher = req.getRequestDispatcher("/path/to/your/jsp");
          requestDispatcher.forward(req, res);
      

      如果您的意思是在不刷新当前页面的情况下发送数据,您可能需要查看发送 ajax 请求。

      【讨论】:

        【解决方案4】:

        这不会让您停留在表单页面上,而是会立即将您重定向回该页面。当然,您也可以使用刚刚输入的值。

        JSP 表单

        <form method="post" action="yourServlet">
        

        Servlet(在doPost()

        getServletContext().getRequestDispatcher("/back/to/your.jsp").forward(request, response);
        

        【讨论】:

          【解决方案5】:

          您可以使用 javascript 和 ajax (XMLHttpRequest),或者为您的表单指定一个引用隐藏 iframe 的目标。

          【讨论】:

            猜你喜欢
            • 2016-10-10
            • 1970-01-01
            • 2013-08-13
            • 2012-07-31
            • 2010-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-20
            相关资源
            最近更新 更多