Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

[Ajax] 20231227 [프로그램소스] - ajax.js, web.xml, WordDTO, Test05Send, AjaxTest05, Test05, Test05_ok 본문

[Ajax]/Program source (Ajax)

[Ajax] 20231227 [프로그램소스] - ajax.js, web.xml, WordDTO, Test05Send, AjaxTest05, Test05, Test05_ok

Jelly-fish 2024. 1. 4. 01:29

012
AjexTest05.jsp

 

AjaxApp


 

ajax.js

 

/**
 * ajax.js
 */

var ajax = null;

// AJAX 객체(→ XMLHttpRequest 객체) 생성 함수
function createAjax()
{
	/*
	// ActiveXObject 를 지원하는 브라우저라면...
	if (window.ActiveXObject)			//-- IE 7 이전
	{
		//return new ActiveXObject("Microsoft.XMLHTTP");
		return new ActiveXObject("Msxml2.XMLHTTP");
		//-- 이와 같은 방식으로 XMLHttpRequest 객체를 생성해서 반환해라.
		//   (ActiveXObject 객체 → XMLHttpRequest 객체를 대신할 수 있는 객체)
	}
	else								//-- 그 외 브라우저
	{
		if (window.XMLHttpRequest)		//-- XMLHttpRequest 객체 지원 브라우저
		{
			return new XMLHttpRequest();
			//-- 이와 같은 방식으로 XMLHttpRequest 객체를 생성해서 반환해라.
		}
		else							//-- AJAX 를 지원하지 않는 브라우저
		{
			return null;
			//-- AJAX 사용할 수 없으므로 null 을 반환해라.
		}
	}
	*/
	
	
	/*
	if (window.ActiveXObject)			
		return new ActiveXObject("Msxml2.XMLHTTP");
	else if (window.XMLHttpRequest)	
		return new XMLHttpRequest();
	else
		return null;
	*/

	if (window.XMLHttpRequest)	
		return new XMLHttpRequest();
	else if (window.ActiveXObject)			
		return new ActiveXObject("Microsoft.XMLHTTP");
	else
		return null;
}

 


 

WordDTO.java

 

/*===================
    WordDTO.java
=====================*/
package com.test.ajax;

public class WordDTO
{
	// 주요 속성 구성
	private String word;

	// 기본 생성자 추가 구성
	public WordDTO()
	{
		this("");
	}
	
	// 사용자 정의 생성자 구성
	public WordDTO(String word)
	{
		this.word = word;
	}
	
	// getter / setter 구성
	public String getWord()
	{
		return word;
	}

	public void setWord(String word)
	{
		this.word = word;
	}
	
	

}

 


 

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" version="3.1">
  <display-name>AjaxApp</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>
  
   <!-- AJAX 관련 실습 -->
   <!-- AjaxTest02 → 페이지 내 컨트롤 확인 -->
   <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>
  
  <!-- ========================================= -->
  
  <!-- AJAX 관련 실습 -->
  <!-- AjaxTest03 → 아이디 중복 검사 -->
  <servlet>
  	<servlet-name>test03send</servlet-name>
  	<servlet-class>com.test.ajax.Test03Send</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test03send</servlet-name>
  	<url-pattern>/test03send.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>test03</servlet-name>
  	<servlet-class>com.test.ajax.Test03</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test03</servlet-name>
  	<url-pattern>/test03.do</url-pattern>
  </servlet-mapping>
  
  <!-- ========================================= -->
  
  <!-- AJAX 관련 실습 -->
  <!-- AjaxTest04 → 우편번호 검색 -->
  <servlet>
  	<servlet-name>test04send</servlet-name>
  	<servlet-class>com.test.ajax.Test04Send</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test04send</servlet-name>
  	<url-pattern>/test04send.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>test04</servlet-name>
  	<servlet-class>com.test.ajax.Test04</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test04</servlet-name>
  	<url-pattern>/test04.do</url-pattern>
  </servlet-mapping>
   
  <!-- ========================================= -->
  
  <!-- [이번 시간에 사용한 web.xml] -->
  
  <!-- AJAX 관련 실습 -->
  <!-- AjaxTest05 → 추천 검색어 처리 -->
  <servlet>
  	<servlet-name>test05send</servlet-name>
  	<servlet-class>com.test.ajax.Test05Send</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test05send</servlet-name>
  	<url-pattern>/test05send.do</url-pattern>
  </servlet-mapping>
  
  <servlet>
  	<servlet-name>test05</servlet-name>
  	<servlet-class>com.test.ajax.Test05</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>test05</servlet-name>
  	<url-pattern>/test05.do</url-pattern>
  </servlet-mapping>
</web-app>

 


Test05Send.java

 

/*========================
 	Test05Send.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;

// Test004.java (Servlet) 에서는
// GenericServlet 을 extends 를 상속하자마자 에러가 났었지만,
// HttpServlet 을 extends 하겠다고 했을 땐, 에러가 나지 않았다.
// ★ 추상 클래스이지만 추상 메소드를 갖고 있지 않은 것이다!!


// [GenericServlet] → service() Overriding
// [HttpServlet] → doGet(), doPost() Overriding



public class Test05Send extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	// 사용자의 http 프로토콜 요청이 GET 방식일 경우 호출되는 메소드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}

	// 사용자의 http 프로토콜 요청이 POST 방식일 경우 호출되는 메소드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}
	
	// 사용자 정의 메소드
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// GET 방식이든 POST 방식이든
		// 어떤 방식의 요청에도 모두 처리할 수 있는 사용자 정의 메소드
		
		String view = "WEB-INF/view/AjaxTest05.jsp";
		//String view = "AjaxTest05.jsp";
		
		RequestDispatcher dispatcher = request.getRequestDispatcher(view);
		dispatcher.forward(request, response);
		
		
	}
	
}

 


AjaxTest05.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>AjaxTest05.jsp</title>
<link rel="stylesheet" type="text/css" href="<%=cp %>/css/main.css">
<style type="text/css">
	
	#search
	{
		width: 500px;
	}
	#list
	{
		border: 1px solid gray;
		width: 502px;
		
		position: absolute;
		left: 68px;
		top: 134px;
		
		font-weight: bold;
		color: #343;
		
		display: none;
		
	}
	#list .item
	{
		padding: 2px;
	}
	#list #footer
	{
		height: 12px;
		background-color: #DDD;
		text-align: right;
		padding: 5px;
		font-size: 8pt;
		
	}
	
	
</style>

<script type="text/javascript" src="<%=cp%>/js/ajax.js"></script>
<script type="text/javascript">
	
	// 검색창에서 키보드 입력이 발생할 때 마다...
	// 그 때 까지의 입력된 단어를 서버로 전송하고
	// 전송된 단어에 맞는 추천 검색어를 받아올 수 있도록 처리
	function search()
	{
		// 확인
		//alert("함수 호출~!!!");
		
		// 데이터 수집(입력된 값 얻어오기)
		var search = document.getElementById("search").value;
		
		// 테스트
		//alert(search);
		
		
		// 서버로 전송하기 전에 유효성 검사 --------------------------------
		
		// ① 검색어가 존재할 경우에만 서버로 전송할 수 있도록 처리
		if (search.replace(" ", "") == "")
		{
			document.getElementById("list").style.display = "none";
			return;
			
		}
		
		// ② 입력된 검색어가 완성형 한글일 경우에만
		//    검색 키워드를 전송할 수 있도록 처리
		//    → 정규표현식 사용
		var regEx = /^[가-힣]{1,}$/;
		
		if (!regEx.test(search))
		{
			return;
		}
		
		
		// -------------------------------- 서버로 전송하기 전에 유효성 검사 
		
		
		// URL 구성
		var url = "test05.do?search=" + search;
		
		// XMLHttpRequest 객체(→ AJAX 객체) 생성
		ajax = createAjax();
		
		// 환경 설정
		ajax.open("GET", url, true);
		
		// 
		
		ajax.onreadystatechange = function()
		{
			if (ajax.readyState==4 && ajax.status==200)
			{
				// 업무 내용 수행(→ 외부의 함수 호출)
				callBack();
			}
		};
		
		ajax.send("");
		
	}

	
	// 추출된 업무 수행 내용
	//-- XML 목록으로 받아온 검색어들을
	//   적절한 리스트로 생성해서 화면에 출력할 수 있도록 처리
	function callBack()
	{
		// 컨트롤러 요청
		// 컨트롤러에서 자료구조 만들고 ok.jsp로 넘기기
		// ok.jsp 를 xml 형식으로 ...
		
		// XML 문서 객체
		var doc = ajax.responseXML;
		
		// XML 문서의 최상위 엘리먼트 수신(루트 엘리먼트)
		// → 지금은 『<list></list>』인 상황
		var root = doc.documentElement;

		// 루트 엘리먼트 하위의 모든 『<item></item>』 엘리먼트 반환받기
		var itemList = root.getElementsByTagName("item");
		
		// 추천 검색어 출력(노출) 지점 초기화
		document.getElementById("items").innerHTML = "";
		
		// 수신한 데이터(추천 검색어) 삽입하기
		
		for (var i = 0; i < itemList.length; i++)
		{
			var word = itemList[i].firstChild.nodeValue;
			
			// 출력(노출) 지점에 추가 → items
			// <div class="item">가습기</div>
			document.getElementById("items").innerHTML
				+= "<div class='item'>" + word + "</div>";
			
			//var word = itemList[i].getElementsByTagName("word")[0];
			//var wordText = word.firstChild.nodeValue;
			
			//document.getElementById("items").innerHTML
			//		+= "<div class='item'>" + wordText + "</div>";
			
		}
		
		// 최종적으로 목록을 화면에 보일 수 있도록 렌더링
		document.getElementById("list").style.display = "block";
	}
	
	
	
</script>

</head>
<body>

<div>
	<h1>AJAX 실습 - 추천 검색어</h1>
	<hr>
</div>

<div>
	검색어
	<input type="text" id="search" class="control"
	placeholder="검색어를 입력하세요" onkeyup="search()">
</div>



<div id="list">
	<div id="items">
		<div class="item">가습기</div>
		<div class="item">가요대전</div>
		<div class="item">가방</div>
		<div class="item">가다랑어</div>
		<div class="item">가위</div>
		<div class="item">가죽</div>
		<div class="item">가족</div>
		<div class="item">가지</div>
		<div class="item">가평</div>
	</div>
	<div id="footer">
		추천 검색어
	</div>
</div>




</body>
</html>

 


 

Test05.java

 

/*========================
 	Test05.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;

// Test004.java (Servlet) 에서는
// GenericServlet 을 extends 를 상속하자마자 에러가 났었지만,
// HttpServlet 을 extends 하겠다고 했을 땐, 에러가 나지 않았다.
// ★ 추상 클래스이지만 추상 메소드를 갖고 있지 않은 것이다!!


// [GenericServlet] → service() Overriding
// [HttpServlet] → doGet(), doPost() Overriding



public class Test05 extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	// 사용자의 http 프로토콜 요청이 GET 방식일 경우 호출되는 메소드
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}

	// 사용자의 http 프로토콜 요청이 POST 방식일 경우 호출되는 메소드
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		doGetPost(request, response);
		
	}
	
	// 사용자 정의 메소드
	protected void doGetPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		// GET 방식이든 POST 방식이든
		// 어떤 방식의 요청에도 모두 처리할 수 있는 사용자 정의 메소드
		
		// ※ 완성형 한글 형태로 전송된 데이터 수신
		
		request.setCharacterEncoding("UTF-8");
		
		
		// 이전 페이지(AjaxTest05.jsp)로부터 넘어온 데이터 수신
		// → search
		String search = request.getParameter("search");
		
		
		// 테스트
		//System.out.println(search);
		
		// DB 연결 및 액션 처리
		// ........ WHERE COLUMNNAME LIKE 'search%'; 와 같은 쿼리문 수행
		// 그에 따른 결과 수신
		
		// 위에서 처리한 결과를 가지고 있는 자료구조 활용
		ArrayList<WordDTO> lists = new ArrayList<WordDTO>();
		
		if (search.equals("가"))
		{
			lists.add(new WordDTO("가습기"));
			lists.add(new WordDTO("가요대전"));
			lists.add(new WordDTO("가방"));
			lists.add(new WordDTO("가다랑어"));
			lists.add(new WordDTO("가위"));
			lists.add(new WordDTO("가죽"));
			lists.add(new WordDTO("가족"));
			lists.add(new WordDTO("가지"));
			lists.add(new WordDTO("가평"));
		}
		else if (search.equals("가습"))
		{
			lists.add(new WordDTO("가습기 손질"));
			lists.add(new WordDTO("가습기 구매"));
			lists.add(new WordDTO("가습기 분해"));
			lists.add(new WordDTO("가습기 교체"));
			lists.add(new WordDTO("가습기 살균제"));
			lists.add(new WordDTO("가습기 고장"));
		}
		else if (search.equals("가방"))
		{
			lists.add(new WordDTO("가방 손질"));
			lists.add(new WordDTO("가방 구매"));
			lists.add(new WordDTO("가방 분해"));
			lists.add(new WordDTO("가방 교체"));
			lists.add(new WordDTO("가방끈"));
			lists.add(new WordDTO("가방 나눔"));
			
		}
		else if (search.equals("가방끈"))
		{
			lists.add(new WordDTO("가방끈 매듭"));
			lists.add(new WordDTO("가방끈 매듭 묶기"));
			lists.add(new WordDTO("가방끈 매듭 푸는 법"));
			lists.add(new WordDTO("가방끈 길이 조절"));
			lists.add(new WordDTO("가방끈 교체"));
			lists.add(new WordDTO("가방끈 색상"));
		}
		
		request.setAttribute("lists", lists);
		
		RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/view/Test05_ok.jsp");
		//RequestDispatcher dispatcher = request.getRequestDispatcher("Test05_ok.jsp");
		dispatcher.forward(request, response);
			
		
		
	}
	
}

 


 

Test05_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();
	response.setContentType("text/xml");
	
%><?xml version="1.0" encoding="UTF-8"?>
<%-- 
<list>
	<c:forEach var="item" items="${lists }">
	<item>
		<word>${item.word }</word>
	</item>
	</c:forEach>
</list>

 --%>
<list>
	<c:forEach var="item" items="${lists }">
	<item>${item.word }</item>
	</c:forEach>
</list>