JSP
[JSP] Ajax 이용하여 회원 가입 & 아이디 중복 체크 (mySQL)
에띠
2022. 5. 24. 15:35
728x90
회원가입 페이지 2_member.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회원가입</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
<script src="./js/regist.js"></script>
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
function sample6_execDaumPostcode() {
new daum.Postcode({
oncomplete: function(data) {
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.
// 각 주소의 노출 규칙에 따라 주소를 조합한다.
// 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
var addr = ''; // 주소 변수
var extraAddr = ''; // 참고항목 변수
//사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
addr = data.roadAddress;
} else { // 사용자가 지번 주소를 선택했을 경우(J)
addr = data.jibunAddress;
}
// 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
if(data.userSelectedType === 'R'){
// 법정동명이 있을 경우 추가한다. (법정리는 제외)
// 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
extraAddr += data.bname;
}
// 건물명이 있고, 공동주택일 경우 추가한다.
if(data.buildingName !== '' && data.apartment === 'Y'){
extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
}
// 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
if(extraAddr !== ''){
extraAddr = ' (' + extraAddr + ')';
}
// 조합된 참고항목을 해당 필드에 넣는다.
document.getElementById("sample6_extraAddress").value = extraAddr;
} else {
document.getElementById("sample6_extraAddress").value = '';
}
// 우편번호와 주소 정보를 해당 필드에 넣는다.
document.getElementById('sample6_postcode').value = data.zonecode;
document.getElementById("sample6_address").value = addr;
// 커서를 상세주소 필드로 이동한다.
document.getElementById("sample6_detailAddress").focus();
}
}).open();
}
</script>
</head>
<body>
<h2>회원가입</h2>
<form action="./2_member_ok.jsp" method="post" name="regform" id="regform" onsubmit="return sendit()">
<input type="hidden" name="isssn" id="isssn" value="n">
<!-- 아이디 중복체크 후 사용할 수 있는 아이디이면 value를 y로 변경 -->
<input type="hidden" name="isidcheck" id="isidcheck" value="n">
<p>아이디 : <input type="text" name="userid" id="userid" maxlength="20">
<input type="button" id="btnIdCheck" value="아이디 중복체크"></p>
<p id="idcheckmsg"></p>
<p>비밀번호 : <input type="password" name="userpw" id="userpw" maxlength="20"></p>
<p>비밀번호 확인 : <input type="password" name="userpw_re" id="userpw_re" maxlength="20"></p>
<p>이름 : <input type="text" name="name" id="name"></p>
<p>휴대폰 번호 : <input type="text" name="hp" id="hp"></p>
<p>이메일 : <input type="text" name="email" id="email"></p>
<p>취미 :
<label>드라이브<input type="checkbox" name="hobby" value="드라이브"></label>
<label>영화감상<input type="checkbox" name="hobby" value="영화감상"></label>
<label>쇼핑<input type="checkbox" name="hobby" value="쇼핑"></label>
<label>게임<input type="checkbox" name="hobby" value="게임"></label>
<label>운동<input type="checkbox" name="hobby" value="운동"></label>
</p> <!--onkeyup: 키보드를 눌렀다 땔 때 마다 실행-->
<p>주민등록번호 :
<input type="text" name="ssn1" id="ssn1" maxlength="6" onkeyup="moveFocus()" onkeydown="ssnChange()"> -
<input type="text" name="ssn2" id="ssn2" maxlength="7" onkeydown="ssnChange()">
<input type="button" onclick="ssnCheck()" value="주민등록번호 검증">
</p>
<p>우편번호 : <input type="text" name="zipcode" id="sample6_postcode">
<input type="button" value="우편번호 검색" onclick="sample6_execDaumPostcode()">
</p>
<p>주소 : <input type="text" name="address1" id="sample6_address"></p>
<p>상세주소 : <input type="text" name="address2" id="sample6_detailAddress"></p>
<p>참고항목 : <input type="text" name="address3" id="sample6_extraAddress"></p>
<p>
<input type="submit" value="가입완료">
<input type="reset" value="다시 작성">
<input type="button" value="로그인" onclick="location.href='./2_login.jsp'">
</p>
</form>
</body>
</html>
회원가입 확인 페이지 2_member_ok.jsp
<%@page import="java.sql.*"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8"); // 한글로 입력 시 깨지지 않게 설정
String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");
String name = request.getParameter("name");
String hp = request.getParameter("hp");
String email = request.getParameter("email");
//String hobby = request.getParameter("hobby");
// 취미는 여러개 선택 가능하기 때문에 배열로 받아옴
String hobby[] = request.getParameterValues("hobby");
// 취미 문자열로 저장
String hobbyStr = "";
for (int i = 0; i < hobby.length; i++) {
hobbyStr = hobbyStr + hobby[i] + " "; // 드라이브 등산 ..
}
String ssn1 = request.getParameter("ssn1");
String ssn2 = request.getParameter("ssn2");
String zipcode = request.getParameter("zipcode");
String address1 = request.getParameter("address1");
String address2 = request.getParameter("address2");
String address3 = request.getParameter("address3");
// db 연결
Connection conn = null;
PreparedStatement pstmt = null;
String sql = "";
String url = "jdbc:mysql://localhost:3306/aiclass";
String id = "root";
String pw = "1234";
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(url, id, pw);
if (conn != null) {
sql = "insert into tb_member(mem_userid, mem_userpw, mem_name, mem_hp, mem_email,
mem_hobby, mem_ssn1, mem_ssn2, mem_zipcode, mem_address1, mem_address2,
mem_address3) values (?, ?, ?, ?, ?, ?, ?, ?, ? ,?, ?, ?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, userid);
pstmt.setString(2, userpw);
pstmt.setString(3, name);
pstmt.setString(4, hp);
pstmt.setString(5, email);
pstmt.setString(6, hobbyStr);
pstmt.setString(7, ssn1);
pstmt.setString(8, ssn2);
pstmt.setString(9, zipcode);
pstmt.setString(10, address1);
pstmt.setString(11, address2);
pstmt.setString(12, address3);
pstmt.executeUpdate();
}
} catch(Exception e) {
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입 완료!</title>
</head>
<body>
<h2>회원가입 완료!</h2>
<p>아이디 : <%=userid %></p>
<p>이름 : <%=name %></p>
<p>휴대폰 번호 : <%=hp %></p>
<p>이메일 : <%=email %></p>
<p>취미 : <%=hobbyStr %></p>
<p>주민등록번호 : <%=ssn1 %> - <%=ssn2 %></p>
<p>우편번호 : <%=zipcode %></p>
<p>주소 : <%=address1 %></p>
<p>상세주소 : <%=address2 %></p>
<p>참고항목 : <%=address3 %></p>
<p><a href="./2_login.jsp">로그인하러 가기</p>
</body>
</html>
js
function sendit() {
const userid = document.getElementById('userid');
const userpw = document.getElementById('userpw');
const userpw_re = document.getElementById('userpw_re');
const name = document.getElementById('name');
const hp = document.getElementById('hp');
const email = document.getElementById('email');
const hobby = document.getElementsByName('hobby');
const isidcheck = document.getElementById('isidcheck'); // 아이디 중복체크
// 정규식
const exNameText = /[가-힣]+$/; // 가 ~ 힣 글자수 제한 x $ : 끝.
const exHpText = /^\d{3}-\d{3,4}-\d{4}$/;
// d{3} : 10진수 3자리 - d{3,4} : 10진수 3자리 또는 4자리 - d{4} 10진수 4자리 d : decimal
const exEmailText = /^[A-Za-z0-9\-\.]+@[A-Za-z0-9\-\.]+\.[A-Za-z0-9]+$/;
// ^ : 이 범위의 형태로 시작 A-Z, a-z, -, . 글자수 제한 x @포함
// @제외하고 특수문자 넣어야 할 경우 \+특수문자
// 아이디
if (userid.value == '') {
alert('아이디를 입력하세요')
userid.focus();
return false;
}
if (userid.value.length < 4 || userid.value.length > 20) {
alert('아이디는 4자 이상 20자 이하로 입력하세요');
userid.focus();
return false;
}
// 아이디 중복체크
if (isidcheck.value == 'n') {
alert('아이디 중복체크를 확인하세요');
isidcheck.focus();
return false;
}
// 비밀번호
if (userpw.value == '') {
alert('비밀번호 입력하세요')
userpw.focus();
return false;
}
if (userpw.value.length < 4 || userpw.value.length > 20) {
alert('비밀번호 4자 이상 20자 이하로 입력하세요');
userpw.focus();
return false;
}
// 비밀번호 확인
if (userpw.value != userpw_re.value) {
alert('비밀번호를 다시 확인해주세요')
userpw_re.focus();
return false;
}
// 이름
if (!exNameText.test(name.value)) { //test() : 정규표현식에 대입한 문자열이 부합하면 true, 아니면 false
alert('이름 형식을 확인하세요. \n한글만 입력 가능합니다.');
name.focus();
return false;
}
// 휴대폰번호
if (!exHpText.test(hp.value)) {
alert('휴대폰번호 형식을 확인하세요\n하이픈(-)을 포함해야 합니다.');
hp.focus();
return false;
}
// 이메일
if (!exEmailText.test(email.value)) {
alert('이메일 형식을 확인하세요.');
email.focus();
return false;
}
// 취미
let count = 0;
for (let i in hobby) {
if (hobby[i].checked) {
count++;
}
}
if (count == 0) {
alert('취미는 적어도 하나이상 선택하세요');
return false;
}
return true;
}
function moveFocus() {
const ssn1 = document.getElementById('ssn1');
if (ssn1.value.length >= 6) { // 주민등록번호 앞자리 6자리를 모두 입력하였을 경우
document.getElementById('ssn2').focus(); // 주민등록번호 뒷자리 입력칸으로 포커스 이동
}
}
function ssnCheck() {
const ssn1 = document.getElementById('ssn1');
const ssn2 = document.getElementById('ssn2');
if (ssn1.value == '' || ssn2.value == '') {
alert('주민등록번호를 입력하세요');
return false;
}
const ssn = ssn1.value + ssn2.value;
let idLast = Number(ssn.substr(-1));
let check = [2,3,4,5,6,7,8,9,2,3,4,5];
let sum = 0;
for (let i = 0; i < check.length; i++) {
sum += Number(ssn.substring(i, i+1)) * Number(check[i]);
}
console.log(sum);
let num = 11 - sum % 11;
if (num >= 10) {
num %= 10;
}
if (!(idLast == num)) {
alert('유효하지 않은 주민등록번호입니다.');
} else {
alert('유효한 주민등록번호입니다.');
isssn.value = 'y';
}
}
function ssnChange(){ // 키보드가 눌릴때 히든 값 'n'으로 변경
const isssn = document.getElementById('isssn');
isssn.value = 'n';
}
$(function() { // 아이디 중복 체크
$('#btnIdCheck').on('click', function() {
if($('#userid').val() == '') {
alert('아이디를 입력하세요');
$('#userid').focus();
return false;
}
const xhr = new XMLHttpRequest();
const userid = $('#userid').val();
xhr.open('GET', '2_idcheck.jsp?userid='+userid, true);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) {
const result = xhr.responseText;
if (result.trim() == "ok") {
$("#idcheckmsg").html("<b style='color:blue'>사용 가능한 아이디입니다.</b>");
$('#isidcheck').val('y');
} else {
$("#idcheckmsg").html("<b style='color:red'>중복된 아이디입니다.</b>");
$('#isidcheck').val('n');
}
}
}
});
$('#userid').on('keyup', function() { // 아이디 변경 시 value 값 변경
$("#isidcheck").val('n');
$("#idcheckmsg").html('');
});
});
728x90