이번엔 회원탈퇴 페이지를 만들고 비밀번호가 일치해야 탈퇴할 수 있게끔 구현했다.
[memberDeleteView.do]

비밀번호가 일치해야 탈퇴된다!
(관리자는 비밀번호 없이 탈퇴할 수 있게 수정할 예정이지만 아직 수정은 안해서 관리자도 똑같이 비밀번호 입력해야 탈퇴된당...^ㅇ^)
[memberDeleteView.jsp]
<%@page import="org.project.dto.MemberDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String userId =
(String)request.getAttribute("userId");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Good Bye</title>
<link rel="stylesheet" href="css/memberDelete.css" />
</head>
<body>
<%@include file="common/header.jsp" %>
<div class="container">
<div class="inner-con">
<div class="delete">
<form action="deleteOk.do" method="post" id="deleteForm">
<table>
<thead>
<tr>
<th>DELETE ACCOUNT</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label for="userId">아이디</label> <br />
<input type="hidden" name="userId" id="userId" value="<%=userId %>"/>
<span class="id"><%=userId %></span>
</td>
</tr>
<tr>
<td>
<label for="userPw">비밀번호</label> <br />
<input type="password" name="userPw" id="userPw" placeholder="비밀번호를 입력해 주세요." />
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>
<input type="submit" value="회원탈퇴" id="deleteOkBtn" />
</td>
</tr>
</tfoot>
</table>
</form>
</div>
</div>
</div>
<%@include file="common/footer.jsp" %>
</body>
</html>
/*memberDeleteView.css*/
@import url("common/reset.css");
@import url("common/header.css");
@import url("common/footer.css");
@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@300&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Sunflower:wght@500&display=swap');
.container {
width: 100%;
height: calc(100vh - 180px);
}
.inner-con {
width: 100%;
height: calc(100vh - 180px);
background-image: url("../img/ekuse6.jpg");
background-repeat: no-repeat;
background-size: cover;
background-position: bottom;
display: flex;
justify-content: center;
}
.delete {
background: rgba(255, 255, 255, 0.5);
width: 700px;
display: flex;
align-items: center;
justify-content: center;
}
.delete > form > table {
margin-left: auto;
margin-right: auto;
padding: 10px 10px;
width: 500px;
font-family: 'Sunflower', sans-serif;
letter-spacing: 2px;
}
.delete > form > table thead tr th {
color: white;
text-shadow: 1px 1px 1px gray;
font-size: 1.5em;
line-height: 50px;
font-family: 'Nunito', sans-serif;
}
.delete > form > table tbody label {
line-height: 40px;
font-size: 1.2em;
color: #5d4037;
}
.id {
color: #004c8c;
}
.delete > form > table tbody input {
width: 100%;
height: 40px;
border: 1px solid #ddd;
border-radius: 5px;
padding: 2px 5px;
margin: 2px 0px;
font-family: 'Sunflower', sans-serif;
}
#pwch {
color: red;
}
.pwch2 {
color: blue !important;
}
.delete > form > table tfoot input {
width: 100%;
height: 40px;
border: none;
background-color: #7f0000;
color: #FFFFFF;
font-family: 'Sunflower', sans-serif;
letter-spacing: 5px;
font-size: 1em;
margin-top: 5px;
}
String userId =(String)request.getAttribute("userId");
아이디는 요청한 유저에 의해 자동으로 가져와지니까 userId를 가져와서 input의 value에 넣고 여기서 입력된 비밀번호와 DB에 저장되어 있는 비밀번호를 비교해서 처리해야 한다.
[ProjectDao - deleteDo]
package org.project.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import org.project.dbConnect.DBConnect;
import org.project.dto.MemberDto;
//DataBase Access Object
public class ProjectDao {
//싱글톤
//클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 객체를 만들어 사용하는 디자인 패턴
//생성자를 외부에서 호출할 수 없도록 private 접근제한자
private static class singleton {
//정적 필드 static final => 한 번 초기값이 저장되면 변경 불가
private static final ProjectDao INSTANCE=new ProjectDao();
}
//생성자
private ProjectDao() {}
//외부 호출이 가능(public) 정적(static) 메소드
public static ProjectDao getInstance() {
return singleton.INSTANCE;
}
//회원탈퇴
public boolean deleteDo(String userId, String userPw) {
boolean result = false;
Connection conn=null;
PreparedStatement pstm=null;
ResultSet rs=null;
String dbUserPw="";
try {
conn=DBConnect.getConnection();
String sql="select userPw from pj_member where userId=?";
pstm=conn.prepareStatement(sql);
pstm.setString(1, userId);
rs=pstm.executeQuery();
if(rs.next()) {
dbUserPw=rs.getString("userPw");
if(dbUserPw.equals(userPw)) {
String delSql="delete from pj_member where userId=?";
pstm=conn.prepareStatement(delSql);
pstm.setString(1, userId);
pstm.executeUpdate();
result=true;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(conn!=null) conn.close();
if(pstm!=null) pstm.close();
if(rs!=null) rs.close();
} catch (Exception e) {
e.printStackTrace();
} finally {}
}
return result;
}
}
String sql="select userPw from pj_member where userId=?";
pstm=conn.prepareStatement(sql);
pstm.setString(1, userId);
rs=pstm.executeQuery();
첫 쿼리문을 통해서 userId=?에 해당하는 비밀번호를 ResultSet의 rs에 저장한다.
그리고 여기에 담겨있는 비밀번호와 요청해서 받은 비밀번호가 일치해야 탈퇴를 실행하므로 중첩 if문을 사용했다.
[DeleteOkCommend]
package org.project.commend;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.project.dao.ProjectDao;
public class DeleteOkCommend implements ExcuteCommend{
@Override
public void excuteQueryCommend(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("회원탈퇴 commend");
String userId=request.getParameter("userId");
String userPw=request.getParameter("userPw");
ProjectDao dao=ProjectDao.getInstance();
HttpSession session=request.getSession();
String sessionId=(String)session.getAttribute("sessionId");
boolean rs=dao.deleteDo(userId, userPw);
String url="";
if(rs==true) {
if(sessionId.equals("admin")) {
System.out.println("관리자권한 회원탈퇴 Ok");
url="/memberListView.do";
} else {
System.out.println("회원탈퇴 Ok");
url="/index.do";
session.invalidate();
}
} else {
System.out.println("회원탈퇴 Fail");
url="/index.do";
}
request.setAttribute("url", url);
}
}
Commend에서는 관리자 권한으로 회원 탈퇴할 시 다시 회원목록 페이지로 이동하게 했고, 일반회원은 회원 탈퇴할 시 세션을 초기화하고 인덱스 페이지로 이동하게끔 했다.
[Controller]
package org.project.controller;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.project.commend.DeleteOkCommend;
import org.project.commend.ExcuteCommend;
import org.project.commend.JoinOkCommend;
import org.project.commend.LoginOkCommend;
import org.project.commend.LogoutCommend;
import org.project.commend.MemberViewCommend;
import org.project.commend.UpdateOkCommend;
@WebServlet("*.do")
public class Controller extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8"); //한글 인코딩(한글처리)
String path=request.getContextPath(); //프로젝트 path만 얻어온다.
// => /webProject_KM
String uri=request.getRequestURI(); //프로젝트와 파일경로까지 얻어온다.
// => /webProject_KM/index.do
String basicURL=uri.substring(path.length());
// => /index.do
System.out.println(basicURL);
ExcuteCommend commend=null;
String url="";
if(basicURL.equals("/index.do")) {
url="/index.jsp";
} else if(basicURL.equals("/loginView.do")) {
url="/loginView.jsp";
} else if(basicURL.equals("/joinView.do")) {
url="/joinView.jsp";
} else if(basicURL.equals("/joinOk.do")) {
commend=new JoinOkCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/loginOk.do")) {
commend=new LoginOkCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/logout.do")) {
commend=new LogoutCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/admin.do")) {
url="/admin.jsp";
} else if(basicURL.equals("/memberListView.do")) {
url="/memberListView.jsp";
} else if(basicURL.equals("/memberView.do")) {
commend=new MemberViewCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/updateOk.do")) {
commend=new UpdateOkCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/deleteOk.do")) {
commend=new DeleteOkCommend();
commend.excuteQueryCommend(request, response);
url=(String)request.getAttribute("url");
} else if(basicURL.equals("/memberDeleteView.do")) {
String userId=request.getParameter("userId");
request.setAttribute("userId", userId);
url="/memberDeleteView.jsp";
}
RequestDispatcher disp=request.getRequestDispatcher(url);
disp.forward(request, response); //해당 ViewPage로 포워딩
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
}
그리고 이게 최종적으로 완성된 프로젝트의 컨트롤러.
지금까진 구현된데 까지만 남겨놓고 지웠는데 마지막 회원탈퇴까지 구현해서 최종 컨트롤러는 요렇다.
이제 막 학원 다니면서 3개월 배우고 얼추 나름의 기능을 담은 첫 웹 프로젝트라 뿌듯하고 재밌었다!
이제 포트폴리오 준비해야하는데 뭘 만들어야할지 모르겠다 허엉....
'[개발 언어 & 프레임워크] > JSP' 카테고리의 다른 글
[JSP/Servlet] HttpServletRequest, HttpServletResponse 객체 이해하기 (0) | 2022.11.28 |
---|---|
[JSP] 4. WebProject(홈페이지 만들기) - 회원 상세 조회하기, 회원정보 수정하기 (0) | 2022.08.15 |
[JSP] 3. WebProject(홈페이지 만들기) - 회원목록 조회하기 (0) | 2022.08.15 |
[JSP] 2. WebProject(홈페이지 만들기) - 로그인 구현하기 (0) | 2022.08.11 |
[JSP] 1. WebProject(홈페이지 만들기) - 회원가입 구현하기 (0) | 2022.08.09 |