JSP

[JSP] login2-1

worri-pi 2021. 7. 29. 13:55

 

 

 

 

emplyees table

 

 

필요한 파일 추가

 

 

index.jsp

index.jsp 를 실행하면 바로 login.do 로 이동하게 됨. (1에서는 a 태그를 사용해서 버튼을 눌러야만 했었음)

get방식으로 서블릿 요청하기.

 

<%@ 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>
</head>
<body>
<%
	response.sendRedirect("login.do");
%>
</body>
</html>

 

 

 

 

header.jsp

바뀌지 않고 계속 보이는 haeder 파일 만들기. 

manager, member, non-member 이렇게 세개의 상황에 따라 다른 메뉴들과, 선택 가능한 항목만 (링크 연결되어있는 항목) 배경 색이 바뀌도록 하기. (javascript if를 쓸지, jstl 태그를 쓸지)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	
	a{
		text-decoration : none;
	}
	td {
	    border : 1px solid #444444;
	    width : 200px;
	    text-align : center;
	}
	.login:hover{
		background-color : #AFC7F9; 
	}
</style>
</head>
<body>
	<table align="center">
		<tr>
			<!-- non-member page -->
			<c:if test="${empty loginUser}">
				<td></td>		
				<td></td>
				<td><a href="login.do">log-in</a></td>
				<td style="width:300px;">
					member registration <br> <span style="color:red">(can use only manager)</span>
				</td>
				<td>
					member's page <br> <span style="color:red">(can use only member)</span>
				</td>
			</c:if>
			
			<!-- member / manager page -->
			<c:if test="${!empty loginUser}">
				<td>${loginUser.name}, hello!</td>		
				<td>level : ${loginUser.lev}</td>
				<td class="login"><a href="logout.do">log-out</a></td>
				
				<c:choose>
					<c:when test="${result==2}">
						<td class="login" style="width:300px;"><a href="custom.do">member registration </a></td>
					</c:when>
					<c:when test="${result==3}">
						<td style="width:300px;">
							member registration <br> <span style = "color:red">(can use only manager)</span>
						</td>
					</c:when>
				</c:choose>
								
				<td class="login">
					<a href="mypage.do">member's page</a>
				</td>
			</c:if>
		</tr>
		
	</table>
</body>
</html>

 

 

 

login.jsp

로그인 입력 폼

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	td{
		text-align ="center";
	}
</style>
</head>
<body>
<form action="login.do" method="post">
	<table>
		<tr>
			<td colspan="2">LOG-IN</td>
		</tr>
		<tr>
			<td>ID</td>
			<td><input type="text" name="id"></td>
		</tr>
		<tr>
			<td>PASSWORD</td>
			<td><input type="password" name="pwd"></td>
		</tr>
		<tr>
			<td>LEVEL</td>
			<td>
				<select name = "lev">
					<option value="A">manager</option>
					<option value="B">user</option>
				</select>
			</td>
		</tr>
		<tr>
			<td colspan="2">
				<input type="submit" value="LOG-IN">
				<input type="reset" value="reset">
			</td>
		</tr>
	</table>
	<div style="color:red; text-align: center;"> ${message} </div>
</form>
</body>
</html>

 

 

 

com.magic.dto - EmployeesVO.java

 

회원 테이블 정보를 저장할 VO클래스 만들기

package com.magic.dto;
import java.util.Date;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class EmployeesVO {
	
	private String id,pass,name,lev,phone;
	private Date enter;
	private Integer getnder;
    
    @Override
	public String toString() {
		return "EmployeesVO [id=" + id + ", pass=" + pass + ", name=" + name + ", lev=" + lev + ", phone=" + phone
				+ ", enter=" + enter + ", getnder=" + getnder + "]";
	}
}

 

 

 

 

com.magic.dao - EmployeeDAO

쿼리문 처리하는 DAO 만들기

db 접속 세팅

메소드 단위 를 db랑 붙어서 

싱글톤 패턴으로 만들기 (외부에서 생성이 안되고, 내부에서 한번만 생성된다)

 

 

package com.magic.dao;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class EmployeesDAO {

	private static EmployeesDAO instance = new EmployeesDAO();	
	public EmployeesDAO() {
	}
	public static EmployeesDAO getInstance() {
		return instance;
	}	
	public Connection getConnection() throws Exception{		
		Connection conn = null;
		Context initContext = null;		
		try {
			initContext = new InitialContext();
			DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/OracleDB");
			conn = ds.getConnection();
		}catch(NamingException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}		
		return conn;		
	}
}

 

 

com.magic.controller - LoginServlet.java (@WebServlet/login.do)

로그인 처리하기 위한 get메소드 post메소드

db연결해서 값 처리하기 위해 값을 입력해서 서브릿 요청이 들어올 떄 post

index.jsp 에서 get 방식(링크에 의한 요청)으로 요청했으니 여기서도 doGet() 메소드를 이용하여 login.jsp 로 포워딩 하도록 한다.

컨트롤러 만들기(서블릿)

 

package com.magic.controller;

import java.io.IOException;

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

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); //이동할 페이지
		rd.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

}

이제 여기까지가 index .jsp 를 실행했을 때 로그인 폼으로 바로 보이게끔 하는 작업을 했다.

 

 

 

doPost

유저 체크를 매개변수 세개를 이용해서 한다.

 

 

package com.magic.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 com.magic.dao.EmployeesDAO;

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher("login.jsp"); //이동할 페이지
		rd.forward(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		//한글처리
		
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String lev = request.getParameter("lev");
		//파라미터 받아오기
		
		String url = null; //페이지 이동시 사용할 변수 만들기
		
		EmployeesDAO empDAO = EmployeesDAO.getInstance();	
        //DAO에서 userCheck() 만들기!
	}

}

 

 

employeesDAO

이제 DAO에다가 다음에 사용할 userCheck() 를 만들어야한다.

 

package com.magic.dao;

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

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

public class EmployeesDAO {

	private static EmployeesDAO instance = new EmployeesDAO();
	
	
	public EmployeesDAO() {
		// TODO Auto-generated constructor stub
	}

	public static EmployeesDAO getInstance() {
		return instance;
		
	}
	
	public Connection getConnection() throws Exception{
		
		Connection conn = null;
		Context initContext = null;
		
		try {
			initContext = new InitialContext();
			DataSource ds = (DataSource)initContext.lookup("java:/comp/env/jdbc/OracleDB");
			conn = ds.getConnection();
		}catch(NamingException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}
		
		return conn;
		
	}
	
	public int userCheck(String userid, String pwd, String lev) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "select * from employees where id=?";
		
		int result = 1;
		
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, userid);
			rs = pstmt.executeQuery();
			
			
			if(rs.next()) {
				if(pwd.equals(rs.getString("psss"))) { //비밀번호 일치
					if(lev.equals(rs.getString("lev"))) { //회원등급 일치
						result = 2; //관리자로 로그인 성공
						if(lev.equals("B")) { 
							result = 3; //일반회원 로그인 성공
						}
					}else { //level 불일치
						result = 1;
					}
				}else { //비밀번호 불일지
					result = 0;
				}
			}else { //아이디 불일치
				result = -1;
			}
			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(pstmt!=null) rs.close();
				if(conn!=null) rs.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return result;
		
	}
}

dao에서 로그인이 정상적으로 되었으면 2 또는 3이 return된다.

 

 

com.magic.controller - LoginServlet.java (@WebServlet/login.do)

dao에서 -1 0 1 2 3 중 하나를 받아서 각자에 맞는 페이지로 넘겨야한다.

회원 전용 페이지 (이름과 레벨 넣어야함)

개인정보가 넘어가야함

 

실행 결과를 VO 객체에 넣어서 사용할 수 있도록 한다. 받아온 값의 최종 목적은 db에서 활용하게 하는 것이다.

회원이 있다고 가정하고, 로그인을 위해 입력한 정보가 실제 db내용과 일치한지 확인한다.

 

조회된 정보를 VO 에 담아서 받아올 것이고, getMember() 를 만들어야한다.

 

package com.magic.controller;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 com.magic.dao.EmployeesDAO;
import com.magic.dto.EmployeesVO;

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
		rd.forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
        
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String lev = request.getParameter("lev");
		
		String url = null; 		
		EmployeesDAO empDAO = EmployeesDAO.getInstance();
		int result = empDAO.userCheck(id,pwd,lev);
		
		if(result == 2 || result ==3) {
			EmployeesVO emp = new EmployeesVO();
			
		}else {
		
	}

}

 

 

employeesDAO

getMember 메소드 만들기

 

package com.magic.dao;

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

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

import com.magic.dto.EmployeesVO;

public class EmployeesDAO {

	private static EmployeesDAO instance = new EmployeesDAO();	
	public EmployeesDAO() {
	}
	public static EmployeesDAO getInstance() {
		return instance;		
	}
	
	public Connection getConnection() throws Exception{		
		Connection conn = null;
		Context initContext = null;
		
		try {
			initContext = new InitialContext();
			DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/OracleDB");
			conn = ds.getConnection();
		}catch(NamingException e) {
			e.printStackTrace();
		}catch(SQLException e) {
			e.printStackTrace();
		}		
		return conn;	
	}
	
	public int userCheck(String userid, String pwd, String lev) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		String sql = "select * from employees where id=?";
		
		int result = 1;
		
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,userid);
			rs = pstmt.executeQuery();
			
			
			if(rs.next()) {
				if(pwd.equals(rs.getString("pass"))) { //비밀번호 일치
					if(lev.equals(rs.getString("lev"))) { //회원등급 일치
						result = 2; //관리자로 로그인 성공
						if(lev.equals("B")) { 
							result = 3; //일반회원 로그인 성공
						}
					}else { //level 불일치
						result = 1;
					}
				}else { //비밀번호 불일지
					result = 0;
				}
			}else { //아이디 불일치
				result = -1;
			}			
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(pstmt!=null) rs.close();
				if(conn!=null) rs.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return result;		
	}
	
	public EmployeesVO getMember(String id) {
		EmployeesVO member = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = "select * from employees where id=?";
		
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1,id);
			rs=pstmt.executeQuery();
			
			if(rs.next()) { 
				member = new EmployeesVO();
				member.setName(rs.getString(3));
				member.setPass(rs.getString(2));
				member.setPhone(rs.getString(7));
				member.setId(rs.getString(1));
				member.setLev(rs.getString(4));
				member.setGender(rs.getInt(6));
				member.setEnter(rs.getDate(5));
			}
		}catch(Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(pstmt!=null) rs.close();
				if(conn!=null) rs.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		return member;
	}
}

 

 

 

 

LoginServlet.java

 

getMember 메소드를 사용해서 받아온 id를 보낸 후, 해당 id의 EmployeesVO 7개를 emp 변수에 넣는다.

 

userCheck메소드를 사용해서 받아온 id, pwd, lev 를 보낸 후 member 나 manager 면 2 와 3을, 로그인에 성공하지 못하면 -1 , 0 , 1 를 받아와 result 변수에 넣는다.

 

 

session을 사용하여 emp 와 result 를 처리한다.

 

member나 manager면 main.jsp

member가 아니면 login.jsp 로 이동하게 하자.

 

package com.magic.controller;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 com.magic.dao.EmployeesDAO;
import com.magic.dto.EmployeesVO;

@WebServlet("/login.do")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
		rd.forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
        
		String id = request.getParameter("id");
		String pwd = request.getParameter("pwd");
		String lev = request.getParameter("lev");
		
		String url = null; 		
		EmployeesDAO empDAO = EmployeesDAO.getInstance();
		int result = empDAO.userCheck(id,pwd,lev);
		
		if(result == 2 || result ==3) {
			EmployeesVO emp = new EmployeesVO();
			emp = empDAO.getMember(id);
			
			HttpSession session = request.getSession(); 
			session.setAttribute("loginUser", emp); 
			session.setAttribute("result", result);
			url="main.jsp";			
		}else {
			if(result == 1) {
				request.setAttribute("message", "don't match level"); 
			}else if(result == 0 ){
				request.setAttribute("message", "don't match password");
			}else {
				request.setAttribute("message", "don't match id");
			}			
			url = "login.jsp";
		}
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}

}
728x90