DELETE 쿼리문을 JSP로 작성하기
INSERT를 해보았으니 DELETE와 UPDATE도 어려운 일이 아니게 되었습니다.
DELETE 로직을 먼저 수행해보겠습니다.
먼저 userDeleteForm.jsp를 생성하고 작성합니다.
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
String uId = (String)session.getAttribute("s_id");
String uPw = (String)session.getAttribute("s_pw");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<row>
<div class = "col-sm-6">
<p><strong><%=uId%>님 정말 회원탈퇴하시겠습니까? 비밀번호를 확인해주세요.</strong></p>
<form action="userDelete.jsp" method="post">
<input type="password" name="uPw" placeholder="비밀번호를 다시 입력해주세요." class="form-control form-control-lg">
<input type="submit" value="확인" class="btn btn-primary mb-3">
<a href="loginWelcome.jsp">뒤로가기</a>
</form>
</div>
</row>
</body>
</html>
비밀번호를 입력받으면 해당 데이터를 userDelete.jsp로 post 방식으로 전송할 것 입니다.
사용자가 입력한 비밀번호는 name="uPw"로 전송됩니다.
userDelete.jsp는 session을 이용해 다른 사용자가 이 페이지에 접근하지 못하도록 차단하고, 사용자가 입력한 비밀번호와 session에 저장된 비밀번호를 비교할 것 입니다.
아래는 그 전문입니다.
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%
request.setCharacterEncoding("UTF-8");
String uId = (String)session.getAttribute("s_id");
String sPw = (String)session.getAttribute("s_pw");
String uPw = request.getParameter("uPw");
if (uId != null) {
response.sendRedirect("userLoginForm.jsp");
}
String dbType = "com.mysql.cj.jdbc.Driver";
String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
String connectId = "root";
String connectPw = "mysql";
try {
Class.forName(dbType);
Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);
String sql = "DELETE FROM userinfo where user_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt = con.prepareStatement(sql);
if (sPw.equals(uPw)){
pstmt.setString(1, uId);
pstmt.executeUpdate();
session.invalidate();
response.sendRedirect("userLoginForm.jsp");
} else {
System.out.println("비밀번호가 일치하지 않습니다.");
response.sendRedirect("userDeleteForm.jsp");
}
} catch(Exception e){
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
먼저 필요한 데이터들을 미리 선언해둡니다.
request.setCharacterEncoding("UTF-8");
String uId = (String)session.getAttribute("s_id");
String sPw = (String)session.getAttribute("s_pw");
String uPw = request.getParameter("uPw");
이후엔 세션을 발급받지 않은 사용자를 로그인 창으로 돌려보냅니다.
if (uId != null) {
response.sendRedirect("userLoginForm.jsp");
}
이후 pstmt를 준비하고 try~catch 문 안에 필요한 쿼리문을 작성합니다.
String dbType = "com.mysql.cj.jdbc.Driver";
String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?serverTimezone=UTC";
String connectId = "root";
String connectPw = "mysql";
try {
Class.forName(dbType);
Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);
String sql = "DELETE FROM userinfo where user_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt = con.prepareStatement(sql);
if (sPw.equals(uPw)){
pstmt.setString(1, uId);
pstmt.executeUpdate();
session.invalidate();
response.sendRedirect("userLoginForm.jsp");
} else {
System.out.println("비밀번호가 일치하지 않습니다.");
response.sendRedirect("userDeleteForm.jsp");
}
} catch(Exception e){
e.printStackTrace();
}
session을 통해 변수들을 비교하여 if ~ else문에 대입하였습니다.
만약 session의 패스워드와 입력받은 패스워드가 동일하면 유저는 삭제될 것 입니다.
UPDATE문을 수행하는 jsp파일도 만들어보겠습니다.
먼저 userUpdateForm.jsp를 작성합니다.
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.ResultSet"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 회원 수정페이지는
// 비번, 이름, 이메일을 수정할 수 있는 페이지입니다.
// 이름, 이메일은 이미 내가 가입했던 정보가 채워져야합니다.
request.setCharacterEncoding("UTF-8");
String uId = (String)session.getAttribute("s_id");
if (uId == null) {
response.sendRedirect("userLoginForm.jsp");
}
String dbType = "com.mysql.cj.jdbc.Driver";
String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?severTimezone=UTC";
String connectId = "root";
String connectPw = "mysql";
ResultSet rs = null;
try {
Class.forName(dbType);
Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);
String sql = "SELECT * FROM userinfo WHERE user_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, uId);
rs = pstmt.executeQuery();
if(rs.next()){
rs.getString(1);
rs.getString(2);
rs.getString(3);
rs.getString(4);
}
} catch(Exception e){
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<row>
<div class="col=sm=6">
<% %>
<p><strong><%=rs.getString(1)%> 회원님, 정보 수정을 하시겠습니까?</strong></p><br/>
</div>
</row>
<row>
<div class="col-sm-6">
<form action="userUpdateCheck.jsp" method="post">
<input type="hidden" name="userId" value = "<%=rs.getString(1) %>">
비밀번호 : <input type="password" name="userPw" placeholder="수정할 비밀번호를 입력해주세요." class="form-control form-control-lg">
이름 : <input type="text" name="userName" placeholder="수정할 이름을 입력해주세요." value = "<%= rs.getString(3) %>" class="form-control form-control-lg">
이메일 : <input type="text" name="userMail" value ="<%=rs.getString(4) %>"placeholder="수정할 이메일을 입력해주세요." class="form-control form-control-lg">
<input type="submit" value="수정하기" class="btn btn-primary mb-3">
<a href="userLoginForm.jsp">뒤로가기</a>
</form>
</div>
</row>
</body>
</html>
여기서도 동일하게
if (uId == null) {
response.sendRedirect("userLoginForm.jsp");
}
를 이용해 session 체크를 먼저했습니다.
이후엔 rs.getString으로 사용자의 정보를 모두 불러왔습니다.
중요한 body 태그의 form에서 사용자가 입력하는 정보들을 취합할 것 입니다.
<body>
<row>
<div class="col=sm=6">
<% %>
<p><strong><%=rs.getString(1)%> 회원님, 정보 수정을 하시겠습니까?</strong></p><br/>
</div>
</row>
<row>
<div class="col-sm-6">
<form action="userUpdateCheck.jsp" method="post">
<input type="hidden" name="userId" value = "<%=rs.getString(1) %>">
비밀번호 : <input type="password" name="userPw" placeholder="수정할 비밀번호를 입력해주세요." class="form-control form-control-lg">
이름 : <input type="text" name="userName" placeholder="수정할 이름을 입력해주세요." value = "<%= rs.getString(3) %>" class="form-control form-control-lg">
이메일 : <input type="text" name="userMail" value ="<%=rs.getString(4) %>"placeholder="수정할 이메일을 입력해주세요." class="form-control form-control-lg">
<input type="submit" value="수정하기" class="btn btn-primary mb-3">
<a href="userLoginForm.jsp">뒤로가기</a>
</form>
</div>
</row>
</body>
session을 통해 사용자의 id를 넘겨받을 수도 있지만
이번엔
<input type="hidden" name="userId" value = "<%=rs.getString(1) %>"
라고 작성한 대로 hidden 타입을 이용해서 id 변수를 post했습니다.
그럼 userUpdateForm.jsp의 목적지인 userUpdateCheck.jsp를 작성해보겠습니다.
수행할 로직은 update도 비슷합니다.
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<%
request.setCharacterEncoding("UTF-8");
String uId = request.getParameter("userId");
if (uId == null) {
response.sendRedirect("userLoginForm.jsp");
}
String updatePw = request.getParameter("userPw");
String updateName = request.getParameter("userName");
String updateMail = request.getParameter("userMail");
String dbType = "com.mysql.cj.jdbc.Driver";
String connectUrl = "jdbc:mysql://localhost:3306/jdbcprac2?severTimezone=UTC";
String connectId = "root";
String connectPw = "mysql";
try {
Class.forName(dbType);
Connection con = DriverManager.getConnection(connectUrl, connectId, connectPw);
String sql = "UPDATE userinfo SET user_pw = ?, user_name = ?, email = ? WHERE user_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, updatePw);
pstmt.setString(2, updateName);
pstmt.setString(3, updateMail);
pstmt.setString(4, uId);
pstmt.executeUpdate();
} catch(Exception e){
e.printStackTrace();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<row>
<div class="col-sm-6">
<p><strong><%= uId %>님의 회원정보가 수정완료되었습니다.</strong></p>
<a href="loginWelcome.jsp">홈페이지로</a>
</div>
</row>
</body>
</html>
먼저 setCharacterEncoding과
session 체크는 항상 따라옵니다.
request.setCharacterEncoding("UTF-8");
String uId = request.getParameter("userId");
if (uId == null) {
response.sendRedirect("userLoginForm.jsp");
}
update할 변수들도 받아둡니다.
String updatePw = request.getParameter("userPw");
String updateName = request.getParameter("userName");
String updateMail = request.getParameter("userMail");
이후엔 try~catch문 안에 pstmt를 준비하고
String sql = "UPDATE userinfo SET user_pw = ?, user_name = ?, email = ? WHERE user_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, updatePw);
pstmt.setString(2, updateName);
pstmt.setString(3, updateMail);
pstmt.setString(4, uId);
pstmt.executeUpdate();
와 같이 선언해주면 됩니다.
일단은 여기까지 입니다..