0

わかりました、これは非常に一般的な質問かもしれませんが、正しい答えを見つけることができません...
私はJavaで関数を持っています(実際にはサーブレットです)、私が必要とする/やろうとしているのはこれです:
いくつかのことをした後、コードで他のことを行う前に、「確認」ウィンドウを表示する必要があります...次のように、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クラス/サーブレット内の関数...
それで...どうすれば私の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 は、XMLHttpRequest などを使用して POST 要求を行う AJAX 要求である可能性があります。
  • ステップ 5 は、保存が確認されたことをサーバー側に伝えるための追加パラメーターを使用したページの再読み込みです。

後者の場合、要求は元の要求と同じハンドラーによって処理されることも、別のハンドラーによって処理されることもあります。

于 2013-06-28T01:42:16.477 に答える
1

残念ながら、あなたの質問に対する答えは基本的に「それはできません」であり、少なくともあなたが想像している方法ではありません。サーブレットは HTTP プロトコルを介してブラウザと通信し、ブラウザはHTTP 要求ごとに 1 つの完全なWeb ページのみを認識します。ブラウザーがアラート ボックスを表示したとしても、サーバー コードは、ユーザーがクリックしたかどうかを知る方法がありません。アラートをクリックしても、それ自体では HTTP 要求が生成されないためです。ユーザーが [OK] をクリックしたという事実を表すデータを含め、データをサーバーに送り返したい場合は常に、新しい HTTP 要求が必要です。

応答が完了するまで、ブラウザーはページをレンダリングしません。各要求は、サーブレットから 1 つの応答を受け取ります。応答全体を完成させて、一度に送信する必要があります。送信するレスポンスを決定する際にJavaコードで if ステートメントを使用できますが、ブラウザが完了したリクエストを受信するまで、javascript または html の内容は実行されません。フラッシュを呼び出したとき、まだ不完全なページの最新の部分のみを送信しました (</body></html>接続を送信して閉じていないため、不完全です)。

最終的な結果として、応答の途中でユーザーに何を求めているか尋ねたり、応答を生成している間にメッセージを送信したり (つまり、アラート) することができなくなります。

ユーザーの入力 (ボタンのクリックを含む) を要求してそれに応答する場合は、ユーザーの入力を要求する単純で完全なページを送信する必要があります。次に、次のいずれかを実行できます。

  1. ユーザーの応答をフォームとして送信し、応答に適したまったく新しいページをレンダリングします。
  2. ユーザーの応答を ajax で送信し、javascript がページに挿入するページ フラグメント (AJAX) で応答します。
  3. ユーザーの応答を ajax で送信し、JavaScript がページ (AJAX も) の要素を構築 (または削除) するために使用する JSON データで応答します。
  4. 元のページに十分な JavaScript ロジックとデータを追加して、サーバーにリクエストを送信せずにユーザーのクリックに完全に応答し、事後にユーザーの入力の通知をサーバーに送信する可能性があります。

覚えておくべき重要なことは、ブラウザーとサーバーは別のマシンであり、ブラウザーから発信された http 要求を介してのみ通信できるということです。サーバーは、リクエストに応答する場合を除き、ブラウザーに接続する方法がありません。

于 2013-06-28T01:46:10.100 に答える
1

通常、javascript はブラウザーで実行され、Java クラスはサーブレット コンテナーで実行されます。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();

次に、パラメーター アクションの値を取得し、サーブレットで必要なことを行う必要があります。

于 2013-06-28T01:32:36.890 に答える
0

ある種の安らかな電話が必要になります。カスタム REST API を実装する場合は、この JavaScript オブジェクト XMLHttpRequest() を調べます。

または単にhtmlフォームを使用してください。httpサーブレットがリッスンしている場所をポイントします。欠点は、post と get しか取得できないことです。例えば<form action="your server" method="get/post" />

于 2013-06-28T01:46:39.243 に答える