Ajax(Ascynchronous Javascript And XML) - 비동기적 통신
ajax의 가장 핵심적인 구성 요소는 바로 XMLHttpRequest 객체에요. 이 객체는 웹 브라우저가 서버와 데이터를 교환 할 때 사용해요.
웹 브라우저가 백그라운드에서 서버와 계속해서 통신할 수 있는 것은 바로 이 객체를 사용하기 때문이에요.
let xhr = new XMLHttpRequest();
open(전달방식, url주소, 동기여부);
- 전달방식 : GET, POST 방식 중 하나 선택
- url주소 : 요청을 처리할 서버의 파일 주소 선택
- 동기여부 : 요청을 동기식으로 전달할지 비동기 식으로 전달할지 선택(비동기: true(기본값), 동기 : false)
- 100번대 : 조건부 응답
- 200번대 : 성공
- 300번대 : 리다이렉션 완료
- 400번대 : 요청 오류
- 500번대 : 서버 오류
- UNSENT(숫자0) : XMLHttpRequest 객체가 생성됨
- OPENED(숫자1) : open()메서드가 성공적으로 실행된
- HEADERS_RECEIVED(숫자 2) : 모든 요청에 대한 응답이 도착
- LOADING(숫자 3) : 요청한 데이터를 처리 중
- DONE(숫자 4) : 요청한 데이터의 처리가 완료되어 응답할 준비가 완료됨.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>Ajax 요청 보내기 테스트</h3>
<input type="submit" value="GET 방식으로 요청보내기" onclick="send1();" />
<input type="submit" value="POST 방식으로 요청보내기" onclick="send2();" />
<p id="result"></p>
</body>
<script>
function send1(){
let xhr = new XMLHttpRequest();
xhr.open("GET", "request_ajax.jsp?userid=apple&userpw=1234", true);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200){
document.getElementById("result").innerHTML = xhr.responseText;
//alert(xhr.responseText);
}
}
}
function send2(){
let xhr = new XMLHttpRequest();
xhr.open("POST", "request_ajax.jsp", true);
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("userid=post&userpw=5678");
xhr.onreadystatechange = function(){
if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200){
document.getElementById("result").innerHTML = xhr.responseText;
}
}
}
</script>
</html>
eclipse 에서 json으로 데이터를 사용하기 위해서는 라이브러리를 추가해주어야 해요
{
"search_word" : [
{"rank" : "1", "name" : "코로나"},
{"rank" : "2", "name" : "비트코인"},
{"rank" : "3", "name" : "JSP"},
{"rank" : "4", "name" : "JAVA"},
{"rank" : "5", "name" : "웹개발"}
]
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>실시간 순위</title>
</head>
<body>
<h1>Ajax를 이용해 실시간 순위 나타내기</h1>
<table border="1">
<tr>
<th>실시간 검색 순위</th>
<th>키워드</th>
</tr>
<tr>
<td id="td1">순위</td>
<td id="td2">키워드</td>
</tr>
</table>
<script>
//window.onload : HTML이 다 load가 완료 했을 때 실행
window.onload = function(){
let obj = "";
let word = new Array();
let xhr = new XMLHttpRequest();
xhr.open("GET", "data2.json", true);
xhr.send();
xhr.onreadystatechange = function(){
if(xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200){
obj = JSON.parse(xhr.responseText);
/*
파싱된 obj에서 search_word라는 key를 가지고 있는 것을 꺼내보면
[{}, {}, {}, {}, {}]가 나온다. (배열 return)
*/
for(let i = 0; i < obj.search_word.length; i++){
/*
obj.search_word 배열의 각 방에는 또 json들이 담겨있다.
{"rank" : 순위, "name" : 검색어}
각 방의 json들에서 name키로 담겨있는 검색어를 꺼내서 word 배열의 각 방에 넣는다.
*/
word[i] = obj.search_word[i].name;
}
}
}
let i = 0;
let interval = setInterval(function(){
// 0, 1, 2, 3, 4 -> 5가 되는 순간 다시 0
i = i % obj.search_word.length;
document.getElementById("td1").innerHTML = i + 1;
document.getElementById("td2").innerHTML = word[i];
i++;
}, 2000);
// setTimeout(함수, 밀리초);
setTimeout(function(){
// clearInterval(인터벌) 해당 인터벌 삭제
clearInterval(interval);
}, 20000);
}
</script>
</body>
</html>
출처
https://media.giphy.com/media/dwmNhd5H7YAz6/giphy.gif
https://media.giphy.com/media/3o6Mb9EC7mNqXl9x7y/giphy.gif