1. 개요
■ 지난 포스팅 : [JSP개발] 게시판 - 댓글 수정
이번에는 아이디 중복체크 및 회원가입 시 입력값들을 검사하는 기능을 구현할 것이다. 핵심적인 부분들의 구현이 우선이어서 미뤄두고 있었던 부분인데, 이번 포스팅에서 모두 구현을 할 것이다.
아이디 중복체크에서 알아야 될 것은 부모창 ↔ 자식창의 데이터 전달이다. 이 부분에 대한 설명은 소스 코드 설명에서 자세히 할 것이다.
■ JSP
JoinForm.jsp : 회원가입 화면에는 중복체크 창을 띄우는 코드 및 입력된 값들을 검사하는 코드를 추가한다.
IdCheckForm.jsp : 아이디 중복체크 화면이다.
■ Java
MemberIdCheckAction.java : 아이디 중복체크를 처리하는 Action이다.
MemberDAO.java : 기존에 만들어둔 아이디 중복체크 메서드를 사용할 것이다. 추가로 구현할 부분은 없다.
2. 소스 코드
■ JoinForm.jsp
회원가입 화면에서는 아이디를 입력하는 <input type="text">와 중복확인 버튼에 이벤트를 추가한다. 그리고 중복체크를 했는지 판단하기 위해 hidden을 추가한다.
139줄 : 아이디 입력란에는 키보드 입력시 발생하는 onkeydown 이벤트를 추가했다. 이 이벤트를 사용하는 것은 만약 사용자가 중복체크를 하고 난 뒤 아이디 입력란에 사용 가능한 아이디를 지우고 새로운 아이디를 입력했을 경우에 대처하기 위함이다. 이렇게 하면 중복체크가 되지 않은 것으로 처리되도록 한다.
140줄 : 중복확인 클릭 시 아이디 중복확인 창을 띄운다.
141줄 : 아이디 중복체크를 했는지 판단하기 위한 부분이다. <input type="hidden">의 value가 idUncheck 이면 중복체크를 하지 않은 것이다.
checkValue( )는 가입버튼 클릭 시 실행되는 함수이다. 여기에서는 회원가입 화면에 값들이 입력되었는지를 검사한다. 입력되지 않은 값이 있다면 경고 창을 띄운다.
checkValue( )를 보면 isNaN( )이란 함수를 사용한 부분이 있다. isNaN( )은 숫자인지 문자인지 검사하는 함수이다. 검사 결과는 boolean으로 반환한다.
isNaN(입력값) → true : 입력값은 문자이다.
isNaN(입력값) → false : 입력값은 숫자이다.
중복확인 버튼 클릭 시 호출되는 함수이다. openIdChk( )는 아이디 중복체크 화면을 띄운다.
아이디 입력란에서 키보드로 값을 입력 시 호출되는 함수이다. 중복체크 후 아이디 입력란에 사용 가능한 아이디가 입력되어 있을 때 입력된 아이디를 지우고 새로운 아이디를 입력하면 문제가 발생할 수 있다.
이와 같은 경우를 방지하기 위해 아이디를 입력하게 되면 일단, <input type="hidden">의 value를 idUncheck로 변경하여 중복체크가 실행되지 않은 것으로 처리한다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 | <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <html> <head> <title>회원가입 화면</title> <style type="text/css"> table{ margin-left:auto; margin-right:auto; border:3px solid skyblue; } td{ border:1px solid skyblue } #title{ background-color:skyblue } </style> <script type="text/javascript"> // 회원가입 화면의 입력값들을 검사한다. function checkValue() { var form = document.userInfo; if(!form.id.value){ alert("아이디를 입력하세요."); return false; } if(form.idDuplication.value != "idCheck"){ alert("아이디 중복체크를 해주세요."); return false; } if(!form.password.value){ alert("비밀번호를 입력하세요."); return false; } // 비밀번호와 비밀번호 확인에 입력된 값이 동일한지 확인 if(form.password.value != form.passwordcheck.value ){ alert("비밀번호를 동일하게 입력하세요."); return false; } if(!form.name.value){ alert("이름을 입력하세요."); return false; } if(!form.birthyy.value){ alert("년도를 입력하세요."); return false; } if(isNaN(form.birthyy.value)){ alert("년도는 숫자만 입력가능합니다."); return false; } if(form.birthmm.value == "00"){ alert("월을 선택하세요."); return false; } if(!form.birthdd.value){ alert("날짜를 입력하세요."); return false; } if(isNaN(form.birthdd.value)){ alert("날짜는 숫자만 입력가능합니다."); return false; } if(!form.mail1.value){ alert("메일 주소를 입력하세요."); return false; } if(!form.phone.value){ alert("전화번호를 입력하세요."); return false; } if(isNaN(form.phone.value)){ alert("전화번호는 - 제외한 숫자만 입력해주세요."); return false; } if(!form.address.value){ alert("주소를 입력하세요."); return false; } } // 취소 버튼 클릭시 첫화면으로 이동 function goFirstForm() { location.href="MainForm.do"; } // 아이디 중복체크 화면open function openIdChk(){ window.name = "parentForm"; window.open("member/IdCheckForm.jsp", "chkForm", "width=500, height=300, resizable = no, scrollbars = no"); } // 아이디 입력창에 값 입력시 hidden에 idUncheck를 세팅한다. // 이렇게 하는 이유는 중복체크 후 다시 아이디 창이 새로운 아이디를 입력했을 때 // 다시 중복체크를 하도록 한다. function inputIdChk(){ document.userInfo.idDuplication.value ="idUncheck"; } </script> </head> <body> <br><br> <b><font size="6" color="gray">회원가입</font></b> <br><br><br> <!-- 입력한 값을 전송하기 위해 form 태그를 사용한다 --> <!-- 값(파라미터) 전송은 POST 방식, 전송할 페이지는 JoinPro.jsp --> <form method="post" action="MemberJoinAction.do" name="userInfo" onsubmit="return checkValue()"> <table> <tr> <td id="title">아이디</td> <td> <input type="text" name="id" maxlength="50" onkeydown="inputIdChk()"> <input type="button" value="중복확인" onclick="openIdChk()"> <input type="hidden" name="idDuplication" value="idUncheck" > </td> </tr> <tr> <td id="title">비밀번호</td> <td> <input type="password" name="password" maxlength="50"> </td> </tr> <tr> <td id="title">비밀번호 확인</td> <td> <input type="password" name="passwordcheck" maxlength="50"> </td> </tr> <tr> <td id="title">이름</td> <td> <input type="text" name="name" maxlength="50"> </td> </tr> <tr> <td id="title">성별</td> <td> <input type="radio" name="gender" value="남" checked>남 <input type="radio" name="gender" value="여" >여 </td> </tr> <tr> <td id="title">생일</td> <td> <input type="text" name="birthyy" maxlength="4" placeholder="년(4자)" size="6"> <select name="birthmm"> <option value="00">월</option> <option value="01" >1</option> <option value="02" >2</option> <option value="03" >3</option> <option value="04" >4</option> <option value="05" >5</option> <option value="06" >6</option> <option value="07" >7</option> <option value="08" >8</option> <option value="09" >9</option> <option value="10" >10</option> <option value="11" >11</option> <option value="12" >12</option> </select> <input type="text" name="birthdd" maxlength="2" placeholder="일" size="4"> </td> </tr> <tr> <td id="title">이메일</td> <td> <input type="text" name="mail1" maxlength="50">@ <select name="mail2"> <option>naver.com</option> <option>daum.net</option> <option>gmail.com</option> <option>nate.com</option> </select> </td> </tr> <tr> <td id="title">휴대전화</td> <td> <input type="text" name="phone"/> </td> </tr> <tr> <td id="title">주소</td> <td> <input type="text" size="50" name="address"/> </td> </tr> </table> <br> <input type="submit" value="가입"/> <input type="button" value="취소" onclick="goFirstForm()"> </form> </body> </html> | cs |
■ IdCheckForm.jsp
아이디 중복체크 화면의 html이다.
115줄 : 중복체크 화면이 열리면 onload 이벤트에 의해 pValue( )라는 함수가 호출된다.
124줄 : 중복확인 버튼 클릭 시 중복체크를 하는 idCheck( )가 호출된다.
128줄 : 취소 클릭 시 현재창을 닫도록 한다.
129줄 : 사용하기를 클릭하면 sendCheckValue( )가 실행되어 입력된 값이 회원가입 화면으로 전달된다.
중복체크 화면이 열리면 제일 먼저 실행되는 함수이다. pValue( )는 부모창, 즉 회원가입 화면의 값을 가져와서 중복체크 화면에 아이디 입력란에 세팅한다.
※ 부모창에 접근하려면 opener를 사용해서 접근해야 한다.
idCheck( )는 아이디 중복체크를 하는 함수이다. 여기서는 먼저 아이디 입력 여부와 한글이나 특수문자를 입력했는지를 검사한다. 이후 Ajax를 이용해 중복체크를 한다. Ajax 부분에 대한 설명은 다른 포스팅에서 몇 번 언급했기에 생략한다.
61줄 : 아이디 입력란에서 입력된 값을 가져온다.
63~65줄 : 아이디 입력 여부를 검사한다. 아이디 미입력시 경고 창을 띄운다.
67~69줄 : 한글 및 특수문자 입력 여부를 검사한다. 한글이나 특수문자가 입력되었다면 경고 창을 띄운다.
서버로 데이터 전달 후 정상적으로 서버에서 데이터를 받을 경우 실행되는 부분이다. 0의 값을 받으면 중복된 아이디가 있는 것이고, 1의 값을 받으면 입력한 아이디는 사용할 수 있는 아이디이다.
여기서 visible와 hidden 이렇게 두 가지 CSS 속성이 사용된 것을 볼 수 있다. 이것은 소스 코드 128~129줄의 취소, 사용하기 버튼을 상황에 따라 보여주거나 보여주지 않거나 하기 위해서이다.
88~90줄 : 아이디가 중복되었을 경우 사용하기 버튼은 보여주지 않는다. 그리고 innerHTML을 이용하여 <div id="msg">안에 입력된 텍스트를 공백으로 바꾼다.
93~95줄 : 입력한 아이디가 사용 가능할 경우 사용하기 버튼을 보여준다. 그리고 innerHTML을 이용하여 <div id="msg">에 사용 가능하다는 텍스트를 보여준다.
사용하기 버튼 클릭 시 호출되는 함수이다. 여기서는 부모창인 회원가입 화면에 2가지 값을 전달한다.
103줄 : opener을 이용해 부모창에 있는 <input type="hidden">에 값을 전달한다. idCheck가 전달되면 부모창에서는 중복체크를 한 것으로 판단한다.
105줄 : 현재 중복체크 창에 입력된 아이디를 부모창에 아이디 입력란에 세팅한다.
107~109줄 : 값 전달 후 중복체크 창을 닫는다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | <%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR"> <title>아이디 중복 체크</title> <style type="text/css"> #wrap { width: 490px; text-align :center; margin: 0 auto 0 auto; } #chk{ text-align :center; } #cancelBtn{ visibility:visible; } #useBtn{ visibility:hidden; } </style> <script type="text/javascript"> var httpRequest = null; // httpRequest 객체 생성 function getXMLHttpRequest(){ var httpRequest = null; if(window.ActiveXObject){ try{ httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) { try{ httpRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e2) { httpRequest = null; } } } else if(window.XMLHttpRequest){ httpRequest = new window.XMLHttpRequest(); } return httpRequest; } // 회원가입창의 아이디 입력란의 값을 가져온다. function pValue(){ document.getElementById("userId").value = opener.document.userInfo.id.value; } // 아이디 중복체크 function idCheck(){ var id = document.getElementById("userId").value; if (!id) { alert("아이디를 입력하지 않았습니다."); return false; } else if((id < "0" || id > "9") && (id < "A" || id > "Z") && (id < "a" || id > "z")){ alert("한글 및 특수문자는 아이디로 사용하실 수 없습니다."); return false; } else { var param="id="+id httpRequest = getXMLHttpRequest(); httpRequest.onreadystatechange = callback; httpRequest.open("POST", "MemberIdCheckAction.do", true); httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); httpRequest.send(param); } } function callback(){ if(httpRequest.readyState == 4){ // 결과값을 가져온다. var resultText = httpRequest.responseText; if(resultText == 0){ alert("사용할수없는 아이디입니다."); document.getElementById("cancelBtn").style.visibility='visible'; document.getElementById("useBtn").style.visibility='hidden'; document.getElementById("msg").innerHTML =""; } else if(resultText == 1){ document.getElementById("cancelBtn").style.visibility='hidden'; document.getElementById("useBtn").style.visibility='visible'; document.getElementById("msg").innerHTML = "사용 가능한 아이디입니다."; } } } // 사용하기 클릭 시 부모창으로 값 전달 function sendCheckValue(){ // 중복체크 결과인 idCheck 값을 전달한다. opener.document.userInfo.idDuplication.value ="idCheck"; // 회원가입 화면의 ID입력란에 값을 전달 opener.document.userInfo.id.value = document.getElementById("userId").value; if (opener != null) { opener.chkForm = null; self.close(); } } </script> </head> <body onload="pValue()"> <div id="wrap"> <br> <b><font size="4" color="gray">아이디 중복체크</font></b> <hr size="1" width="460"> <br> <div id="chk"> <form id="checkForm"> <input type="text" name="idinput" id="userId"> <input type="button" value="중복확인" onclick="idCheck()"> </form> <div id="msg"></div> <br> <input id="cancelBtn" type="button" value="취소" onclick="window.close()"><br> <input id="useBtn" type="button" value="사용하기" onclick="sendCheckValue()"> </div> </div> </body> </html> | cs |
■ MemberIdCheckAction.java
아이디 중복체크 Action에서는 중복체크 화면에서 넘겨받은 id를 검사하는 작업을 한다. 그리고 검사 결과에 따라 0 또는 1의 값을 화면으로 전달한다.
18줄 : 파라미터에서 id값을 가져온다.
21줄 : DAO로 전달하여 id 중복체크를 한다.
26~27줄 : 중복된 아이디라면 0을 사용 가능한 아이디라면 1을 화면으로 전달한다.
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 32 33 34 | package jsp.member.action; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jsp.common.action.Action; import jsp.common.action.ActionForward; import jsp.member.model.MemberDAO; public class MemberIdCheckAction implements Action { @Override public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception { String id = request.getParameter("id"); MemberDAO dao = MemberDAO.getInstance(); boolean result = dao.duplicateIdCheck(id); response.setContentType("text/html;charset=euc-kr"); PrintWriter out = response.getWriter(); if(result) out.println("0"); // 아이디 중복 else out.println("1"); out.close(); return null; } } | cs |
■ MemberDAO.java
DAO에서는 기존에 구현해둔 중복체크 메서드를 사용하면 된다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 | package jsp.member.model; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Date; import java.util.ArrayList; import javax.naming.NamingException; import jsp.common.util.DBConnection; /** * JSP_MEMBER 테이블과 연관된 DAO로 * 회원 데이터를 처리하는 클래스이다. * <br><br> * Data Access Object - 테이블 당 한개의 DAO를 작성한다. */ public class MemberDAO { private static MemberDAO instance; // 싱글톤 패턴 private MemberDAO(){} public static MemberDAO getInstance(){ if(instance==null) instance=new MemberDAO(); return instance; } /** * String -> java.sql.Date로 변경하는 메서드 * <pre> * 문자열로된 생년월일을 Date로 변경하기 위해 필요하다. * java.util.Date클래스로는 오라클의 Date형식과 연동할 수 없다. * Oracle의 date형식과 연동되는 java의 Date는 java.sql.Date 클래스이다. </pre> * @param member 회원정보를 담고있는 TO * @return java.sql.Date */ public Date stringToDate(MemberBean member) { String year = member.getBirthyy(); String month = member.getBirthmm(); String day = member.getBirthdd(); Date birthday = null; if(year != null && month != null && day != null) birthday = Date.valueOf(year+"-"+month+"-"+day); return birthday; } // end stringToDate() /** * 회원정보를 JSP_MEMBER 테이블에 저장하는 메서드 * @param member 가입할 회원정보를 담고있는 TO * @throws SQLException */ public void insertMember(MemberBean member) throws SQLException { Connection conn = null; PreparedStatement pstmt = null; try { // 커넥션을 가져온다. conn = DBConnection.getConnection(); // 자동 커밋을 false로 한다. conn.setAutoCommit(false); // 쿼리 생성한다. // 가입일의 경우 자동으로 세팅되게 하기 위해 sysdate를 사용 StringBuffer sql = new StringBuffer(); sql.append("insert into JSP_MEMBER values"); sql.append("(?, ?, ?, ?, ?, ?, ?, ?, sysdate)"); stringToDate(member); /* * StringBuffer에 담긴 값을 얻으려면 toString()메서드를 * 이용해야 한다. */ pstmt = conn.prepareStatement(sql.toString()); pstmt.setString(1, member.getId()); pstmt.setString(2, member.getPassword()); pstmt.setString(3, member.getName()); pstmt.setString(4, member.getGender()); pstmt.setDate(5, stringToDate(member)); pstmt.setString(6, member.getMail1()+"@"+member.getMail2()); pstmt.setString(7, member.getPhone()); pstmt.setString(8, member.getAddress()); // 쿼리 실행 pstmt.executeUpdate(); // 완료시 커밋 conn.commit(); } catch (ClassNotFoundException | NamingException | SQLException sqle) { // 오류시 롤백 conn.rollback(); throw new RuntimeException(sqle.getMessage()); } finally { // Connection, PreparedStatement를 닫는다. try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end insertMember() /** * 아이디를 이용해 현재 회원정보를 가져온다. * @param id 회원 아이디 * @return MemberBean */ public MemberBean getUserInfo(String id) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; MemberBean member = null; try { // 쿼리 StringBuffer query = new StringBuffer(); query.append("SELECT * FROM JSP_MEMBER WHERE ID=?"); conn = DBConnection.getConnection(); pstmt = conn.prepareStatement(query.toString()); pstmt.setString(1, id); rs = pstmt.executeQuery(); if (rs.next()) // 회원정보를 DTO에 담는다. { // DB의 생년월일정보 -> 년, 월, 일로 문자열 자른다. String birthday = rs.getDate("birth").toString(); String year = birthday.substring(0, 4); String month = birthday.substring(5, 7); String day = birthday.substring(8, 10); // 이메일을 @ 기준으로 자른다. String mail = rs.getString("mail"); int idx = mail.indexOf("@"); String mail1 = mail.substring(0, idx); String mail2 = mail.substring(idx+1); // 자바빈에 정보를 담는다. member = new MemberBean(); member.setId(rs.getString("id")); member.setPassword(rs.getString("password")); member.setName(rs.getString("name")); member.setGender(rs.getString("gender")); member.setBirthyy(year); member.setBirthmm(month); member.setBirthdd(day); member.setMail1(mail1); member.setMail2(mail2); member.setPhone(rs.getString("phone")); member.setAddress(rs.getString("address")); member.setReg(rs.getTimestamp("reg")); } return member; } catch (Exception sqle) { throw new RuntimeException(sqle.getMessage()); } finally { // Connection, PreparedStatement를 닫는다. try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end getUserInfo /** * 모든 회원정보를 가져온다. * @return ArrayList<MemberBean> : 회원 List를 리턴한다. */ public ArrayList<MemberBean> getMemberList() { ArrayList<MemberBean> memberList = new ArrayList<MemberBean>(); Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; MemberBean member = null; try { StringBuffer query = new StringBuffer(); query.append("SELECT * FROM JSP_MEMBER"); conn = DBConnection.getConnection(); pstmt = conn.prepareStatement(query.toString()); rs = pstmt.executeQuery(); while (rs.next()) { member = new MemberBean(); member.setId(rs.getString("id")); member.setPassword(rs.getString("password")); member.setName(rs.getString("name")); member.setGender(rs.getString("gender")); member.setBirthyy(rs.getDate("birth").toString()); member.setMail1(rs.getString("mail")); member.setPhone(rs.getString("phone")); member.setAddress(rs.getString("address")); member.setReg(rs.getTimestamp("reg")); memberList.add(member); } return memberList; } catch (Exception sqle) { throw new RuntimeException(sqle.getMessage()); } finally { // Connection, PreparedStatement를 닫는다. try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end getMemberList /** * 회원정보를 수정한다. * @param member 수정할 회원정보를 담고있는 TO * @throws SQLException */ public void updateMember(MemberBean member) throws SQLException{ Connection conn = null; PreparedStatement pstmt = null; try { StringBuffer query = new StringBuffer(); query.append("UPDATE JSP_MEMBER SET"); query.append(" PASSWORD=?, MAIL=?, PHONE=?, ADDRESS=?"); query.append(" WHERE ID=?"); conn = DBConnection.getConnection(); pstmt = conn.prepareStatement(query.toString()); // 자동 커밋을 false로 한다. conn.setAutoCommit(false); pstmt.setString(1, member.getPassword()); pstmt.setString(2, member.getMail1()+"@"+member.getMail2()); pstmt.setString(3, member.getPhone()); pstmt.setString(4, member.getAddress()); pstmt.setString(5, member.getId()); int flag = pstmt.executeUpdate(); if(flag > 0){ conn.commit(); // 완료시 커밋 } } catch (Exception sqle) { conn.rollback(); // 오류시 롤백 throw new RuntimeException(sqle.getMessage()); } finally { try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end updateMember /** * 회원정보를 삭제한다. * @param id 회원정보 삭제 시 필요한 아이디 * @param pw 회원정보 삭제 시 필요한 비밀번호 * @return x : deleteMember() 수행 후 결과값 */ @SuppressWarnings("resource") public int deleteMember(String id, String pw) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String dbpw = ""; // DB상의 비밀번호를 담아둘 변수 int x = -1; try { // 비밀번호 조회 StringBuffer query1 = new StringBuffer(); query1.append("SELECT PASSWORD FROM JSP_MEMBER WHERE ID=?"); // 회원 삭제 StringBuffer query2 = new StringBuffer(); query2.append("DELETE FROM JSP_MEMBER WHERE ID=?"); conn = DBConnection.getConnection(); // 자동 커밋을 false로 한다. conn.setAutoCommit(false); // 1. 아이디에 해당하는 비밀번호를 조회한다. pstmt = conn.prepareStatement(query1.toString()); pstmt.setString(1, id); rs = pstmt.executeQuery(); if (rs.next()) { dbpw = rs.getString("password"); if (dbpw.equals(pw)) // 입력된 비밀번호와 DB비번 비교 { // 같을경우 회원삭제 진행 pstmt = conn.prepareStatement(query2.toString()); pstmt.setString(1, id); pstmt.executeUpdate(); conn.commit(); x = 1; // 삭제 성공 } else { x = 0; // 비밀번호 비교결과 - 다름 } } return x; } catch (Exception sqle) { try { conn.rollback(); // 오류시 롤백 } catch (SQLException e) { e.printStackTrace(); } throw new RuntimeException(sqle.getMessage()); } finally { try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end deleteMember /** * 로그인시 아이디, 비밀번호 체크 메서드 * @param id 로그인할 아이디 * @param pw 비밀번호 * @return x : loginCheck() 수행 후 결과값 */ public int loginCheck(String id, String pw) { Connection conn = null; PreparedStatement pstmt = null; ResultSet rs = null; String dbPW = ""; // db에서 꺼낸 비밀번호를 담을 변수 int x = -1; try { // 쿼리 - 먼저 입력된 아이디로 DB에서 비밀번호를 조회한다. StringBuffer query = new StringBuffer(); query.append("SELECT PASSWORD FROM JSP_MEMBER WHERE ID=?"); conn = DBConnection.getConnection(); pstmt = conn.prepareStatement(query.toString()); pstmt.setString(1, id); rs = pstmt.executeQuery(); if (rs.next()) // 입려된 아이디에 해당하는 비번 있을경우 { dbPW = rs.getString("password"); // 비번을 변수에 넣는다. if (dbPW.equals(pw)) x = 1; // 넘겨받은 비번과 꺼내온 비번 비교. 같으면 인증성공 else x = 0; // DB의 비밀번호와 입력받은 비밀번호 다름, 인증실패 } else { x = -1; // 해당 아이디가 없을 경우 } return x; } catch (Exception sqle) { throw new RuntimeException(sqle.getMessage()); } finally { try{ if ( pstmt != null ){ pstmt.close(); pstmt=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end loginCheck() /** * 아이디 중복체크를 한다. * @param id 아이디 * @return x : 아이디 중복여부 확인값 */ public boolean duplicateIdCheck(String id) { Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; boolean x= false; try { // 쿼리 StringBuffer query = new StringBuffer(); query.append("SELECT ID FROM JSP_MEMBER WHERE ID=?"); conn = DBConnection.getConnection(); pstm = conn.prepareStatement(query.toString()); pstm.setString(1, id); rs = pstm.executeQuery(); if(rs.next()) x= true; //해당 아이디 존재 return x; } catch (Exception sqle) { throw new RuntimeException(sqle.getMessage()); } finally { try{ if ( pstm != null ){ pstm.close(); pstm=null; } if ( conn != null ){ conn.close(); conn=null; } }catch(Exception e){ throw new RuntimeException(e.getMessage()); } } } // end duplicateIdCheck() } | cs |
■ MemberCommand.properties
프로퍼티 파일에는 중복체크 관련 명령어를 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # Form Change MainForm.do=jsp.member.action.MemberFormChangeAction LoginForm.do=jsp.member.action.MemberFormChangeAction JoinForm.do=jsp.member.action.MemberFormChangeAction UserInfoForm.do=jsp.member.action.MemberFormChangeAction ModifyFrom.do=jsp.member.action.MemberFormChangeAction DeleteForm.do=jsp.member.action.MemberFormChangeAction ResultForm.do=jsp.member.action.MemberFormChangeAction MemberListForm.do=jsp.member.action.MemberFormChangeAction # Action MemberLoginAction.do=jsp.member.action.MemberLoginAction MemberLogoutAction.do=jsp.member.action.MemberLogoutAction MemberJoinAction.do=jsp.member.action.MemberJoinAction MemberInfoAction.do=jsp.member.action.MemberInfoAction MemberModifyFormAction.do=jsp.member.action.MemberModifyFormAction MemberModifyAction.do=jsp.member.action.MemberModifyAction MemberDeleteAction.do=jsp.member.action.MemberDeleteAction MemberListAction.do=jsp.member.action.MemberListAction MemberIdCheckAction.do=jsp.member.action.MemberIdCheckAction | cs |
3. 실행 결과
aaa라는 값을 입력 후 중복확인 버튼을 누른다. 그러면 아이디 중복체크 창이 뜨면서 aaa란 값이 입력되어 있는 것을 볼 수 있다.
중복확인을 누르면 중복 여부를 알 수 있다. 아이디가 중복되어 있을 경우 위와 같은 경고 창을 띄운다.
아이디가 사용 가능할 경우 위와 같은 메시지가 화면에 표시된다.
아이디 중복체크 창에서 사용하기 버튼을 누르면 자동적으로 사용 가능한 아이디가 회원가입 화면에 입력 된다.
여기서 가입 버튼을 클릭하면 비밀번호를 입력하라는 경고 창이 뜬다. 다른 부분도 마찬가지로 입력하지 않았다면 경고 창이 뜬다.
4. 소스코드 다운로드 (war 파일)
'코딩 > JSP' 카테고리의 다른 글
[JSP개발] 회원가입 답변형 게시판 (8) | 2017.02.06 |
---|---|
[JSP개발] 게시판, 방명록, 댓글 줄바꿈 처리 (2) | 2017.01.08 |
[JSP개발] 게시판 - 댓글 수정 (0) | 2017.01.05 |
[JSP개발] 게시판 - 댓글 삭제 (1) | 2017.01.04 |
[JSP개발] 게시판 - 댓글 답변 구현 (4) | 2017.01.03 |