일단 5월7일부터 본격적인 프로젝트코딩이 시작될것같은데
그전에 좀 써먹어보려고 몇개의 기능을 구현해보려고한다
1) joinForm리팩토링 (유효성검사추가)
기존joinForm (비밀번호,이메일,전화번호 유효성검사X)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
</head>
<body>
<!-- onsubmit : 나의 form 내부에 submit버튼 클릭되면
form 태그에 이벤트 발생(target == form)
return input_check(this) : input_check()함수 호출 , 매개변수this : form객체를 의미
-->
<form action="join" name="f" method="post" onsubmit="return input_check(this)">
<input type="hidden" name="picture" value=""><!-- 업로드된 이미지의 이름이 들어갈태그 -->
<table class="table">
<tr>
<td rowspan="4" valign="bottom">
<img src="" width="100" height="120" id="pic"><br>
<font size="1"><a href="javascript:win_upload()">사진등록</a></font>
</td><th>아이디</th>
<td><input type="text" name="id" class="form-control">
<button type="button" onclick="idchk()" class="btn btn-dark" id="chk" name="chk">중복검색</button>
</td></tr>
<tr><th>비밀번호</th><td><input type="password" name="pass"></td></tr>
<tr><th>이름</th><td><input type="text" name="name"></td></tr>
<tr><th>성별</th>
<td>
<label for="gender1" class="form-check-label">
남<input type="radio" name="gender" id="gender1" value="1">
</label>
<label for="gender2" class="form-check-label">
여<input type="radio" name="gender" id="gender2" value="2" >
</label>
</td></tr>
<tr><th>전화번호</th><td colspan="2"><input type="text" name="tel" class="form-control"></td></tr>
<tr><th>이메일</th><td colspan="2"><input type="text" name="email" class="form-control"></td></tr>
<!-- button태그의 기본type : submit임 -->
<tr><td colspan="3"><button class="btn btn-outline-dark">회원가입</button ></td></tr>
</table>
</form>
<script>
function input_check(f){
//f : <form...>
//f.id : <input name="id">name이 id인태그
if(f.id.value.trim() == ""){
alert("아이디입력")
f.id.focus(); //name이id인 곳에 포커스를 둠
return false; //기본이벤트 취소
}
if(f.pass.value.trim() == ""){
alert("비밀번호입력")
f.pass.focus();
return false;
}
if(f.name.value.trim() == ""){
alert("이름입력")
f.name.focus();
return false;
}
return true;//아이디비번이름이 입력됐다면 true
}
function win_upload(){
let op = "width=500,height=500 ,top=50 ,left=150";
open("pictureForm","",op);
//pictureForm.jsp를 연다
}
function idchk(){
if(document.f.id.value==''){
alert("아이디를 입력하세요");
document.f.id.focus();
}
else{
let op="width=500,height=200,left=50,right=150";
open("idchk?id="+document.f.id.value,"",op);
}
}
</script>
</body>
</html>
바꾼 joinForm
(주요하게봐야할 곳
password , email , tel의 하위에 태그하나 추가)
(tChk(this) , pChk(this ) , eChk( this )함수와 valid(text,type)함수 , input_check함수)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
</head>
<body>
<!-- onsubmit : 나의 form 내부에 submit버튼 클릭되면
form 태그에 이벤트 발생(target == form)
return input_check(this) : input_check()함수 호출 , 매개변수this : form객체를 의미
-->
<form action="join" name="f" method="post" onsubmit="return input_check(this)">
<input type="hidden" name="picture" value=""><!-- 업로드된 이미지의 이름이 들어갈태그 -->
<table class="table">
<tr>
<td rowspan="4" valign="bottom">
<img src="" width="100" height="120" id="pic"><br>
<font size="1"><a href="javascript:win_upload()">사진등록</a></font>
</td><th>아이디</th>
<td><input type="text" name="id" class="form-control">
<button type="button" onclick="idchk()" class="btn btn-dark" id="chk" name="chk">중복검색</button>
</td></tr>
<tr><th>비밀번호</th><td><input type="password" name="pass" onkeyup="pChk(this)"></td></tr>
<tr><td id="passValid"></td></tr>
<tr><th>이름</th><td><input type="text" name="name"></td></tr>
<tr><th>성별</th>
<td>
<label for="gender1" class="form-check-label">
남<input type="radio" name="gender" id="gender1" value="1">
</label>
<label for="gender2" class="form-check-label">
여<input type="radio" name="gender" id="gender2" value="2" >
</label>
</td></tr>
<tr><th>전화번호</th><td colspan="2"><input type="text" name="tel" class="form-control" onkeyup="tChk(this)"></td></tr>
<tr><td id="telValid"></td></tr>
<tr><th>이메일</th><td colspan="2"><input type="text" name="email" class="form-control" onkeyup="eChk(this)"></td></tr>
<tr><td id="emailValid"></td></tr>
<!-- button태그의 기본type : submit임 -->
<tr><td colspan="3"><button class="btn btn-outline-dark">회원가입</button ></td></tr>
</table>
</form>
<script>
function pChk(p){
const passVal = document.querySelector("#passValid");
if(!valid(p.value,'pass')){
passVal.innerHTML= '특수문자포함 8~16자리';
passVal.style.color='red';
}
else{
passVal.innerHTML= '유효한비밀번호';
passVal.style.color='green';
}
}
function tChk(t){
const telVal = document.querySelector("#telValid");
if(!valid(t.value,'tel')){
telVal.innerHTML= '올바른 휴대폰번호입력바람';
telVal.style.color='red';
}
else{
telVal.innerHTML= '유효한 번호';
telVal.style.color='green';
}
}
function eChk(e){
const emailVal = document.querySelector("#emailValid");
if(!valid(e.value,'email')){
emailVal.innerHTML= '올바른 Email형식작성하세요';
emailVal.style.color='red';
}
else{
emailVal.innerHTML= '유효한E-mail';
emailVal.style.color='green';
}
}
function valid(text,type){
if(type==='email'){//넘어온값과 name=email의 값이 동일할때
const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9._]+\.[a-zA-Z]{2,}$/;
return regex.test(text);
}
else if(type==='tel'){ //넘어온값과 name=tel의 값이 동일할때
const regex = /^(01[0126789])-?\d{3,4}-?\d{4}$/;
return regex.test(text);
}
else if(type==='pass'){ //비밀번호유효성검사
const regex = /^(?=.*[A-Za-z])(?=.*\d)(?=.*[\W_])[A-Za-z\d\W_]{8,16}$/;
//(?=.*[A-Za-z]) → 문자열 어딘가에 영문자가 있어야 해 (확인만)
//\W : 특수문자 , [A-Za-z\d\W_]{8,16} : 해당문자들이 8개~16개존재해야함
return regex.test(text);
}
}
function input_check(f){
//f : <form...>
//f.id : <input name="id">name이 id인태그
if(f.id.value.trim() == ""){
alert("아이디입력")
f.id.focus(); //name이id인 곳에 포커스를 둠
return false; //기본이벤트 취소
}
if(f.pass.value.trim() == ""){
alert("비밀번호입력")
f.pass.focus();
return false;
}
if(f.name.value.trim() == ""){
alert("이름입력")
f.name.focus();
return false;
}
if(f.gender.value.trim() == ""){
alert("성별체크")
return false;
}
if(f.tel.value.trim() == ""){
alert("전화번호입력바람")
f.tel.focus();
return false;
}
if(f.email.value.trim() == ""){
alert("email입력바람")
f.email.focus();
return false;
}
if(!(valid(f.pass.value.trim())
&& valid(f.email.value.trim())
&& valid(f.tel.value.trim()))){ //3개중 한개라도 유효성검사를 실패했다면 실행
alert("형식을준수해주세요")
return false;
}
return true;//아이디비번이름이 입력됐다면 true
}
function win_upload(){
let op = "width=500,height=500 ,top=50 ,left=150";
open("pictureForm","",op);
//pictureForm.jsp를 연다
}
function idchk(){
if(document.f.id.value==''){
alert("아이디를 입력하세요");
document.f.id.focus();
}
else{
let op="width=500,height=200,left=50,right=150";
open("idchk?id="+document.f.id.value,"",op);
}
}
</script>
</body>
</html>
email, tel , pass의 값 입력시(keyup)이벤트 발생 시 echk(this),tchk(this) ,pchk(this)함수이동
해당함수에선 전달받은값(this)의 value와 type을 적어 valid(text,type)로 전달
valid(text,type)함수에서 전달받은type을 비교해
일치하는값에 해당하는 유효성검사를 실시후 참거짓 리턴
ex) /^(?=.*[A-Za-z])(?=.*\d)(?=.*[\W_])[A-Za-z\d\W_]{8,16}$/
어디든 영문자1개 , 숫자1개 , 특수문자1개를포함 한 8~16자리문자
?= : 검사
.* : 0개이상(앞에뭐가있든없든 신경X)
(?=.*[A-Za-z]) : 어디든 영문자1개가 존재하는가?
각 검사결과에따른 메시지를 하단에 넣어준다.(xxChk(this))
form에 전달 시 valid함수에 email,tel,password함수가 들어갓을 때
모두 true가 나와야 action=join으로 폼을 넘길것임
(input_check(this))
2) 임시비밀번호만들어보기 (이메일로 전송하거나 DB에 없데이트하는법은 나중에)
MemberController의 pw매핑부분!! (출력만해놨기때문에 DB에 영향은없음)
@RequestMapping("pw") // 비번찾기
public String pw(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
//name="name"인 파라미터를 가져와
String email = request.getParameter("email");
String tel = request.getParameter("tel");
String pass = dto.pwSearch(id, tel, email);
String rPass = UUID.randomUUID().toString().substring(0,8);
//MemberDto에 가서 DB정보와비교해 가져온다
if(pass==null) {
request.setAttribute("msg", "password를 찾을수없어요");
request.setAttribute("pass", pass);
return "pwSearch";
}
else {
//request.setAttribute("msg", id+"님의 password : "+pass.substring(0,pass.length()-2)+"**");
request.setAttribute("msg", "임시비번 : "+rPass);
request.setAttribute("pass", pass);
return "pwSearch";
}
}
1 UUID.randomUUID()를 이용해 어디든없는 UUID생성
2 toString으로 문자열로변경
3 substring을 이용해 8자리만가져오기
4) alert창에 띄우기
지금은 DB를 망치고싶지않아서 업데이트부분은 넣지않았다
updatePass(id,pass)를 구현해놨기때문에
아이디와 임시비번만 넘겨준다면 될거임.
그 후 메일로 해당 임시비밀번호를전송하는 식으로 하려고함
'주말공부 or 복습' 카테고리의 다른 글
주말복습8(javaScript) (1) | 2025.03.30 |
---|---|
주말복습 7( HTML) (0) | 2025.03.16 |
주말복습6 (DB) (2) | 2025.03.09 |
주말복습5 (0) | 2025.03.03 |
주말복습4(Collection(List,set,Map) (0) | 2025.03.01 |