MVC 회원관리 (3) - 로그인 폼
- 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
처리할 일은 다음과 같다.
- 세션 삭제
- 로그인 화면으로 이동
실행해보았다.
[확인] 버튼을 누르면 바로 로그인 폼 화면으로 이동한다.