MVC패턴(모델2)를 이용한 로그인 페이지 만들기

leeeexxxx·2022년 6월 13일
1

JSP

목록 보기
9/9

모델 1은 뷰와 로직을 모두 jsp 페이지 하나에서 처리하는 구조를 말한다

모델1구조

1.jsp
2.자바빈 혹은 서비스 클래스

모델 2는 모든 처리를 jsp 페이지 하나가 담당하는것 과는 달리 jsp페이지 와 서블릿,그리고 로직을 위한 클래스가 나뉘어 브라우저 요청을 처리한다.

모델2구조 (Mvc패턴)

자바빈 혹은 서비스 클래스 (Model)
jsp (view)
서블릿 (controller)

요청이 들어오면 요청에 대한 로직처리는 이를 처리할 모델(Model)인 서비스 클래스 혹은 자바빈이 담당하고 ,
요청 결과는 뷰(view)단인 jsp 에 출력 되며
이 모든 흐름제어는 컨트톨러인 서블릿(controller)이 담당한다.

장점

  • 출력을 위한 뷰 코드와 로직 처리를 위한 자바코드를 분리 하기 때문에 jsp모델1에 비해 * 코드가 복잡하지 않다.
  • 뷰,로직 처리에 대한 분업이 용이하다.
  • 기능에 따라 분리되어있기때문에 유지보수가 용이하다.

MVC패턴을 이용한 로그인폼만들기

MYSQL 데이터베이스 , 테이블 생성

-1.mysql -u java -p

create database 데이터베이스명;
-->create database testdb4;

-2.'java'권한 부여

grant all privileges on 데이터 베이스명 . to '아이디'@'localhost';
-->grant all privileges on testdb4 .
to 'java'@'localhost';

-3.mysql -u java -p

테이블생성

create table users(
-> id VARCHAR2(12) PRIMARY KEY,
-> passwd VATCHAR2(50),
-> addr VARCHAR2(50),
-> age int,
-> email Varchar2(30),
-> gender CHAR(1),
-> name VARCHAR2(12),
-> nation VARCHAR2(16));

-4.value 추가

insert into users values('java','java','서울시',40,'aaa#naver','M','오정원','대한민국');

패키지 설정

db:데이터 베이스 관련해서 공통적으로 수행해야하는 기능들을 정의한 패키지이다.
jdbcUtil.java :DB에 연결을 담당하는 메소드,DB작업을 처리한후 사용한 자원을 해제 시켜주는 메소드 등이 정의--> db작업을 할때 공통적으로 필요한 기능 정의

conttoller: 서블릿 정의

svc:비즈니스 로직을 구현하는 자바 파일들이 정의

dao:db에 존재하는 데이터들을 sql문장을 이용해서 다루는 클래스들 dao(data access objects)

vo:관련 있는 특정데이터 하나를 저장할수있는 형태의 클래스들이 존재하는 패키지이다.

✔️index.jsp

사용자가 처음으로 접속하는페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>

<body>
	<%
	String id =(String)session.getAttribute("id");
	
	if(id==null){
	%>
	
	<a href="loginForm.html">로그인</a>	
	<%	
	}else{
	%>
		<a href="logout">로그아웃</a>
	<%
	}
	%>
</body>
</html>

✔️loginForm.html

로그인에 사용될 아이디와 비밀번호를 입력 받을수있는 페이지

<section id="loginFormArea">

<h1>로그인</h1>
<form action="login" method="post">
	<fieldset>
	<table>
	<tr>	
		<td class="td_left">
		<label for="id">아이디:</label>
		</td>
		
		<td class="td_ right">
		<input type="text" name="id" id="id"/>
		</td>
	</tr>
	<tr>	
		<td class="td_left">
		<label for="passwd">비밀번호:</label>
		</td>	
		<td class="td_ right">
		<input type="password" name="passwd" id="passwd"/>
		</td>
	</tr>
	</table>
	<input type="submit" value="로그인" id="selectButton"/>
	</fieldset>
</form>
</section

✔️loginServlet.java

로그인 요청을 처리받는 페이지

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public LoginServlet() {
        super();

    }

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String id = request.getParameter("id");
		String passwd= request.getParameter("passwd");
		
		LoginService loginService = new LoginService();
		Member loginMember = loginService.getLoginMember(id,passwd);
		//로그인이 성공 되면 member 객체가 넘어오고 실패하면 null이 넘어옴
		
		if(loginMember != null) {
			HttpSession session = request.getSession();
			session.setAttribute("id", id);
			response.sendRedirect("index.jsp");
		}else {
			response.setContentType("text/html; charset=UTF-8");
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('로그인 실패')");
			out.println("history.back()");
			out.println("</script>");
		}
	}

}

✔️loginService.java

로그인 비즈니스 로직을 처리

public class LoginService{
	public Member getLoginMember(String id,String passwd){
		LoginDAO loginDAO =LoginDAO.getInstance();
		Connection con = getConnection();
		loginDAO.setConnection(con);
		Member loginMember = loginDAO.selectLoginMember(id,passwd);
		close(con);
		return loginMember;
}
}

✔️loginDAO.java

데이터베이스에 로그인관련 sql문 전송

public class LoginDAO {
	private static LoginDAO loginDAO;
	private Connection con;
	
	private LoginDAO() {
		
	}
	public static LoginDAO getInstance() {
		if(loginDAO==null) {
			loginDAO = new LoginDAO();
		}
		return loginDAO;
	}
	
	public void setConnection(Connection con) {
		this.con=con;
	}
	
	public Member selectLoginMember(String id,String passwd) {
		Member loginMember = null;
		PreparedStatement pstmt=null;
		ResultSet rs = null;
		
		try {
			pstmt=con.prepareStatement("SELECT * FROM users WHERE id=? AND passwd=?");
			pstmt.setString(1, id);
			pstmt.setString(2, passwd);
			
			rs=pstmt.executeQuery();
			if(rs.next()) {
				loginMember= new Member();
				loginMember.setAddr(rs.getString("addr"));
				loginMember.setAge(rs.getInt("age"));
				loginMember.setEmail(rs.getString("email"));
				loginMember.setGender(rs.getString("gender"));
				loginMember.setId(rs.getString("id"));
				loginMember.setName(rs.getString("name"));
				loginMember.setNation(rs.getString("nation"));
				loginMember.setPasswd(rs.getString("passwd"));

		}
	}catch (Exception e) {
			e.printStackTrace();
		}
		
		
		
		
		finally {
			try {
				close(rs);
				close(pstmt);
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
	
		return loginMember;
	}

✔️JDBCUtil.java

데이터베이스 작업시 반복적으로 사용하는 기능들을 정의

package db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class JdbcUtil {
	public static Connection getConnection() {
		Connection con = null;
		try {
			Context initCtx= new InitialContext();
			Context envCtx = (Context)initCtx.lookup("java:comp/env");
			DataSource ds=(DataSource)envCtx.lookup("jdbc/mariaDB");
			
			con=ds.getConnection();
			con.setAutoCommit(false);
			System.out.println("connect sucess");
		}catch(Exception e) {
			e.printStackTrace();
		}
		return con;
	}
	public static void close(Connection con) {
		try {
			con.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static void close(Statement stmt) {
		try {
			stmt.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	public static void close(ResultSet rs) {
		try {
			rs.close();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	public static void commit(Connection con) {
	
		try{
			con.commit();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	public static void rollback(Connection con) {
		
		try{
			con.rollback();
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}

✔️Member.java

회원 한명의 정보를 저장

package vo;

public class Member {
	private String name;
	private String addr;
	private int age;
	private String nation;
	private String id;
	private String passwd;
	private String gender;
	private String email;
	
	public String getName(String name) {
		return name;
		
	}
	
	public void setName(String name) {
		this.name= name;
	}
	
	public String getAddr(String addr) {
		return addr;
		
	}

	public void setAddr(String addr) {
		this.addr=addr;
		
	}
	public int getAge(int age) {
		return age;
		
	}
	public void setAge(int age) {
		this.age=age;
		
	}
	public String getNation(String nation) {
		return nation;
		
	}
	
	public void setNation(String nation) {
		this.nation=nation;
		
	}
	public String getId(String id) {
		return id;
		
	}

	public void setId(String id) {
		this.id=id;
		
	}
	
	
	public String getPasswd(String passwd) {
		return passwd;
		
	}

	public void setPasswd(String passwd) {
		this.passwd=passwd;
		
	}



	public String getGender(String gender) {
		return passwd;
		
	}

	public void setGender(String gender) {
		this.gender=gender;
		
	}
	public String getEmail(String email) {
		return passwd;
		
	}

	public void setEmail(String email) {
		this.email=email;
		
	}
}

✔️logoutservlet.java

로그아웃

package controller;

import java.io.IOException;
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;

@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public LogoutServlet() {
        super();
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		HttpSession session= request.getSession();
		session.invalidate();
		response.sendRedirect("index.jsp");
	}

}

0개의 댓글