ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AJAX] 002. AJAX 관찰 실습(2)
    SsY 2023. 6. 15. 18:00
    728x90
    AjaxApp

    - AjaxTest03 번 아이디에 더해서 주소 구성

    • AjaxTest04 (내 풀이)
    • AjaxTest04.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>AjaxTest04.jsp</title>
    <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
    <style type="text/css">
    
    	#result
    	{
    		width: 250px;
    		color: #F33;
    		font-size: small;
    		/* display : none; */
    		display : inline; 
    	}
    </style>
    <script type="text/javascript" src="<%=cp%>/js/ajax.js"></script>
    <script type="text/javascript">
    	
    	// 중복 확인 버튼 클릭시 호출되는 함수 
    	function check()
    	{
    		//alert("호출 확인");
    		
    		// 데이터 수집
    		var id = document.getElementById("id").value;
    		
    		// URL 준비
    		var url = "test03_ok.action?id=" + id;
    		
    		// AJAX 객체 생성 (XMLHttpRequest 객체)
    		ajax = createAjax();  // 임포트한 js 파일에서 정의한 메소드 호출 
    		
    		// 환경 설정( open("메소드방식", "URL", 비동기/동기 T/F로) )
    		ajax.open("GET", url, true);
    		
    		//ajax.onreadystatechange = 기능;
    		ajax.onreadystatechange = function()
    		{
    			if(ajax.readyState==4 && ajax.status==200) 
    			{
    				// 업무 수행 → 외부로 추출(별도 함수로 정의) → 정의된 함수 호출 
    				callBack();
    			}
    		};
    		
    		ajax.send("");
    		
    	}
    	
    	// 외부로 추출된 업무 구성 -> 함수 정의
    	// → 아이디 중복 검사 결과(1 or 0) 를 통보받고 
    	// 사용자에게 메세지 출력 → span →  #result
    	function callBack()
    	{
    		// responseText / responseXML (받은 값이 TEXT 기반인지 XML 기반인지..)
    		
    		var data = parseInt(ajax.responseText);
    		
    		if (data == 0)
    		{
    			document.getElementById("result").innerText = "사용 가능한 아이디입니다.";
    		}
    		else
    		{
    			document.getElementById("result").innerText = "이미 사용중인 아이디입니다.";
    		}
    		
    	}// end callBack()
    	
    	function findAddr()
    	{
    		var addr = document.getElementById("addr").value;
    		
    		var url = "test04_ok.action?addr="+addr;
    		
    		ajax = createAjax();
    		
    		ajax.onreadystatechange = function ()
    		{
    			if (ajax.readyState==4 && ajax.status==200)
    			{
    				// 기능 함수 호출
    				setAddr();
    			}
    		};
    		
    		ajax.open("GET",url,true);
    		ajax.send("");
    		
    	}// end findAddr()
    	
    	function setAddr()
    	{
    		// (HTML 태그로 감싼 String으로) 가져온 리스트 결과 값을 selectbox 에 배치하는 함수
    		var listStr = ajax.responseText;
    		
    		//alert(listStr);
    		
    		document.getElementById("addrResult").innerHTML += listStr;
    				
    	}// end setAddr()
    
    	function change()
    	{
    		// selectBox 에서 값을 변경했을 때
    		// #addr1, #addr2 에 각각 선택된 우편번호, 기본 주소 setting 하는 함수
    		var str = document.getElementById("addrResult").value;
    		var dto = str.split(",");
    		alert("dto[0] : " + dto[0] + "\ndto[1] : " + dto[1]);
    		document.getElementById("addr1").value = dto[0];
    		document.getElementById("addr2").value = dto[1];
    	}
    </script>
    </head>
    
    <body>
    
    <div>
    	<h1>회원 가입</h1>
    	<p>- 우편번호 검색</p>		
    	<p>- ※ url → http://localhost:3306/AjaxApp/test04.action</p>
    	<p>- 		→ http://localhost:3306/AjaxApp/test04_ok.action</p>
    	<hr>
    </div>
    
    <table class="table">
    	<tr>
    		<th>아이디</th>
    		<td>
    			<input type="text" id="id" class="control">
    			<input type="button" value="중복검사" class="control" onclick="check()">	
    					
    			<!-- 
    			<span id="result">사용 가능한 아이디입니다.</span>
    			<span id="result">이미 사용중인 아이디입니다.</span>  
    			-->
    			
    			<span id="result"></span>
    		</td>
    	</tr>
    	
    	<tr>
    		<th>이름</th>
    		<td>
    			<input type="text" id="name" class="control">(테스트)
    		</td>
    	</tr>
    	
    	<tr>
    		<th>주소</th>
    		<td>
    			<input type="text" id="addr" class="control" placeholder="동 입력">
    			<input type="button" value="검색하기" class="control" onclick="findAddr()">
    			<br>
    			<select id="addrResult" class="control" onchange="change()">
    				<option>주소를 입력하세요</option>
    			</select>
    		</td>
    	</tr>
    	
    	<tr>
    		<th>주소 검색 결과</th>
    		<td>
    			 <input type="text" id="addr1" class="control" readonly="readonly"
    			 style="width: 200px;">
    			 <br>
    			 <input type="text" id="addr2" class="control" readonly="readonly"
    			 style="width: 400px;">
    			 <br>
    			 <input type="text" id="addr3" class="control" placeholder="상세주소를 입력하세요"
    			 style="width: 400px;">
    		</td>
    	</tr>
    	
    	<tr>
    		<th>기타 등등</th>
    		<td>
    			<input type="text" id="etc" class="control">(테스트)
    		</td>
    	</tr>
    	
    </table>
    
    
    
    </body>
    </html>

    • ZipCodeDTO.java
    /*======================
    	ZipCodeDTO.java
    =======================*/
    
    package com.test.ajax;
    
    public class ZipCodeDTO
    {
    	// 주요 속성 구성
    	private String zipCode;
    	private String address;
    	
    	// 기본 생성자 형태의 사용자 정의 생성자 추가 구성
    	public ZipCodeDTO()
    	{
    		this("","");
    	}
    	
    	// 사용자 정의 생성자 구성
    	public ZipCodeDTO(String zipCode, String address)
    	{
    		this.zipCode = zipCode;
    		this.address = address;
    	}
    	
    	
    	// getter / setter 구성
    	public String getZipCode()
    	{
    		return zipCode;
    	}
    	public void setZipCode(String zipCode)
    	{
    		this.zipCode = zipCode;
    	}
    	public String getAddress()
    	{
    		return address;
    	}
    	public void setAddress(String address)
    	{
    		this.address = address;
    	}
    	
    	
    }

    • web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    	id="WebApp_ID" version="3.1">
    	<display-name>AjaxBackup2</display-name>
    	<welcome-file-list>
    		<welcome-file>index.html</welcome-file>
    		<welcome-file>index.htm</welcome-file>
    		<welcome-file>index.jsp</welcome-file>
    		<welcome-file>default.html</welcome-file>
    		<welcome-file>default.htm</welcome-file>
    		<welcome-file>default.jsp</welcome-file>
    	</welcome-file-list>
    <!-- 	
    	<servlet>
    		<servlet-name></servlet-name>
    		<servlet-class></servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name></servlet-name>
    		<url-pattern></url-pattern>	
    	</servlet-mapping>
    -->
    
    	<!-- test02.kb -->
    	<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.kb</url-pattern>	
    	</servlet-mapping>
    
    	<!-- test03.action -->
    	<servlet>
    		<servlet-name>test03</servlet-name>
    		<servlet-class>com.test.ajax.AjaxTest03</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>test03</servlet-name>
    		<url-pattern>/test03.action</url-pattern>	
    	</servlet-mapping>
    
    	<!-- test03_ok.action -->
    	<servlet>
    		<servlet-name>test03ok</servlet-name>
    		<servlet-class>com.test.ajax.Test03_ok</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>test03ok</servlet-name>
    		<url-pattern>/test03_ok.action</url-pattern>	
    	</servlet-mapping>
    
    	<!-- test04.action -->
    	<servlet>
    		<servlet-name>test04</servlet-name>
    		<servlet-class>com.test.ajax.AjaxTest04</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>test04</servlet-name>
    		<url-pattern>/test04.action</url-pattern>	
    	</servlet-mapping>
    
    	<!-- test04_ok.action -->
    	<servlet>
    		<servlet-name>test04ok</servlet-name>
    		<servlet-class>com.test.ajax.Test04</servlet-class>
    	</servlet>
    
    	<servlet-mapping>
    		<servlet-name>test04ok</servlet-name>
    		<url-pattern>/test04_ok.action</url-pattern>	
    	</servlet-mapping>
    </web-app>

    • AjaxTest04.java
    package com.test.ajax;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class AjaxTest04 extends HttpServlet
    {
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    	
    	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 서블릿 관련 코딩
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher("AjaxTest04.jsp");
    		dispatcher.forward(request, response);
    	}
    	
    }

    • Test04.java
    package com.test.ajax;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Test04 extends HttpServlet
    {
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    	
    	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 서블릿 관련 코딩
    		
    		// 데이터 값 수신 
    		// 한글 깨짐 방지
    		request.setCharacterEncoding("UTF-8");
    		
    		String addr = request.getParameter("addr");
    		ZipCodeModel model = new ZipCodeModel();
    		String result = model.findAddr(addr);
    		
    		request.setAttribute("result", result);
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher("Test04.jsp");
    		dispatcher.forward(request, response);
    	}
    	
    }

    • ZipCodeModel.java
      ArrayList 를 String 으로 HTML 태그를 포함하여 한 줄로 전송하는 방식
      responseText
    package com.test.ajax;
    
    import java.util.ArrayList;
    
    public class ZipCodeModel
    {
    	public String findAddr(String addr)
    	{
    		String result = "";
    		
    		ArrayList<ZipCodeDTO> list = new ArrayList<ZipCodeDTO>();
    		
    		// DB 역을 수행할 ArrayList<ZipCodeDTO>
    		ArrayList<ZipCodeDTO> db = new ArrayList<ZipCodeDTO>();
    		ZipCodeDTO dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 13 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 17 (서교동, 용성빌딩)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 18 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 20 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-3 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-4 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-6 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 23 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 24 (서교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 171 (동교동, 아람빌딩)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03995","서울특별시 마포구 동교로 172 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 173 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03995","서울특별시 마포구 동교로 174 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 175 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03995","서울특별시 마포구 동교로 176 (동교동, 청휘빌딩)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 177 (동교동, 동교동빌딩)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 177-1 (동교동, 동교동빌딩)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 179 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03992","서울특별시 마포구 동교로 179-5 (동교동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03696","서울특별시 서대문구 가좌로 15 (연희동, 연궁아파트)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-5 (연희동, 해마루)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-6 (연희동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-7 (연희동, 연희궁빌라)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-9 (연희동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-11 (연희동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-13 (연희동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-14 (연희동, 주함하우스)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-15 (연희동)");
    		db.add(dto);
    		dto = new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-16 (연희동, 구립연희어린이집)");
    		db.add(dto);
    		
    		// DB에서 입력받아온 동 리스트 가져오기
    		for (ZipCodeDTO res : db)
    		{
    			if (res.getAddress().contains(addr))
    			{
    				/*
    				ZipCodeDTO a = new ZipCodeDTO();
    				a.setAddress(res.getAddress());
    				a.setZipCode(res.getZipCode());
    				
    				result.add(a);
    				*/
    				
    				list.add(res);
    			}
    		}
    		
    		// 동 리스트 -> HTML 태그로 감싼 String 으로 만들어야함
    		// -> 값을 넘겨줘야하기 때문에
    		
    		for (ZipCodeDTO res : list)
    		{
    			result += "<option value='"+ res.getZipCode()+"," + res.getAddress() +"'>" + res.getAddress() + "</option><br>"; 
    		}
    
    		return result;
    	}
    }

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

    • test04.action (빈파일)

    • AjaxTest04 (해설)
    • AjaxTest04.jsp
      - callBack2() 함수 -- Test04_ok.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>AjaxTest04.jsp</title>
    <link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
    <style type="text/css">
    
    	#result
    	{
    		width: 250px;
    		color: #F33;
    		font-size: small;
    		/* display : none; */
    		display : inline; 
    	}
    </style>
    <script type="text/javascript" src="<%=cp%>/js/ajax.js"></script>
    <script type="text/javascript">
    	
    	// 중복 확인 버튼 클릭시 호출되는 함수 
    	function check()
    	{
    		//alert("호출 확인");
    		
    		// 데이터 수집
    		var id = document.getElementById("id").value;
    		
    		// URL 준비
    		var url = "test03_ok.action?id=" + id;
    		
    		// AJAX 객체 생성 (XMLHttpRequest 객체)
    		ajax = createAjax();  // 임포트한 js 파일에서 정의한 메소드 호출 
    		
    		// 환경 설정( open("메소드방식", "URL", 비동기/동기 T/F로) )
    		ajax.open("GET", url, true);
    		
    		//ajax.onreadystatechange = 기능;
    		ajax.onreadystatechange = function()
    		{
    			if(ajax.readyState==4 && ajax.status==200) 
    			{
    				// 업무 수행 → 외부로 추출(별도 함수로 정의) → 정의된 함수 호출 
    				callBack();
    			}
    		};
    		
    		ajax.send("");
    		
    	}
    	
    	// 외부로 추출된 업무 구성 -> 함수 정의
    	// → 아이디 중복 검사 결과(1 or 0) 를 통보받고 
    	// 사용자에게 메세지 출력 → span →  #result
    	function callBack()
    	{
    		// responseText / responseXML (받은 값이 TEXT 기반인지 XML 기반인지..)
    		
    		var data = parseInt(ajax.responseText);
    		
    		if (data == 0)
    		{
    			document.getElementById("result").innerText = "사용 가능한 아이디입니다.";
    		}
    		else
    		{
    			document.getElementById("result").innerText = "이미 사용중인 아이디입니다.";
    		}
    		
    		
    	}// end callBack()
    	
    	/* 주소 검색 버튼 클릭 시 호출되는 함수 정의 */
    	function search()
    	{
    		//확인
    		//alert("함수호출확인");
    		
    		// 데이터 수집
    		var addr = document.getElementById("addr").value;
    		
    		// url 구성
    		var url = "test04_ok.action?addr="+addr;
    		
    		// XMLHttpRequest 객체 생성(→AJAX 객체 생성)
    		ajax = createAjax();	//-- ajax.js
    		
    		// 설정
    		ajax.open("GET",url,true);
    		ajax.onreadystatechange = function()
    		{
    			if (ajax.readyState==4 && ajax.status==200)
    			{
    				// 업무 수행
    				callBack2();
    			}
    		};
    		
    		ajax.send("");
    	
    	}// end search()
    	
    	// 수행해야 할 업무 추출
    	// → 우편번호 검색 결과를 통보 받아서
    	//    사용자에게 안내해 줄 수 있도록 처리
    	function callBack2()
    	{
    		// XML 문서 전체의 참조 객체. (→ 흔히 XML 문서 객체라고 한다.)
    		var doc = ajax.responseXML;
    		
    		// XML 문서의 최상위 엘리먼트(루트 엘리먼트)
    		//-- 현재는 『<list>』 엘리먼트
    		var root = doc.documentElement;
    		
    		// select box 초기화
    		document.getElementById("addrResult").innerHTML = "";
    		
    		
    		// 루트 엘리먼트의 모든 『<item>』엘리먼트 반환받기
    		var itemList = root.getElementsByTagName("item");
    		
    		// 검색 결과 확인
    		if (itemList.length==0)
    		{
    			document.getElementById("addrResult").innerHTML = "<option>주소를 입력하세요</option>";
    		}
    		else
    		{
    			document.getElementById("addrResult").innerHTML = "<option value='-1'>주소를 선택하세요</option>";
    		}
    		
    		// 검색 결과가 존재할 경우... 반복문을 순환하며 각 데이터 가져오기
    		for (var i=0; i <itemList.length; i++)	//-- 수신한 아이템의 갯수만큼 반복 순환
    		{
    			var zipcode = itemList[i].getElementsByTagName("zipcode")[0];
    			var address = itemList[i].getElementsByTagName("address")[0];
    			
    			// ※ 태그가 가지는 텍스트는
    			//    태그의 첫 번째 자식이고
    			//    텍스트 노드의 값은
    			//    nodeValue 로 가져온다.
    			
    			var zipcodeText = zipcode.firstChild.nodeValue;
    			var addressText = address.firstChild.nodeValue;
    			
    			// select box 에 아이템 추가
    			document.getElementById("addrResult").innerHTML 
    				+= "<option value='"+zipcodeText + "/" + addressText 
    				+"'>["+zipcodeText+"] "+addressText+"</option>";
    			
    		}
    
    	}// end callBakc2()
    	
    	// 검색된 주소 항목에 대한 선택이 이루어졌을 때 호출되는 함수
    	/*//-- 내 풀이
    	function selectZipCode()
    	{
    		//확인
    		//alert("선택 확인");
    		
    		var addrStr = document.getElementById("addrResult").value;
    		var arr = addrStr.split("/");
    		
    		document.getElementById("addr1").value = arr[0];
    		document.getElementById("addr2").value = arr[1];
    	}
    	 */
    	function selectZipCode(sel)
    	{
    		//확인
    		//alert("선택 확인");
    		
    		//확인
    		//alert(sel.value);
    		
    		if (sel.value!="-1") //-- 선택하세요 클릭시 예외처리
    		{
    			//확인
    			//alert(sel.value);
    			//--==>> 03992/서울특별시 마포구 동교로 171 (동교동, 아람빌딩)
    
    			document.getElementById("addr1").value = sel.value.split("/")[0];
    			document.getElementById("addr2").value = sel.value.split("/")[1];
    			document.getElementById("addr3").focus();	//-- 상세주소 입력하도록 focus 주기
    		}
    	}
    </script>
    </head>
    
    <body>
    
    <div>
    	<h1>회원 가입</h1>
    	<p>- 우편번호 검색</p>		
    	<p>- ※ url → http://localhost:3306/AjaxApp/test04.action</p>
    	<p>- 		→ http://localhost:3306/AjaxApp/test04_ok.action</p>
    	<hr>
    </div>
    
    <table class="table">
    	<tr>
    		<th>아이디</th>
    		<td>
    			<input type="text" id="id" class="control">
    			<input type="button" value="중복검사" class="control" onclick="check()">	
    					
    			<!-- 
    			<span id="result">사용 가능한 아이디입니다.</span>
    			<span id="result">이미 사용중인 아이디입니다.</span>  
    			-->
    			
    			<span id="result"></span>
    		</td>
    	</tr>
    	
    	<tr>
    		<th>이름</th>
    		<td>
    			<input type="text" id="name" class="control">(테스트)
    		</td>
    	</tr>
    	
    	<tr>
    		<th>주소</th>
    		<td>
    			<input type="text" id="addr" class="control" placeholder="동 입력">
    			<input type="button" value="검색하기" class="control" onclick="search()">
    			<br>
    			<!-- <select id="addrResult" class="control"> -->
    			<select id="addrResult" class="control" onchange="selectZipCode(this)">
    				<option>주소를 입력하세요</option>
    			</select>
    		</td>
    	</tr>
    	
    	<tr>
    		<th>주소 검색 결과</th>
    		<td>
    			 <input type="text" id="addr1" class="control" readonly="readonly"
    			 style="width: 200px;">
    			 <br>
    			 <input type="text" id="addr2" class="control" readonly="readonly"
    			 style="width: 400px;">
    			 <br>
    			 <input type="text" id="addr3" class="control" placeholder="상세주소를 입력하세요"
    			 style="width: 400px;">
    		</td>
    	</tr>
    	
    	<tr>
    		<th>기타 등등</th>
    		<td>
    			<input type="text" id="etc" class="control">(테스트)
    		</td>
    	</tr>
    	
    </table>
    
    </body>
    </html>

    • ZipCodeDTO.java (상동)

    • Test04.java
    package com.test.ajax;
    
    import java.io.IOException;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Test04
    extends HttpServlet
    {
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    	
    	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 서블릿 관련 코딩
    		
    		String view = "AjaxTest04.jsp";
    		//String view = "WEB-INF/view/AajxTest04.jsp";
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher(view);
    		dispatcher.forward(request, response);
    	}
    	
    }

    • Test04_ok.java
    package com.test.ajax;
    
    import java.io.IOException;
    import java.util.ArrayList;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Test04_ok  extends HttpServlet
    {
    	private static final long serialVersionUID = 1L;
    
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		doGetPost(request, response);
    	}
    	
    	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    	{
    		// 서블릿 관련 코딩
    		
    		// 한글 깨짐 방지
    		request.setCharacterEncoding("UTF-8");
    		
    		// 데이터 수신 (AjaxTest04.jsp 로부터 동 이름(addr)수신 )
    		String addr = request.getParameter("addr");
    
    		// ※ 여기서도 마찬가지로 우편번호 DB 가 있다고 가정하고
    		//    ArrayList 로 직접 DB 구성
    		ArrayList<ZipCodeDTO> lists = new ArrayList<ZipCodeDTO>();
    		
    		if (addr.indexOf("서교")>-1)	// 서교라는 문자가 addr 안에 있다면
    		{
    			//lists.add(ZipCodeDTO객체);
    			//lists.add(new ZipCodeDTO(zipCode, address));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 13 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 17 (서교동, 용성빌딩)"));
    			lists.add(new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 18 (서교동)"));
    			lists.add(new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 20 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-3 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-4 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 21-6 (서교동)"));
    			lists.add(new ZipCodeDTO("04044","서울특별시 마포구 독막로3길 23 (서교동)"));
    			lists.add(new ZipCodeDTO("04047","서울특별시 마포구 독막로3길 24 (서교동)"));
    			
    		}
    		else if (addr.indexOf("동교")>-1)
    		{
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 171 (동교동, 아람빌딩)"));
    			lists.add(new ZipCodeDTO("03995","서울특별시 마포구 동교로 172 (동교동)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 173 (동교동)"));
    			lists.add(new ZipCodeDTO("03995","서울특별시 마포구 동교로 174 (동교동)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 175 (동교동)"));
    			lists.add(new ZipCodeDTO("03995","서울특별시 마포구 동교로 176 (동교동, 청휘빌딩)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 177 (동교동, 동교동빌딩)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 177-1 (동교동, 동교동빌딩)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 179 (동교동)"));
    			lists.add(new ZipCodeDTO("03992","서울특별시 마포구 동교로 179-5 (동교동)"));
    
    
    		}
    		else if (addr.indexOf("연희")>-1)
    		{
    			lists.add(new ZipCodeDTO("03696","서울특별시 서대문구 가좌로 15 (연희동, 연궁아파트)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-5 (연희동, 해마루)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-6 (연희동)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-7 (연희동, 연희궁빌라)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-9 (연희동)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-11 (연희동)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-13 (연희동)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-14 (연희동, 주함하우스)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-15 (연희동)"));
    			lists.add(new ZipCodeDTO("03661","서울특별시 서대문구 가좌로 16-16 (연희동, 구립연희어린이집)"));
    
    		}
    		
    		request.setAttribute("lists", lists);
    		
    		RequestDispatcher dispatcher = request.getRequestDispatcher("Test04_ok.jsp");
    		dispatcher.forward(request, response);
    	}
    	
    }

    • Test04_ok.jsp
      ** ArrayList 를 넘겨 받는 경우 -> XML 기반 처리 사용**
      즉, responseXML 사용
    더보기

    ※ XML 의 특징
    1. <?xml version="1.0" encoding="UTF-8"?> 
    - 해당문서가 XML 이라고 설명하는 한 줄 (**필수구성)

    2. 모든 엘리먼트를 감싸는 엘리먼트 (rootElement , 루트엘리먼트)가 반드시 필수적
    - web.xml 을 수정할 때도 이 때문에 </web-app> 끝나기 전에 추가 작업한 것

    ++ html 에서는 tag 가 이미 정해져있으나
         xml 에서는 구조를 잡는 것(구분을하기 위한)에 특화되어있는 것으로
        사전에 약속되어있는 element 들이 정의가 되어있는 것이 아니다.
        다만, well-formed XML  (잘 만든 xml) 부터 기본 문법된 xml 이 있고, 그냥 파일에 xml 확장자만 붙은 xml 이 있다..
        xml 은 엄밀히 말하면 단독으로 존재할 수가 없고, 해당 xml (xml 안의 태그 )의 설명서 같은 존재가 필요하다.

        ex) 저 xml 은 
              루트 엘리먼트는 xxxxx
              루트 엘리먼트의 하위엘리먼트는 item, xxx, yyy...
              ...
              item 엘리먼트의 속성은 id, pw .....

    XML 이 갖는 특성 상
    1번 구문 앞에 공백이나 개행이 들어있으면 절대 안됨
    --> 그래서 개행이 없게 처리하기 위해서
    해당 문서 문번호 1~19 번 사이의 <%@ %><%@ %>- 와 같이 다 붙여 쓰는 형태로 만들어줘야함

    <%@ 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();
    	
    	//check 
    	response.setContentType("text/xml");
    	//-- AJAX 객체에 데이터를 돌려줄 때
    	//   브라우저가 이 데이터를 XML 로 인식해야 하기 때문에
    	//   MIME 타입을 XML 로 선언한다.
    	//------------ 최면 걸기~
    	
    	// ※ (수신해서 처리해야 하는) 데이터가 단일 데이터가 아닐 경우
    	//    XML 이나 JSON 과 같이 구조화시킬 수 있는 데이터의 형태로 전달하는 것이 처리과정에서 용이하다.
    	//    우편번호에 대한 검색 결과는 당연히 다량의 데이터를 전송해야하기 때문에
    	//    텍스트가 아닌 XML 형태로 반환하려고 하는 것이다. 
    	
    %><?xml version="1.0" encoding="UTF-8"?> 
    <list>
    	<c:forEach var="item" items="${lists}">
    		<item>
    			<zipcode>${item.zipCode }</zipcode>
    			<address>${item.address }</address>
    		</item>
    	</c:forEach>
    </list>
    
    <%-- 문번호 19번은 html 을 그릴 것이 아니고 xml 문서일 것을 표시 --%>
    <%-- 태그 내에서 jsp 문법 전부 사용 가능 --%>
    
    <%-- 현재는 XML 객체를 구성한 것이 아니라 서블릿에게 XML 처럼 보이게 만든 것 --%>

     

    728x90
Designed by planet-si