0

好的,也许这是一个非常常见的问题,但我找不到正确的答案......
我在 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

4 回答 4

2

首先,您需要清楚地了解相应代码的执行位置......以及何时执行。

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

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

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

  1. 客户端:请求页面
  2. 服务器端:东西...
  3. 服务器端:JSP 格式 HTML + Javascript
  4. 客户端:页面加载
  5. 客户端:Javascript 显示确认对话框
  6. 客户端:用户说“是”
  7. 客户端:Javascript 导致向服务器端发送一个新请求,告诉它客户端已确认。
  8. 服务器端:执行确认的动作。
  9. 服务器端:发送响应报告操作。

有几种构建确认交互的方法:

  • 第 5 步可能是一个 AJAX 请求,其中使用 XMLHttpRequest 或类似方法发出 POST 请求。
  • 步骤#5 可以是一个页面重新加载,带有一个额外的参数来告诉服务器端保存已确认。

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

于 2013-06-28T01:42:16.477 回答
1

通常,javascript 在浏览器上运行,而 Java 类在您的 servlet 容器中运行。你可以用javascript实现你的逻辑,用java实现数据操作。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();

然后你需要获取参数 action 的值是什么,并在你的 servlet 中做你想做的事情。

于 2013-06-28T01:32:36.890 回答
1

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

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

最终结果是,您不能在响应过程中询问用户他们想要什么,或者在您生成响应(即您的警报)时向他们发送消息。

如果您想要请求用户输入(包括按钮点击)并对其做出响应,您必须发送一个简单但完整的页面来请求用户输入,那么您可以执行以下操作之一:

  1. 以表单形式提交用户的响应,并呈现一个适合其响应的全新页面。
  2. 使用 ajax 提交用户的响应,并使用您的 javascript 插入页面 (AJAX) 的页面片段进行响应。
  3. 使用 ajax 提交用户的响应,并使用 JSON 数据进行响应,您的 javascript 使用这些数据在页面上构建(或删除)元素(也是 AJAX)。
  4. 在原始页面中添加足够的 javascript 逻辑和数据以完全响应用户的点击而不向服务器发送请求,可能在事后向服务器发送用户输入的通知。

要记住的核心是浏览器和服务器是独立的机器,只能通过源自浏览器的 http 请求进行通信。除了响应请求,服务器无法联系浏览器。

于 2013-06-28T01:46:10.100 回答
0

您将需要某种宁静的电话。如果你想实现一个自定义的 rest api,请查看这个 javascript 对象 XMLHttpRequest()

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

于 2013-06-28T01:46:39.243 回答