[英]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函數? 或者我需要做些什么來使我的代碼等到確認消息之后?
謝謝
首先,您需要清楚地知道執行各個代碼的位置……以及何時執行。
在將HTML及其嵌入的Javascript發送到瀏覽器之前,在服務器端執行JSP代碼。
在瀏覽器收到HTML及其嵌入式Javascript之后,將以瀏覽器大小執行Java代碼。
因此,您想要的是Javascript進行確認,然后將記錄保存到數據庫中。 因此,顯然,該記錄不應該由該JSP保存...或者至少不是無條件保存。 所發生的是,單擊確認按鈕必須使Javascript向服務器發送一個請求,要求說操作已確認。 順序為:
有兩種方法來構造確認交互:
在后一種情況下,該請求可以由與原始請求相同的處理程序處理,也可以由不同的處理程序處理。
通常,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>
並關閉了連接,因此它不完整)。
最終結果是,您不能在響應過程中部分詢問用戶他們想要什么,也不能在產生響應時(即警報)向用戶發送消息。
如果要征求用戶輸入(包括按鈕單擊)並做出響應,則必須發送一個簡單但完整的頁面來請求用戶輸入,然后可以執行以下操作之一:
要記住的核心是瀏覽器和服務器是獨立的機器,並且只能通過源自瀏覽器的 http請求進行交談。 除了響應請求外,服務器無法聯系瀏覽器。
您將需要某種輕松的通話。 如果您想實現自定義的rest api,請查看此javascript對象XMLHttpRequest()
或僅使用html表單。 將其指向您的httpservlet正在偵聽的位置。 不利的一面是,您只能獲得職位並獲得職位。 例如<form action="your server" method="get/post" />
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.