본문 바로가기
웹 개발 언어/JSP&Servlet

MVC 패턴 Model2를 이용해서 로그인 페이지 만들기

by 0725 2022. 4. 21.

이미 회원가입 페이지를 만들어보았기 때문에 겹치는 부분이 있을 수 있다.

 

html를 통해 로그인 정보를 받아준다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	fieldset {
		text-align: center;
		display: inline;
	}
</style>
</head>
<body>
	<form action="login" method="post">
		<fieldset>
			<legend>로그인</legend>
			<input type="text" name="id" placeholder="ID를 입력해주세요"><br>
			<input type="password" name="pw" placeholder="PW를 입력해주세요"><br>
			<input type="submit" value="로그인">
		</fieldset>
	</form>
</body>
</html>


DAO에 있는 메소드가 어떤 형태인지부터 확인한다.

package Model;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;

public class DAO {

	// 전역변수 선언
	Connection conn = null;
	PreparedStatement psmt = null;
	int cnt = 0;
	ResultSet rs = null;

	// DB 연결 메소드
	public void db_conn() {
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");

			String db_url = "jdbc:oracle:thin:@localhost:1521:xe";
			String db_id = "hr";
			String db_pw = "hr";

			// DB에 연결 -> 연결 성공하면 Connection 객체로 반환
			conn = DriverManager.getConnection(db_url, db_id, db_pw);

			if (conn != null) {
				System.out.println("DB 연결 성공");
			} else {
				System.out.println("DB 연결 실패");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// DB 연결 해제 메소드
	public void db_close() {
		try {
			if (rs != null) rs.close();
			if (psmt != null) psmt.close();
			if (conn != null) conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 로그인 메소드
	public String login(String id, String pw) {
		String nickname = null;
		try {
			db_conn();
			
			// 입력한 id, pw member테이블에 있는지 확인
			String sql = "select nickname from member10 where id=? and pw=?";

			// sql문장 DB에 전달하면 psmt에 저장
			psmt = conn.prepareStatement(sql);

			// 바인드 변수에 값 채우기
			psmt.setString(1, id);
			psmt.setString(2, pw);

			// sql문장 실행
			// query -> 질의하다
			// executeQuery : select문에서 사용, db에 값이 있는지 조회
			// resultset : sql 실행 결과라고 생각하기
			rs = psmt.executeQuery();

			// next() : 다음 줄로 이동해서 값이 있는지 없는지 확인
			// : 리턴값은 boolean
			// : 다음줄에 값이 있으면 true 없으면 false
			// : 값이 있는 경우에 if문 내의 코드를 실행한다 
			// -> nickname이라는 스트링값에 닉네임이 대입된다.
			if (rs.next()) {
				nickname = rs.getString("nickname");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			db_close();
		}return nickname;
	}
}

 

 

 - login Servlet

package controller;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Model.DAO;

@WebServlet("/login")
public class login_session extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Login Controller");
		
		// POST 방식 인코딩
		request.setCharacterEncoding("UTF-8");
		
		// 입력받은 값 가져오기
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		
		System.out.println("id : "+id);
		System.out.println("pw : "+pw);
		
		String nickname = new DAO().login(id, pw);
		
		if(nickname!=null){
			System.out.println("로그인 성공");
            
			// session 생성하여 nickname값 전송
			HttpSession session = request.getSession();
			session.setAttribute("name", nickname);
			
			response.sendRedirect("./loginSuccess.jsp");
			
		}else{
			System.out.println("로그인 실패");
			response.sendRedirect("./loginFail.jsp");
		}
		
	}

}

 DAO의 login메소드를 실행했을 때 사용자가 입력한 정보가 DB에 존재했다면

login 메소드는 사용자의 nickname을 반환했을 것.

그렇기 때문에 nickname이 null 아니라면 로그인이 성공한 것이다.

session에 nickname을 저장해주도록 하자.

 

 

댓글