본문 바로가기

[Ajax] Ajax 적용하기 - JSON 방식

인포꿀팁 발행일 : 2020-12-07

ex.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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
 
<script type="text/javascript">
// AJAX 객체 생성
function createXMLHttpRequest() {
    var req = null;
    
    if(window.XMLHttpRequest) { // IE 7.0 이상, Non-Microsoft browsers
        req = new XMLHttpRequest();
    } else if(window.ActiveXObject) { // IE 7 미만
        req = new ActiveXObject("Msxml2.XMLHTTP");
    }
    
    return req;
}
 
var httpReq = null;
function send() {
    var query;
    var name=document.getElementById("name").value;
    var content=document.getElementById("content").value;
    
    query="content="+content+"&name="+name;
    var url = "ex5_ok.jsp";
    
    // AJAX 객체 생성
    httpReq = createXMLHttpRequest();
    
    // 서버에서 처리한 결과를 전송 할 자바스크립트 함수 지정
    httpReq.onreadystatechange = callback;
    
    // post 방식으로 서버에 전송
    httpReq.open("POST", url, true);
    //form 태그에서 기본적으로 설정되어있는 값 여기서는 form을 사용하지 않았기 때문에 encode 방식을 세팅해줘야 한다.
    httpReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    httpReq.send(query);
}
 
// 서버에서 처리한 결과를 넘겨 받는 함수
function callback() {
    if(httpReq.readyState == 4) { // 요청상태(4:모든 요청 및 응답 완료)
        if(httpReq.status == 200) { // 서버로 부터 넘겨 받은 상태코드(200:성공)
            printData();
        }
    }
}
 
function printData() {
    var box = document.getElementById("box");
    
    // 서버에서 전달 받은 데이터(JSON)
    var doc = httpReq.responseText;
    //console.log(doc);
    
    var data = JSON.parse(doc);
    
    var out="";
    out="데이터개수:"+data.count+"<br><hr>";
    for(var i=0; i<data.list.length; i++){
        var num = data.list[i].num;
        var name = data.list[i].name;
        var content = data.list[i].content;
        
        out+="번호 : "+num+"<br>";  
        out+="이름 : "+name+"<br>";  
        out+="내용 : "+content+"<br>";  
        out+="<hr>";  
    }
    box.innerHTML = out;
}
</script>
 
</head>
<body>
 
<h3> AJAX 예제 -POST : JSON 방식</h3>
 
<div>
    <p> <input type="text" id="name"> </p>
    <p> <textarea rows="3" cols="60" id="content"></textarea> </p>
    <p> <button type="button" onclick="send();">등록</button> </p>
</div>
<hr>
<div id="box"></div>
 
</body>
</html>
cs

ex_ok.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
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@page import="org.json.JSONArray"%>
<%@page import="org.json.JSONObject"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
    request.setCharacterEncoding("utf-8");
 
    String name = request.getParameter("name");
    String content = request.getParameter("content");
    
    
    JSONObject job = new JSONObject();
    job.put("count"5);
    
    JSONArray jarr = new JSONArray();
    for(int i = 201; i<=205; i++){
        JSONObject ob = new JSONObject();
        ob.put("num", i);
        ob.put("name",name+"-"+i);
        ob.put("content",content+"-"+i);
        jarr.put(ob);
    }
    job.put("list", jarr);
    // System.out.println(job.toString());
    //클라이언트에게 json 데이터 전송
    out.println(job.toString());
    
/*
    - JSON : 데이터 교환방식중 하나
        하나의 데이터  - {"이름1":값1, "이름1":값2}
        여러개의 데이터 - [{"이름1":값1, "이름1":값2},{"이름1":값1, "이름1":값2},{"이름1":값1, "이름1":값2}]
    
*/
/*
<dataCount>5</dataCount> => xml 방식
"dataCount":5 => JSON 방식
*/
/*    Map과 유사하게 json 값을 넘기는데 이때 아래와 같이 \를 넣어서 넘겨야한다.
    StringBuffer sb = new StringBuffer();
    sb.append("{");
    sb.append("\"dataCount\":5");
    sb.append(", \"name\":\"홍길동\"");
    sb.append("}");
*/
%>
 
 
cs

 

1) XMLHttpRequest 객체 생성 & 사용자 요청 전송

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function send() {
    var query;
    var name=document.getElementById("name").value;
    var content=document.getElementById("content").value;
    
    query="content="+content+"&name="+name;
    var url = "ex5_ok.jsp";
    
    // AJAX 객체 생성
    httpReq = createXMLHttpRequest();
    
    // 서버에서 처리한 결과를 전송 할 자바스크립트 함수 지정
    httpReq.onreadystatechange = callback;
    
    // post 방식으로 서버에 전송
    httpReq.open("POST", url, true);
    //form 태그에서 기본적으로 설정되어있는 값 여기서는 form을 사용하지 않았기 때문에 encode 방식을 세팅해줘야 한다.
    httpReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
    httpReq.send(query);
}
 
cs

2) 넘어온 파라미터 값 저장 & JSON 객체 생성후 값  저장

- JSON : 데이터 교환방식중 하나
하나의 데이터  - {"이름1":값1, "이름1":값2}
여러개의 데이터 - [{"이름1":값1, "이름1":값2},{"이름1":값1, "이름1":값2},{"이름1":값1, "이름1":값2}]

MAP 방식과 유사하게 속성과 값에 값을 PUT 해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    request.setCharacterEncoding("utf-8");
 
    String name = request.getParameter("name");
    String content = request.getParameter("content");
    
    
    JSONObject job = new JSONObject();
    job.put("count"5);
    
    JSONArray jarr = new JSONArray();
    for(int i = 201; i<=205; i++){
        JSONObject ob = new JSONObject();
        ob.put("num", i);
        ob.put("name",name+"-"+i);
        ob.put("content",content+"-"+i);
        jarr.put(ob);
    }
    job.put("list", jarr);
    // System.out.println(job.toString());
    //클라이언트에게 json 데이터 전송
    out.println(job.toString());
cs

3)처리페이지에서 수행된 결과를 받아온다.

이때 넘어온 데이터를 JSON.parse() 를 통해 결과값의 문자열들을 자바스크립트의 객체로 변환해준다.

원하는 형태의 태그폼을 생성하고 innerHTML 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function printData() {
    var box = document.getElementById("box");
    
    // 서버에서 전달 받은 데이터(JSON)
    var doc = httpReq.responseText;
    //console.log(doc);
    
    var data = JSON.parse(doc);
    
    var out="";
    out="데이터개수:"+data.count+"<br><hr>";
    for(var i=0; i<data.list.length; i++){
        var num = data.list[i].num;
        var name = data.list[i].name;
        var content = data.list[i].content;
        
        out+="번호 : "+num+"<br>";  
        out+="이름 : "+name+"<br>";  
        out+="내용 : "+content+"<br>";  
        out+="<hr>";  
    }
    box.innerHTML = out;
}
cs

댓글