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を使って擬似的に時間がかかる処理にしている。なお、以下のようにクエリパラメーターで名前を渡すとその名前が表示されることも確認しておく。
無効なURLです
●続いて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ファイルをダウンロード
下からダウンロード
1 ファイル 227.17 KB
●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>
●受信ボタンを押してみよう。表が作成されれば成功だ。
コメント