簡體   English   中英

從JavaScript代碼調用Java函數?

[英]Calling a Java Function From JavaScript Code?

好的,也許這是一個非常普遍的問題,但是我找不到正確的答案...
我有一個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函數? 或者我需要做些什么來使我的代碼等到確認消息之后?
謝謝

首先,您需要清楚地知道執行各個代碼的位置……以及何時執行。

  1. 在將HTML及其嵌入的Javascript發送到瀏覽器之前,在服務器端執行JSP代碼。

  2. 在瀏覽器收到HTML及其嵌入式Javascript之后,將以瀏覽器大小執行Java代碼。

因此,您想要的是Javascript進行確認,然后將記錄保存到數據庫中。 因此,顯然,該記錄不應該由該JSP保存...或者至少不是無條件保存。 所發生的是,單擊確認按鈕必須使Javascript向服務器發送一個請求,要求說操作已確認。 順序為:

  1. 客戶端:請求頁面
  2. 服務器端:做東西...
  3. 服務器端:JSP格式HTML + Javascript
  4. 客戶端:頁面加載
  5. 客戶端:Javascript顯示確認對話框
  6. 客戶端:用戶說“是”
  7. 客戶端:JavaScript導致將請求發送到服務器端,以告知客戶端已確認。
  8. 服務器端:執行已確認的操作。
  9. 服務器端:發送響應以報告操作。

有兩種方法來構造確認交互:

  • 步驟#5可以是AJAX請求,其中使用XMLHttpRequest或類似命令發出POST請求。
  • 步驟#5可能是頁面重新加載,並帶有附加參數以告知服務器端已確認保存。

在后一種情況下,該請求可以由與原始請求相同的處理程序處理,也可以由不同的處理程序處理。

通常,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中執行所需的操作。

不幸的是,對您的問題的回答基本上是“您無法做到”,至少不是您所設想的那樣。 Servlet通過HTTP協議與瀏覽器通信,瀏覽器僅了解完整的網頁,每個HTTP請求一個。 即使瀏覽器確實顯示了警報框,您的服務器代碼也無法知道用戶是否單擊了它,因為單擊警報將不會自行生成HTTP請求。 每當您要將數據發送回服務器(包括代表用戶單擊確定的事實的數據)時,都需要一個新的HTTP請求

在響應完成之前,瀏覽器將不會呈現頁面。 每個請求都從Servlet獲得一個響應。 您必須完成整個答復並立即發送所有答復。 在確定要發送的響應時,可以在Java代碼中使用if語句,但是在瀏覽器收到已完成的請求之前,javascript或html中的任何內容都不會運行。 當您調用flush時,您僅發送了仍未完成頁面的最新部分(您尚未發送</body></html>並關閉了連接,因此它不完整)。

最終結果是,您不能在響應過程中部分詢問用戶他們想要什么,也不能在產生響應時(即警報)向用戶發送消息。

如果要征求用戶輸入(包括按鈕單擊)並做出響應,則必須發送一個簡單但完整的頁面來請求用戶輸入,然后可以執行以下操作之一:

  1. 以表單的形式提交用戶的響應,並呈現一個與其響應相對應的全新頁面。
  2. 使用ajax提交用戶的響應,並使用您的JavaScript插入頁面(AJAX)的頁面片段進行響應。
  3. 使用ajax提交用戶的響應,並使用JSON數據進行響應,您的javascript使用JSON數據來構建(或刪除)頁面上的元素(也是AJAX)。
  4. 在原始頁面中添加足夠的javascript邏輯和數據,以完全響應用戶的單擊,而無需向服務器發送請求,這可能會在事實發生后向服務器發送用戶輸入的通知。

要記住的核心是瀏覽器和服務器是獨立的機器,並且只能通過源自瀏覽器的 http請求進行交談。 除了響應請求外,服務器無法聯系瀏覽器。

您將需要某種輕松的通話。 如果您想實現自定義的rest api,請查看此javascript對象XMLHttpRequest()

或僅使用html表單。 將其指向您的httpservlet正在偵聽的位置。 不利的一面是,您只能獲得職位並獲得職位。 例如<form action="your server" method="get/post" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM