열심히 끝까지

디바이스 융합 자바(Java) day53 - AJAX 이용한 아이디 중복 체크 본문

디바이스 융합 자바(Java)기반 풀스택 개발자 양성과정(수업내용)

디바이스 융합 자바(Java) day53 - AJAX 이용한 아이디 중복 체크

노유림 2022. 8. 25. 17:07

AJAX 
         아이디 중복검사
         인증
         좋아요
         추천/비추천
         찜
          .
          .
          .
=> 비동기처리
    : 서버의 별도 방문 없이 바로 바뀌는 것
      >> 이미 데이터의 로딩 완료
    : 서버 방문을 안하기 때문에 페이지의 내용이 유지    

※ AJAX는 Spring에서는 @ 설정으로 진행되는 것이 일반적
   > JSP에서 사용하는 방식을 소개할 예정
>> 많이 쓰이는 방식은 아님!

★name 속성      vs       id, class 속성

- name 속성
     파라미터명
     request.getParameter("name에 작성된 값");
     ${param.name에 작성된 값}

- id, class 속성
      CSS, JS에서 사용하기 위해 붙인 이름
      #id명 .class명
      웹 크롤링 등에서도 이용됨
      id : 유일한 요소에서 사용
      class : 다수의 요소에 공통적으로 설정이 적용될 때

- tip! 
  : getParameter안에 꺾세괄호를 넣음 
     => 오류가 나지 않고 null값을 받아오기 때문에 꺾세가 []붙어나옴

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX 실습</title>
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
</head>
<body>

<div id="box">
	<input type="text" name="mid" id="mid">
	<button class="btn" onclick="check();">중복검사</button>
	<div id="result"></div>
</div>

<script type="text/javascript">
	function check(){
		var mid = $("#mid").val(); // html에서 불러온 값 id = # | class = .
		$.ajax({
			type: 'GET', // get or post
			url : '${pageContext.request.contextPath}/check.do?mid='+mid, // controller 작업할 차례 => servlet 사용
			data : {mid:mid},// {이름:값} // json 사용
			success : function(result){ // check에서 가져온 값 result 작성
				// result는 String 파일
				// js - 1 : 모든 데이터가 객체
				// js - 2 : 동적타이핑(즉각적으로 자동 형변환)
				console.log("로그2 ["+result+"]");
				if(result==1){
					$("#result").text("사용가능한 아이디입니다!")// 사용가능
					$("#result").css("color","blue");
				}
				else{
					$("#result").text("이미 사용중인 아이디입니다...")// 사용중이라 사용 불가
					$("#result").css("color","red");
				}
			},
			error : function(request, status, error){ // 순서 
				console.log("상태코드 : " + request.status);
				console.log("메세지 : " + request.responseText);
				console.log("에러 설명 : " + error); // 이 것은 디버깅 할 때 필요, 잘 안쓰이기도 함
			}
		});
	}
</script>

</body>
</html>
package test;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Check
 */
@WebServlet("/check.do") // FrontController에서 했던 것 /도 판단 부분이라 들어감
public class Check extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Check() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
		// GET으로 만들어서 여기에 만들어도 되고
		// POST로 보내서 POST에서 작업해도 괜찮음
		// doPost(request, response);
		// response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("로그1 ["+ request.getParameter("mid") +"]");
		// tip! getParameter안에 꺾세가로를 넣음 => 오류가 나지 않고 null값을 받아오기 때문에 꺾세가 []붙어나옴
		
		TestDAO dao = new TestDAO();
		TestVO vo = new TestVO();
		vo.setMid(request.getParameter("mid")); // 문자열 값
		// setMid를 받으려면 파라미터로부터 받아야 함
		int result = dao.check(vo);
		
		ArrayList<Integer> datas = new ArrayList<Integer>();
		datas.add(1);
		datas.add(23);
		datas.add(4);
		
		// 요청했던 곳으로 result값을 보낼 예정 = keypoint
		// 그 전에 utf-8로 인코딩 하라고 지시
		response.setContentType("application/x-json; charset=UTF-8");
		//response.getWriter().write(result+""); 
		response.getWriter().write(datas.toString()); 
		// result뒤에 ""넣음으로서 String으로 값 보냄
		// ResponseBody는 Spring에서 사용
		// String으로 데이터를 변환 작업
		// -> 직접 String으로 데이터를 변환
	}

}

- 모듈화의 이유로 ajax의 서블릿을 따로 만듦
- 어떤 요청을 하는가, 만약 NewFile.jsp를 쓰면 그 페이지가 동작
     -> mid(V에서 입력한 값)라는 변수 만들어서 사용자가 입력한 값을 확보한 상태
          DB한테 물어볼 예정 "mid라는 값이 DB에 이미 있어?" => DAO를 거침
                 Controller가 작업할 예정 "서블릿"이 필요!
         'check.do'라고 써도 괜찮다. 하지만! 각자 쓰는 서비스의 어느 페이지라고 지정을 하게 되어있음!
         실제 서버에 관한 정보를 넘기는 방법 ${pageContext.request.contextPath} 작성

 

 

>> 데이터를 보내주는 쪽에서 객체를 여러개 보낼 수 있다
>> 받는 쪽에서 
result는 String 파일
js - 1 : 모든 데이터가 객체
js - 2 : 동적타이핑(즉각적으로 자동 형변환)
다음과 같은 
정리
1. 데이터를 N개, 객체 등을 보낼 수 있다.

1. JS가 동적타이핑을 지원하기 때문에,
2. list 타입으로 데이터를 받아서