我使用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()方法中
答案 0 :(得分:5)
我建议你不要转发到第二页的初始页面,而是重定向到它以便跟随Post-Redirect-Get pattern。
如果不这样做,用户将在其URL栏中看到他发布数据的页面的地址,如果他点击后退按钮,他将收到重复提交帖子的丑陋信息。
所以在doPost()
方法只是为了:
response.sendRedirect("/back/to/your/page");
作为替代方案,您可以隐藏 servlet后面的JSP页面,并让servlet直接转发到JSP页面以获取GET请求,并且执行其工作对于POST,然后转发到JSP或重定向到自己。在这种情况下,您不会在<form>
标记中设置任何操作以将数据发布到相同的网址。
由于它会保留相同的网址,您最终可以直接进行转发,但我仍然建议您重定向以避免后退按钮问题。
答案 1 :(得分:4)
在你的servlet上,定义你想要返回的jsp。
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/path/to/your/jsp");
requestDispatcher.forward(req, res);
如果您要在不刷新当前页面的情况下发送数据,您可能需要查看发送ajax请求。
答案 2 :(得分:4)
您的 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 上,从 getAttribute
获取要在同一页面上显示的servlet中的属性<%
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));
}
%>
此示例是一个小计算器,显示表单同一页面上number1 + number 2的结果;)
答案 3 :(得分:1)
这不会让您留在表单页面上,但会立即将您重定向回来。当然,您可以使用刚刚输入的值。
JSP表单
<form method="post" action="yourServlet">
Servlet(在doPost()
中)
getServletContext().getRequestDispatcher("/back/to/your.jsp").forward(request, response);
答案 4 :(得分:-1)
您可以使用javascript和ajax(XMLHttpRequest),或指定表单的目标,引用隐藏的iframe。