このサンプルでは、"Fetch Data"ボタンをクリックすると、サーバーからJSON形式のデータが非同期で取得され、画面に表示されます。

成功すればJSON形式のデータが表示され、失敗すると「Failed to fetch data」というメッセージが表示されます。

サーバーサイドでは、簡単なJSONオブジェクトを手動で作成し、それをクライアントに返しています。

これは単純化した例ですので、実際のアプリケーションでは、通常、JSONライブラリ(例えばGsonやJacksonなど)を使用して、JavaオブジェクトからJSONに変換します。

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>

<body>
	<button id="fetchData">Fetch Data</button>
	<div id="result"></div>

	<script>
		// $(document).ready()は、HTMLドキュメントが完全に読み込まれ、DOMが操作可能になったときに実行する関数を指定します。
		$(document).ready(function () {
			// $('#fetchData').click()は、HTML内のidが"fetchData"の要素(この例ではボタンなど)がクリックされたときに実行する関数を指定します。
			$('#fetchData').click(function () {
				// $.ajax()は、非同期(Asynchronous)HTTP(Ajax)リクエストを作成します。
				$.ajax({
					// リクエストの送信先URLを指定します。
					url: 'Data',
					// HTTPメソッド(この例では'GET')を指定します。
					type: 'GET',
					// サーバーから返されるデータの型を指定します。この例では'json'を指定しています。
					dataType: 'json',
					// リクエストが成功したときに実行する関数を指定します。この関数は、サーバーから返されたデータを引数として受け取ります。
					success: function (data) {
						// HTMLを格納するための空の文字列を初期化します。
						var html = '';
						// forEachは、配列の各要素に対して関数を実行します。この例では、サーバーから返されたデータ(ユーザー情報の配列)の各要素(ユーザー情報)に対して関数を実行します。
						data.forEach(function (user) {
							// 各ユーザーの情報を文字列に変換し、それをHTML文字列に追加します。
							html += 'Name: ' + user.name + ', Age: ' + user.age + ', City: ' + user.city + '<br>';
						});
						// 生成したHTMLをidが"result"の要素(この例ではdivなど)の中身として設定します。
						$('#result').html(html);
					},
					// リクエストが失敗したときに実行する関数を指定します。
					error: function () {
						// アラートを表示して、データの取得に失敗したことをユーザーに通知します。
						alert('Failed to fetch data');
					}
				});
			});
		});

	</script>
</body>

</html>

package controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Data")
public class DataServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// クライアントに送信するコンテンツのMIMEタイプを設定します。これはJSON形式のデータを返すことを示します。
		resp.setContentType("application/json");

		// HttpServletResponseオブジェクトからPrintWriterオブジェクトを取得します。これは、クライアントへのレスポンスを書き込むためのオブジェクトです。
		PrintWriter out = resp.getWriter();

		// PrintWriterオブジェクトのprintメソッドを使用して、JSON形式のデータをレスポンスに書き込みます。この例では、3人のユーザー情報を含むJSON配列を作成しています。
		out.print(
				"[{\"name\":\"matsuda\", \"age\":30, \"city\":\"New York\"},{\"name\":\"imai\", \"age\":33, \"city\":\"Ichinomiya\"},{\"name\":\"tabuchi\", \"age\":29, \"city\":\"Hawaii\"}]");

		// PrintWriterのflushメソッドを呼び出して、バッファにあるすべてのデータを強制的に送信します。これにより、データはすぐにクライアントに送信されます。
		out.flush();
	}
}

なお、このサンプルコードではエラーハンドリングやセキュリティ対策などは考慮していません。実際のアプリケーションで使用する場合は、それらの重要な要素も適切に考慮する必要があります。

最後までお読みいただきありがとうございます。