검색결과 리스트
글
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
원문은 "Ajax 기본 예제와 JSP 엔진에서 한글 인코딩 충돌 문제 처리"인데 Ajax 기본 예제부분만 발췌했습니다.
Ajax가 필요한 일이 발생해서, 급조해서 Ajax를 공부했다.
공부한 책은 Ajax 입문이며, 처음 약 5~60 페이지만 읽었다. 급조한 내용이니 너무 신뢰하지 말 것. 아.. 그리고 이 책, 중대한 오탈자가 은근히 있다. 혹시 이 책으로 공부하고자 한다면 오탈자를 확인한 뒤에 공부해서 불필요한 시간 낭비를 줄이는 것이 좋겠다.
아무튼, 책의 내용중 Ajax의 기본적인 사용에 관한 문제를 정리하고, 또 JSP/Servlet 엔진에서 Ajax사용시에 발생하는 한글 인코딩(encoding)문제의 처리방법도 정리해 둔다.
Ajax의 개념에 관한 설명은 인터넷 상에 차고 넘치므로 생략.
* A Simpler Ajax Path가 Ajax 입문에 좋은 글.
1. XMLHttpRequest 객체 생성
2. HTTP 요청을 발생시킴(open(), send())
3. 서버측에서 XMLHttpRequest를 통해 보낸 요청을 받아서 파라미터를 분석하고, 작업을 한 뒤에 결과를 XML이나 문자열로 리턴한다.
4. XMLHttpRequest로 서버가 리턴한 데이터를 받아서 처리(onreadystatechange, responseText, responseXML)
// XMLHttpRequest 오브젝트 생성 함수
// @sample oj = createHttpRequest();
// @return XMLHttpRequest 오브젝트
function createHttpRequest()
{
if (window.ActiveXObject) {
try {
// IE6
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
// IE4, IE5
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
return null;
}
}
} else if (window.XMLHttpRequest) {
// Mozilla, FireFox, Opera, Safari, Konqueror3
return new XMLHttpRequest();
} else {
return null;
}
}
1. open() 메소드 실행 (POST/GET, 요청URL, 동기/비동기지정)
var request = createHttpRequest();
request.open("GET", "/test.xml");
// param 1 : GET/POST
// param 2 : URL
// param 3 : 생략가능. 동기/비동기 여부. 기본 비동기.
2. send() 메소드(데이터 송신)
request.send(null); // Konqueror에서는 오류 발생함. Konqueror를 제외하고 데이터 없이 전송할 때 사용가능
위 a,b가 기본적인 모양새이지만, 실제로 GET과 POST 방식에 따라 차이가 많이난다.
* GET 방식 : GET 방식은 URL에 파라미터를 직접 붙여 보내지만, 한글 등의 문제로 인코딩이 필요하고, RequestHeader 설정도 필요하다. 일반적으로 다음과 같은 모양이 된다.
var paramValue = encodedURIComponent("파라미터값"); // 파라미터 값을 UTF-8로 인코딩
// 파라미터 구분에 사용되는 ?와 &는 인코딩 되면 안된다. 그래서 따로 붙인다.
var fullParameter = '?' + paramName + '=' + paramValue; // URL에 사용할 파라미터 구성
request.open("GET", "/test.cgi" + data);
// setRequestHeader()는 open()보다 이후에 나와야만 한다.
// 아래는 파라미터 값을 UTF-8로 인코딩해서 보내겠다는 의미.
// GET방식에서는 필요 없고, POST방식에서는 필수이다.
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(null);
* POST 방식 : send() 메소드에 인수를 데이터로 넘긴다.
request.open("POST", "/test.cgi");
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
// POST 방식에서도 파라미터를 인코딩하여 send()메소드의 인자로 넘겨주면 된다.
request.send("name=test&data=123");
A Simpler Ajax Path에 보면 HTML폼에 입력된 값을 자동으로 파라미터 문자열로 변경해주는 메소드 예가 있다.
* onreadystatechange 이벤트(송수신 상태 변할때 기동) - IE 이외 부라우저에서는 콜백 스타일의 onload 이벤트 사용가능
* readyState 프라퍼티 (송수신 상태를 나타내는 값. "4"가 송신 완료) - onload의 경우에는 불필요
onreadystatechange는 요청 처리 상태를 나타내는 readyState 프라퍼티의 값이 바뀔 때 발생한다.
* 착신을 처리할 함수 지정은 request.open() 함수를 호출하기 전에 선언해야 정상 작동했다. 항상 요청을 보내기 전에 요청을 처리할 함수 지정을 해둔다.
function callbackFunction() {
// readyState == 4는 착신 완료를 의미한다.
if (request.readyState == 4) {
// 착신시의 처리
}
}
다른 방법으로, callback 함수를 인라인으로 정의하고, HTTP 상태 코드가 200일때만 작업하도록 할 수도 있다. 두가지를 한꺼번에 보면,
request.onreadystatechange = funcation() {
if (request.readyState == 4 &&
request.status == 200) {
// 착신시의 처리
}
}
onreadystatechange 대신 onload를 사용할 수 있다. Opera 8은 버그때문에 onload만 사용한다. (IE를 제외한 다른 브라우저에서 다 된다)
request.onload = function() {
// 착신시의 처리
}
onload와 onreadystatechange를 동시에 이용하기 위해서 다음과 같이한다.
if (window.opera) {
request.onload = function() { callback(request); }
} else {
request.onreadystatechange = function() {
if (request.readyState == 4) {
callback(request);
}
}
}
function callback(request) {
// 실제 착신시의 처리를 구현하는 부분
}
* responseText 또는 responseXML (데이터를 텍스트 혹은 DOMDocument로 수신)
* responseText : 텍스트로 받기
* responseXml : XML로 받기
* 여러줄의 CSV 텍스트를 받았을 때의 일반적 처리
var res = request.responseText;
var rows = res.split(" "); // 여러 줄을 한 줄씩 배열로 만든다.
var cols = rows[0].split(","); // 첫번째 줄을 쉼표 단위로 분리하여 배열로 만든다.
* JSON 처리
eval("res = " + request.responseText)
//... 기타 처리
* XML 처리
<?xml version="1.0"?>
<lists>
<name>Toshiro Takahashi</name>
<msg>hello</msg>
</lists>
var res = request.responseXML;
var msgs = res.getElementsByTagName("msg"); // DOM 객체 사용
alert(msg[0].firstChild.nodeValue);
출처 : http://kwon37xi.egloos.com/2558053
Ajax가 필요한 일이 발생해서, 급조해서 Ajax를 공부했다.
공부한 책은 Ajax 입문이며, 처음 약 5~60 페이지만 읽었다. 급조한 내용이니 너무 신뢰하지 말 것. 아.. 그리고 이 책, 중대한 오탈자가 은근히 있다. 혹시 이 책으로 공부하고자 한다면 오탈자를 확인한 뒤에 공부해서 불필요한 시간 낭비를 줄이는 것이 좋겠다.
아무튼, 책의 내용중 Ajax의 기본적인 사용에 관한 문제를 정리하고, 또 JSP/Servlet 엔진에서 Ajax사용시에 발생하는 한글 인코딩(encoding)문제의 처리방법도 정리해 둔다.
Ajax의 개념에 관한 설명은 인터넷 상에 차고 넘치므로 생략.
* A Simpler Ajax Path가 Ajax 입문에 좋은 글.
Ajax의 개발 순서
1. XMLHttpRequest 객체 생성
2. HTTP 요청을 발생시킴(open(), send())
3. 서버측에서 XMLHttpRequest를 통해 보낸 요청을 받아서 파라미터를 분석하고, 작업을 한 뒤에 결과를 XML이나 문자열로 리턴한다.
4. XMLHttpRequest로 서버가 리턴한 데이터를 받아서 처리(onreadystatechange, responseText, responseXML)
XMLHttpRequest에 의한 송수신 상세 예
JavaScript에서 XMLHttpRequest Object 생성하기
// XMLHttpRequest 오브젝트 생성 함수
// @sample oj = createHttpRequest();
// @return XMLHttpRequest 오브젝트
function createHttpRequest()
{
if (window.ActiveXObject) {
try {
// IE6
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
// IE4, IE5
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
return null;
}
}
} else if (window.XMLHttpRequest) {
// Mozilla, FireFox, Opera, Safari, Konqueror3
return new XMLHttpRequest();
} else {
return null;
}
}
HTTP 요청 발생
1. open() 메소드 실행 (POST/GET, 요청URL, 동기/비동기지정)
var request = createHttpRequest();
request.open("GET", "/test.xml");
// param 1 : GET/POST
// param 2 : URL
// param 3 : 생략가능. 동기/비동기 여부. 기본 비동기.
2. send() 메소드(데이터 송신)
request.send(null); // Konqueror에서는 오류 발생함. Konqueror를 제외하고 데이터 없이 전송할 때 사용가능
위 a,b가 기본적인 모양새이지만, 실제로 GET과 POST 방식에 따라 차이가 많이난다.
* GET 방식 : GET 방식은 URL에 파라미터를 직접 붙여 보내지만, 한글 등의 문제로 인코딩이 필요하고, RequestHeader 설정도 필요하다. 일반적으로 다음과 같은 모양이 된다.
var paramValue = encodedURIComponent("파라미터값"); // 파라미터 값을 UTF-8로 인코딩
// 파라미터 구분에 사용되는 ?와 &는 인코딩 되면 안된다. 그래서 따로 붙인다.
var fullParameter = '?' + paramName + '=' + paramValue; // URL에 사용할 파라미터 구성
request.open("GET", "/test.cgi" + data);
// setRequestHeader()는 open()보다 이후에 나와야만 한다.
// 아래는 파라미터 값을 UTF-8로 인코딩해서 보내겠다는 의미.
// GET방식에서는 필요 없고, POST방식에서는 필수이다.
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
request.send(null);
* POST 방식 : send() 메소드에 인수를 데이터로 넘긴다.
request.open("POST", "/test.cgi");
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
// POST 방식에서도 파라미터를 인코딩하여 send()메소드의 인자로 넘겨주면 된다.
request.send("name=test&data=123");
A Simpler Ajax Path에 보면 HTML폼에 입력된 값을 자동으로 파라미터 문자열로 변경해주는 메소드 예가 있다.
착신과 데이터 처리
* onreadystatechange 이벤트(송수신 상태 변할때 기동) - IE 이외 부라우저에서는 콜백 스타일의 onload 이벤트 사용가능
* readyState 프라퍼티 (송수신 상태를 나타내는 값. "4"가 송신 완료) - onload의 경우에는 불필요
onreadystatechange는 요청 처리 상태를 나타내는 readyState 프라퍼티의 값이 바뀔 때 발생한다.
* 착신을 처리할 함수 지정은 request.open() 함수를 호출하기 전에 선언해야 정상 작동했다. 항상 요청을 보내기 전에 요청을 처리할 함수 지정을 해둔다.
function callbackFunction() {
// readyState == 4는 착신 완료를 의미한다.
if (request.readyState == 4) {
// 착신시의 처리
}
}
다른 방법으로, callback 함수를 인라인으로 정의하고, HTTP 상태 코드가 200일때만 작업하도록 할 수도 있다. 두가지를 한꺼번에 보면,
request.onreadystatechange = funcation() {
if (request.readyState == 4 &&
request.status == 200) {
// 착신시의 처리
}
}
onreadystatechange 대신 onload를 사용할 수 있다. Opera 8은 버그때문에 onload만 사용한다. (IE를 제외한 다른 브라우저에서 다 된다)
request.onload = function() {
// 착신시의 처리
}
onload와 onreadystatechange를 동시에 이용하기 위해서 다음과 같이한다.
if (window.opera) {
request.onload = function() { callback(request); }
} else {
request.onreadystatechange = function() {
if (request.readyState == 4) {
callback(request);
}
}
}
function callback(request) {
// 실제 착신시의 처리를 구현하는 부분
}
* responseText 또는 responseXML (데이터를 텍스트 혹은 DOMDocument로 수신)
* responseText : 텍스트로 받기
* responseXml : XML로 받기
* 여러줄의 CSV 텍스트를 받았을 때의 일반적 처리
var res = request.responseText;
var rows = res.split(" "); // 여러 줄을 한 줄씩 배열로 만든다.
var cols = rows[0].split(","); // 첫번째 줄을 쉼표 단위로 분리하여 배열로 만든다.
* JSON 처리
eval("res = " + request.responseText)
//... 기타 처리
* XML 처리
<?xml version="1.0"?>
<lists>
<name>Toshiro Takahashi</name>
<msg>hello</msg>
</lists>
var res = request.responseXML;
var msgs = res.getElementsByTagName("msg"); // DOM 객체 사용
alert(msg[0].firstChild.nodeValue);
출처 : http://kwon37xi.egloos.com/2558053
'WEB' 카테고리의 다른 글
WSH - WScript 와 CScript (0) | 2009.08.07 |
---|---|
특수문자의 URL 인코딩 결과값 (0) | 2009.04.20 |
웹페이지를 mht로 변환하기 (0) | 2007.11.22 |
WSH - WScript 와 CSciprt (0) | 2006.09.12 |
HTTP상태코드 및 의미 (0) | 2006.08.31 |
RECENT COMMENT