Servlet쇼핑몰3: 로그인

loginForm.jsp 생성

  • 모든 페이지이동은 가상주소를 이용하여 이동 => 이것이 모델2방식
1
2
3
4
5
6
7
8
9
10
11
12
<!-- .me가 가상경로이기때문에 ../style.css가 아닌 ./style.css(./의 의미는 루트)가 되어야한다  -->
<link href="./style.css" rel="stylesheet" />

<fieldset>
<legend>로그인</legend>
<form action="./MemberLoginAction.me" method="post" name="fr">
아이디 <input type="text" name="id" required ><br>
비밀번호 <input type="password" name="pw"><br>
<input type="submit" value="로그인하기">
<input type="button" value="회원가입하기" onclick="location.href='./MemberJoin.me'">
</form>
</fieldset>




MemberFrontController.java의 doProcess()메서드 추가 코드작성

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doProcess메서드 호출");

//4. 가상주소 가져오기 : 가지고 다닐 주소는 /*.me 앞부분의 주소는 필요가 없다.
String requestURI = req.getRequestURI();
StringBuffer requestURL = req.getRequestURL();
//uri와 url차이 -> uri에서 내 프로젝트명을 뺀 /*.me만 들고다니면됨
System.out.println("리퀘스트uri: "+requestURI); ///Model2JSP7/*.me
System.out.println("리퀘스트url: "+requestURL); //http://localhost:8088/Model2JSP7/*.me
//contextPath는 프로젝트명을 호출함
String contextPath = req.getContextPath();
System.out.println("contextPath: "+contextPath); ///Model2JSP7
//가상주소 command : 필요한 주소인 /*.me만 가져다니기 위해 substring()사용
String command = requestURI.substring(contextPath.length());
System.out.println("잘 짤렸는지 가상주소 command: "+command);


//9-1. 일회성이 아닌 다회용 여러번 쓸수있게 처리
Action action = null;

//6-3.ActionForward 객체사용
ActionForward forward = null;

//5. 특정 주소에 대한 처리
if(command.equals("/MemberJoin.me")){
System.out.println("/MemberJoin.me 호출");

//6. 회원가입처리 -> 회원정보 입력창(view의 개념이 필요)
//모델2에서 페이지 이동은 무조건 ActionForward사용
/*//6-1.페이지이동방법은 2가지 중 첫번째 : response
resp.sendRedirect("./member/insertForm.jsp");
//6-2.페이지이동방법은 2가지 중 두번째 : forward
RequestDispatcher dis = req.getRequestDispatcher("./member/insertForm.jsp");
dis.forward(req, resp);*/

//6-4. 특정주소에 대한 처리 후 페이지이동 =>먼저 특정주소에 대한 처리는 ActionForward 객체 사용
//ActionForward 객체 생성되기 전에는 null (값이 없다)이다가 객체생성후 이동정보가 생긴다
forward = new ActionForward();
// 이동할 주소
forward.setPath("./member/insertForm.jsp");
// 이동할 방법
forward.setRedirect(false);

//8.MemberJoinAction일때도 주소 출력
//8-1.Action페이지는 모델1의 pro페이지 역할을 한다.
}else if(command.equals("/MemberJoinAction.me")){ //주소에 `.`붙이면 안됨
System.out.println("/MemberJoinAction.me 주소 호출");

//8-2.전달되는 정보를 Action.java 인터페이스에 저장 --Acttion.java인터페이스와 MemberJoinAction.java생성--> DB로 전달
//Action페이지를 통해서 처리 => MemberJoinAction 객체를 생성 후 execute메서드 호출
//MemberJoinAction action = new MemberJoinAction(); //데이터 업캐스팅(Action <- MemberJoinAction)해서 저장

//9-2.`MemberJoinAction action = new MemberJoinAction()`을 `action = new MemberJoinAction();`으로 변경
action = new MemberJoinAction();

try {
System.out.println("@@@@ Controller : MemberJoinAction 객체생성완료 후 excute()호출완료");
forward = action.execute(req, resp);
System.out.println("@@@@ Controller : 회원가입 처리완료 후 페이지 이동"+forward);
} catch (Exception e) {
e.printStackTrace();
}

//10. 로그인페이지연결
}else if(command.equals("/MemberLogin.me")){
System.out.println("가상주소: /MemberLogin.me 주소 호출, 실제주소: ./member/loginForm.jsp");
forward = new ActionForward();
forward.setPath("./member/loginForm.jsp");
forward.setRedirect(false);
//10-1. 로그인처리
}else if(command.equals("/MemberLoginAction.me")){
//10-2. MemberLoginAction.java 생성
action = new MemberLoginAction();
try {
System.out.println("@@@@ Controller : MembeLoginAction 객체생성완료 후 excute()호출완료");
forward = action.execute(req, resp);
System.out.println("@@@@ Controller : 로그인 처리완료 후 페이지 이동"+forward);
} catch (Exception e) {
e.printStackTrace();
}
}
//7.페이지이동 : 두가지방식
//이동정보가 있을때 (ActionForward객체가 생성되었을때) 페이지이동이 실행되어야한다
//7-1.response => true일때 이동
//7-2.forward => false일때 이동
if(forward != null){
System.out.println("@@@페이지이동@@@");
if(forward.isRedirect()){//1 - response.sendRedirect(주소)사용
//정보는 ActionForward객체 안에 있다
System.out.println("sendRedirect방식의 이동"+forward.getPath());
resp.sendRedirect(forward.getPath());
}else{ //0 - forward사용
System.out.println("RequestDispatcher방식의 이동"+forward.getPath());
RequestDispatcher dis = req.getRequestDispatcher(forward.getPath());
dis.forward(req, resp);
}
}
}//end of doProcess




MemberLoginAction.java 객체 생성

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
public class MemberLoginAction implements Action{

@Override
public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
System.out.println("@@@@ Action: MembeLoginAction안의 execute() 실행됨");
//1. 한글처리
req.setCharacterEncoding("UTF-8");
//2.전달되는 파라미터 정보저장 ->MemberLoginAction객체생성
String id = req.getParameter("id");
String pw = req.getParameter("pw");

//3. DB객체처리
MemberDAO mdao = new MemberDAO();
int check = mdao.idCheack(id, pw);

//4. 페이지이동 : 결과에 따른 페이지이동처리, 무조건 Controller로 이동
System.out.println("@@@@ Action : 페이지이동 "+check);

//4-2.로그인 비번오류
if(check == 0){ //로그인 비번오류
//자바스크립트사용하여 alert()창띄우기
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("<script>");
out.print("alert('비밀번호오류');");
out.print("history.back();");
out.print("</script>");
//자원해제
out.close();
return null; //null이란 Controller에서 페이지 이동하지않겠다는 의미
}else if(check == -1){
//자바스크립트사용하여 alert()창띄우기
resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print("<script>");
out.print("alert('존재하지 않는 아이디입니다');");
out.print("history.back();");
out.print("</script>");
//자원해제
out.close();
return null; //null이란 Controller에서 페이지 이동하지않겠다는 의미
}

//4-1. 정상 로그인처리
if (check == 1){ //정상 로그인처리
//아이디값 세션객체에 저장
//jsp페이지가 아닌 java페이지기때문에 java에는 session내장객체가 없다.
//session.setAttribute("id", id); 한줄로는 실행이 안되니까 HttpSession session = req.getSession(); 추가해준다
HttpSession session = req.getSession();
session.setAttribute("id", id);
}

//페이지이동객체생성
ActionForward forward = new ActionForward();
forward.setPath("./Main.me");
forward.setRedirect(true);
return forward;
}

}




MemberDAO.java의 idCheck()메서드 추가 코드 작성

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
//4. 로그인메서드
// DB에서 해당 값이 있는지 체크하고 결과를 리턴
// 정수형 데이터값 사용(1-정상처리, 0-비번오류, (-1)-아이디가없음)
public int idCheack(String id, String pw){
int result = -1;
try {
//4-1. 드라이브로드 디비연결
con = getCon();
//4-2. SQL & pstmt 생성
sql = "select pw from itwill_member where id=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
//4-3. 실행 -> rs저장
rs = pstmt.executeQuery();
//4-4. 데이터 처리
//왜 while이 아닌 if인가? where절에서 id는 pk조건을 가지고 있으므로 중복이 없기때문
if(rs.next()){
if(pw.equals(rs.getString("pw"))){
result = 1;
//4-5. 세션정보를 만들 수 있을까? 만들 수 없다.
//session.setAttribute();
//why? session은 jsp내장객체이다.
// 따라서 java에서 사용할 수 없지만 추후 서블릿을 통해 사용할 수 있다.
}else{
result = 0;
}
}else{
result = -1;
}
System.out.println("@@@@ DAO : 로그인처리완료 "+result);
} catch (Exception e) {
e.printStackTrace();
} finally { //4-6. 자원해제
closeDB();
}
return result;
}//idCheck닫힘




index.jsp코드 수정

프로젝트 시작페이지를 login페이지로 변경

1
2
3
4
<%
//프로젝트의 시작페이지
response.sendRedirect("./MemberLogin.me");
%>