JSP_basic. SQL DB와 연동한 로그인 페이지를 수정해보자 (pstmt, session을 이용한 DELETE, UPDATE)
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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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();
와 같이 선언해주면 됩니다.
일단은 여기까지 입니다..
Author And Source
이 문제에 관하여(JSP_basic. SQL DB와 연동한 로그인 페이지를 수정해보자 (pstmt, session을 이용한 DELETE, UPDATE)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nugoory20/JSPbasic.-SQL-DB와-연동한-로그인-페이지를-수정해보자-pstmt-session을-이용한-DELETE-UPDATE저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)