ㅁ myinfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
#profileImg{
width:250px;
height:250px;
border:1px solid lightgray;
border-radius: 50%;
}
</style>
</head>
<body>
<div class="container p-3">
<!-- Header, Nav start -->
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<!-- Header, Nav end -->
<!-- Section start -->
<section class="row m-3" style="min-height: 500px">
<div class="container border p-5 m-4 rounded">
<h2 class="m-4">마이페이지</h2>
<br>
<div align="center">
<img id="profileImg" src="${contextPath}<c:out value='${loginUser.profileURL}' default='/resources/images/defaultProfile.png' />" onclick="$('#profileImgFile').click();">
<input type="file" id="profileImgFile" style="display:none;">
</div>
<form action="${contextPath}/member/update.do" method="post" id="myinfo_form">
<div class="form-group">
<label for="userId">* ID :</label>
<input type="text" class="form-control" id="userId" name="userId" value="${ loginUser.userId }" readonly><br>
<label for="userName">* Name :</label>
<input type="text" class="form-control" id="userName" name="userName" value="${ loginUser.userName }"><br>
<label for="email"> Email :</label>
<input type="email" class="form-control" id="email" name="email" value="${ loginUser.email }"><br>
<label for="phone"> Phone :</label>
<input type="tel" class="form-control" id="phone" name="phone" value="${ loginUser.phone}"><br>
<label for="address"> Address :</label>
<input type="text" class="form-control" id="address" name="address" value="${ loginUser.address }"><br>
<label for=""> Gender : </label>
<input type="radio" name="gender" id="Male" value="M">
<label for="Male">남자</label>
<input type="radio" name="gender" id="Female" value="F">
<label for="Female">여자</label><br>
<script>
$(function(){
$("#myinfo_form :radio").filter("[value=${loginUser.gender}]").attr("checked", true);
})
</script>
</div>
<br>
<div class="btns" align="center">
<button type="submit" class="btn btn-primary">수정하기</button>
<button type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteForm">회원탈퇴</button>
</div>
</form>
</div>
</section>
<!-- Section end -->
<!-- Footer start -->
<jsp:include page="/WEB-INF/views/common/footer.jsp"/>
<!-- Footer end -->
</div>
<!-- 회원탈퇴 버튼 클릭시 보여질 Modal -->
<div class="modal" id="deleteForm">
<div class="modal-dialog">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h4 class="modal-title">회원탈퇴</h4>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<!-- Modal body -->
<div class="modal-body" align="center">
<b>
탈퇴 후 복구가 불가능합니다. <br>
정말로 탈퇴 하시겠습니까?
</b>
<form action="" method="post">
비밀번호 :
<input type="password" name="" required>
<button type="submit" class="btn btn-danger">탈퇴하기</button>
</form>
</div>
</div>
</div>
</div>
</body>
</html>
- /member/update.do
- name값들 다 줬다.
ㅁ MemberController
package com.br.spring.controller;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.br.spring.dto.MemberDto;
import com.br.spring.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RequestMapping("/member")
@RequiredArgsConstructor
@Controller
public class MemberController {
private final MemberService memberService;
private final BCryptPasswordEncoder bcryptPwdEncoder;
@PostMapping("/signin.do")
public void signin(MemberDto m, HttpServletResponse response, HttpSession session, HttpServletRequest request) throws IOException {
MemberDto loginUser = memberService.selectMember(m);
// 로그인 성공시 => 세션에 회원정보를 담고, alert와 함께 메인 페이지로 이동
// 로그인 실패시 => alert와 함께 기존에 보던 페이지 유지(아이디, 비번 입력하는 로그인 폼 유지. 작성하던 입력데이터도 그대로.)
// script문을 응답데이터로 돌려줘서 흐름제어
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<script>");
if(loginUser != null && bcryptPwdEncoder.matches(m.getUserPwd(), loginUser.getUserPwd())) { // 로그인 성공
session.setAttribute("loginUser", loginUser);
out.println("alert('" + loginUser.getUserName() + "님 환영합니다~');");
out.println("location.href = '" + request.getHeader("referer") + "';"); // 메인페이지가 아닌 이전에 보던 페이지로 이동
}else { // 로그인 실패
out.println("alert('로그인에 실패하였습니다. 아이디 및 비밀번호를 다시 확인해주세요.');");
out.println("history.back();"); // modal이 띄워진 상태였으면 modal도 유지된다.
}
out.println("</script>");
}
@GetMapping("/signout.do")
public String signout(HttpSession session) {
session.invalidate();
return "redirect:/";
}
@GetMapping("/signup.do")
public void signupPage() { } //WEB-INF/views/member/signup.jsp
@ResponseBody
@GetMapping("/idcheck.do")
public String idCheck(String checkId) {
return memberService.selectUserIdCount(checkId) == 0 ? "YYYY" : "NNNN";
}
@PostMapping("/insert.do")
public String signup(MemberDto m, RedirectAttributes rdAttributes) {
log.debug("암호화 전 member: {}", m);
m.setUserPwd( bcryptPwdEncoder.encode(m.getUserPwd()) );
log.debug("암호화 후 member: {}", m);
int result = memberService.insertMember(m);
// 성공시 alert와 함께 메인페이지 이동
// 실패시 alert와 함께 기존에 작업중이던 페이지 유지
if(result > 0) {
rdAttributes.addFlashAttribute("alertMsg", "성공적으로 회원가입 되었습니다.");
}else {
rdAttributes.addFlashAttribute("alertMsg", "회원가입에 실패하였습니다.");
rdAttributes.addFlashAttribute("historyBackYN", "Y");
}
return "redirect:/";
}
@GetMapping("/myinfo.do")
public void myinfoPage() {}
@PostMapping("/update.do")
public String modify(MemberDto m
, RedirectAttributes rdAttributes
, HttpSession session) {
int result = memberService.updateMember(m);
if(result > 0) {
session.setAttribute("loginUser", memberService.selectMember(m));// 동일한 키값으로 담으면 덮어씌워진다.
rdAttributes.addFlashAttribute("alertMsg", "성공적으로 정보수정 되었습니다.");
}else {
rdAttributes.addFlashAttribute("alertMsg", "정보수정에 실패하였습니다.");
}
return "redirect:/member/myinfo.do";
}
}
- input 요소의 key값(name 속성값)을 dto 객체의 필드명으로 하면 요청시 전달값이 매개변수의 MemberDto 객체에 곧바로 담긴다.
- id는 수정 불가하게끔 readonly 되어있어서 정보 수정을 할 순 없지만 값을 넘기긴 한다.
where 조건절에 id를 사용한다.
- id를 readonly가 아니라 disabled로 하는 분이 있다.
그러면 값이 넘어가지 않아서 readonly를 주셔야 한다.
- 마이페이지로 포워딩이 아닌 리다이렉트한다. url 재요청한다.
- 성공, 실패시 각기 다른 메세지를 alert로 띄운다. 뭐가 됐든 마이페이지로 리다이렉트한다.
ㅁ member-mapper.xml
ㅁ 서버키고 정보변경 해보기
- 로그인부터 다시하고 정보변경해본다.
- 성별 정보가 없던 유저로 로그인해서 젠더를 고르고 수정하기를 누르면,
alert로 성공에 수정했다는 메세지가 뜨고 현재 이 페이지가 다시 보여진다.
- 성별이 checked된 채로 보여진다. db에도 반영되었다.
'Spring' 카테고리의 다른 글
[웹프로젝트] 11. 회원탈퇴 (0) | 2024.10.29 |
---|---|
[웹프로젝트] 10. 마이페이지(3) 프로필이미지 변경 요청 (1) | 2024.10.29 |
[웹프로젝트] 8. 마이페이지(1) 조회 (1) | 2024.10.29 |
[웹프로젝트] 7. 회원가입(3) - 암호화 후 로그인 (0) | 2024.10.29 |
[웹프로젝트] 6. 회원가입(2) - 암호화 (0) | 2024.10.28 |