KoreaIt Academy/JSP

[JSP, JAVASCRIPT,JQuery] AJAX - GET방식과 POST방식

hongeeii 2021. 9. 9.
728x90
반응형

Ajax(Asynchronous Javascript and Xml) 

빠르게 동작하는 동적인 웹 페이지를 만들기 위한 개발 기법입니다.
Ajax는 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지 일부분만을 갱신할 수 있고
백그라운드 영역에서 서버와 통신하여, 그 결과를 웹 페이지의 일부분에만 표시할 수 있습니다.
이 때 서버와 아래와 같은 데이터를 주고 받을 수 있습니다.

 

-JSON
-XML
-HTML
-텍스트 파일 등 


Ajax의 장점
1. 웹 페이지 전체를 다시 로딩하지 않고도, 웹 페이지의 일부분만을 갱신할 수 있습니다.
2. 웹 페이지가 로드된 후에 서버로 데이터 요청을 보내거나 받을 수 있습니다.
3. 다양한 UI(동적 페이지)구현이 가능해집니다.

Ajax의 단점
1. 페이지 이동이 없기 때문에 히스토리 관리가 안됩니다.
2. 반복적인 데이터를 요청하면 느려지거나 작동하지 않게 됩니다.
3. 페이지의 이동이 없다는 것은 보안상의 문제도 발생할 수 있다는 것입니다.

Ajax 구성 요소
- 웹 페이지의 표현을 위한 HTML과 CSS
- 데이터에 접근하거나 화면 구성을 동적으로 조작하기 위해 사용되는 DOM 모델
- 데이터 교환을 위한 JSON이나 XML
- 웹 서버와의 비동기 통신을 위한 XMLHttpRequest 객체
- 위에서 언급한 모든 기술을 결합하여 사용자의 작업 흐름을 제어하는 데 사용되는 자바스크립트

XMLHttpRequest 객체
Ajax의 가장 핵심적인 구성 요소는 바로 XMLHttpRequest 객체입니다.
Ajax에서 XMLHttpRequest 객체는 웹 브라우저가 서버와 데이터를 교환할 때 사용됩니다.
웹 브라우저가 백그라운드에서 계속해서 서버와 통신할 수 있는 것은 바로 이 객체를 사용하기 때문입니다.

XMLHttpRequest 객체 생성 

var 객체명 = new XMLHttpRequest(); 


서버에 요청하기
Ajax에서는 XMLHttpRequest 객체를 사용하여 서버와 데이터를 교환합니다.
따라서 서버에 요청을 보내기 위해서는 객체를 생성해야 하고, 

객체의 open()메소드와 send()메소드를 사용하여 요청을 보낼 수 있습니다.

open()
서버로 보낼 Ajax 요청 형식을 설정합니다.
open(전달방식, URL, 동기 여부);

전달방식 : GET, POST 등 요청 방식 작성
URL : 요청을 처리할 서버의 파일 주소 전달
동기 여부 : 요청을 동기식으로 전달할 지, 비동기식으로 전달할 지를 선택

               - 비동기(true: 기본값)와 동기(false) 방식이 있습니다. 

send() 메소드
작성된 Ajax 요청을 서버로 전달.
전달방식에 따라서 인수를 가질 수도 가지지 않을 수도 있습니다.

send() : GET방식
send(전송할 데이터의 전달 방식에 맞추어 작성) : POST방식

setRequestHeader()
POST방식에서 전달할 데이터의 방식(타입)을 설정한다.

setRequestHeader("Content-Type", "전달할 데이터의 방식");

Ajax 요청 시 XMLHttpRequest 객체는 각 상태별로 readyState가 변합니다.
처음에는 readyState가 0(객체명.UNSENT, 보내지 않음)이었다가, open메소드를 호출하는 순간
1(객체명.OPEND)로 바뀌고 send()호출 시 순차적으로 2(객체명.HEADERS_RECEIVED),
3(객체명.LOADING), 4(객체명.DONE)으로 바뀝니다.
최종적으로 readyState가 4(객체명.DONE)가 된다면 상태코드(객체명.status)가 성공을 의미하는
200, 201일 때 응답을 확인해야 합니다.


AJAX 사용 예시) 

GET 방식

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET, POST 방식의 요청</title>
</head>
<body>
	<h1>GET 방식의 요청</h1>
	<button onclick="sendRequest()">GET 방식으로 요청 보내기!</button>
	<p id="text"></p>

	<!-- <h1>POST 방식의 요청</h1>
	<button onclick="sendRequest()">POST 방식으로 요청 보내기!</button>
	<p id="text"></p> -->
</body>

<script>
	function sendRequest() {
		var xhr = new XMLHttpRequest();

		xhr.open("GET", "request_ajax.jsp?city=Seoul&zipcode=45466", true);
		xhr.send();

		/* 	xhr.open("POST","request_ajax.jsp",true);
			xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xhr.send("city=Seoul&zipcode=45466"); */

		xhr.onreadystatechange = function() {
			if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
				document.getElementById("text").innerHTML = xhr.responseText;
			}
		}

	}
</script>
</html>

open메소드에 "GET"방식을 넣어주었고, URL에 쿼리스트링을 써주어 매개변수가 없는 send()를 썼습니다.

xhr객체가 onreadystatechange   (<!-- 상태가 변할 때마다 --!>) 일 때마다 함수가 호출 되는데,

상태가 XMLHttpRequest.DONE(상수 4) 일때와 상태코드가 200일때를 검사하여 DOM으로 TEXT를 넣어주었습니다.

 

 

 

POST 방식

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET, POST 방식의 요청</title>
</head>
<body>
	<!-- <h1>GET 방식의 요청</h1>
	<button onclick="sendRequest()">GET 방식으로 요청 보내기!</button>
	<p id="text"></p> -->

	<h1>POST 방식의 요청</h1>
	<button onclick="sendRequest()">POST 방식으로 요청 보내기!</button>
	<p id="text"></p> 
</body>

<script>
	function sendRequest() {
		var xhr = new XMLHttpRequest();

		/* xhr.open("GET", "request_ajax.jsp?city=Seoul&zipcode=45466", true);
		xhr.send(); */

			xhr.open("POST","request_ajax.jsp",true);
			xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xhr.send("city=Seoul&zipcode=45466");

		xhr.onreadystatechange = function() {
			if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
				document.getElementById("text").innerHTML = xhr.responseText;
			}
		}

	}
</script>
</html>

open메소드에 "POST"방식을 넣어주었고,

POST방식은 RequestHeader에 전달할 데이터의 타입을 지정해 주어야 합니다.

send()메소드에 매개변수로 파라메터를 보내주면 됩니다.

 

 

뒤로 가기가 되지 않는 것을 볼 수 있습니다.

=> 페이지 이동없이 AJAX로 값을 가져온 것입니다.

 

 

 

JQuery로 사용하는 AJAX

$.ajax({
		url:"",  //요청할 URL
		type:"", //메소드 방식(get, post,..)
		data:"", //전송할 데이터
		contentType:"", // 전송할 데이터의 타입
		dataType:"",//전송받을 데이터의 타입 text:responseText
		success: function(){},	//정상적으로 done됬을때 함수를 넘김
		error:function(){}  //에러가 날때에는 이 함수를 넘김
	});

다만 jquery를 사용하면 contextPath가 사라지기 때문에 붙여줘야한다. (경로가 박살난다..)

<script src="${pageContext.request.contextPath}/assets/js/jquery.min.js"></script> 

.jsp에서 el문으로 임의로 붙여줘야 경로를 찾을 수 있다.

 

 

data: json으로 보내고 , contentType:text(생략가능)으로 한다면

.java에서 request.getParameter("키값")으로 반환받을 수 있음,

 

728x90
반응형

추천 글