Promise
가 등장했다.// callback -> Promise 객체 리턴
function test(a, callback) {
// setTimeout(() => {
// callback(a + 5); // 0.1초 후에 콜하도록 변경
// }, 100)
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(a + 5);
}, 100);
});
}
console.log(test(10)); // Promise 객체 반환, PromiseResult에 15가 들어간다.
test(10)
.then((res) => {
console.log(res); // 15
});
test(10)
.then(test)
.then((res) => {
console.log(res); // 20
});
test(10)
.then((res) => {
throw 'Error';
console.log('after throw', res); // 출력X
})
.catch((err) => {
console.log(err);
});
function test(a, callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(a + 5);
}, 100);
});
}
const fn1 = async () => { // async function fn1 () {}
const a = await test(10);
console.log(a); // 15
const b = await test(a); // 15 들어감
console.log(b); // 20
}
fn1();
const fn2 = async () => {
const a = await test(10).then(res => res + 15);
console.log(a); // 30
const b = await test(a).catch(err => console.log(err)); // 30 들어감
console.log(b); // 35
}
fn2();
// Promise, async/await등은 모두 멀티쓰레드 즉, 비동기통신을 구현하기 위한 키워드 들이다.
// Non-blocking을 처리하는 것과 같은 말이다.
// 출력결과: 15 20(fn2) 20(fn1) 25
function loadDoc() {
const xhttp = new XMLHttpRequest();
xhttp.onload = function() {
// this.responseText는 응답 텍스트
let member = JSON.parse(this.responseText); // json to object
let text = `
<h3>${member.num}</h3>
<h3>${member.id}</h3>
<h3>${member.pw}</h3>
<h3>${member.name}</h3>
<h3>${member.tel}</h3>
`;
document.getElementById("demo").innerHTML = text;
}
// xhttp.open("GET", "ajax_info.txt");
xhttp.open("GET", "./ajax_member.txt"); // open이 먼저 실행되고, onload가 실행된다.
xhttp.send();
}
// selectAll.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% response.setHeader("Access-Control-Allow-Origin", "*"); %> // cors
[{ "num": 11, "id": "admin", "pw": "hi1212", "name": "kim", "tel": "010" },
{ "num": 22, "id": "admin2", "pw": "hi2222","name": "lee","tel": "02" },
{ "num": 33, "id": "admin33", "pw": "hi3333", "name": "park", "tel": "031"}]
// selectAll.html의 script 부분
window.addEventListener('load', () => {
const xhttp = new XMLHttpRequest();
xhttp.onload = function() {
console.log(this.responseText)
let members = JSON.parse(this.responseText); // json to object
let rows = ``;
for (const member of members) {
rows += `
<tr>
<td><a href="./js17_ajax_selectOne.html?num=${member.num}">${member.num}</a></td>
<td>${member.id}</td>
<td>${member.pw}</td>
<td>${member.name}</td>
<td>${member.tel}</td>
</tr>
`;
}
document.getElementById('table').innerHTML = rows; // 응답 텍스트
}
xhttp.open("GET", "http://localhost:8090/web02hello/selectAll.jsp"); // open이 먼저 실행되고, onload가 실행된다.
xhttp.send();
});
String id = request.getParameter("id"); // url Parameter 받을 때
// TestController.java
package test.com;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestController
*/
@WebServlet({ "/selectAll.do", "/selectOne.do", "/idCheck.do" }) // URL
public class TestController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Access-Control-Allow-Origin", "*");
String sPath = request.getServletPath();
System.out.println(sPath);
if (sPath.equals("/selectAll.do")) { // router와 비슷
String vos = "[{\"num\":11,\"id\":\"admin\",\"pw\":\"hi1212\",\"name\":\"kim\",\"tel\":\"010\"},{\"num\":22,\"id\":\"admin2\",\"pw\":\"hi2222\",\"name\":\"lee\",\"tel\":\"02\"},{\"num\":33,\"id\":\"admin33\",\"pw\":\"hi3333\",\"name\":\"park\",\"tel\":\"031\"}]";
response.getWriter().append(vos);
}
else if (sPath.equals("/selectOne.do")) {
String vo = "";
String num = request.getParameter("num");
if (num.equals("11"))
vo = "{\"num\":11,\"id\":\"admin11\",\"pw\":\"hi1212\",\"name\":\"kim\",\"tel\":\"010\"}";
else if (num.equals("22"))
vo = "{\"num\":22,\"id\":\"admin22\",\"pw\":\"hi1212\",\"name\":\"kim\",\"tel\":\"010\"}";
else
vo = "{\"num\":33,\"id\":\"admin33\",\"pw\":\"hi1212\",\"name\":\"kim\",\"tel\":\"010\"}";
response.getWriter().append(vo);
}
else if (sPath.equals("/idCheck.do")) {
String id = request.getParameter("id");
String result = "";
if (id.equals("admin"))
result = "{\"result\":\"사용가능한 아이디 입니다.\"}";
else
result = "{\"result\":\"사용중인 아이디 입니다.\"}";
response.getWriter().append(result);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
필수로 써야 한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.1/jquery.min.js"></script>
<!-- <script src="jquery.min.js"></script> 다운로드 되어 있기 때문에, 이것도 가능 -->
<script>
$(() => { // window.onload와 같다.
console.log('onload...');
// 아이디의 #이나 클래스의 .을 선택자라고 부른다.
$('#title').text('Hello jQuery'); // 텍스트가 바뀜
$('#content').html('<h1 id="title">jQuery</h1>'); // html 요소 삽입 가능
$('.words').text('Hello everyone'); // words 클래스 전부가 바뀜
$('.words').css('background', 'blue'); // words 클래스 전부에 css 속성 부여
// console.log($('.words')); // 이렇게 출력해볼수도 있다. querySelector, querySelectorAll과 동일.
$('span').css('background', 'red'); // 태그 바로 선택 가능. 이럴 시 선택자 없음
});
</script>
</head>
<body>
<h1 id="title">jQuery</h1>
<div id="content"></div>
<p class="words">a</p>
<p class="words">b</p>
<p class="words">c</p>
<span>Hello1</span>
<span>Hello2</span>
<span>Hello3</span>
<span>Hello4</span>
</body>
</html>