[JSP] 로그인 화면 분석 ④ (쿠키 적용, 로그아웃, nav 자동변경)
** log4j 관련 파일 ** WEB-INF > conf > log4j 자동으로 log 파일이 만들어진다. **로그 관련 파일 ** web.xml (복붙) log4j가 어디있다 알려주면서 한글 깨지는 문제 처리 해주는 부분 **HttpE..
practice365.xyz
이어서 . . .
지금까지는 로그인과 회원가입까지 성공을 했다.
이번엔 회원정보수정 페이지에서 수정 버튼을 눌렀을 때
제대로 값을 입력했는지 처리하는 걸 만들거다.
<userUpdateForm.jsp>
- 제이쿼리문 작성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.icia.common.util.StringUtil" %>
<%@ page import="com.icia.web.util.CookieUtil" %>
<%@ page import="com.icia.web.util.HttpUtil" %>
<%@ page import="com.icia.web.dao.UserDao" %>
<%@ page import="com.icia.web.model.User" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<%
//로그
Logger logger = LogManager.getLogger("/user/userUpdateForm.jsp");
HttpUtil.requestLogString(request, logger);
User user = null;
String cookieUserId = CookieUtil.getValue(request, "USER_ID"); //쿠키 정보
//비어있지 않으면 로그인 돼 있으면
if(!StringUtil.isEmpty(cookieUserId))
{
//쿠키 정보가 있다면
logger.debug("cookieUserId : " + cookieUserId);
UserDao userDao = new UserDao();
user = userDao.userSelect(cookieUserId); //정보를 이렇게 넘김
//DB에 없는 정상사용자가 아님
if(user == null)
{
//정상 사용자가 아니라면 쿠키를 삭제하고 로그인 페이지로 이동
CookieUtil.deleteCookie(request, response, "USER_ID");
response.sendRedirect("/"); //index 페이지로 이동
}
else
{
if(!StringUtil.equals(user.getStatus(), "Y"))
{
//정지된 사용자인경우
CookieUtil.deleteCookie(request, response, "USER_ID");
user = null;
response.sendRedirect("/");
}
}
}
if(user != null)
{
//user가 null과 같지 않을 때
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
<script>
$(document).ready(function(){
$("#btnUpdate").on("click", function(){
//모든 공백체크 정규식
var emptCheck = /\s/g;
//영문 대소문자, 숫자로만 이루어진 4~12자리 정규식
var idPwCheck = /^[a-zA-Z0-9]{4,12}$/;
if($.trim($("#userPwd1").val()).length <= 0)
{
alert("비밀번호를 입력하세요.");
$("#userPwd1").val("");
$("#userPwd1").focus();
return;
}
if(emptCheck.test($("#userPwd1").val()))
{
alert("비밀번호는 공백을 포함할 수 없습니다.");
$("#userPwd1").focus();
return;
}
if(!idPwCheck.test($("#userPwd1").val()))
{
alert("비밀번호는 영문 대소문자와 숫자로 4~12자리 입니다.");
$('#userPwd1').focus();
return;
}
if($("#userPwd1").val() != $("#userPwd2").val())
{
alert("비밀번호가 일치하지 않습니다.");
$("#userPwd2").focus();
return;
}
if($.trim($("#userName").val()).length <= 0)
{
alert("사용자 이름은 입력하세요.");
$("#userName").val("");
$("#userName").focus();
return;
}
if(!fn_validateEmail($("#userEmail").val()))
{
alert("사용자 이메일 형식이 올바르지 않습니다.");
$("#userEmail").focus();
return;
}
//hidden
$("#userPwd").val($("#userPwd1").val());
//form
document.updateForm.submit();
});
});
function fn_validateEmail(value)
{
var emailReg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/;
return emailReg.test(value);
}
</script>
</head>
<body>
<%@ include file="/include/navigation.jsp" %>
<div class="container">
<div class="row mt-5">
<h1>회원정보수정</h1>
</div>
<div class="row mt-2">
<div class="col-12">
<form name="updateForm" id="updateForm" action="/user/userProc.jsp" method="post">
<div class="form-group">
<label for="username">사용자 아이디</label>
<!-- 하드코딩에서 넣어준다 -->
<%=user.getUserId()%>
<!-- user객체의 get으로 갖고온다. -->
</div>
<div class="form-group">
<label for="username">비밀번호</label>
<input type="password" class="form-control" id="userPwd1" name="userPwd1" value="<%=user.getUserPwd()%>" placeholder="비밀번호" maxlength="12" />
</div>
<div class="form-group">
<label for="username">비밀번호 확인</label>
<input type="password" class="form-control" id="userPwd2" name="userPwd2" value="<%=user.getUserPwd()%>" placeholder="비밀번호 확인" maxlength="12" />
</div>
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" id="userName" name="userName" value="<%=user.getUserName()%>" placeholder="사용자 이름" maxlength="15" />
</div>
<div class="form-group">
<label for="username">사용자 이메일</label>
<input type="text" class="form-control" id="userEmail" name="userEmail" value="<%=user.getUserEmail()%>" placeholder="사용자 이메일" maxlength="30" />
</div>
<input type="hidden" id="userId" name="userId" value="<%=user.getUserId()%>" />
<input type="hidden" id="userPwd" name="userPwd" value="" />
<button type="button" id="btnUpdate" class="btn btn-primary">수정</button>
</form>
</div>
</div>
</div>
</body>
</html>
<%
}
%>
<UserDao.java>
- SQL 쿼리문 작성 및 복사
- userUpdate()메소드 작성하면서 붙여넣기
package com.icia.web.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.icia.web.db.DBManager;
import com.icia.web.model.User;
public class UserDao
{
private static Logger logger = LogManager.getLogger(UserDao.class);
public UserDao()
{
}
//사용자 id 체크
public int userIdSelectCount(String userId)
{
int count = 0;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sql = new StringBuilder();
//쿼리문 넣어야함
sql.append("SELECT COUNT(USER_ID) AS CNT "); //반드시 띄어쓰기
sql.append(" FROM TBL_USER ");
sql.append(" WHERE USER_ID = ? ");
try
{
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, userId); //0부터 아님
rs = pstmt.executeQuery();
if(rs.next()) //next() 첫번째 레코드값을 읽어 온다.
{
count = rs.getInt("CNT");
}
}
catch(Exception e)
{
logger.error("[UserDao] userIdSelectCount Exception", e);
//log4j를 이용한 출력
}
finally
{
DBManager.close(rs, pstmt, conn);
}
return count;
}
//사용자 조회
public User userSelect(String userId)
//객체 하나만 넘어가는 거임
//모델 클릭
{
User user = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
sql.append(" USER_ID, ");
sql.append(" NVL(USER_PWD, '') AS USER_PWD, ");
sql.append(" NVL(USER_NAME, '') AS USER_NAME, ");
sql.append(" NVL(USER_EMAIL, '') AS USER_EMAIL, ");
sql.append(" NVL(STATUS, '') AS STATUS, ");
sql.append(" NVL(TO_CHAR(REG_DATE, 'YYYY.MM.DD HH24:MI:SS'), '') AS REG_DATE ");
sql.append(" FROM ");
sql.append(" TBL_USER ");
sql.append(" WHERE USER_ID = ? ");
try
{
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, userId); //0부터 아님
rs = pstmt.executeQuery();
if(rs.next()) //next() 첫번째 레코드값을 읽어 온다.
{
user = new User();
user.setUserId(rs.getString("USER_ID")); //세터메소드를 이용해서 하나씩 넣어줌
user.setUserPwd(rs.getString("USER_PWD"));
user.setUserName(rs.getString("USER_NAME"));
user.setUserEmail(rs.getString("USER_EMAIL"));
user.setStatus(rs.getString("STATUS"));
user.setRegDate(rs.getString("REG_DATE"));
}
}
catch(Exception e)
{
logger.error("[UserDao] userIdSelectCount Exception", e);
}
finally
{
DBManager.close(rs, pstmt, conn);
}
return user;
}
//회원정보 삽입
public int userInsert(User user)
//리턴타입 건수(count)라서 int로 처리
//매개변수를 아이디, 비번, 이메일 등으로 받으려면 User 객체로 전달 받야한다.
{
int count = 0;
//pstmt 날리고 나서 리턴타입을 카운트로 받을 거임
Connection conn = null;
PreparedStatement pstmt = null;
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO TBL_USER ");
sql.append(" (USER_ID, USER_PWD, USER_NAME, USER_EMAIL, STATUS, REG_DATE ) ");
sql.append("VALUES (?, ?, ?, ?, ?, SYSDATE) ");
//SQL Developer에서 그대로 복사해와서 사용
//의무적으로 맨 끝에는 띄어쓰기를 해야한다.
//SYSDATE 오라클에 있는 값을 넣어야하기 때문에 냅둠
try
{
int idx = 0;
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql.toString());
//pstmt.setString(4, "Y"); //이렇게 넣어 줄 수도 있음
//rs 없으니까 끝~
pstmt.setString(++idx, user.getUserId());
//위에서 0을 설정함 1부터 시작을 해야 돼서 전치 증가 연산자
pstmt.setString(++idx, user.getUserPwd());
pstmt.setString(++idx, user.getUserName());
pstmt.setString(++idx, user.getUserEmail());
pstmt.setString(++idx, user.getStatus());
//Y로 바로 넣을 수 있음
//idx가 아니라 하드 코딩으로 숫자를 넣었다면
//위치가 변경될 때마다 내가 바꿔줘야하는 번거로움이 있다.
count = pstmt.executeUpdate();
}
catch(Exception e)
{
logger.error("[UserDao] userInsert Exception", e);
}
finally
{
DBManager.close(pstmt, conn);
}
return count;
}
//사용자 정보 수정
public int userUpdate(User user)
{
int count = 0;
Connection conn = null;
PreparedStatement pstmt = null;
StringBuilder sql = new StringBuilder();
sql.append("UPDATE TBL_USER ");
sql.append(" SET USER_PWD = ?, ");
sql.append(" USER_NAME = ?, ");
sql.append(" USER_EMAIL = ? ");
sql.append(" WHERE USER_ID = ? ");
//인수처리가 가능하니까 물음표
try
{
int idx = 0; //추가될 수 있으니까
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(++idx, user.getUserPwd());
pstmt.setString(++idx, user.getUserName());
pstmt.setString(++idx, user.getUserEmail());
pstmt.setString(++idx, user.getUserId());
count = pstmt.executeUpdate(); //Update
}
catch(Exception e)
{
logger.error("[UserDao] userUpdate SQLException", e);
}
finally
{
DBManager.close(pstmt, conn);
//두 개만 넘김
}
return count;
}
}
<userProc.jsp>
- 회원 정보 등록 / 회원 정보 수정 같이 사용한다.
String cookieUserId = CookieUtil.getValue(request, "USER_ID");
//CookieUtil, 용도 2 (회원 가입, 회원 정보 수정)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.icia.common.util.StringUtil" %>
<%@ page import="com.icia.web.util.CookieUtil" %>
<%@ page import="com.icia.web.util.HttpUtil" %>
<%@ page import="com.icia.web.dao.UserDao" %>
<%@ page import="com.icia.web.model.User" %>
<%@ page import="org.apache.logging.log4j.LogManager" %>
<%@ page import="org.apache.logging.log4j.Logger" %>
<%
//로그
Logger logger = LogManager.getLogger("/user/userIdCheckAjax.jsp");
HttpUtil.requestLogString(request, logger);
String redirectUrl = "";
String msg = "";
String userId = HttpUtil.get(request, "userId");
String userPwd = HttpUtil.get(request, "userPwd");
String userName = HttpUtil.get(request, "userName");
String userEmail = HttpUtil.get(request, "userEmail");
String cookieUserId = CookieUtil.getValue(request, "USER_ID");
//CookieUtil, 용도 2 (회원 가입, 회원 정보 수정)
UserDao userDao = new UserDao();
//쿠키값 비어있을 때 처리
if(StringUtil.isEmpty(cookieUserId))
{
//회원 가입
if(!StringUtil.isEmpty(userId) && !StringUtil.isEmpty(userPwd) &&
!StringUtil.isEmpty(userName) && !StringUtil.isEmpty(userEmail))
{
if(userDao.userIdSelectCount(userId) > 0)
{
//중복아이디 존재
msg = "사용자 아이디가 존재 합니다.";
redirectUrl = "/user/userRegForm";
}
else
{
//회원 가입
User user = new User();
user.setUserId(userId);
user.setUserPwd(userPwd);
user.setUserName(userName);
user.setUserEmail(userEmail);
user.setStatus("Y");
if(userDao.userInsert(user) > 0)
{
msg = "회원가입이 완료 되었습니다.";
redirectUrl = "/";
}
else
{
msg = "회원가입중 오류가 발생했습니다.";
redirectUrl = "/user/userRegForm.jsp";
}
}
}
else
{
msg = "회원가입 중 입력값이 잘 못 되었습니다.";
redirectUrl = "/user/userRegForm.jsp";
}
}
else
{ //값이 비어있지 않으면
//회원 정보 수정
User user = userDao.userSelect(cookieUserId);
//받아 놓은 쿠키 아이디
//해당 아이디가 갖고 있는 레코드를 user 객체가 가지고 있음
if(user != null)
{
//user.getUserId()값이랑 파라미터 값이랑 같냐?
if(StringUtil.equals(user.getUserId(), userId) &&
StringUtil.equals(user.getStatus(), "Y"))
{
if(!StringUtil.isEmpty(userId) && !StringUtil.isEmpty(userPwd) &&
!StringUtil.isEmpty(userName) && !StringUtil.isEmpty(userEmail))
{
//값이 넘어 왔는지 확인
//정상적일 때
//리퀘스트를 이용해서 넘어 온 값으로 대체를 해줘야함
user.setUserPwd(userPwd);
user.setUserName(userName);
user.setUserEmail(userEmail);
//Id가 없는 이유는 바꿀 필요 없으니까
//원래는 DB의 정보와 바뀐 정보와 다를 때 수정이 되도록 해야하는데
//지금 이 코드는 아무런 값이 바뀌지 않아도 수정이 되도록 구동이 된다.
//user.로 돼 있는 것은 기존에 있던 회원정보임
if(userDao.userUpdate(user) > 0)
{
//정상처리
msg = "회원정보가 수정되었습니다.";
redirectUrl = "/user/userUpdateForm.jsp";
}
else
{
msg = "회원 정보 수정중 오류가 발생하였습니다.";
redirectUrl = "/user/userUpdateForm.jsp";
}
}
else
{
msg = "회원 정보 중 값이 올바르지 않습니다.";
redirectUrl = "/user/userUpdateForm.jsp";
}
}
else
{
CookieUtil.deleteCookie(request, response, "USER_ID");
msg = "올바른 사용자가 아닙니다.";
redirectUrl = "/";
//아래에서 그대로 복사
}
}
else
{
CookieUtil.deleteCookie(request, response, "USER_ID");
msg = "올바른 사용자가 아닙니다.";
redirectUrl = "/"; //로그인페이지
}
}
%>
<!DOCTYPE html>
<html>
<head>
<%@ include file="/include/head.jsp" %>
<script type="text/javascript">
$(document).ready(function() {
alert("<%=msg%>");
location.href = "<%=redirectUrl%>";
});
</script>
</head>
<body>
</body>
</html>
수정 버튼을 누르면 회원정보가 수정 되면서 SQL 테이블에 담겨 있는 회원정보도 수정이 된다.
'개발일지 > JSP' 카테고리의 다른 글
[JSP] 게시판 구성(게시판 조회 LOWNUM) (0) | 2021.12.02 |
---|---|
[JSP] 게시판 구성하기 (feat.시퀀스쿼리) (0) | 2021.12.01 |
[JSP] 로그인 화면 분석 ④ (쿠키 적용, 로그아웃, nav 자동변경) (0) | 2021.11.29 |
[JSP] 로그인 화면 분석하기③ (0) | 2021.11.29 |
[JSP] 쿠키(Cookie) (0) | 2021.11.29 |