내가 이해한 한도내에서의 스프링에서의 ajax 구현시 데이터 흐름도는

1. ajax 함수 호출 



2.  - ajax함수내에서 데이터 조회에 참조할 데이터변수
     - 요청주소(컨트롤러에 맵핑해서 실행할 url 주소) 설정



3. 2번항목에서 지정한 컨트롤러에 실행되는 메소드내에서는 getParameter로 해당 변수를 받아온 후
    해당 변수를 사용하여 쿼리를 날려 결과값을 setAttribute 를 사용하여 jsp 단으로 전달한다. (return "abc.jsp";)



4. jsp에서는
        - 
responseText 인 경우 예를 들어
        <%  String result = (String) request.getAttribute("result");  out.write(result);         %>

과 같은 처리.

  - responseXML 인 경우

ArrayList<자료형> abc = (캐스팅 변환)request.getAttribute("속성명");

형대로 받아 StringBuilder를 사용해서 XML 형대로 문자열을 누적 처리.

다만, jsp에서 XML 형태로 가공할때 가공 후 응답은 

response.setContentType("text/xml; charset=euc-kr");

response.getWriter().write(result.toString()); 

을 사용하여 리턴.

EX) 간단한 XML 형태

<?xml version="1.0" encoding="utf-8"?>
<users>
<user>
<name>HyunWook Kim</name>
</user>
<user>
<name>redccoma</name>
</user>
</users>



5.    out.write(result) 구문이 실행되면 ajax 관련 함수중 콜백 함수를 실행하면서 응답확인을 하고 에러검출이 안될 경우

지정한 액션 혹은 지정한 함수를 실행. 예를 들어 xmlReq.status == 200 과 같은 조건일 경우 정상응답이므로 해당 조건하에서

사용자 정의 액션처리를 바로 하거나 printData(); 와 같은 사용자 지정함수를 호출.



6. printData() 와 같은 함수를 호출한다고 가정할 경우 var result = xmlReq.responseText; 

   혹은 var result = xmlReq.responseXML;  형태로 결과 데이터를 저장.

   당연히 TEXT와 같은 경우 단일 데이터이므로 재처리할 필요 없이 원하는 액션처리를 하면 되고,

   XML의 경우 아래의 코드처럼 xml값을 분석하여 가져온 후 동적으로 html 소스생성하고 innerHTML을 통해 문서로

   최종반환하여 처리를 종료.


  ex) 간단한 XML 분석 및 HTML 동적 소스 생성

var users = result.getElementsByTagName("user");

for(var i=0;i<users.length;i++){

result += users[i].getElementsByTagName("name")[0].firstChild.nodeValue + "<br>";

}

document.getElementById("str").innerHTML = str;


아래 영문내용과는 다르게 구현된 AJAX 소스 (어차피 같은 의미임-.-)

//AjaxSend02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

<script type="text/javascript">


//전역변수

var xmlReq; 

//전송 역할 함수

function myFunc() {

var data = document.getElementById("data");

//ajax 객체

xmlReq = new XMLHttpRequest(); //IE 7.0 이상

//서버 요청주소

var url = "AjaxReceive02.jsp";

//서버요청시 데이터 전송하는 부분

//데이터가 두개 이상인 경우는

//식별자=값&식별자=값&.... 형태로 작성

var postString = "data=" + data.value;

//응답이 돌아온다면 callback 함수 호출

//이벤트 등록 부분

xmlReq.onreadystatechange = callBack;

//ajax 요청 형식 // true는 비동기

xmlReq.open("POST", url, true);

//전송하는 데이터 안에 한글이 있는 경우 인코딩방식을 알려주어야 함.

xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=euc-kr");

//ajax 요청

xmlReq.send(postString);

}

//응답 확인 함수

function callBack() {

//state는 1, 2, 3, 4의 총 4가지 상태가 있음.

//1은 요청전

//2는 요청후

//3은 서버로 응답을 보낸 상태

//4는 최종 응답을 받은 상태를 의미

if(xmlReq.readyState == 4) {

//status는 서버 응답의 종류를 의미

//200은 정상적인 처리가 되었음을 의미

//500은 JSP 실행은 했지만 오류가 발생함.

//404는 요청 주소에 해당하는 파일이 없음.

if(xmlReq.status == 200) {

//정상적인 응답을 화면에 출력하는 함수 호출

printData();

} else {

alert("처리 불가!");

}

}

}

//결과 출력 함수

function printData() {

//응답은 두가지 종류가 존재

//responseText, responseXML

var result = xmlReq.responseText;

//alert(result);

var msg = document.getElementById("msg");

msg.innerHTML = result;

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2(ajax 방식)</h2>

<form>

이름 <input type="text" name="name" id="name"><br>

전화번호 <input type="text" name="tel" id="tel"><br>

아이디 <input type="text" name="data" id="data"><br>

<input type="button" value="중복체크" onclick="myFunc()">

</form>

<div>결과 데이터 : <span id="msg"></span></div>

</div>

</body>

</html>




//AjaxReceive02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%


String data = request.getParameter("data");

String result = "OK";

if(data.equals("test") || data.equals("admin") || data.equals("hong")) {

result = "Cancel";

}


//ajax 방식에서 데이터를 처리후 재전송할때 out.write(값); 을 사용해야 함.

out.write(result);

%>



JSPAndAJAXExamples


Example 1 - Server side JSP encoding

service.jsp:

  <%@page contentType="text/html; charset=UTF-8"%>
 
<%@page import="org.json.simple.JSONObject"%>
 
<%
   
JSONObject obj=new JSONObject();
    obj
.put("name","foo");
    obj
.put("num",new Integer(100));
    obj
.put("balance",new Double(1000.21));
    obj
.put("is_vip",new Boolean(true));
    obj
.put("nickname",null);
   
out.print(obj);
   
out.flush();
  %>

Please note that you need to place json_simple-1.1.jar in WEB-INF/lib before running the JSP. Then the client side will get the resulting JSON text.

Example 2 - Client side XMLHttpRequest

client.html:

<html>
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<script type="text/javascript">
function createXMLHttpRequest(){
 
// See http://en.wikipedia.org/wiki/XMLHttpRequest
 
// Provide the XMLHttpRequest class for IE 5.x-6.x:
 
if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
   
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
   
try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
   
throw new Error( "This browser does not support XMLHttpRequest." )
 
};
 
return new XMLHttpRequest();
}

var AJAX = createXMLHttpRequest();

function handler() {
 
if(AJAX.readyState == 4 && AJAX.status == 200) {
     
var json = eval('(' + AJAX.responseText +')');
      alert
('Success. Result: name => ' + json.name + ',' + 'balance => ' + json.balance);
 
}else if (AJAX.readyState == 4 && AJAX.status != 200) {
    alert
('Something went wrong...');
 
}
}

function show(){
  AJAX
.onreadystatechange = handler;
  AJAX
.open("GET", "service.jsp");
  AJAX
.send("");
};
</script>

<body>
 
<a href="#" onclick="javascript:show();"> Click here to get JSON data from the server side</a>
</html>

Please place client.html and service.jsp (see Example 1) in the same directory and then open client.html in IE or Firefox, click the link and you'll get result.



출처 : https://code.google.com/p/json-simple/wiki/JSPAndAJAXExamples


WRITTEN BY
빨강꼬마

,