회원 정보 수정하고 회원 탈퇴 구현해보자
⚠️주의⚠️
이전 내용 구현 후 진행
https://yun000.tistory.com/222
로그인,로그아웃 구현
⚠️주의⚠️회원가입 구현 후 진행 가능https://yun000.tistory.com/219 회원 가입 구현MVC pattern으로 회원가입을 만들어보자 🍏구조project는 Dynamic Web Project생성.project이름은 FinalPrj로 했다. 🍏설정1
yun000.tistory.com
🍏구조
🍏 설정
JSTL세팅
https://yun000.tistory.com/229
JSTL사용 세팅
ApacheTomcat 홈페이지https://tomcat.apache.org/download-taglibs.cgi Apache Tomcat® - Apache Taglibs DownloadsWelcome to the Apache Taglibs download page. This page provides download links for obtaining the latest version of the Apache Standard Taglib
yun000.tistory.com
🍏코드
◆ MemberDAO.java
=deleteMember, updateMember추가
package com.example.myweb.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import com.example.myweb.model.MemberVO;
public class MemberDAO {
private DataSource ds;
public MemberDAO() {
try {
Context ctx = new InitialContext();
ds = (DataSource) ctx.lookup("java:comp/env/jdbc/Oracle");
} catch (Exception e) {
throw new RuntimeException("DataSource lookup failed: " + e.getMessage());
}
}
public void insert(MemberVO member) {
Connection con = null;
try {
con = ds.getConnection(); // DataSource에서 Connection 가져오기
String sql = "INSERT INTO member (userid, name, password, email, address) VALUES (?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, member.getUserid());
pstmt.setString(2, member.getName());
pstmt.setString(3, member.getPassword());
pstmt.setString(4, member.getEmail());
pstmt.setString(5, member.getAddress());
pstmt.executeUpdate();
} catch (Exception e) {
throw new RuntimeException("MemberDAO.insert() : " + e.getMessage());
} finally {
if (con != null) try { con.close(); } catch (Exception ignored) {}
}
}
public String getPassword(String userid)
{
String pw="";
Connection con=null;
try {
con=ds.getConnection();
String sql="SELECT password from member where userid=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1,userid);
ResultSet rs=pstmt.executeQuery();
//something exsists
if(rs.next()) {
pw=rs.getString("password");
}
else {
throw new SQLException("there is no such id");
}
} catch (Exception e) {
System.out.println(e.getMessage());
throw new RuntimeException(e);
}finally {
closeConnection(con);
}
return pw;
}
private void closeConnection(Connection con)
{
if(con!=null) {
try {con.close();}catch(Exception e){}
}
}
public MemberVO getMember(String userid) {
MemberVO member = new MemberVO();
Connection con = null;
try {
con = ds.getConnection();
String sql = "select * from member where userid=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, userid);
ResultSet rs = pstmt.executeQuery();
if(rs.next()) {
//조회한 결과(rs.getXxxx())를 member 객체에 setXxx 합니다.
member.setUserid(rs.getString("userid"));
member.setName(rs.getString("name"));
member.setPassword(rs.getString("password"));
member.setEmail(rs.getString("email"));
member.setAddress(rs.getString("address"));
}
else {throw new RuntimeException("no user");}
}
catch (Exception e) {
throw new RuntimeException("MemberDAO.getMember : " + e.getMessage());
}
finally{
closeConnection(con);
}
return member;
}
public void updateMember(MemberVO member)
{
Connection con = null;
try {
con = ds.getConnection(); // DataSource에서 Connection 가져오기
String sql = "UPDATE member SET name=?, password=?, email=?, address=? WHERE userid=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, member.getName());
pstmt.setString(2, member.getPassword());
pstmt.setString(3, member.getEmail());
pstmt.setString(4, member.getAddress());
pstmt.setString(5, member.getUserid());
//pstmt.executeUpdate();
int rowCount=pstmt.executeUpdate();
System.out.println(rowCount+"개 행이 변경");
if(rowCount<=0) {
throw new RuntimeException("변경된 행 없음");
}
} catch (Exception e) {
throw new RuntimeException("MemberDAO.insert() : " + e.getMessage());
} finally {
closeConnection(con);
}
}
public void deleteMember(String userid,String password)
{
Connection con=null;
try {
con=ds.getConnection();
String sql="DELETE FROM member WHERE userid=? AND password=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, userid);
pstmt.setString(2, password);
//pstmt.executeUpdate();
int rowCount=pstmt.executeUpdate();
if(rowCount<=0) {
throw new RuntimeException("wrong id or password");
}
} catch (Exception e) {
throw new RuntimeException("MemberDAO.delete() : " + e.getMessage());
} finally {
closeConnection(con);
}
}
}
◆ AuthFilter.java
=사용자 인증 구현
package com.example.myweb.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class AuthFilter implements Filter {
String encoding = "utf-8";
public void init(FilterConfig fConfig) throws ServletException {
encoding = fConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
request.setCharacterEncoding(encoding);
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
HttpSession session = req.getSession();
String userid = (String)session.getAttribute("userid");
if(userid==null) {
res.sendRedirect("/Login.do");
return;
}
CharUpperWrapper requestWrapper = new CharUpperWrapper(req);
chain.doFilter(requestWrapper, response);
}
public void destroy() {
}
}
◆ CharUpperWrapper.java
=얻은 파라미터를 대문자로 변경한다.
package com.example.myweb.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class CharUpperWrapper extends HttpServletRequestWrapper {
HttpServletRequest request;
public CharUpperWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
public String getParameter(String name) {
String value = request.getParameter(name);
return value.toUpperCase();
}
}
◆ MemberVO.java
package com.example.myweb.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data //Getter Setter
@NoArgsConstructor //기본 생성자
@AllArgsConstructor
public class MemberVO {
private String userid;
private String name;
private String password;
private String email;
private String address;
}
◆ MemberServlet.java
=회원 수정, 탈퇴 추가
package com.example.myweb.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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 javax.servlet.http.HttpSession;
import com.example.myweb.dao.MemberDAO;
import com.example.myweb.model.MemberVO;
@WebServlet("/member/Member.do")
public class MemberServlet extends HttpServlet
{
MemberDAO dao;
public void init(ServletConfig config) throws ServletException
{ dao = new MemberDAO(); }
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
request.setCharacterEncoding("utf-8");
String action=request.getParameter("action");
//회원 가입
if("insert".equals(action))
{
String userid = request.getParameter("userid"); //요청 파라미터 받아서
String name = request.getParameter("name");
String password = request.getParameter("password");
String email = request.getParameter("email");
String address = request.getParameter("address");
MemberVO member = new MemberVO(userid,name,password,email,address);
response.setContentType("text/html;charset=utf-8");
try {
//insert informations
dao.insert(member);
response.sendRedirect("/Login.do");
}
catch(Exception e) {
throw new RuntimeException(e);
}
}
//회원 수정
else if("update".equals(action))
{
String userid = (String)request.getSession().getAttribute("userid");
String name = request.getParameter("name");
String password = request.getParameter("password");
String email = request.getParameter("email");
String address = request.getParameter("address");
if(userid==null) {
throw new RuntimeException("로그인한 사용자 없습니다");
}else {
MemberVO member=new MemberVO(userid,name,password,email,address);
dao.updateMember(member);
response.sendRedirect("/member/Member.do?action=select");
}
}
//회원 탈퇴
else if("delete".equals(action))
{
String userid = (String)request.getSession().getAttribute("userid");
String password = request.getParameter("password");
String view="index.jsp";
if(userid==null) {
throw new RuntimeException("로그인한 사용자 없습니다");
}
else
{
try {
String dbpw=dao.getPassword(userid);
if(dbpw.contentEquals(password)){
//correct password
dao.deleteMember(userid,password);
MemberVO member=new MemberVO();
}
else {
//wrong password
throw new RuntimeException("wrong password! 회원 탈퇴 불가");
}
}
catch (RuntimeException e) {
request.setAttribute("message", e.getMessage());
view="loginerror.jsp";
}
RequestDispatcher disp=request.getRequestDispatcher("/WEB-INF/views/"+view);
disp.forward(request, response);
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String action =request.getParameter("action");
HttpSession session=request.getSession();
String view="/index.jsp";
//회원가입
if("insert".equals(action) || action==null) {
request.setAttribute("action", "insert");
view="/member/memberform.jsp";
}
//회원 수정
else if("select".equals(action)) {
String userid=(String)session.getAttribute("userid");
if(userid==null){
request.setAttribute("message", "로그인하지 않은 사용자");
view="/loginform.jsp";
}
else {
MemberVO member=dao.getMember(userid);
request.setAttribute("member", member);
request.setAttribute("action", "update");
view="/member/memberform.jsp";
}
}
//회원 탈퇴
else if("delete".equals(action)) {
String userid=(String)request.getSession().getAttribute("userid");
if(userid==null){
request.setAttribute("message", "로그인하지 않은 사용자");
view="/loginform.jsp";
}
else {
request.setAttribute("action", "delete");
view="/deleteform.jsp";
}
}
RequestDispatcher disp=request.getRequestDispatcher("/WEB-INF/views"+view);
disp.forward(request, response);
}
}
◆sample.jsp
=인증된 사용자만 볼 수 있는 페이지
<%@ page contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>로그인 사용자만 볼 수 있습니다.</h1>
${param.name}
</body>
</html>
◆ runtime.jsp
=runtime exception 발생할 때 다듬어진 화면을 사용자가 볼 수 있게 해준다
<%@ page language="java" contentType="text/html; charset=UTF-8"
isErrorPage="true"
pageEncoding="UTF-8"%>
<%
response.setStatus(200);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ERROR</title>
</head>
<body>
<h1><%=exception.getMessage() %></h1> <!-- exception발생했을 때만 생견단다 -->
<h2>runtime exception</h2>
<pre>
<%
exception.printStackTrace(new java.io.PrintWriter(out));
%>
</pre>
</body>
</html>
◆ memberform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보</title>
</head>
<body>
<h1>회원 정보 입력 폼</h1>
<form action="/member/Member.do" method="post">
<fieldset>
<legend>회원정보</legend>
<table>
<tr>
<td class="label">아이디</td>
<td class="field"><input type="text" name="userid" value="${member.userid}" ${empty member.userid ? "": "readonly" }></td>
</tr>
<tr>
<td class="label">비밀번호</td>
<td class="field"><input type="password" name="password" value="${member.password}"></td>
</tr>
<tr>
<td class="label">이름</td>
<td class="field"><input type="text" name="name" value="${member.name}"></td>
</tr>
<tr>
<td class="label">이메일</td>
<td class="field"><input type="text" name="email" value="${member.email}"></td>
</tr>
<tr>
<td class="label">주소</td>
<td class="field"><input type="text" name="address" size="50" value="${member.address}"></td>
</tr>
</table>
<input type="hidden" name="action" value="${action}">
<input type="submit" value=" save ">
<input type="reset" value=" reset ">
</fieldset>
</form>
</body>
</html>
◆ deleteform.jsp
=회원탈퇴 시 아이디와 비밀번호를 한 번 더 입력할 것이다
이 정보가 맞아야 회원 탈퇴가 가능하다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원 탈퇴</h1>
<form action="/member/Member.do" method="post">
<fieldset>
<legend>회원정보</legend>
<table>
<tr>
<td class="label">아이디</td>
<td class="field"><input type="text" name="userid" value="${member.userid}"></td>
</tr>
<tr>
<td class="label">비밀번호</td>
<td class="field"><input type="password" name="password" value="${member.password}"></td>
</tr>
</table>
<input type="hidden" name="action" value="${action}">
<input type="submit" value=" 탈퇴 ">
<input type="reset" value=" reset ">
</fieldset>
</form>
</body>
</html>
◆ index.jsp
<%@ page contentType="text/html; charset=UTF-8"
import="java.util.Date,
java.util.Random,
java.util.Enumeration"
%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Welcome page</title>
</head>
<body>
<%@ include file="header.jsp" %>
<a href="<c:url value='/Login.do'/>">로그인</a>
<c:url value="/member/Member.do" var="insert" scope="page"/>
<a href="${insert}">회원가입</a>
<a href="/member/Member.do?action=select">회원정보 수정</a>
<a href="/member/Member.do?action=delete">회원정보 삭제</a>
<br><br>
<%
out.println(new Date() + "<br>");
out.println(new Random().nextInt());
%><br>
RemoteAddr: <%= request.getRemoteAddr() %><br>
URI: <%= request.getRequestURI() %><br>
URL: <%= request.getRequestURL() %><br>
<c:forEach var="i" begin="0" end="10">
${i}
</c:forEach>
<jsp:include page="footer.jsp"/>
<%-- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:import url="https://www.naver.com"/> --%>
</body>
</html>
◆ web.xml
=AuthFilter을 추가했다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>FinalPrj</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- /////////////////////////////////////////////////////////////////// -->
<servlet>
<servlet-name>MemberServlet</servlet-name>
<servlet-class>com.example.myweb.web.MemberServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MemberServlet</servlet-name>
<url-pattern>/servlet/com.example.myweb.web.MemberServlet</url-pattern>
</servlet-mapping>
<!-- /////////////////////////////////////////////////////////////////// -->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.example.myweb.web.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlet/com.example.myweb.web.LoginServlet</url-pattern>
</servlet-mapping>
<!-- /////////////////////////////////////////////////////////////////// -->
<error-page>
<error-code>404</error-code>
<location>/WEB-INF/views/error/404.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/WEB-INF/views/error/runtime.jsp</location>
</error-page>
<!-- /////////////////////////////////////////////////////////////////// -->
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.example.myweb.filter.AuthFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/auth/*</url-pattern>
</filter-mapping>
</web-app>
🍏결과
▶ 로그인 후 회원 정보 업데이트 가능
▶ 회원 로그인 상태에서 탈퇴
URI정리
기능 | URI | Method | view |
회원정보입력 | /member/Member.do?action=insert | GET | /member/memberform.jsp |
회원정보입력 | /member/Member.do?action=insert | POST | redirect/index.jsp |
회원정보조회 | /member/Member.do?action=select | GET | /member/memberform.jsp |
회원정보수정 | /member/Member.do?action=update | POST | redirect/member/Member.do?action=select |
회원정보삭제 | /member/Member.do?action=delete | GET | /member/deleteform.jsp |
회원정보삭제 | /member/Member.do?action=delete | POST | redirect/index.jsp |