Ajax
クライアント側
test.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Demo</title>
<script type="text/javascript" src="js/jquery-1.7.2.js"></script>
<script type="text/javascript" src="js/test.js"></script>
</head>
<body>
<input type ="text" id="userName"/><br/>
<div id="result"></div>
<input type="button" value="チェック" onclick="verify()"/>
</body>
</html>
test.js(jQueryにより)
function verify(){
var jqueryObj = $("#userName");
var userName = jqueryObj.val();
var url = "login?name=" + encodeURI(encodeURI(userName));
// ★HTMLの場合(GET)
$.get(
convertURL(url),
null,
function (data){
var result = $("#result"); // 書き方1
result.html(data);
});
// ★HTMLの場合(POST)
$.post(
"login",
"name=" + encodeURI(encodeURI(userName)),
callback); // 書き方2
// ★XMLの場合
$.ajax({
type:"post",
url:"login",
data:"name=" + encodeURI(encodeURI(userName)),
dataType:"xml",
success:callbackXml
});
// ★JSONの場合
$.ajax({
type:"post",
url:"login",
data:"name=" + encodeURI(encodeURI(userName)),
dataType:"json",
success:callbackJson,
error: function(){
alert('fail');
}
});
// ★JSONPの場合
$.ajax({
type: "get",
async: false,
url: "login?name=" + encodeURI(encodeURI(userName)),
dataType: "jsonp",
jsonp: "callback",
jsonpCallback:"handler",
success: function(data){
var resultObj = $("#result");
resultObj.html(data.age + ' | ' + data.address);
},
error: function(){
alert('fail');
}
});
}
function callback(data){
var result = $("#result");
result.html(data);
}
function callbackXml(data){
var jqueryObj = $(data);
var msg = jqueryObj.children();
var text = msg.text(); //messageが配列
var resultObj = $("#result");
resultObj.html(text);
}
function callbackJson(data){
var resultObj = $("#result");
resultObj.html(data.age + ' | ' + data.address);
}
// キャッシュを防ぐため
function convertURL(url){
var timstamp = (new Date()).valueOf();
if(url.indexOf("?") >= 0){ //?があるかどうか
url += "&t="+ timstamp;
}else{
url += "?t="+ timstamp;
}
return url;
}
test.js(オリジナルのJavaScriptにより)
function verify(){
var userName = document.getElementById("userName").value;
if(window.XMLHttpRequest){
//firefox, Mozillor, Opera, Safari, IE7, IE8
xmlhttp = new XMLHttpRequest();
if(xmlhttp.overrideMimeType){
xmlhttp.overrideMimeType("text/xml");
}
}else if(window.ActiveXObject){
//IE6, IE5.5, IE5
var activexName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];
for( var i = 0;i < activexName.length;i++){
try{
xmlhttp = new ActiveXObject(activexName[i]);
break;
}catch(e){
}
}
}// if-else
if(!xmlhttp){
alert("XMLHttpRequestの作成が失敗");
return;
}
xmlhttp.onreadystatechange = callback;
// ★GETの場合
xmlhttp.open(
"GET",
"login?name=" + encodeURI(encodeURI(userName)),
true); // true:非同期
xmlhttp.send(null);
// ★POSTの場合
xmlhttp.open(
"POST",
"login",
true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.send("name=" + encodeURI(encodeURI(userName)));
}
function callback(data){
// 4:やり取りの処理が完了
if(xmlhttp.readyState == 4){
// 200:成功
if(xmlhttp.status == 200){
var responseText = xmlhttp.responseText;
var divNode = document.getElementById("result");
divNode.innerHTML = responseText;
}
}
}
★通信方法
Fetch API
A modern replacement for XMLHttpRequest
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
fetch('/user?ID=12345', {
method: 'get'
})
.then(response => response.json())
.then(jsonData => console.log(jsonData))
.catch(err => {
...
}
var input = document.querySelector('input[type="file"]')
var data = new FormData()
data.append('file', input.files[0])
data.append('user', 'andy')
fetch('/upload', {
method: 'POST',
body: data
})
Axios
https://github.com/axios/axios
npm install axios
axios.get('/user?ID=12345')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
var input = document.getElementById('file');
var data = new FormData();
data.append('file', input.files[0]);
data.append('user', 'andy');
var config = {
onUploadProgress: function(progressEvent) {
var percentCompleted =
Math.round( (progressEvent.loaded * 100) / progressEvent.total );
}
};
axios.put('/upload', data, config)
.then(function (res) {
output.innerHTML = res.data;
})
.catch(function (err) {
output.innerHTML = err.message;
});
jQuery
$.ajax({
url: '/user?ID=12345',
type: "GET",
dataType: "json",
success: function (data) {
console.log(data);
}
fail: function () {
console.log("Error!")
}
});
var formData = new FormData();
formData.append('file', $('#file')[0].files[0]);
$.ajax({
url : '/upload',
type : 'POST',
data : formData,
processData: false,
contentType: false,
success : function(data) {
console.log(data);
}
});
サーバ側
web.xml
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.test.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
MyServlet.java
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyServlet() {
super();
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// ★HTMLの場合
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if(name == null || name.length() == 0){
out.println("未入力!");
return;
}
name = URLDecoder.decode(name, "utf-8");
out.println("こんにちは, " + name + "様");
// ★XMLの場合
response.setContentType("text/xml;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if(name == null || name.length() == 0){
out.println("未入力!");
return;
}
StringBuilder sb = new StringBuilder();
sb.append("<msg>");
name = URLDecoder.decode(name, "utf-8");
sb.append(name);
sb.append("</msg>");
out.println(sb.toString());
// ★JSONの場合
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if(name == null || name.length() == 0){
out.println("未入力!");
return;
}
String json = "{\"name\" : \"%s\",\"age\": 23,\"address\": \"東京\"}";
name = URLDecoder.decode(name, "utf-8");
out.println(String.format(json, name));
// ★JSONPの場合
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if(name == null || name.length() == 0){
out.println("未入力!");
return;
}
String json =
"handler({\"name\" : \"%s\",\"age\": 23,\"address\": \"東京\"});";
name = URLDecoder.decode(name, "utf-8");
out.println(String.format(json, name));
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
★deferred
$.when($.ajax("test1.php"), $.ajax("test2.php"))
.done(function(){ ... })
.fail(function(){ ... });
或いは
$.when($.ajax("test.php"))
.then(successFunc, failureFunc);
※then(arg1)とdone(arg1)同様
//改善前
var $info = $("#xxx");
$.ajax({
url:"/service/json/",
data: {
json: JSON.stringify({
"name": "value"
})
},
type:"POST",
success: function(response){
$info.text(...);
}
});
//改善後
var $info = $("#xxx");
$.ajax({
url: "/service/json/",
data: {
json: JSON.stringify({
"name": "value"
})
},
type: "POST"
})
.then(function (response) {
$info.text(...);
})
.then(function () {
$info.append("...");
})
.done(function () {
$info.append("...");
});
或いは
.then(function (response) {
$info.text(...); // 成功の場合
},
function () {
$info.text("..."); // 失敗の場合
})
.always(function () { // Javaのfinallyに相当
$info.append("...");
});