Ajax(Asynchronous JavaScript + XML)を利用して非同期通信を行ってみよう。
今回サーバーサイドはJavaを利用する。

●エクリプス新規動的プロジェクトからajaxlessonを作成する。

●新規サーブレットからcontroller.Hello.javaを以下のように作成する。
controller.Hello.java

package controller;

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

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


@WebServlet("/Hello")
public class Hello extends HttpServlet {
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name=request.getParameter("name");
		name=name==null? "名無し":name;
		try {
			Thread.sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		response.setContentType("text/plain;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.print("こんにちは"+name+"さん");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request,response);
	}

}

●サーバーで実行してみよう。「こんにちは名無しさん」と表示されれば成功だ。Thread.sleepを使って擬似的に時間がかかる処理にしている。なお、以下のようにクエリパラメーターで名前を渡すとその名前が表示されることも確認しておく。

http://localhost:8080/ajaxLesson/Hello?name=hoge

●続いてWebContentフォルダの直下にgetSample.htmlを以下のように作成する。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax体験</title>
</head>
<body>
<form>
名前:<input type="text" id="name">
<input type="button" id="btn"  value="送信">
</form>
<div id="result"></div>
<script>
'use strict';
//DOMContentLoadedはwindow.onloadとほぼ同じだが、画像の読み込みを待たない。
//画像を読み込んでから処理を走らせたいばあいはonload,そうでない場合はこちらを使うとよい
document.addEventListener("DOMContentLoaded",function(){
	document.getElementById("btn").addEventListener('click',function(){
		var result=document.getElementById("result");
		//XMLHttpRequestオブジェクト生成
		var xhr=new XMLHttpRequest();
		//onreadystatechangeは通信の状態が変化したときに走る
		//0...未初期化,1...ロード中,2...ロード済み,3...一部の応答を取得,4...すべての応答データを取得
		xhr.onreadystatechange=function(){
			if(xhr.readyState===4){//通信が完了したとき
				if(xhr.status===200){//正常に通信できたら
					result.textContent=xhr.responseText;//テキストとして取得し、resultに反映させる
				}else{
					result.textContent="サーバーエラーが発生しました。";
				}
			}else{
				console.log("readyState:"+xhr.readyState);
				result.textContent='通信中・・・';
			}
		};
		//通信準備
		xhr.open('GET','/ajaxLesson/Hello?name='+encodeURIComponent(document.getElementById('name').value));
		//通信開始(引数はpost通信の時にパラメータを指定する。)
		xhr.send(null);
	});
});

</script>
</body>
</html>

●続いてAjaxでポスト通信をしてみる。postSample.htmlを以下のように作成(先ほどとの違いは下部のみ)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax体験</title>
</head>
<body>
<form>
名前:<input type="text" id="name">
<input type="button" id="btn"  value="送信">
</form>
<div id="result"></div>
<script>
'use strict';
//DOMContentLoadedはwindow.onloadとほぼ同じだが、画像の読み込みを待たない。
//画像を読み込んでから処理を走らせたいばあいはonload,そうでない場合はこちらを使うとよい
document.addEventListener("DOMContentLoaded",function(){
	document.getElementById("btn").addEventListener('click',function(){
		var result=document.getElementById("result");
		//XMLHttpRequestオブジェクト生成
		var xhr=new XMLHttpRequest();
		//onreadystatechangeは通信の状態が変化したときに走る
		//0...未初期化,1...ロード中,2...ロード済み,3...一部の応答を取得,4...すべての応答データを取得
		xhr.onreadystatechange=function(){
			if(xhr.readyState===4){//通信が完了したとき
				if(xhr.status===200){//正常に通信できたら
					result.textContent=xhr.responseText;//テキストとして取得し、resultに反映させる
				}else{
					result.textContent="サーバーエラーが発生しました。";
				}
			}else{
				console.log("readyState:"+xhr.readyState);
				result.textContent='通信中・・・';
			}
		};
		
		//通信準備(POST)
		xhr.open('POST','/ajaxLesson/Hello');
		//コンテントタイプを指定する
		xhr.setRequestHeader('content-type','application/x-www-form-urlencoded;charset=UTF-8');
		//通信開始(パラメータをkey=val&...で渡す)
		xhr.send('name='+encodeURIComponent(document.getElementById('name').value));
	});
});

</script>
</body>
</html>

JSONを返却するサーバーサイド作成

●下からgson.jarファイルをダウンロード


●WEB-INF/lib/ファルダのにgson.jarをコピペで配置する。
●modelパッケージを作成しその中にPerson.javaを以下のように作成する。

package model;

import java.io.Serializable;

public class Person implements Serializable{
	private String name;
	private int age;
	public Person(){}
	public Person(String name,int age){
		this.name=name;
		this.age=age;
	}
}

●controllerパッケージ内に新規サーブレットPersonAPI.javaを以下のように作成する。

package controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

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

import com.google.gson.Gson;

import model.Person;

@WebServlet("/PersonAPI")
public class PersonAPI extends HttpServlet {
	 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Gson gson=new Gson();
		List<Person> list=new ArrayList<>();
		list.add(new Person("John",21));
		list.add(new Person("Paul",19));
		String json=gson.toJson(list);
		response.setContentType("application/json;charset=UTF-8");
		PrintWriter out=response.getWriter();
		out.print(json);
	}	
}

●WebContentの直下にgetJson.htmlを以下のように作成する。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>getJson</title>
</head>
<body>
<button id="btn">受信</button>
<table id="table" border="1"></table>
<script>
'use strict';
document.addEventListener('DOMContentLoaded',function(){
	var table=document.getElementById("table");
	document.getElementById('btn').addEventListener("click",function(){
		var xhr=new XMLHttpRequest();
		xhr.onreadystatechange=function(){
			if(xhr.readyState===4){
				if(xhr.status===200){
					var data=JSON.parse(xhr.responseText);
					if(data===null){
						console.log("parseErr");
					}else{
						for(var i=0;i<data.length;i++){
							var tr=document.createElement("tr");
							var td=document.createElement("td");
							td.textContent=data[i].name;
							tr.appendChild(td);
							td=document.createElement("td");
							td.textContent=data[i].age;
							tr.appendChild(td);
							table.appendChild(tr);
						}
						
					}
				}else{
					console.log("err");
				}
			}
		};
		xhr.open("GET",'/ajaxLesson/PersonAPI');
		xhr.send(null);
	});
});


</script>

</body>
</html>

●受信ボタンを押してみよう。表が作成されれば成功だ。