|
Space Map
|
Ajax(Asynchronous JavaScript + XML) 기본Table of Contents1. Ajax란? ('에이젝스'라고 발음함)'Ajax'란 이름은 2005년 2월 18일에 Adaptive Path사의 제시 제임스 가렛(Jesse James Garrett)이 쓴 블로그 형식의 칼럼 "Ajax: A New Approach to Web Applications"에 처음 등장, 이후 세상에 처음 Ajax라는 말이 알려지기 시작했다. Ajax는 'Asynchronous JavaScript + XML'을 줄인말로써, "서버 처리를 기다리지 않고 비동기(Asynchronous)요청이 가능하다"란 의미로 이해하면되겠다. 동기/비동기 통신 매커니즘
이 그림에서 개인적으론 이해가 안되는 부분이 있었다. combo box에서 어떠한 값을 선택(click event발생)했을때 Ajax Engine이 서버의 어떠한 정보를 가져오도록한 경우, 서버측에서는 결과를 추출해내기 위해 무언가 작업을 하고 있을것이다. 이때, combo box옆에 input text field를 나타나게 하는것도 같이 작업하게 했다면, 서버에서 데이터가 오기 전에 input text field는 이미 화면에 display되어 있는것이다. Web Application Model 형태
2. Ajax의 장점과 단점장점
단점
3. XMLHttpRequest Object의 송수신과 ReferenceXMLHttpRequest 오브젝트를 생성하여 HTTP 요청을 준비한 후, 서버에 접속하여 데이터 및 요청을 보내고, responseText 또는 responseXML 프로퍼티로 수신한다. XMLHttpRequest Object 생성
대체로 어느 브라우저에서도 작동될 수 있도록 크로스 브라우저 라이브러리 사용 function createHttpRequest(){
if(window.ActiveXObject){
try{
//win ie4, ie5, ie6
return new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
return new ActiveXObject("Microsoft.XMLHTTP");
}catch (e2) {
return null;
}
}
}else if(window.XMLHttpRequest){
//ie, safari, kconqueror, firefox, nescape, opera
return new XMLHttpRequest();
}else{
return null;
}
}
초기화
obj.open( 'POST', 'http://wiki.javajigi.net/' )
send('data=1')
obj.open( 'GET', 'http://wiki.javajigi.net/', true, javajigi, javajigi )
요청 헤더 설정
obj.open( 'POST', 'http://wiki.javajigi.net/' )
obj.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
Http 요청 송신
var str = 'data=aaa&test=10'
send(str)
착신요청이 송신되면 서버로부터 그에 대한 응답이 도착하는데, 언제 도착할지 모를때 이를 확인하기 위해 onreadystatechange이벤트를 이용한다.
// readyState값이 4일때, responseText를 대화창에 표시 obj.onreadystatechange = func1 function func1() { if ( obj.readyState == 4 ) { alert(obj.responseText); } }
obj.onload = function (obj) {
alert( obj.responseText )
}
obj.onreadystatechange = function () {
if (obj.readState == 4 && obj.status == 200) {
alert(obj.responseText)
}
}
obj.onreadystatechange = function () {
if (obj.readState == 4 && obj.statusText == "OK") {
alert(obj.responseText)
}
}
데이터
샘플XML파일 <?xml version="1.0" encoding="UTF-8"?> <test>읽어들인 XML입니다</test> obj.onreadystatechange = function () {
if (obj.readState == 4) {
// 응답을 취득
var xmlDoc = oj.responseXML
// test tag를 배열로 set
var nodes = xmlDoc.getElementsByTagName("test")
// 최초 test tag의 firstChild 값을 표시한다.
alert(nodes[0].firstChild.nodeValue)
}
}
결과 : 알림창에 '읽어들인 XML입니다'를 띄운다.
obj.onreadystatechange = function () {
if (obj.readState == 4) {
alert(obj.responseText)
}
}
기타 reference
// 수신완료 후, 모든 응답 헤더를 대화창에 표시 if (obj.readyState == 4) { alert(obj.getAllResponseHeaders()) } 실행 결과: Date : Mon, 1 May 2006 14:45:24 GMT
Server : Apache/2.0.40 (Red Hat Linux)
Last-Modified: Mon, 1 May 2006 14:51:20 GMT
ETag : "6b043c-51-62002a00"
Accept=Ranges: bytes
Content-Length: 81
Keep-Alive : timeout=12, max=198
Connection: Keep-Alive
Content-Type: text/plain
4. 샘플소스Ajax용 간이 크로스 브라우저 라이브러리를 작성하여, response에 대해 XML이나 Text형식으로 받아 처리하는 예제를 테스트해보도록 한다. jslb-ajax.js //// // 동작가능한 브라우저 판정 // // @sample if(chkAjaBrowser()){ location.href='nonajax.htm' } // @sample oj = new chkAjaBrowser();if(oj.bw.safari){ /* Safari 코드 */ } // @return 라이브러리가 동작가능한 브라우저만 true true|false // function chkAjaBrowser() { var a,ua = navigator.userAgent; this.bw= { safari : ((a=ua.split('AppleWebKit/')[1])?a.split('(')[0]:0)>=124 , konqueror : ((a=ua.split('Konqueror/')[1])?a.split(';')[0]:0)>=3.3 , mozes : ((a=ua.split('Gecko/')[1])?a.split(" ")[0]:0) >= 20011128 , opera : (!!window.opera) && ((typeof XMLHttpRequest)=='function') , msie : (!!window.ActiveXObject)?(!!createHttpRequest()):false } return (this.bw.safari||this.bw.konqueror||this.bw.mozes||this.bw.opera||this.bw.msie) } //// // XMLHttpRequest 오브젝트 생성 // // @sample oj = createHttpRequest() // @return XMLHttpRequest 오브젝트(인스턴스) // function createHttpRequest() { if(window.ActiveXObject){ //Win e4,e5,e6용 try { return new ActiveXObject("Msxml2.XMLHTTP") ; } catch (e) { try { return new ActiveXObject("Microsoft.XMLHTTP") ; } catch (e2) { return null ; } } } else if(window.XMLHttpRequest){ //Win Mac Linux m1,f1,o8 Mac s1 Linux k3용 return new XMLHttpRequest() ; } else { return null ; } } //// // 송수신 함수 // // @sample sendRequest(onloaded,'&prog=1','POST','./about2.php',true,true) // @param callback 송수신시에 기동하는 함수 이름 // @param data 송신하는 데이터 (&이름1=값1&이름2=값2...) // @param method "POST" 또는 "GET" // @param url 요청하는 파일의 URL // @param async 비동기라면 true 동기라면 false // @param sload 수퍼 로드 true로 강제、생략또는 false는 기본 // @param user 인증 페이지용 사용자 이름 // @param password 인증 페이지용 암호 // function sendRequest(callback,data,method,url,async,sload,user,password) { //XMLHttpRequest 오브젝트 생성 var oj = createHttpRequest(); if( oj == null ) return null; //강제 로드의 설정 var sload = (!!sendRequest.arguments[5])?sload:false; if(sload || method.toUpperCase() == 'GET')url += "?"; if(sload)url=url+"t="+(new Date()).getTime(); //브라우저 판정 var bwoj = new chkAjaBrowser(); var opera = bwoj.bw.opera; var safari = bwoj.bw.safari; var konqueror = bwoj.bw.konqueror; var mozes = bwoj.bw.mozes ; //송신 처리 //opera는 onreadystatechange에 중복 응답이 있을 수 있어 onload가 안전 //Moz,FireFox는 oj.readyState==3에서도 수신하므로 보통은 onload가 안전 //Win ie에서는 onload가 동작하지 않는다 //Konqueror은 onload가 불안정 //참고 http://jsgt.org/ajax/ref/test/response/responsetext/try1.php if(opera || safari || mozes){ oj.onload = function () { callback(oj); } } else { oj.onreadystatechange =function () { if ( oj.readyState == 4 ){ callback(oj); } } } //URL 인코딩 data = uriEncode(data) if(method.toUpperCase() == 'GET') { url += data } //open 메소드 oj.open(method,url,async,user,password); //헤더 application/x-www-form-urlencoded 설정 setEncHeader(oj) //디버그 //alert("////jslb_ajaxxx.js//// \n data:"+data+" \n method:"+method+" \n url:"+url+" \n async:"+async); //send 메소드 oj.send(data); //URI 인코딩 헤더 설정 function setEncHeader(oj){ //헤더 application/x-www-form-urlencoded 설정 // @see http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/interact/forms.html#h-17.13.3 // @see #h-17.3 // ( enctype의 기본값은 "application/x-www-form-urlencoded") // h-17.3에 의해、POST/GET 상관없이 설정 // POST에서 "multipart/form-data"을 설정할 필요가 있는 경우에는 커스터마이즈 해주세요. // // 이 메소드가 Win Opera8.0에서 에러가 나므로 분기(8.01은 OK) var contentTypeUrlenc = 'application/x-www-form-urlencoded; charset=UTF-8'; if(!window.opera){ oj.setRequestHeader('Content-Type',contentTypeUrlenc); } else { if((typeof oj.setRequestHeader) == 'function') oj.setRequestHeader('Content-Type',contentTypeUrlenc); } return oj } //URL 인코딩 function uriEncode(data){ if(data!=""){ //&와=로 일단 분해해서 encode var encdata = ''; var datas = data.split('&'); for(i=1;i<datas.length;i++) { var dataq = datas[i].split('='); encdata += '&'+encodeURIComponent(dataq[0])+'='+encodeURIComponent(dataq[1]); } } else { encdata = ""; } return encdata; } return oj }
5. 활용예제
관련링크 & 참고문서 |
|







Comments (5)
4월 23, 2006
강윤기 says:
8차 스터디 파트너 최진영씨 연락이 안되서요~ ~ 우선 젤루 쉬워 보이는걸루 선택했습니다. ^^ 잘써야할텐데8차 스터디 파트너 최진영씨 연락이 안되서요~
~ 우선 젤루 쉬워 보이는걸루 선택했습니다. ^^ 잘써야할텐데
5월 03, 2006
고덕성 says:
고생이 많으시군요 ^^. 이따 뵙겠습니다. ~고생이 많으시군요 ^^. 이따 뵙겠습니다. ~
5월 03, 2006
최진영 says:
하핫~ 넘 늦어서 지성~ ^^;;하핫~ 넘 늦어서 지성~ ^^;;
5월 04, 2006
남연숙 says:
어제 못가서 .. 죄송해요. ajax 꼭 듣구 싶었던 내용이였는데.. 회사에 오픈하는게 있어서 참석하지못했네요~어제 못가서 .. 죄송해요.
ajax 꼭 듣구 싶었던 내용이였는데..
회사에 오픈하는게 있어서 참석하지못했네요~
4월 02, 2007
Nara park says:
샘플코드 테스트 결과 IE7에서 responseXML 테스트는 htm파일과 xml파일을 charset을 utf-8으로 하면 JS 에러가 발생...샘플코드 테스트 결과 IE7에서
responseXML 테스트는 htm파일과 xml파일을 charset을 utf-8으로 하면 JS 에러가 발생하네요
charset을 euc-kr로 변경하면 정상적으로 작동하구요.
한글 IE7이라서 그런건지...아니면.. ^^;
responseText 테스트는 정상적으로 작동하네요.
타 브라우저 테스트는 FireFox에서 해봤는데..
정상작동하구요.