이전 게시글은 여기 >>
Servlet 과 JSP를 이용한(모델2 형식) 블로그 만들기(11) - DTO(Data Transfer Object)를 이용한 블로그 수정과 삭제 만들기
(여기까지 멀쩡하게 했으면 회원수정 못하면 바보지)
어떻게 하면 될까요?
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 받아서 수정 실패 떠서 다시 해야하는거~ 게시판 수정 구현했으면 다들 알 수 있을 거라고 생각해요.
수정되는 거 확인해봅시다.