从JavaScript代码调用Java函数?

时间:2013-06-28 00:56:39

标签: java javascript servlets

好吧,也许这是一个非常常见的问题,但我找不到合适的答案...... 我有一个Java函数(实际上,是一个Servlet),我需要/尝试做的是这个:
在做了一些事情之后,我需要在我的代码中做一些其他事情之前显示一个“确认”窗口...我这样做是通过javascript,这样:

out.println("<script type='text/javascript'>");
out.println("result = confirm(Do you wanna to record in DB?)");
out.println("if(result)");
out.println("  alert('will record');");
out.println("else");
out.println("  alert('will not record')");
out.println("</script>");
out.flush();

但该代码之后的行将在显示对话框消息之前执行。所以,现在我想调用不同的函数(我有警报的地方)。我的Java类/ servlet中的函数...
那么......如何在我的javascript代码中调用Java函数?或者我需要做些什么来让我的代码等到我确认我的消息之后呢?
谢谢

4 个答案:

答案 0 :(得分:2)

首先,你需要清楚地了解各自代码的执行情况......以及何时。

  1. 在HTML及其嵌入式Javascript发送到浏览器之前,JSP代码在服务器端执行。

  2. 在浏览器收到HTML及其嵌入式Javascript后,浏览器大小会执行Javascript代码。

  3. 所以你想要的是Javascript要求确认,然后将记录保存到数据库中。显然,记录不应该被JSP保存......或者至少不能无条件地保存。必须发生的是,单击确认按钮必须使Javascript向服务器发送请求以确认操作已确认。顺序是:

    1. 客户端:请求页面
    2. 服务器端:有什么东西......
    3. 服务器端:JSP格式化HTML + Javascript
    4. 客户端:页面加载
    5. 客户端:Javascript显示确认对话框
    6. 客户端:用户说&#34;是&#34;
    7. 客户端:Javascript会将请求发送到服务器端,告诉客户端已确认。
    8. 服务器端:执行已确认的操作。
    9. 服务器端:发送报告操作的响应。
    10. 确认互动有两种结构方式:

      • 步骤#5可以是一个AJAX请求,其中使用XMLHttpRequest或类似命令发出POST请求。
      • 步骤#5可以是带有附加参数的页面重新加载,以告知服务器端已确认保存。

      在后一种情况下,请求可以由与原始请求相同的处理程序处理,也可以由不同的处理程序处理。

答案 1 :(得分:1)

通常,javascript在浏览器上运行,Java类在servlet容器中运行。您可以通过java实现javascript和数据操作的逻辑。 Jquery将帮助您轻松使用ajax。

out.println("<script type=\"text/javascript\" src=\"http://code.jquery.com/jquery-1.10.0.min.js\"></script>");
out.println("<script type='text/javascript'>");
out.println("result = confirm(Do you wanna to record in DB?)");
out.println("if(result) {");
out.println("  alert('will record');");
out.println("$.ajax({" + 
   "type: \"POST\"," + 
  "url: \"/your_servlet_url\"," + 
  "data: \"action=record\"," + 
  "success: function(msg) {" + 
  "  alert( \"Data Saved: \" + msg );" + 
  "}" + 
"});");
out.println("} else {");
out.println("  alert('will not record');");
out.println("$.ajax({" + 
   "type: \"POST\"," + 
  "url: \"/your_servlet_url\"," + 
  "data: \"action=norecord\"," + 
  "success: function(msg) {" + 
  "  alert( \"Data Saved: \" + msg );" + 
  "}" + 
"});");
out.println("}");
out.println("</script>");
out.flush();

然后,您需要获取参数操作值,并在servlet中执行您想要的操作。

答案 2 :(得分:1)

不幸的是,你的问题的答案基本上是&#34;你不能这样做#34;,至少不是你想象的方式。 servlet通过HTTP协议与浏览器通信,浏览器只能理解完整网页,每个HTTP请求一个。即使浏览器确实显示了警告框,您的服务器代码也无法知道用户是否单击了它,因为单击警报不会自动生成HTTP请求。每当您想要将数据发送回服务器时,都需要新的HTTP请求,包括表示用户点击确定的事实的数据。

在响应完成之前,浏览器不会呈现页面。每个请求都从servlet获得一个响应。您必须完成整个响应并立即发送。您可以在确定要发送的响应时使用 Java 代码中的if语句,但是在浏览器收到完成的请求之前,javascript或html中的任何内容都不会运行。当您拨打同花顺时,您只发送了仍然不完整页面的最新部分(您尚未发送</body></html>并关闭了连接,因此它不完整)。

最终结果是,您无法通过响应向用户询问他们想要的内容,或者在您生成响应时向他们发送消息(即您的警报)。

如果您想要征求用户输入(包括按钮点击)并回复它,您必须发送一个简单但完整的页面来请求用户的输入,然后您可以执行以下操作之一:

  1. 以表格形式提交用户的回复,并根据其回复呈现一个全新的页面。
  2. 使用ajax提交用户的回复,并使用您的javascript插入页面(AJAX)的页面片段进行回复。
  3. 使用ajax提交用户的响应,并使用JSON数据进行响应,您的javascript用于构建(或删除)页面上的元素(也是AJAX)。
  4. 在原始页面中添加足够的javascript逻辑和数据,以完全响应用户的点击而不向服务器发送请求,可能在事后向服务器发送通知用户的输入。
  5. 要记住的核心是浏览器和服务器是独立的机器,只能通过源自浏览器的http请求进行通信。除响应请求外,服务器无法联系浏览器。

答案 3 :(得分:0)

你需要一些宁静的电话。如果要在此javascript对象XMLHttpRequest()

中实现自定义rest api外观

或只使用html表单。将它指向httpservlet正在侦听的位置。缺点是你只能获得发布并获得。例如<form action="your server" method="get/post" />