JSP/model 2

MVC 회원관리 (3) - 로그인 폼

Kiwisae 2022. 9. 19. 16:54
  • DBCP 방식
  • request, session 객체 공유 설정
  • Controller 클래스 : Java Servlet
  • Service, DTO, DAO 클래스, Model (Service + DAO)
  • View (화면 인터페이스) : EL, JSTL 사용

 

 

프로그램 구조

 

Java Resources > src Controller 클래스 Controller  MemberController.java  
DTO 클래스 model MemberDTO.java  
DAO 클래스 dao MemberDAO.java  
Action 인터페이스 service Action.java 인터페이스
ActionForward 클래스 ActionForward.java  
회원가입 MemberInsert.java Action 상속
ID중복검사 IdCheck.java Action 상속
로그인 Login.java Action 상속
로그아웃 Logout.java  
정보수정 폼 UpdateMember.java  
정보수정 Update.java Action 상속
회원탈퇴 폼 DeleteMember.java  
회원탈퇴 Delete.java Action 상속
WebContent > member 메인 페이지 main.jsp    
회원가입 폼 memberform.jsp member.js  
ID 중복검사 idcheck.jsp    
로그인 폼 loginform.jsp login.jsp login.js
수정 폼 updateform.jsp    
삭제 폼 deleteform.jsp    
로그아웃 logout.jsp    
WebContent > WEB-INF
> lib
라이브러리 cos.jar jstl-1.2jar ojdbc6.jar
WebContent > META-INF 커넥션 풀 context.xml    
WebContent > sql DB member.sql    
WebContent 인덱스 index.jsp    

 

 

 

 

MVC 구조

 

 

 

 


 

 

 

loginform.jsp

 

회원가입 버튼을 누르면 바로 연결되도록 연결해본다.

submit 버튼에 바로 memberform.jsp를 연결하면 되지만

model2 이기 때문에 jsp 문서에 다이렉트로 연결해서는 안된다.

컨트롤러의 어노테이션 값을 *.do로 설정한 이상

모든 연결 문서는 ~.do로 설정되어 Controller를 통해 연결되어야만 한다.

 

 

controller에서 다음과 같은 코드를 생성해 준다.

중요한 것은 if가 아니라 Action과 ActionForward 객체 하위의 if문에서

계속해서 else if로 이어서 작성해야 한다는 것이다.

 

 

 

 

여기까지 진행하면 로그인 화면에서 [회원가입] 버튼을 눌렀을 때 바로 연결된다.

 

 

 

 

 

 

Login.java 생성 

 

1) Login 클래스를 생성, Action을 상속받는다.

 

public class Login implements Action{

}

 

 

2) 메소드 오버라이딩

 

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

public class Login implements Action{

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {

		return null;
	}

}

 

 

 

3) 에러 발생 시 흐름 파악을 위한 System.out.println("Login.java"); 코드 추가

 

System.out.println("Login.java");

 

 

 

4) ActionForward 객체를 forward라는 이름으로 생성하여 return 값으로 forward를 설정한다.

 

		ActionForward forward = new ActionForward();
		
		return forward;

 

 

5) request 객체로 한글 인코딩 처리를 하고

로그인 폼에서 입력받은 ID와 비밀번호 값을 받아온다.

 

		request.setCharacterEncoding("UTF-8");
		String id = request.getParameter("id");
		String passwd = request.getParameter("passwd");

 

 

6) DAO 객체를 생성해 연동을 설정하고

로그인 폼에서 받아온 id와 passwd 값을 매개로 회원 인증 기능을 수행하는 memberAuth메소드를 호출한다.

흐름 파악을 위해 콘솔에 메시지를 출력한다.

 

import dao.MemberDAO;

		MemberDAO dao = MemberDAO.getInstance();
		int result = dao.memberAuth(id, passwd);	// 회원인증
		// 인증 성공시 : result=1, 인증 실패시 : result = -1
        
		if(result == 1 ) System.out.println("회원인증 성공");

 

 

 

7) 로그인을 성공하면

이 로그인 값이 다른 페이지에 넘어가도 지속되어야 하므로 세션 객체를 설정한다.

 

import javax.servlet.http.HttpSession;

		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
        
        	if (result == 1){
			session.setAttribute("id", id);
			//로그인 성공시 세션 객체 설정하여 로그인이 지속되도록 함
		} else {
			out.println("<script>");
			out.println("alert('로그인 실패');");
			out.println("history.go(-1);");
			out.println("</script>");
			out.close();
			
			return null;
			// return null;을 설정하지 않으면 콘솔창에 에러 메시지가 출력된다.
		}

 

 

 

8) 로그인 성공 후 main.jsp에 넘어가도록 설정

 

		ActionForward forward = new ActionForward();
		forward.setRedirect(false);				// dispatcher 방식 포워딩
		forward.setPath("./member/main.jsp");	// 포워딩 할 파일명
		
		return forward;

 

 

 

 

 

 

 

 

DAO 클래스 > memberAuth 메소드 생성

 

 

 

여기에서 내가 실수했던 것

메소드 생성시 자료형을 MemberDto member로 설정해서

setString으로 id와 passwd 값을 설정할 때 오류가 발생했었다.

 

 

 

 

Controller.java ---CONNECT--- service class

else if로 이어서 다음 코드를 입력한다

컨트롤러에서 연결 코드를 먼저 - 서비스 클래스를 작성하든,

서비스 클래스를 먼저 - 컨트롤러에서 연결 하든 순서는 상관없다.

 

		else if (command.equals("/Login.do")) {
			try {
				action = new Login();
				forward = action.execute(request, response);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

 

 

 

 

틀린 로그인 정보를 입력해보았다.

 

 

 

분명 한글 인코딩 설정을 해주었는데...

 

 

 

 

다음 코드를 추가한다.

 

		response.setContentType("text/html; charset=UTF-8");

 

 

 

 

이제 한글이 깨지지 않는다.

 

 

 

 

관련 내용

 

 

(Servlet/JSP) setCharacterEncoding, setContentType 정리

JSP와 서블릿 공부를 하면서 항상 헷갈렸던 내용이 있다. request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=utf-8"); 이번 포스팅..

cbw1030.tistory.com

 

 

 

 

 

 

이번엔 올바른 로그인을 해본다.

아직 별다른 어노테이션 설정을 하지 않았으므로 Login.do로 주소가 뜨지만

미리 main.jsp를 생성하여 타이틀 값을 '메인'으로 지정해 둔 것이 그대로 브라우저에 출력되므로

제대로 이동했다는 것을 알 수 있다.

 

 

 

 

main.jsp

사실 상단의 page 태그 말고는 불필요한 내용이라 다 지웠다.

표현언어와 JSTL을 사용해야 하기 때문에 코어 라이브러리를 불러온다.

 

 

main.jsp는 세션값이 있을 때, 없을 때 이렇게 두 가지 경우에 따라 출력되는 내용이 다르다.

이것을 if 조건문으로 작성한다.

 

 

 

 

 

 

각 메뉴에 링크를 걸어본다.

 

 

 

 

1) 세션이 없는 경우

 

 

회원가입으로 넘어갈 수 있는 MemberForm.do의 경우

Controller에서 이미 생성해 둔 조건문이 있기 때문에 넘어갈 수 있지만

 

로그인 화면으로 넘어가는 LoginForm.do는 아직 생성을 하지 않았기 때문에

Controller 에서 이것을 생성해주어야 한다.

역시 else if 문으로 이어서 적어야 한다.

 

1) ActionForward 객체 생성

2) 리다이렉트는 false로 설정

3) setPath에 이동할 페이지 절대 경로 설정

 

 

 

잘 처리가 되었고, 클릭하면 각 화면으로 넘어간다.

 

 

 

 

 

 

 

2) 세션이 있는 경우

 

 

로그아웃에 링크를 걸어준다.

 

 

controller 에서 로그아웃의 경우를 else if 로 이어서 생성한다.

 

 

 

 

 

Logout.jsp

 

처리할 일은 다음과 같다.

  • 세션 삭제
  • 로그인 화면으로 이동

 

 

실행해보았다.

[확인] 버튼을 누르면 바로 로그인 폼 화면으로 이동한다.