2015-06-16 139 views
5

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

我想按下“提交”按钮,数据应该发送,我想仍然留在页面上的形式。我宁愿不使用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

但是,您如何通过发出POST请求离开页面? –

+0

尝试使用ajax。例如jquery.ajax –

回答

4

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

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

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

-1

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

1

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

JSP形式

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

的Servlet(在doPost()

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

你应该在你JSP

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

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

有形式方法= “POST”然后在你的层的servlet,在的doPost方法,你有的getParameter(“名称”)让你的表单参数,你想它是什么,然后重新发送到你的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的结果;)

4

我建议你不要转发到第二个页面的初始页面,而是要重定向到它,以便遵循Post-Redirect-Get pattern

如果你不这样做,用户会在他的网址列中看到他发布数据的页面地址,如果他点击后退按钮,他会收到重复提交邮件的丑陋消息。

所以你doPost()方法只是:

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

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

因为它会保持相同的URL,你最终可能只是做一个前进,但我仍然建议重定向,以避免后退按钮问题。

相关问题