JspServlet #8 MVC패턴, 회원가입 로그인 실습

장서영·2023년 11월 1일

JspServlet

목록 보기
6/11

MVC

Moder view controller
→ 시각적으로 보여지는 부분과 데이터를 처리하는 부분을 분리하여 유연한 구조를 설계

-Model

-Controller

-view

- Model1
→ JSP만을 사용하는 설계 방법

  • Model 2
  • 차이점
  • MVC pattern

회원가입 로그인 실습

  • main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	fieldset {
		display :inline;
}
</style>
</head>
<body>
	<fieldset>
		<legend> Main </legend>
		<a href="./Join.jsp"> <button> 회원가입 </button></a>
		<a href="./Login.jsp"> <button> 로그인 </button></a>
	</fieldset>	
</body>
</html>

-a태그에 href값 넣어주기

  • join.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	fieldset {
	display:inline;
}
</style>
</head>
<body>
	<fieldset align="center">
		<legend> 회원가입 </legend>
		<form action="JoinProgram" method="post">
		<!-- action에 적을 때
			servlet을 요청 : url mapping값(확장자X)
			jsp로 요청 : 해당 jsp로 가기위한 상대경로 -->
		ID : <input type="text" name="id"><br>
		PW : <input type="password" name="pw"><br>
		NAME : <input type="text" name="name"><br>
		<input type="submit" value="회원가입">
		</form>
	</fieldset>
</body>
</html>
  • JoinProgram
System.out.println("[JoinProgram]");
		// Join. jsp에서 보낸 id, pw, name 3가지 데이터를 
		// 받아와서 console창에 출력				
		//post방식 디코딩
		request.setCharacterEncoding("utf-8");
		//id, pw, name 데이터 받아오기
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String name = request.getParameter("name");		
		System.out.println(id);
		System.out.println(pw);
		System.out.println(name);		
		//DTO(Data Trasfer object) 묶기
		MemberDTO dto = new MemberDTO(id,pw,name);		
		//회원가입 기능이 있는 join메소드 호출
		int row = new MemberDAO().join(dto);
		//원래는 ↓↓
//		MemberDAO dao = new MemberDAO();
//		dao.join(dto);	
		// 성공 실패 여부 확인
		// 성공 -> Login.jsp
		// 실패 -> Main.jsp
		String moveURL ;
		if(row > 0) {
			System.out.println("회원가입 성공!");
			moveURL = "./Login.jsp";
		}else {
			System.out.println("회원가입 실패!");
			moveURL = "./Main.jsp";
		}
		response.sendRedirect(moveURL);

→ 데이터를 db에

  • sqld에 테이블 생성
-- Member1 테이블 생성
-- id, pw, name -> varchar2(100)
-- id -> pk
create table Member1(
    id varchar2(100) primary key,
    pw varchar2(100),
    name varchar2(100)
);
-- test값 넣어보기
insert into member1 values('test','test','test');
-- 조회하기
select * from member1;
  • MemberDTO
//DTO(Data Transfer Object) : 데이터 전달 객체(데이터가방)
	//테이블 형태 그대로 생성	
	// 필드 
	private String id;
	private String pw;
	private String name;	
	// 메소드
	// 생성자 메소드 : 객체를 초기화 하기 위한 메소드
	//MemberDTO dto = new MemberDTO(id,pw,name);
	public MemberDTO(String id, String pw, String name) {
		this.id = id;
		this.pw = pw;
		this.name = name;
	}
	//로그인을 위한 생성자 메소드
	public MemberDTO(String id, String pw) {
		this.id = id;
		this.pw = pw;
	}
	// Getter 메소드 매개변수 필요 없음
	public String getId() {
		return id;
	}
	public String getPw() {
		return pw;
	}
	public String getName() {
		return name;
	}


→ 아무것도 담기지 않은 기본 생성자
→ 둘이 같음?

-클래스는 필드와 메소드로 이루어짐
dto 전달 객체를 만들었다.→ 화장품 가방! 하나의 파우치에 모아둬서
table형태 그대로!
필드 → 카드 넣는 자리 지갑넣는 자리를 지정하는 것 praviate 걸어놔서 메소드가 있어야 접근 가능
기본 생성자는 돈이 없음
메소드 해주면 값이 채워준다
MemberDAO

//DAO(Data Access Object) : DB에 접근하는 객체
	Connection conn = null; //전역변수로 변경 파란색 데이터베이스에 접근하게 해주는 객체
	PreparedStatement psmt = null;
	ResultSet rs = null; // 정보를 담을 수 있는 객체
	//DB연결 하는 메소드 리턴타입 없음
	public void db_conn() {
		try {
			//1. ojdbc6.jar 라이브러리 불러오기 WEB-INF lib에 드래그			//C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
			//클래스를 가져오겠다.		
			// 2. OravleDriver class 불러오기
			// OravleDriver : Java와 DB 사이에 통로를 만들어주는 역할			Class.forName("oracle.jdbc.driver.OracleDriver");			
			//3. DB에 접속하기 위한 카드키 설정(주소, 계정, 비번)
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "service";
			String pw = "12345";			
			//4. DB에 접속 -> 접속 성공 시 Connection 객체로 반환
			conn = DriverManager.getConnection(url, user, pw);			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}	
	//DB연결 종료 메소드
	public void db_close() {
		try {
			if(psmt !=null) psmt.close();
			if(conn !=null) conn.close();
			if(rs !=null) rs.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	// 회원가입 메소드
 		public int join(MemberDTO dto) {
 			int row = 0;
			try {
				db_conn();				
			//5. SQL 쿼리 작성 -> ? : 바인드변수 -> 성능향상을 위해서 (soft parsing)
			String sql ="insert into Member1 values(?,?,?)";		
			//6. SQL문장을 DB에 전달 -> 전달 성공 시 PrepareStatement 객체로 반환
			psmt = conn.prepareStatement(sql);			
			//7. 바인드변수 값 채우기
			// psmt.set자료형(물음표의 순서, 넣을 값)
			psmt.setString(1, dto.getId());
			psmt.setString(2, dto.getPw());
			psmt.setString(3, dto.getName());		
			// 8. 실행 
			// executeUpdate : DB에 변화가 생겼을 때, select 구문을 제외한 모든 구문
			// executeQuery : DB에 질의할 때, select 구문
			// int로 return하는 이유 : 몇개의 행이 변화 되었는지 알려주는 것!
			row = psmt.executeUpdate();			
			} catch (Exception e) {
				e.printStackTrace();
			}finally {// 오류가 나든 실행을 하든 무조건 닫아!
				db_close();
			} return row;
		}
 	// 로그인 메소드
 		public MemberDTO login(MemberDTO dto){
 			MemberDTO login_dto = null;
 			try {
 				// 1. DB연결 메소드 호출
 				db_conn();
 				// 2. 쿼리문 작성
 				String sql = "select * from Member1 where id =? and pw =?";
				// 3. sql문 db에 전달 -> PRepareState객체 생성
 				psmt = conn.prepareStatement(sql);			
				// 4.받아온 id와 pw를 sql문에 세팅
 				psmt.setString(1, dto.getId());
				psmt.setString(2, dto.getPw());			
				//5. 실행(executeQuery 메소드 사용 -> ResultSet객체 반환)
				rs = psmt.executeQuery();			
				if(rs.next()) {
				String id=rs.getString(1);
				String pw = rs.getNString("pw");
				String name = rs.getString(3);
				//3개를 하나로 묶음
				login_dto = new MemberDTO(id, pw, name);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
 			finally {
 				// 6. db연결 종료 메소드 호출
				db_close();
			}
 			return login_dto;


  • JoinProgram
    update delete insert → psmt.executeUpdate()
    돌려받아야 하는 자료가 없을 때
    행만 있을 때 → 바뀐 행의 개수 → 리턴값은 int형
    cf) select psmt.executeQuery()
    결과 값을 전달 받아야한다.
    → select용 메소드가 따로 있다. 리턴 값은 ResultSet객체
    System.out.println("[JoinProgram]");
    		// Join. jsp에서 보낸 id, pw, name 3가지 데이터를 
    		// 받아와서 console창에 출력		  		
    		//post방식 디코딩
    		request.setCharacterEncoding("utf-8");   
    		//id, pw, name 데이터 받아오기
    		String id = request.getParameter("id");
    		String pw = request.getParameter("pw");
    		String name = request.getParameter("name");		
    		System.out.println(id);
    		System.out.println(pw);
    		System.out.println(name); 		
    		//DTO(Data Trasfer object) 묶기
    		MemberDTO dto = new MemberDTO(id,pw,name);    		
    		//회원가입 기능이 있는 join메소드 호출
    		int row = new MemberDAO().join(dto);
    		//원래는 ↓↓
    //		MemberDAO dao = new MemberDAO();
    //		dao.join(dto);   		
    		// 성공 실패 여부 확인
    		// 성공 -> Login.jsp
    		// 실패 -> Main.jsp
    		String moveURL ;
    		if(row > 0) {
    			System.out.println("회원가입 성공!");
    			moveURL = "./Login.jsp";
    		}else {
    			System.out.println("회원가입 실패!");
    			moveURL = "./Main.jsp";
    		}
    		response.sendRedirect(moveURL);
  • LoginProgram
    JSP환경에서 현재 작업중인 페이지에서 다른페이지로 이동
    forward → url변화 x, 객체 재사용 o ex)로그인,회원가입,글쓰기
    redirect → url변화 o, 객체 재사용 x ex)리스트보기, 검색
    ```java
    System.out.println("[LoginProgram]");
    		request.setCharacterEncoding("UTF-8");
    		String id = request.getParameter("id");
    		String pw = request.getParameter("pw");
    		System.out.println(id);
    		System.out.println(pw);
    		// 2개의 값 넘겨줄 거야 DAO 묶어서 
    		MemberDTO dto = new MemberDTO(id, pw);
    		MemberDTO login_dto = new MemberDAO().login(dto);![](https://velog.velcdn.com/images/tjduddl0430/post/dbfad766-0908-4901-8c32-9762951d325e/image.png)   		
    		String name = login_dto.getName();
    		System.out.println("DB에서 넘어온 name : "+name);    		
    		if(login_dto != null) {
    			//로그인 성공
    			name = URLEncoder.encode(name, "UTF-8");
    			System.out.println(name);//인코딩 완료된 데이터
    			//한글데이터가 있는 데이터를 인코딩 해주겠다.    			response.sendRedirect("./LoginSuccess.jsp?name="+name);
    		}else {
    			//로그인 실패    			response.sendRedirect("./LoginFail.jsp");
    		}
    ```  
    session 이용한 LoginProgram
System.out.println("[LoginProgram]");
		request.setCharacterEncoding("UTF-8");
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		System.out.println(id);
		System.out.println(pw);
		// 2개의 값 넘겨줄 거야 DAO 묶어서 
		MemberDTO dto = new MemberDTO(id, pw);
		MemberDTO login_dto = new MemberDAO().login(dto);
		//id,pw,name값이 들어있음
		if(login_dto==null) {
			//로그인 실패
			response.sendRedirect("./LoginFail.jsp");
		}		
		String name = login_dto.getName();
		System.out.println("DB에서 넘어온 name : "+name)		
		if(login_dto != null) {
			//로그인 성공
	// sendRedirect 페이지 이동 방식!!!!
			//name = URLEncoder.encode(name, "UTF-8");
			//System.out.println(name);//인코딩 완료된 데이터
			//한글데이터가 있는 데이터를 인코딩 해주겠다.
			//response.sendRedirect("./LoginSuccess.jsp?name="+name);			
	// forwarding 페이지 이동 방식 -> 서버에서 서버로	
//			RequestDispatcher rd = request.getRequestDispatcher("./LoginSuccess.jsp");
			//위에 있는 request 객체를 재활용!!
//			request.setAttribute("login_dto", login_dto);
			//업캐스팅
//			rd.forward(request, response);
			// session 사용해서 값 저장 후 LoginSuccess.jsp에서 name값 출력하기
			// servlet에서는 session을 생성해야한다. 내장객체가 아니어서
			HttpSession session = request.getSession();
			session.setAttribute("login_dto", login_dto);
			response.sendRedirect("./LoginSuccess.jsp");
  • Login.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
    	fieldset {
    	display: inline;
    }
    </style>
    </head>
    <body>
    <fieldset align="center">
    	<legend> 로그인 </legend>
    	<form action="LoginProgram" method ="post">
    	ID : <input type = "text" name ="id"><br>
    	PW : <input type = "password" name ="pw"><br>
    	<input type="submit" value="로그인">
    	</form>
    </fieldset>
    </body>
    </html>
  • LoginSuccess
    <h2>로그인 성공하셨습니다.</h2>
    <%
    	request.setCharacterEncoding("utf-8");
    	String name = request.getParameter("name");
    	response.setContentType("text/html;charset=utf-8");
    %>
    <%=name %>님 환영합니다~!
    세션 이용한 LoginSuccess
<h2>로그인 성공하셨습니다.</h2>
<%
	//String name = request.getParameter("name");
//	MemberDTO login_dto = (MemberDTO)request.getAttribute("login_dto");
							//다운캐스팅
	//String name = login_dto.getName();
							// 아래 없어도 됨 사실..
	//MemberDTO login_dto  = (MemberDTO)session.getAttribute("login_dto");
%>
	 <!-- el문법으로 가져왔음 -->
	 ${login_dto.name}님 환영합니다~!
  • LoginFail.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <style type="text/css">
    fieldset {
    	display = inline;
    }
    </style>
    </head>
    <body>
    	<h2>로그인 실패 </h2>
    	<a href="./Main.jsp"><button>메인 </button></a>
    	<a href="./Login.jsp"><button>로그인</button></a>
    </body>
    </html>
profile
영이의 일상은 짱셔요

0개의 댓글