JSP

#1 JSP Project 05(Blog) - Ajax(회원가입 계속)

H-V 2021. 6. 30. 18:00

210628~29 유투버 '데어프로그래밍'님 강의 참조

 

 

Ajax란?

  • JS의 라이브러리중 하나, XMLHttpRequest객체를 이용해서 전체페이지를 새로고침없이도 페이지 일부만을 위한 데이터 로드 기업
  • 비동기 통신중 하나이며 클라이언트와 서버간에 JS  XML을 주고 받는 기술
  • 웹 HTML기반은 항상 'stateless' 상태이기 때문에 resquest/response 이후에는 항상 연결이 끊기는데 이때 페이지의 일부분만 갱신을 하고싶은데 페이지 전체를 다시 로드해야하면 많은 자원과 시간이 낭비된다. 이를 보완한게 'Ajax'
  • 최근에는 비동기 요청시에는 XML보다 JSON/TEXT 두개를 많이 쓴다
  • Ajax는 동기적/비동기적 둘다 가능하다

 

Ajax를 이용하여 아이디 중복검사 만들기

-joinForm.jsp에 조건 추가 및 버튼 만들기

- " 에 함수 추가

- 반드시 ischecking() 통해서 중복이면 가입이 안되도록 true/false 를 잘 써야한다. 

<script>
	var isChecking = false;
	function valid(){
		if(isChecking == false){
			alert("Check your username");
		}
		return isChecking;
	}
	function usernameCheck(){
		// DB에서 확인해서 정상이면 isChecking = true
		var username = $("#username").val();
		$.ajax({
			type: "POST",
			url: "/blog/user?cmd=usernameCheck",
			data: username,
			contentType: "text/plain; charset=utf-8",
			dataType: "text"  // 응답 받을 데이터의 타입을 적으면 자바스크립트 오브젝트로 파싱해줌.
		}).done(function(data){
			if(data === 'ok'){ // 유저네임 있다는 것
				isChecking = false;
				alert('Duplicated')
			}else{
				isChecking = true;
				$("#username").attr("readonly", "readonly");
				alert('Not duplicated')
			}
		});
	}

-UserController에 usernameCheck() 함수 생성

@WebServlet("/user")
public class UserController extends HttpServlet {
....
      } else if (cmd.equals("usernameCheck")) {
                  BufferedReader br = request.getReader(); // text는 버퍼로!
                  String username = br.readLine();
                  System.out.println(username);
                  int result = userSerivce.유저네임중복체크(username);
                  PrintWriter out = response.getWriter();
                  if(result==1) {
                      out.print("ok");
                  } else {
                      out.print("fail");
                  }
                  out.flush();
              }
          }
      }

-UserService 에 유저네임중복체크() 수정

public class UserService {
...
	public int 유저네임중복체크(String username) {
		int result=userDao.findByUsername(username);
		return result;
	}
}

-UserDao에 findByUsername() 함수 추가

(DBconn에 rs.close() 함수 추가)

public class UserDao {
	public int findByUsername(String username) { //회원가입
		//Admin은 DB에서 따로 변경하면 쉽다. 
		//1) 쿼리문 준비
		String sql = "SELECT * FROM user WHERE username = ?";
		PreparedStatement pstmt = null;
		//2) DB커넥션 연결
		Connection conn = DBConn.getConnection();
		ResultSet rs = null;
		try {
			//3)
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,username);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally { //try-catch 상관없이 무조건 실행.
			//코드가 길어지니 DBconn에서 함수로 따로 관리
			DBConn.close(conn, pstmt, rs);
		}
		return -1;
	}
    
    .....

**ischecking()을 통해서 중복이면 무조건 가입이 안되도록 막는다