본문 바로가기
JSP

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(12) - 회원정보 수정하기

by 김마리님 2020. 6. 10.

이전 게시글은 여기 >>

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(11) - DTO(Data Transfer Object)를 이용한 블로그 수정과 삭제 만들기

 

Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(11) - DTO(Data Transfer Object)를 이용한 블로그 수정��

이전 게시글은 여기 >> Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(10) - DTO(Data Transfer Object)를 이용한 블로그 상세보기 만들기 > Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(9) - Lucy..

itstudy-mary.tistory.com

 

(여기까지 멀쩡하게 했으면 회원수정 못하면 바보지)

 

어떻게 하면 될까요?

1. 회원수정 버튼 누르기

2. 회원수정 화면 띄우기(이 때 텍스트 입력창에 텍스트를 띄워주세요)

3. 완료 버튼 누르기

4. 데이터베이스에 입력한 값으로 업데이트 된 후 홈 화면으로 돌아가기.

 

그럼 라우터부터 만들어봅시다.

 

- UserController. java의 라우터 메소드

	public Action router(String cmd) {
		if(cmd.equals("join")) {
			return new UsersJoinAction();
		}else if(cmd.equals("joinProc")) {
			//회원가입 진행 후 -> index.jsp 이동
			return new UsersJoinProcAction();
		}else if(cmd.equals("update")) {
			return new UsersUpdateAction();
			//회원 수정 페이지 이동(세션에 user object를 가지고 있을 예정)
		}else if(cmd.equals("updateProc")) {
			//회원 수정 진행 -> index 이동
			return new UsersUpdateProcAction();
		}else if(cmd.equals("delete")) {
			//회원 삭제 진행 후 -> 로그아웃 -> index.jsp
		}else if(cmd.equals("login")) {
			//회원 로그인 페이지로 이동
			return new UsersLoginAction();
		}else if(cmd.equals("loginProc")) {
			return new UsersLoginProcAction();
			//로그인 수행 -> 세션 등록 -> index.jsp
		}else if(cmd.equals("logout")) {
			return new UsersLogoutAction();
			//로그아웃 수행 -> index.jsp
		}else if(cmd.equals("usernameCheck")) {
			return new UsersUsernameCheckAction();
			//아이디와 일치하는 이름이 있는지, 수행 -> index.jsp
		}
		return null;
	}

 

수정페이지로 넘어가려면 로그인할 때 세션에 (비밀번호 빼고)넣었던 user Object 를 가지고 화면에 뿌릴 것이다.

따라서, 데이터베이스를 거쳐가지 않기 때문에 액션이 간단간단합니다.

 

- UsersUpdateAction.java

package com.cos.blog.action.user;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cos.blog.action.Action;

public class UsersUpdateAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher dis=request.getRequestDispatcher("user/update.jsp");
		dis.forward(request, response);
		
	}
}

 

수정창을 구현합니다.

 

-update.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ include file="../include/nav.jsp"%>


<div class="container">
	<form action="/blog/user?cmd=updateProc" method="POST" class="was-validated">

		<div class="form-group">
			<label for="username">Username:</label>
			<input value="${sessionScope.principal.username}" type="text" class="form-control" id="username"
				placeholder="Enter username" name="username" required readonly>
			<div class="valid-feedback">Valid.</div>
			<div class="invalid-feedback">Please fill out this field.</div>

		</div>
		
		<div class="form-group">
			<label for="pwd">Password:</label> 
			<input type="password" class="form-control" id="password" placeholder="Enter password" name="password" required>
			<div class="valid-feedback">Valid.</div>
			<div class="invalid-feedback">Please fill out this field.</div>
		</div>

		<div class="form-group">
			<label for="email">Email:</label> <input value="${sessionScope.principal.email}" type="email" class="form-control" id="email" placeholder="Enter Email" name="email" required>
			<div class="valid-feedback">Valid.</div>
			<div class="invalid-feedback">Please fill out this field.</div>
		</div>

		<div class="form-group">
			<label for="address">Address:</label> <button type="button" class="btn btn-warning float-right" onclick="goPopup()">주소검색</button>
			<input value = "${sessionScope.principal.address}" type="text" class="form-control" id="address" placeholder="Enter Address" name="address" required readonly>
			<div class="valid-feedback">Valid.</div>
			<div class="invalid-feedback">Please fill out this field.</div>
		</div>

		<button type="submit" class="btn btn-primary">수정하기</button>
	</form>
</div>

<script src="/blog/js/join.js"></script>
<%@ include file="../include/footer.jsp"%>

 

 

비밀번호를 빼고 sessionScope로 값을 가져온 것이 보입니다.

이 때 아이디는 수정되면 안되니까 꼭 텍스트 창에 readonly를 걸어 수정되지 못하게 합니다.

 

 

- 구현 화면

이제 이 값들을 받아서 수정해줄, 데이터베이스에 접근할 액션을 만들어야겠죠.

버튼을 누를 때 데이터베이스로 이동할 액션을, 라우터를 보면서 제작해줍시다.

 

package com.cos.blog.action.user;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.catalina.User;

import com.cos.blog.action.Action;
import com.cos.blog.model.RoleType;
import com.cos.blog.model.Users;
import com.cos.blog.repository.UsersRepository;
import com.cos.blog.util.SHA256;
import com.cos.blog.util.Script;

import sun.font.CreatedFontTracker;

public class UsersUpdateProcAction implements Action {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//0. 유효성 검사
		HttpSession session = request.getSession();
		if (session.getAttribute("principal") == null) {
			Script.outText("잘못된 접근입니다.", response);
		}
		if(
			request.getParameter("username").equals("")||
			request.getParameter("username")==null||
			request.getParameter("password").equals("")||
			request.getParameter("password")==null||
			request.getParameter("email").equals("")||
			request.getParameter("email")==null||
			request.getParameter("address").equals("")||
			request.getParameter("address")==null
		) {
			return ;
		}
		
		
		
		//1. 파라메터 받기(x-www-form-urlencoded mime type -> key = value)
		Users users=(Users)session.getAttribute("principal");
		String username = request.getParameter("username");
		String email = request.getParameter("email");
		String address=request.getParameter("address");
		
		//2. User 오브젝트 변환
		Users user=Users.builder()
				.id(users.getId())
				.username(username)
				.password(password)
				.address(address)
				.email(email)
				.userRole(users.getUserRole())
				.createDate(users.getCreateDate())
				.build();
		//3. DB 연결 - Repository save 호출
		UsersRepository usersRepository=UsersRepository.getInstance();
		int result=usersRepository.update(user);
		
		//4. index.jsp 페이지 이동
		if(result==1) {
			
			session.setAttribute("principal", user);
			Script.href("수정에 성공하였습니다.", "/blog/board?cmd=home&page=0", response);
		}else {
			Script.back("수정에 실패하셨습니다.", response);
		}
	}
}

(세션을 꼭 확인해주세요. 세션이 무효화됐으면 안됩니다.)

유효성 검사는 꼭 해줘야죠.

 

Users에 있던 기존 값(userRole나, createData 등)을 먼저 넣어주고, 변화된 값으로 값을 재선언해줍시다. 

이 값을 데이터베이스에 넣어줍니다.

 

- UserRepository.java의 update 메소드

	public int update(Users user) {
		final String SQL="update users set password=?, email=? , address=? where id=?";
		try {
			conn=DBConn.getConnection();
			pstmt = conn.prepareStatement(SQL);
			//물음표 완성하기
			pstmt.setString(1, user.getPassword());
			pstmt.setString(2, user.getEmail());
			pstmt.setString(3, user.getAddress());
			pstmt.setInt(4, user.getId());
			
			System.out.println(pstmt.executeUpdate());
			return pstmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println(TAG+"update : "+e.getMessage());
		}finally {
			DBConn.close(conn, pstmt);
		}
		
		return -1;
	}

 

정상적으로 수정 반영 됐으면~ executeQuery가 1 반영하고~ 홈페이지로 돌아가고~

아니면 -1 받아서 수정 실패 떠서 다시 해야하는거~ 게시판 수정 구현했으면 다들 알 수 있을 거라고 생각해요.

 

수정되는 거 확인해봅시다.

반응형