차근차근 개발자 되기

JSP

72일차: Model 2 회원 관리(3)_ 2021.09.28

wellow 2021. 9. 28. 20:46

 

목차

1.     로그아웃

2.     회원 정보 수정(Update)

3.     회원 탈퇴(Delete)

 

 

1. 로그아웃

 

1) 뷰 페이지(main.jsp)

- 코어 라이브러리 태그 중 <c:if> 태그를 이용하여 세션이 있는 경우와 없는 경우로 나누어서 처리한다.

- 세션이 있는 경우, ‘회원 정보 수정’, ‘로그아웃’, ‘회원 탈퇴’ 버튼이 보이도록 한다.

- 세션이 없는 경우, ‘회원가입’, ‘로그인’ 버튼이 보이도록 한다.

- /Logout.do 로 컨트롤러를 호출한다.

- main.jsp MemberController.java

 

세션이 있는 경우

- 로그인 서비스 클래스(Login.java)에서 session.setAttribute("id", id); 로 공유한 값을 EL 기본객체인 sessionScope 로 받는다.

 

세션이 없는 경우

- sessionScope.id 가 null 인 경우, 즉 로그인이 되지

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 
<!-- 세션이 있는 경우 -->
<c:if test="${sessionScope.id != null }">
    ${sessionScope.id}님 환영합니다. <br><br>
    
    <a href="./UpdateMember.do"> 회원 정보 수정 </a> <br><br>
    <a href="./Logout.do"> 로그아웃 </a> <br><br>
    <a href="./DeleteMember.do"> 회원 탈퇴 </a> <br><br>
</c:if>
 
<!-- 세션이 없는 경우 -->
<c:if test="${sessionScope.id == null }">
    <a href="<%=request.getContextPath()%>/MemberForm.do">회원가입</a> <br><br>
    <a href="<%=request.getContextPath()%>/LoginForm.do">로그인</a> <br><br>
</c:if>
 
cs

 

2) 컨트롤러 클래스(MemberController.java)

- 서비스 클래스의 요청을 받아 처리한다.

- forward 객체를 생성해서 전송 방식과 이동할 페이지 경로를 설정한다.

- MemberController.java → logout.jsp

 

1
2
3
4
5
6
// 로그아웃
        }else if(command.equals("/Logout.do")) {
            forward = new ActionForward();
            forward.setRedirect(false);
            forward.setPath("/member/logout.jsp");
 
cs

 

3) 뷰 페이지(logout.jsp / loginform.jsp)

① 로그아웃 처리 페이지

- 세션 삭제하기 <% session.invalidate(); %>

- alert() 메소드로 로그아웃이 되었다는 알람창 띄우고, LoginForm.do 로 컨트롤러 호출

- logout.jsp → MemberController.java

 

로그아웃 후 이동 페이지

- 컨트롤러에서 요청을 받아 로그인 페이지로 이동

- MemberController.java → loginform.jsp

 

2. 회원정보 수정(Update)

 

1) 뷰 페이지(main.jsp)

- 뷰 페이지인 main.jsp에서 "./UpdateMember.do" 로 컨트롤러를 호출한다.

- main.jsp MemberController.java

 

2) 컨트롤러 클래스(MemberController.java)

- 서비스 클래스인 UpdateMember 클래스의 객체를 생성하고, execute() 메소드를 호출한다.

- 메소드 호출 후 ActionForward 클래스 타입으로 반환하게 되고, 포워딩 처리 코드에서 포워딩을 실행한다.

- MemberController.java → UpdateMember.java

 

1
2
3
4
5
6
7
8
9
// 회원정보 수정 폼
        }else if(command.equals("/UpdateMember.do")) {
            try {
                action = new UpdateMember();
                forward = action.execute(request, response);
            }catch(Exception e) {
                e.printStackTrace();
            }
 
cs

 

 

3) 서비스 클래스(UpdateMember.java)

- 부모 인터페이스인 Action을 상속받는다.

- 로그인 시 공유된 session 값을 getAttribute() 메소드로 구해온다. 이때, session 객체는 자바에서 내장 객체가 아니므로 request 객체로 session 객체를 먼저 생성해야 한다. 또, 구해오는 값에 맞추어 다운캐스팅을 해야 한다.

(ex. HttpSession session = request.getSession();

      String id = (String)session.getAttribute("id");

- DAO 객체를 생성하고 회원 정보를 구해오는 메소드로 한 명의 회원 정보를 구해오고, DTO 클래스 타입으로 돌려받는다.

- 이때, 취미는 회원가입을 할 때 “공부-게임-등산-“과 같은 형태로 저장을 시켰으므로 split() 메소드를 이용해서 “-“를 기준으로 나누고, 배열로 저장한다.

- 구해온 정보를 request 객체로 공유한다.

  (ex. request.setAttribute("member", member);

request.setAttribute("h", h); )

- ActionForward 객체를 생성하고 전송 방식과 경로를 설정한 후 리턴한다.

- request 객체로 공유한 값을 포워딩된 페이지에서 사용하기 위해서는 전송 방식이 dispatcher 방식으로 설정되어야 한다.

- UpdateMember.java MemberController.java → updateform.jsp

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package service;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import dao.MemberDAO;
import model.MemberDTO;
 
public class UpdateMember implements Action {
 
    @Override
    public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // TODO Auto-generated method stub
        
        System.out.println("UpdateMember");
        
        request.setCharacterEncoding("utf-8");
        
        HttpSession session = request.getSession();
        String id = (String)session.getAttribute("id");
        
        MemberDAO dao = MemberDAO.getInstance();    // DB 연동을 위해 DAO 객체 생성
        MemberDTO member = dao.getMember(id);        // 한 명의 상세정보를 구하는 메소드 호출
        System.out.println("수정폼:"+member);         // DTO 객체 주소 값
        
        String hobby = member.getHobby();            // "공부-게임-등산-"
        String[] h = hobby.split("-");                // h[0]="공부", h[1]="게임", h[2]="등산"
        
        // 공유 설정
        request.setAttribute("member", member);
        request.setAttribute("h", h);
        
        ActionForward forward = new ActionForward();
        
        // request 객체로 공유가 된 경우에는 dispatcher 방식으로 포워딩 해야
        // view 페이지에서 공유한 값을 사용할 수 있다.
        forward.setRedirect(false);            // dispatcher 방식으로 포워딩
        forward.setPath("/member/updateform.jsp");
        
        return forward;
    }
 
}
 
cs

 

 

 

4) 뷰 페이지(updateform.jsp)

- 서비스 클래스(UpdateMember.java)에서 request 객체로 공유한 값을 EL 태그로 가져온다.

 (ex. ${member.id} )

- 공유받은 DTO 객체로 각 입력 양식의 value 값을 보여준다. (ex. value="${member.name} )

- <select> 태그, radio 속성으로 선택된 값은 JSTL 코어 라이브러리 태그인 <c:if> 태그로 구해온다.

- checkbox 속성으로 선택된 취미 값은 제이쿼리를 이용해서 구해온다.

- hidden 속성으로 아이디(id) 값을 전달하고, 그 외 사용자가 입력하는 값을 전달한다.

- “/Update.do” 로 컨트롤러를 호출한다.

- updateform.jsp → MemberController.java

 

5) 컨트롤러 클래스(MemberController.java)

- 서비스 클래스인 Update 클래스의 객체를 생성하고, execute() 메소드를 호출한다.

- 메소드 호출 후 ActionForward 클래스 타입으로 반환하게 되고, 포워딩 처리 코드에서 포워딩을 실행한다.

- MemberController.java → Update.java

 

1
2
3
4
5
6
7
8
// 회원정보 수정
    }else if(command.equals("/Update.do")) {
        try {
            action = new Update();
            forward = action.execute(request, response);
        }catch(Exception e) {
                e.printStackTrace();
        }
cs

 

 

6) 서비스 클래스(Update.java)

- 부모 인터페이스인 Action을 상속받는다.

- DTO 객체를 생성하고 수정 폼(updateform.jsp)에서 입력한 값을 request.getParameter()로 가져와서 DTO 객체에 저장한다.

- DAO 객체로 회원 정보를 가져온 후, DB에 저장된 비밀번호와 수정 폼에서 사용자가 입력한 비밀번호를 비교해서 일치하면 정보를 수정한다.

- ActionForward 객체를 생성하고 전송 방식과 경로를 설정한 후 리턴한다.

- Update.java MemberController.java → main.jsp

 

3. 회원 탈퇴(Delete)

 

1) 뷰 페이지(main.jsp)

- 뷰 페이지인 main.jsp에서 "./DeleteMember.do" 로 컨트롤러를 호출한다.

- main.jsp MemberController.java

 

2) 컨트롤러 클래스(MemberController.java)

- forward 객체를 생성해서 전송 방식과 이동할 페이지 경로를 설정한다.

- MemberController.java → deleteform.jsp

 

3) 뷰 페이지(updateform.jsp)

- 로그인 시 공유된 session 값을 EL 태그의 내장 객체인 sessionScope로 가져오고, hidden 속성으로 전달한다.

(ex. value="${sessionScope.id} )

- “/Delete.do” 로 컨트롤러를 호출한다.

 

4) 컨트롤러 클래스(MemberController.java)

- 서비스 클래스인 Delete 클래스의 객체를 생성하고, execute() 메소드를 호출한다.

- 메소드 호출 후 ActionForward 클래스 타입으로 반환하게 되고, 포워딩 처리 코드에서 포워딩을 실행한다.

- MemberController.java → Delete.java

 

5) 서비스 클래스(Delete.java)

- 부모 인터페이스인 Action을 상속받는다.

- 삭제 폼(deleteform.jsp)에서 전달한 id와 passwd 값을 request.getParameter()로 받는다.

- DAO 객체로 회원 정보를 가져온 후, DB에 저장된 비밀번호와 수정 폼에서 사용자가 입력한 비밀번호를 비교해서 일치하면 정보를 삭제한다.

- 회원 정보가 삭제되면, 세션도 삭제한다.

- ActionForward 객체를 생성하고 전송 방식과 경로를 설정한 후 리턴한다.

- Delete.java MemberController.java → loginform.jsp