제육's 휘발성 코딩
article thumbnail
반응형

Ajax

image

  • 비동기 통신(Asynchronous JavaScript and XML)
    • 동기 통신 : 통신을 요청한 쪽에서 응답이 올 때까지 블락킹 (URL이 직접 나오면서 변경)
    • 비동기 통신 : 통싱을 요청한 쪽에서 응답이 올 때까지 블락킹 X
    • : js 가 핵심 + WEB API - XMLHttpRequest, fetch,axios, jQuery 등
  • 동작 원리
    • 사용자에 의해 이벤트가 발생하면 핸들러에 의해 바로 자바스크립트를 불러온다. 그 후 자바스크립트에서는 XmlHttpRequest 객체를 이용하여 서버로 요청을 보내는데, 그 동안 웹 브라우저는 응답을 기다릴 필요 없이 다른 작업을 수행할 수 있다. (비동기)
    • 서버측에서 처리를 마치고 XmlHttpRequest 객체를 전달 받으면 이를 토대로 Ajax요청을 처리하게 되는 것이다. 클라이언트가 직접 원하는 정보를 서버에게 요청하여 얻는 방식을 client pooling 방식이라고 하는데 Ajax가 이 방식을 사용한다. 반면, 푸시 알림같은 server push방식의 서비스를 만들 수는 없다.

XMLHttpRequest

imageimage

var xhr = new XMLHttpRequest();
xhr.open('GET', './time.html');
xhr.onreadtstatechange = function() {
  if (xhr.readyState === 4 && xhr.status === 200) {
    document.querySelector('#time').innerHTML = xhr.responseText;
  }
}
xhr.send();
  • Ajax방식으로 서버와 브라우저가 데이터를 주고받을 때 사용하는 API이다. 자바스크립트는 XMLHttpRequest 객체를 사용하여 서버와 통신하고 데이터를 교환한다.

JavaScript Ajax

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Break Neck Pizza Delivery</title>
    <link rel="stylesheet" type="text/css" href="breakneck.css" media="screen" />

    <!--   <script  /> 이런식으로는 불가능 -->
    <script src="./ajax-xhr.js"></script>
    <script type="text/javascript">
      let req;
      // function getCustomerInfo() {
      //   let phone = this.value;
      //   req = createRequest();
      //   req.onreadystatechange = updatePage2;
      //   req.open("get", `http://118.36.53.65:8080/myapp/customer.do?phone=${phone}&type=xml`);
      //   req.send();
      //   console.log("send request...");
      // }
      function getCustomerInfo() {
        let phone = this.value;
        req = createRequest();
        req.onreadystatechange = updatePage;
        req.open("post", `http://118.36.53.65:8080/myapp/customer.do`);
        req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        req.send(`phone=${phone}`);
        console.log("send request...");
      }
      function updatePage(customer) {
        if(req.readyState != XMLHttpRequest.DONE) return;
        if(req.status == 200) {
          console.log("updatePage");
          let customer = JSON.parse(req.responseText);
          document.getElementById("name").value = customer.name;
          document.getElementById("address").value = customer.address;
        } else if (req.status == 404) {
          console.log("고객정보가 없습니다.");
        } else {
          console.log("데이터 조회에 실패했습니다.");
        }
      }

      function updatePage2(xmlDoc) {
        if(req.readyState != XMLHttpRequest.DONE) return;
        if(req.status == 200) {
          console.log("updatePage");
          let xmlDoc = req.responseXML;
          document.getElementById("name").value = 
            xmlDoc.getElementsByTagName("name")[0].firstChild.nodeValue;
          document.getElementById("address").value = 
            xmlDoc.getElementsByTagName("address")[0].textContent;
        } else if (req.status == 404) {
          console.log("고객정보가 없습니다.");
        } else {
          console.log("데이터 조회에 실패했습니다.");
        }
      }

      window.onload = function() {
        document.getElementById("phone").onchange = getCustomerInfo;
      }
    </script>
  </head>

  <body>
    <p><img src="breakneck-logo.gif" alt="Break Neck Pizza" /></p>
    <form method="POST" action="placeOrder.jsp">
      <p>
        Enter your phone number:
        <input type="text" size="14" name="phone" id="phone" />
      </p>
      <p>Type your order in here:</p>
      <p><textarea name="order" id="order" rows="6" cols="50"></textarea></p>
      <p>Your order will be delivered to:</p>
      <p>Name : <input type="text" size="14" name="name" id="name" /></p>
      <p>Address : <textarea name="address" id="address" rows="4" cols="50"></textarea></p>
      <p><input type="submit" id="submit" value="Order Pizza" /></p>
    </form>
  </body>
</html>

jQuery Ajax

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>Break Neck Pizza Delivery</title>
    <link rel="stylesheet" type="text/css" href="breakneck.css" media="screen" />

    <!--   <script  /> 이런식으로는 불가능 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
    <script type="text/javascript">
      let req;
      function getCustomerInfo() {

        $.ajax({
          url : `http://118.36.53.65:8080/myapp/customer.do`,
          method : "post",
          data : {
            phone : $(this).val(),
            type : "xml",
          },
          success : updatePage2,
          statusCode : {
            404 : function() {
              console.log("고객정보가 없습니다.");
            }
          },
          error:function() {
            console.log("데이터 조회에 실패했습니다.");
          },
          dataType : "xml" // 응답 데이터 형식, 생략 가능 
        });

        console.log("send request...");
      }
      function updatePage(customer) {
          console.log("updatePage");
          document.getElementById("name").value = customer.name;
          document.getElementById("address").value = customer.address;
      }

      function updatePage2(xmlDoc) {
          console.log("updatePage");
          $("#name").val($("name", xmlDoc).text());
          $("#address").val($(xmlDoc).find("address").text());
      }

      $(function() {
          $("#phone").change(getCustomerInfo);
      });
    </script>
  </head>

  <body style="background-color: pink;">
    <p><img src="breakneck-logo.gif" alt="Break Neck Pizza" /></p>
    <form method="POST" action="placeOrder.jsp">
      <p>
        Enter your phone number:
        <input type="text" size="14" name="phone" id="phone" />
      </p>
      <p>Type your order in here:</p>
      <p><textarea name="order" id="order" rows="6" cols="50"></textarea></p>
      <p>Your order will be delivered to:</p>
      <p>Name : <input type="text" size="14" name="name" id="name" /></p>
      <p>Address : <textarea name="address" id="address" rows="4" cols="50"></textarea></p>
      <p><input type="submit" id="submit" value="Order Pizza" /></p>
    </form>
  </body>
</html>
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^