본문 바로가기

JSP

[JSP] AJAX 활용 아이디 중복 검사

728x90
반응형

[AJAX] 

  • 자바스크립트 라이브러리 중 하나
  • 자바스크립트를 통해서 비동기처리로 서버에 데이터를 요청하여 
    필요한 데이터를 받아와 전체 페이지를 새로 고치지 않고 변경이 필요한 페이지 부분만 고치는 기법 
  • AJAX의 주목적은 화면 전환 없이 클라이언트와 서버간의 정보를 교환하기 위함
  • ex) 아이디 중복검사, 인증, 좋아요, 추천/비추천, 찜하기 

ajax.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>AJAX 아이디 중복검사 실습</title>
<!-- jquery를 불러오기위해서 CDN방식으로 선언  -->
<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();//class 불러올경우 $(".mid")
		$.ajax({
			type: 'GET', // 어떤 방식으로 보낼건지 GET인지 POST요청인지  
			url: '${pageContext.request.contextPath}/check.do?mid='+mid, //자신이 어떤 요청을 할지 -> mid(V에서 입력한 값)라는 변수만들어서 사용자가 입력한 값을 확보한 상태
// /check.do로 경로설정해도 되지만, 톰캣에 들어가는 프로젝트 이름을 같이 넣어주는게 좋음				     // DB한테 물어볼예정 "mid라는 값이 DB에 이미 있어?" => DAO(M) 거쳐야함 
																					 // C가 작업을 할 차례구나!! "서블릿" 
			//data: {mid:mid}, //post방식일 경우 사용 
			success : function(result){
				//result는 String
				// JS - 1 : 모든 데이터가 객체 
				// JS - 2 : 동적타이핑(즉각적으로 자동 형변환)
				console.log("로그1 ["+result+"]");
				if(result==1){//	사용가능 
					$("#result").text("사용가능한 아이디입니다!");
					$("#result").css("color", "blue");
				}
				else{//사용중이라 쓸수없는 아이디 
					
					$("#result").text("이미 사용중인 아이디입니다!");
					$("#result").css("color", "red");
				}
			}, 
			error: function(request, status, error){ // 서블릿에서 에러 발생 시 
				console.log("code: "+request.status);
				console.log("message: "+request.responseText);
				console.log("error: "+error);
			}
		});
	}
</script>

</body>
</html>

Check.java (서블릿 파일) 

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")
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 {
		// get으로 요청했기때문에 여기에 로직을 만들어도되고 doPOST(request, response);라고하고 post에 로직 작성해도 상관없음! 
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("로그1 ["+request.getParameter("mid")+"]");
		
		TestDAO dao = new TestDAO();
		TestVO vo = new TestVO();
		
		vo.setMid(request.getParameter("mid")); //setmid하려면 param으로 부터 mid 받아와야함 
		int result=dao.check(vo); //인자로 vo롤 쓰기 때문에 vo / output이 int이기 떄문에 result도 int
		
		//ArrayList<Integer> datas = new ArrayList<Integer>();
		//datas.add(1);
		//datas.add(23);
		//datas.add(4);
		
		//요청했던 곳으로 result값을 보낼예정 
		response.setContentType("application/x-json; charset=UTF-8");//
		//response.getWriter().write(datas.toString());//결과값을 작성해서 보냄 - result가 int라서 string으로 바꿔서 보냄
		response.getWriter().write(result+"");
	}
}

TestVO

package test;

public class TestVO {
	private String mid;

	public String getMid() {
		return mid;
	}

	public void setMid(String mid) {
		this.mid = mid;
	}

	@Override
	public String toString() {
		return "TestVO [mid=" + mid + "]";
	}
}

TestDAO

package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TestDAO {
	Connection conn;
	PreparedStatement pstmt;
	final private String sql="SELECT * FROM TEST WHERE MID=?";
	
	public int check(TestVO vo) { // 1, 0, -1 output을 int로 (상황에 따라 output이 달라질 수 있음) 
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql);
			pstmt.setString(1, vo.getMid());
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) { // 해당 데이터가 있니? 아이디가 중복이니? 
				return 0; // 아이디 중복 발생
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			// return -1; 에러상황 보고 가능 
		}finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return 1; // 아이디 중복 아님! 
	}
}
728x90
반응형