📚 Study/Javascript

AJAX :: AJAX 실습 (텍스트 변경, 화면 제어 확인)

bono-hye 2023. 12. 28. 00:25

💫 AjaxTest01

# AjaxTest01.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AjaxTest01.html</title>
<link rel="stylesheet" type="text/css" href="css/main.css">

<script type="text/javascript">

	function loadXMLDocs() 
	{
    	// XMLHttpRequest 객체(→ AJAX 객체)를 담을 변수 선언
		var xmlHttp;
		
        // (클라이언트 측) 브라우저에 따른 분기
		// (클라이언트 측에서) 자신의 브라우저가 XMLHttpRequest 를
		// 지원하고 있는 상황이라면...
		if (window.XMLHttpRequest)
		{
        	// (이렇게...) 이와 같은 방법으로 객체를 생성하고
			xmlHttp = new XMLHttpRequest();
		}
		else
		{
        	// (저렇게...) 이와 같은 방법으로 객체를 생성하고
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
        // ※ 객체를 생성하는 방법의 차이만 있을 뿐
		//    여기까지 수행하면 XMLHttpRequest 객체(→ AJAX 객체) 생성 완료~!!!
		
		// 『xmlHttp』 : XMLHttpRequest 객체
		// 서버로부터 응답이 오면 『readystatechange』 이벤트가 발생하게 된다.
		// 『onreadystatechange』 : readystatechange 이벤트가 발생했을 때
		// 동작할 수 있도록 이벤트 핸들러를 등록하는 과정.
		// 즉, 이와 같은 이벤트가 발생하게 되면... 다음의 내용처럼 동작해라~!!! 라는 의미.
		
        //xmlHttp.onreadystatechange = 기능,동작,행위;
		xmlHttp.onreadystatechange = function() 
		{
        
        	// 응답이 올 때 마다
			// readyState 가 그 상황에서의 XMLHttpRequest 상태를 저장하게 된다.
			// 즉, readyState 는 XMLHttpRequest 객체의 property 이다.
			// ==> readystatechange 이벤트는
			//     readyState 가 변경될 때 마다 발생하게 된다.
			
			// ※ 『XMLHttpRequest』의 『readyState』는 0 에서 4 까지 순차적으로 변화한다.
			//    0 → 요청이 초기화 되지 않음.
			//    1 → 서버 연결이 이루어지지 않음.
			//    2 → 요청이 수신됨.
			//    3 → 요청을 처리중
			//    4 → 요청의 처리가 종료되고, 응답이 준비됨.
			
			// 요청의 처리가 종료되고, 응답이 준비된 상태라면...
            
			if (xmlHttp.readyState == 4)
			{
            	// ※ 『XMLHttpRequest』의 『status』는 『HTTP Status』 코드를 의미한다.
				//    200 → 올바른 응답
				//    40x → 클라이언트 측 에러
				//    50x → 서버 측 에러
                
				if (xmlHttp.status == 200)
				{
                
                	// 이 구문을 통해 서버로부터 응답을 정상적으로 받았을 때
					// 그 응답을 가져와서 DOM 을 업데이트 하겠다는 의미.
					// 응답의 속성에는 크게 두 가지가 있는데
					// 『responseText』는 텍스트 형식의 응답일 경우 사용하게 되고
					// 『responseXML』은 응답이 XML 형식일 경우 사용하게 된다.
                    
					document.getElementById("myDiv").innerHTML = xmlHttp.responseText;
				}
			}
		};
        
        // 『XMLHttpRequest』의 『open("페이지 요청 방식", "URL", async)』
		// XMLHttpRequest 객체를 필요한 설정으로 초기화하는데 사용하는 메소드이다.
		// GET 방식이 아닌 POST 방식으로 요청하기 위해서는
		// 『xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlendcoded");
		//   xmlHttp.send(input1=value1&input2=value2);』
		// 와 같은 구문으로 헤더를 추가해 주어야 한다.
		
		xmlHttp.open("GET", "ajaxTarget.txt", true);
		xmlHttp.send("");
	}

</script>
</head>
<body>

<div id="myDiv">
	<h1>AJAX 를 이용하여 이 텍스트를 바꾸어본다.</h1>
</div>

<button type="button" class="btn" onclick="loadXMLDocs()">Content 바꾸기</button>

</body>
</html>

 

# ajaxTarget.txt

(텍스트만 있는, 버튼 누르면 요청할 페이지 코드는 생략~~)

 


💫 AjaxTest02

# ajax.js

- AJAX 객체 생성 함수 정의

var ajax = null;

function createAjax() 
{
	if (window.XMLHttpRequest)		
		return new XMLHttpRequest();
	else if (window.ActiveXObject)		
		return new ActiveXObject("Msxml2.XMLHTTP");		
	else 							
		return null;
}

 

# web.xml

   <servlet>
  	<servlet-name>test02send</servlet-name>
  	<servlet-class>com.test.ajax.Test02Send</servlet-class>
   </servlet>
  
   <servlet-mapping>
  	<servlet-name>test02send</servlet-name>
	<url-pattern>/test02send.do</url-pattern>
   </servlet-mapping>


   <servlet>
  	<servlet-name>test02</servlet-name>
  	<servlet-class>com.test.ajax.Test02</servlet-class>
   </servlet>
  
   <servlet-mapping>
  	<servlet-name>test02</servlet-name>
	<url-pattern>/test02.do</url-pattern>
   </servlet-mapping>

 

# Test02Send.java

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	// GET 방식이든 POST 방식이든
	// 어떤 방식의 요청에도 모두 처리할 수 있는 사용자 정의 메소드
	
	String view = "WEB-INF/view/AjaxTest02.jsp";
	
	RequestDispatcher dispatcher = request.getRequestDispatcher(view);
	dispatcher.forward(request, response);
}

 

# AjaxTest02.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AjaxTest02.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
<style type="text/css">
	.short
	{
		width: 50px;
		text-align: right;
	}
</style>

<script type="text/javascript" src="<%=cp%>/js/ajax.js"></script>
<script type="text/javascript">

	function sum() 
	{
		var n1 = document.getElementById("num1").value;
		var n2 = document.getElementById("num2").value;
		
		var url = "test02.do?n1="+n1+"&n2="+n2;
		
		ajax = createAjax();
		
		ajax.open("GET", url, true);
		
		ajax.onreadystatechange = function() 
		{
			if (ajax.readyState == 4)
				if(ajax.status == 200)
					callBack();
		};
		
		ajax.send("");
	}
	
	function callBack() 
	{
    	// 서버에서 응답할 데이터가 텍스트일 경우(단일 데이터)
		var data = ajax.responseText;
		
		// 서버에서 응답한 데이터가 XML 일 경우(다량의 데이터)
		//var data = ajax.responseXML;
		
		document.getElementById("result").value = data;
	}

</script>

</head>
<body>

<div>
	<h1>AJAX 기본 실습</h1>
	<hr>
</div>

<input type="text" id="num1" class="txt short" />
+
<input type="text" id="num2" class="txt short" />
<input type="button" value=" = " class="btn" onclick="sum()"/>
<input type="text" id="result" class="txt short"/>

<br><br>

<p>같은 페이지에 있는 기타 다른 요소들</p>

<input type="text" />
<br>

<input type="checkbox" name="check" value="check1"/> 체크1
<input type="checkbox" name="check" value="check2"/> 체크2
<br>

<input type="radio" name="rdo" value="rdo1"/> 라디오1
<input type="radio" name="rdo" value="rdo2"/> 라디오2
<br>

<select id="sel">
	<option value="1">선택1</option>
	<option value="2">선택2</option>
	<option value="3">선택3</option>
</select>

</body>
</html>

➰체크할 내용➰

1. ajax.open("GET", url, true)

 - GET : 데이터 전송 및 페이지 요청 방식 (POST 사용도 가능, POST 사용 시 헤더 추가 필요)

 - url : AJAX 요청 페이지 (데이터 수신 및 응답 페이지)

 - true :  비동기. false 일 경우에는 동기. AJAX 처리 과정에서 동기는 사용하지 않음 즉, true를 써야 비동기 처리 가능

 

2. ajax.send("")

 - 실제 서버에서 AJAX 요청. 즉, 이 부분이 진짜 연결 작업!!

 - GET 방식 사용할 경우 인자값 "" / POST 방식 사용할 경우 인자값에 해당 데이터 넣기

 

# Test02.java

protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
	int n1 = Integer.parseInt(request.getParameter("n1"));
	int n2 = Integer.parseInt(request.getParameter("n2"));
	
	int result = n1 + n2;
		
	request.setAttribute("result", result);
		
	RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/view/Test02_ok.jsp");
	dispatcher.forward(request, response);
}

 

# Test02_ok.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
${result}

 

페이지 최총 요청 파일인 test02send.do는 아무런 코드가 없으니 생략~

아래 다른 요소들로 페이지 전체가 새로 요청되는 것이 아니라는 것을 확인할 수 있음. 비동기 통신!!