서버로부터 응답(response) 확인

Ajax에서 서버로부터의 응답을 확인하기 위해 사용하는 XMLHttpRequest 객체의 프로퍼티는 다음과 같다.

  1. readyState 프로퍼티
  2. status 프로퍼티

1. readyState 프로퍼티

XMLHttpReqeust 객체의 현재 상태를 나타낸다. 이 프로퍼티의 값은 현재 상태에 따라 다음과 같은 주기로 변화한다.

의미 설명
0 UNINITIALIZED XMLHttpRequest 객체만 생성되고 초기화되지 않은 상태
(open 메서드가 호출되지 않음)
1 LOADING open 메서드가 호출되었지만 아직 send 메서드는 불리지 않은 상태
2 LOADED send 메서드가 불렸지만 status와 헤더는 도착하지 않은 상태
3 INTERACTIVE 요청한 데이터를 처리 중인 상태
4 COMPLETED 요청한 데이터에 대한 처리가 완료된 상태

 

2. status 프로퍼티

서버의 문서 상태를 나타낸다.

의미 설명
200 OK 요청 성공
403 Forbidden 접근 거부
404 Not Found 페이지 없음
500 Internal Server Error 서버 오류 발생

 

 


Ajax로 응답데이터 받기

  1. HTML 형식: responseText
  2. XML 형식: responseXML
  3. JSON 형식: responseText로 받은 뒤 JSON.parse() 함수를 이용해서 문자열을 JSON 객체로 변환

1) HTML 형식의 파일 받기

[HTML 형식의 파일: pizzaResult.jsp]

1
2
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
100#홍길동#서울 마포구 동교동#3333-3333
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
let req = false;
const init = function(){
    try{
        req = new XMLHttpRequest();
        console.log('req: ' + req);
    }catch(e){
        alert('req생성 실패');
    }
}
    
const getUserInfo = function(){
    //1. 사용자가 입력한 연락처 정보를 알아내자
    let tel = $('#phone').val(); //document.getElementById('phone').value
    
    //2. Ajax로 요청을 보내보자
    //[1] 요청을 준비하는 단계
    let url = "pizzaResult.jsp?phone=" + tel; //text data를 생성
    req.open('GET', url, true); //true==>비동기방식으로 요청을 보낸다(디폴트)
    //[2] 요청을 보내기 전에 onreadystatechange 속성값에 콜백함수 지정 (상태값이 바뀔 때 함수를 호출)
    req.onreadystatechange = updatePage;
    //[3] 요청을 전송하는 단계 => XMLHttpRequest의 send(파라미터데이터들)
    req.send(null); //get은 body가 비어서 가기 때문에 null을 전달해야 함
}
    
//1. text(HTML)로 받을 경우
const updatePage = function(){
    //readyState: 2, 3, 4가 뜸
    if(req.readyState==4 && req.status==200){ //데이터 수신이 완료되면 4를 반환
        let res = req.responseText;
        //alert(res);
        //'#' 구분자를 기준으로 쪼개어 배열에 저장
        let tokens = res.split('#');
        //tokens[0]: 회원번호    tokens[1]: 이름 ...
        let str = "<h3>회원 이름: " + tokens[1+ "</h3>";
        let str2 = `
            <h3>회원 주소: \${tokens[2]}</h3>
            <h3>회원 연락처: \${tokens[3]}</h3>
        `;

        $('#userInfo').html(str); //id가 userInfo인 <div>에 출력
        $('#address').html(str2); //id가 address인 <div>에 출력
    }
}

window.onload = init;

//준비되면 init함수를 실행시켜라
 

res (req.responseText값)
실행 결과


2) XML 형식의 파일 받기

[Oracle DB SQL: pizza_user 테이블 생성]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
drop table pizza_user;
 
create table pizza_user(
    num number(8primary key,
    name varchar2(30),
    phone varchar2(15not null,
    addr varchar2(100not null
);
 
drop sequence pizza_seq;
 
create sequence pizza_seq
start with 1
increment by 1
nocache;
 
insert into pizza_user(num, name, phone, addr)
values(pizza_seq.nextval, '이영철''1111-1111''서울 마포구 합정동 1번지');
 
insert into pizza_user(num, name, phone, addr)
values(pizza_seq.nextval, '콩진호''2222-2222''서울 마포구 서교동 2번지');
 
commit;
cs

pizza_user

 

[XML 형식의 파일: pizzaResultXml.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@ page language="java" contentType="text/xml; charset=UTF-8"
    pageEncoding="UTF-8" import="java.sql.*" %>
<%
    String phone = request.getParameter("phone");
    Class.forName("oracle.jdbc.driver.OracleDriver");
    String url = "jdbc:oracle:thin:@localhost:1521/XE";
    String user = "multishop", pwd = "tiger";
    
    Connection con = DriverManager.getConnection(url, user, pwd);
    String sql = "select * from pizza_user where phone=?";
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(1, phone);
    ResultSet rs = ps.executeQuery();
    
    String num = "0", name = "", addr = "", tel="";
    while(rs.next()){
        num = rs.getString("num");
        name = rs.getString("name");
        addr = rs.getString("addr");
        tel = rs.getString("phone");
    }
    rs.close();
    ps.close();
    con.close();
%>
<user>
    <num><%=num%></num>
    <name><%=name%></name>
    <addr><%=addr%></addr>
    <phone type="cell"><%=phone%></phone>
</user>
cs

실행 결과


url에 phone=1111-1111 파라미터값 입력한 결과


url에 phone=2222-2222 파라미터값 입력한 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
let req = false;
const init = function(){
    try{
        req = new XMLHttpRequest();
        console.log('req: ' + req);
    }catch(e){
        alert('req생성 실패');
    }
}
    
const getUserInfo = function(){
    //1. 사용자가 입력한 연락처 정보를 알아내자
    let tel = $('#phone').val(); //document.getElementById('phone').value
        
    //2. Ajax로 요청을 보내보자
    //[1] 요청을 준비하는 단계 => XMLHttpRequest의 open(요청방식, url, [비동기여부(true/false)])
    let url = "pizzaResultXml.jsp?phone=" + tel;//xml data를 생성
    req.open('GET', url, true); //true==>비동기방식으로 요청을 보낸다(디폴트)
    //[2] 요청을 보내기 전에 onreadystatechange 속성값에 콜백함수 지정 (상태값이 바뀔 때 함수를 호출)
    req.onreadystatechange = updatePage;
    //[3] 요청을 전송하는 단계 => XMLHttpRequest의 send(파라미터데이터들)
    req.send(null); //get은 body가 비어서 가기 때문에 null을 전달해야 함
}
    
 
//2. xml로 받을 경우
const updatePage = function(){
    if(req.readyState==4 && req.status==200){
    let res = req.responseXML;
    //xml로 받을 경우 ==> XMLDocument객체로 응답옴 ==> 이 문서를 파싱하여 필요한 데이터 추출 ==> jquery의 find()함수 사용
    //alert(res);
    let num = $(res).find('num').text();
    if(parseInt(num)==0){//비회원일 경우
        $('#nonUser').show(1000); //보여주기(1000초)
        $('#userInfo').html("").hide(1000);//감추기(1000초)
        $('#addr').focus();
    }else{//회원일 경우
        let name = $(res).find('name').text();
        let addr = $(res).find('addr').text();
        let phone = $(res).find('phone').text();
        //phone태그의 type 속성 추출(정적인 속성: attr() / 기능적인 속성: prop())
        let phoneType = $(res).find('phone').attr('type');
            
        let str = `
            <h3>회원 번호: \${num}</h3>
            <h3>회원 이름: \${name}</h3>
            <h3>회원 주소: \${addr}</h3>
            <h3>회원 연락처[\${phoneType}]: \${phone}</h3>
        `;
        $('#userInfo').html(str).show(1000);
        $('#nonUser').hide();
        $('#addr').val("");
        }        
    }
}

window.onload = init;
//준비되면 init함수를 실행시켜라
cs

실행결과 (비회원인 경우)
실행결과 (회원인 경우)

 


3) JSON 형식의 파일 받기

[JSON 형식의 파일: pizzaResultJson.jsp]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8" import="java.sql.*" %>
<%
    String phone = request.getParameter("phone");
    Class.forName("oracle.jdbc.driver.OracleDriver");
    String url = "jdbc:oracle:thin:@localhost:1521/XE";
    String user = "multishop", pwd = "tiger";
    
    Connection con = DriverManager.getConnection(url, user, pwd);
    String sql = "select * from pizza_user where phone=?";
    PreparedStatement ps = con.prepareStatement(sql);
    ps.setString(1, phone);
    ResultSet rs = ps.executeQuery();
    
    String num = "0", name = "", addr = "", tel="";
    while(rs.next()){
        num = rs.getString("num");
        name = rs.getString("name");
        addr = rs.getString("addr");
        tel = rs.getString("phone");
    }
    rs.close();
    ps.close();
    con.close();
    /*JSON (JavaScript Object Notation)
    객체: {속성명:값, 속성명2:값2}
    배열: [1, 2, 3, 4], [{}, {}, {}, {}](객체)
    contentType을 application/json으로 설정해야 함에 유의!
    */
%>
{
    "num":"<%=num%>",
    "name":"<%=name%>",
    "addr":"<%=addr%>",
    "phone":"<%=tel%>"
}
cs

실행 결과


url에 phone=1111-1111 파라미터값 입력한 결과


url에 phone=2222-2222 파라미터값 입력한 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
let req = false;
const init = function(){
    try{
        req = new XMLHttpRequest();
        console.log('req: ' + req);
    }catch(e){
        alert('req생성 실패');
    }
}
    
const getUserInfo=function(){
    //1. 사용자가 입력한 연락처 정보를 알아내자
    let tel = $('#phone').val(); //document.getElementById('phone').value   
    
//2. Ajax로 요청을 보내보자
    //[1] 요청을 준비하는 단계 => XMLHttpRequest의 open(요청방식, url, [비동기여부(true/false)])
    let url = "pizzaResultJson.jsp?phone=" + tel; //JSON data를 생성
   req.open('GET', url, true); //true==>비동기방식으로 요청을 보낸다(디폴트)
    //[2] 요청을 보내기 전에 onreadystatechange 속성값에 콜백함수 지정 (상태값이 바뀔 때 함수를 호출)
    req.onreadystatechange = updatePage;
    //[3] 요청을 전송하는 단계 => XMLHttpRequest의 send(파라미터데이터들)
    req.send(null);
    //get은 body가 비어서 가기 때문에 null을 전달해야 함
}
 
//3. json으로 받을 경우
const updatePage = function(){
    if(req.readyState==4 && req.status==200){
        let res = req.responseText;
        //alert(res+", typeof res: " + typeof(res)); //string
        //[1] JSON.parse(문자열) => 문자열을 json객체로 변환함
        //[2] JSON.stringify(json객체) => json객체를 문자열로 변환함
            
        let obj = JSON.parse(res);
        //alert(obj+", typeof(obj): " + typeof(obj)); //[object Object], typeof(obj): object
            
        let num = obj.num;
        let name = obj.name;
        let phone = obj.phone;
        let addr = obj.addr;
            
        if(parseInt(num)==0){
            $('#nonUser').show(1000); //보여주기(1000초)
            $('#userInfo').html("").hide(1000);//감추기(1000초)
            $('#addr').focus();
        }else{
            let str = `
            <div class="alert alert-danger my-3">
                <h3>회원 번호: \${num}</h3>
                <h3>회원 이름: \${name}</h3>
                <h3>회원 주소: \${addr}</h3>
                <h3>회원 연락처: \${phone}</h3>
            </div>
            `;
            $('#nonUser').hide();
            $('#userInfo').html(str).show(1000);
            $('#addr').val("");
        }
    }
}
    
    window.onload = init; //$(function(){})
    //준비되면 init함수를 실행시켜라
cs

res, typeof res

  1. JSON.parse(string): 문자열을 JSON객체로 변환
  2. JSON.stringify(obj): JSON객체를 문자열로 변환
let obj = JSON.parse(res);
alert(obj+", typeof(obj): " + typeof(obj));

 

실행결과 (비회원인 경우)
실행결과(회원인 경우)

 

+ Recent posts