JAVA & JSP & JavaScript
<div class="mb-2">
<label class="form-label" for="pwd">비밀번호</label>
<input class="form-control" type="password" name="pwd" id="pwd"/>
<small class="form-text">특수 문자를 하나 이상 조합하세요.</small>
<div class="invalid-feedback">비밀 번호를 확인 하세요</div>
</div>
<div class="mb-2">
<label class="form-label" for="pwd2">비밀번호 확인</label>
<input class="form-control" type="password" id="pwd2"/>
</div>
특수문자가 아닌 한글자 : [a-zA-Z0-9_] ➜ [\w]
특수문자 한글자 : [^a-zA-Z0-9_] ➜ [\W]
숫자 한글자 : [0-9] ➜ [\d]
숫자가 아닌 한글자 : [^0-9] ➜ [\D]
공백 한글자 : [ ] ➜ [\s]
공백이 아닌 한글자 : [^ ] ➜ [\S]
// 함수를 미리 만들어서
const checkPwd = ()=>{
// 비밀 번호를 검증할 정규 표현식(특수문자 포함여부)
const reg_pwd=/[\W]/;
// 양쪽에 입력한 비밀번호를 읽어와서
let pwd=document.querySelector("#pwd").value;
let pwd2=document.querySelector("#pwd2").value;
// 일단 is-valid 와 is-invalid 클래스를 제거를 먼저하고
document.querySelector("#pwd").classList.remove("is-valid", "is-invalid");
// 일단 정규표현식을 만족하는지 확인해서 만족하지 않으면 함수를 여기서 종료
// 만일 첫번째 비밀번호가 정규표현식을 통과하지 못하거나 또는 두번째 비밀번호가 정규표현식을 통과하지 못한다면
if( !reg_pwd.test(pwd) || !reg_pwd.test(pwd2) ){
document.querySelector("#pwd").classList.add("is-invalid");
return;
}
if(pwd == pwd2){
document.querySelector("#pwd").classList.add("is-valid");
}else{
document.querySelector("#pwd").classList.add("is-invalid");
}
};
// 비밀번호 혹은 비밀번호 확인란에 입력 했을때 동일한 함수가 호출되도록 한다
document.querySelector("#pwd").addEventListener("input", checkPwd);
document.querySelector("#pwd2").addEventListener("input", checkPwd);
<div class="mb-2">
<label class="form-label" for="email">이메일</label>
<input class="form-control" type="email" name="email" id="email"/>
<div class="invalid-feedback">이메일 형식에 맞게 입력하세요.</div>
</div>
document.querySelector("#email").addEventListener("input", (e)=>{
//이메일을 검증할 정규 표현식
const reg_email=/@/;
//입력한 문자열 읽어오기 (e.target 은 이벤트가 발생한 바로 그 요소의 참조값이다)
const email=e.target.value;
//일단 is-valid 와 is-invalid 클래스를 제거를 먼저하고
document.querySelector("#email").classList.remove("is-valid", "is-invalid");
if(reg_email.test(email)){
document.querySelector("#email").classList.add("is-valid");
}else{
document.querySelector("#email").classList.add("is-invalid");
}
});
<button class="btn btn-primary btn-sm" type="submit" disabled>가입</button>
// 아이디 유효성 여부를 관리할 변수
let isIdValid = false;
// 비밀번호 유효성 여부를 관리할 변수
let isPwdValid = false;
// 이메일 유효성 여부를 관리할 변수
let isEmailValid = false;
const checkForm = () => {
// 만일 아이디도 유효하고 그리고 비밀번호도 유효하고 그리고 이메일도 유효하다면
if(isIdValid && isPwdValid && isEmailValid){
// 전송 버튼에 disabled 속성을 제거하고
document.querySelector("[type=submit]").removeAttribute("disabled");
}else{
// 전송 버튼에 disabled 속성을 추가한다
document.querySelector("[type=submit]").setAttribute("disabled", "");
}
};
document.querySelector("#userName").addEventListener("input", (e)=>{
// 현재까지 입력한 아이디를 읽어온다.
const inputId = e.target.value;
// "영문자 소문자로 시작하고 5글자~10글자 이내로 입력" 이 검증조건을 만족했는지 여부를 알아낸다
const reg = /^[a-z].{4,9}$/;
// 만일 정규 표현식을 통과 하지 못했다면
if(!reg.test(inputId)){
e.target.classList.remove("is-valid");
e.target.classList.add("is-invalid");
//사용할수 없는 아이디라는 의미에서 false 를 넣어준다.
isIdValid=false;
checkForm();
return; //함수를 여기서 종료하기
}
// fetch() 함수를 이용해서 get 방식으로 입력한 아이디를 보내고 사용가능 여부를 json 으로 응답받는다.
fetch("check-id.jsp?inputId="+inputId)
.then(res=>res.json())
.then(data=>{
// 일단 is-valid , is-invalid 클래스를 제거하고
e.target.classList.remove("is-valid", "is-invalid");
// data 는 {canUse:true} 또는 {canUse:false} 구조의 object 이다
if(data.canUse){ //사용가능 하다면
e.target.classList.add("is-valid");
// 사용할수 있는 아이디라는 의미에서 true 를 넣어준다
isIdValid = true;
}else{//사용가능 하지 않다면
e.target.classList.add("is-invalid");
//사용할수 없는 아이디라는 의미에서 false 를 넣어준다
isIdValid = false;
}
checkForm();
});
});
// 함수를 미리 만들어서
const checkPwd = ()=>{
// 비밀 번호를 검증할 정규 표현식(특수문자 포함여부)
const reg_pwd=/[\W]/;
// 양쪽에 입력한 비밀번호를 읽어와서
let pwd=document.querySelector("#pwd").value;
let pwd2=document.querySelector("#pwd2").value;
// 일단 is-valid 와 is-invalid 클래스를 제거를 먼저하고
document.querySelector("#pwd").classList.remove("is-valid", "is-invalid");
// 일단 정규표현식을 만족하는지 확인해서 만족하지 않으면 함수를 여기서 종료
// 만일 첫번째 비밀번호가 정규표현식을 통과하지 못하거나 또는 두번째 비밀번호가 정규표현식을 통과하지 못한다면
if( !reg_pwd.test(pwd) || !reg_pwd.test(pwd2) ){
document.querySelector("#pwd").classList.add("is-invalid");
isPwdValid = false;
checkForm();
return;
}
if(pwd == pwd2){
document.querySelector("#pwd").classList.add("is-valid");
// 비밀번호가 유효하다는 의미에서 true 를 넣어준다
isPwdValid = true;
}else{
document.querySelector("#pwd").classList.add("is-invalid");
// 비밀번호가 유효하지 않다는 의미에서 false 를 넣어준다
isPwdValid = false;
}
checkForm();
};
document.querySelector("#email").addEventListener("input", (e)=>{
//이메일을 검증할 정규 표현식
const reg_email=/@/;
//입력한 문자열 읽어오기 (e.target 은 이벤트가 발생한 바로 그 요소의 참조값이다)
const email=e.target.value;
//일단 is-valid 와 is-invalid 클래스를 제거를 먼저하고
document.querySelector("#email").classList.remove("is-valid", "is-invalid");
if(reg_email.test(email)){
document.querySelector("#email").classList.add("is-valid");
isEmailValid = true;
}else{
document.querySelector("#email").classList.add("is-invalid");
isEmailValid = false;
}
checkForm();
});
document.querySelector("#userName").addEventListener("blur", (e)=>{
➜ forward 이동시킬 때 페이지
<error-page>
<error-code>404</error-code>
<location>/error/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/error/500.jsp</location>
</error-page>
<error-page>
<error-code>403</error-code>
<location>/error/403.jsp</location>
</error-page>
isWhiteList 메소드에 코드 추가// 에러 페이지
if(path.startsWith("/error")) return true;
<div class="container text-center py-5">
<h1 class="display-3 text-danger">404</h1>
<h2 class="mb-3">페이지를 찾을 수 없습니다</h2>
<p class="text-muted mb-4">요청하신 페이지가 존재하지 않거나 이동되었을 수 있습니다.</p>
<a href="<%= request.getContextPath() %>/" class="btn btn-primary btn-lg">메인 페이지로 이동</a>
</div>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<%--
isErrorPage = "true" 속성을 추가하면 exception 객체를 사용할 수 있다
exception 객체에는 예외의 정보가 들어 있다
--%>
<%
// 에러 메세지를 얻어낼 수 있다
// String errMsg = exception.getMessage();
%>
<div class="container text-center py-5">
<h1 class="display-3 text-danger">500</h1>
<h2 class="mb-3">서버 내부 오류가 발생했습니다</h2>
<p class="text-muted mb-4">잠시 후 다시 시도해 주세요.</p>
<% if (exception != null) { %>
<div class="alert alert-warning text-start mx-auto" style="max-width: 600px;">
<strong>오류 메시지:</strong> <%= exception.getMessage() %>
</div>
<% } %>
<a href="<%= request.getContextPath() %>/" class="btn btn-primary btn-lg">메인 페이지로 이동</a>
</div>

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<div class="container text-center py-5">
<h1 class="display-3 text-danger">403</h1>
<h2 class="mb-3">접근이 거부되었습니다</h2>
<p class="text-muted mb-4">이 페이지에 접근할 권한이 없습니다.</p>
<% if (exception != null) { %>
<div class="alert alert-warning text-start mx-auto" style="max-width: 600px;">
<strong>오류 메시지:</strong> <%= exception.getMessage() %>
</div>
<% } %>
<a href="<%= request.getContextPath() %>/" class="btn btn-primary btn-lg">메인 페이지로 이동</a>
</div>
