[구디아카데미][IT국비지원][TIL] 직원 리스트 : 고용일 월별 검색 기능 추가

Seokhyun Jeong·2023년 4월 28일
0

과제

목록 보기
17/19
post-thumbnail

[구디아카데미][IT국비지원]

코드

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="vo.*" %>
<%
	//System.out.print font color & bg color 
	final String PUPPLE = "\u001B[35m";
	final String BG_CYAN = "\u001B[46m";
	final String RESET = "\u001B[0m";
	
	//request 인코딩 설정
	request.setCharacterEncoding("utf-8");
	
	// 여러개의 요청값 디버깅
	System.out.println(PUPPLE+" "+BG_CYAN+request.getParameterValues("ckMonth")+RESET);
	// 여러개의 요청값을 배열에 저장
	String[] ckMonth = request.getParameterValues("ckMonth");
	// int배열 선언
	int[] intCkMonth = null;
	// 요청값이 null이 아니면 int배열로 변환
	if(ckMonth != null) {
		intCkMonth = new int[ckMonth.length];
		for(int i=0; i<intCkMonth.length; i+=1) {
			intCkMonth[i] = Integer.parseInt(ckMonth[i]);
		}
	}
	//현재 페이지 변수 : 기본값 1, 요청값 없을 때 1페이지
	int currentPage = 1;
	// 파라미터값 null 유효성 검사
	// 요청된 현재 페이지 값 유효성 검사
	if(request.getParameter("currentPage") != null) {							// 요청된 현재 페이지 값이 null이 아니면
		currentPage = Integer.parseInt(request.getParameter("currentPage"));	// 요청된 현재 페이지 값을 현재 페이지 변수에 저장
	}
	// 디버깅(현재 페이지 확인)
	System.out.println(PUPPLE+" "+BG_CYAN+currentPage + "<-- lastEmpList currentPage"+RESET);
	
	// 페이지당 출력 행의 수 변수 : 기본값 10, 요청값 없을 때 10행
	int rowPerPage = 10;
	// 파라미터값 null 유효성 검사
	// 요청된 페이지당 출력 행의 수 값 유효성 검사
	if(request.getParameter("rowPerPage") != null) {							// 요청된 페이지당 출력 행의 수 값이 null이 아니면
		rowPerPage = Integer.parseInt(request.getParameter("rowPerPage"));		// 요청된 페이지당 출력 행의 수 값을 페이지당 출력 행의 수 변수에 저장
	}
	// 디버깅(페이지당 출력 행의 수)
	System.out.println(PUPPLE+" "+BG_CYAN+rowPerPage + " <-- lastEmpList rowPerPage"+RESET);
	
	// 시작 행 번호 : (현재 페이지-1) * 행의 수
	int startRow = (currentPage-1) * rowPerPage;
	// 디버깅(시작 행 번호 확인)	
	System.out.println(PUPPLE+" "+BG_CYAN+startRow + "<-- lastEmpList startRow"+RESET);
	
	// DB 호출에 필요한 변수 생성
	String driver = "org.mariadb.jdbc.Driver";
	String dbUrl = "jdbc:mariadb://127.0.0.1:3306/employees";
	String dbUser = "root";
	String dbPw =  "java1234";
	// 드라이버 로딩
	Class.forName(driver);
	// DB 접속
	Connection conn = DriverManager.getConnection(dbUrl, dbUser, dbPw);
	// sql 전송
	// sql을 전송하기 위한 변수 선언
	String sql = "";
	String sql2 = "";
	PreparedStatement stmt = null;
	PreparedStatement stmt2 = null;
	if(intCkMonth != null){	// intCkMonth이 null이 아니면
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender, hire_date hireDate FROM employees WHERE MONTH(hire_date) IN (";
		sql2 = "SELECT COUNT(*) FROM employees WHERE MONTH(hire_date) IN (";
		// 배열 길이 만큼 sql에 ? 추가
		for(int i=0; i< intCkMonth.length ; i += 1) {
			if(i == intCkMonth.length-1) {	// 마지막 ?에는 ,X
				sql += "?";
				sql2 += "?";
			} else {
				sql += "?,";
				sql2 += "?,";
			}
		}
		sql += ") LIMIT ?,?";
		sql2 += ")";
		stmt = conn.prepareStatement(sql);
		stmt2 = conn.prepareStatement(sql2);
		// ?에 값 대입
		for(int i=0; i< intCkMonth.length ; i += 1) {
			stmt.setInt(i+1, intCkMonth[i]);
			stmt2.setInt(i+1, intCkMonth[i]);
		}
		stmt.setInt(intCkMonth.length+1,startRow);
		stmt.setInt(intCkMonth.length+2,rowPerPage);
	} else {
		// sql 전송
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender, hire_date hireDate FROM employees LIMIT ?,?";
		stmt = conn.prepareStatement(sql);
		stmt.setInt(1,startRow);
		stmt.setInt(2,rowPerPage);
		sql2 = "SELECT COUNT(*) FROM employees";
		stmt2 = conn.prepareStatement(sql2);
	}
	// 전송한 sql 디버깅
	System.out.println(PUPPLE+" "+BG_CYAN+stmt + " <-- lastEmpList stmt"+RESET);
	System.out.println(PUPPLE+" "+BG_CYAN+stmt2 + " <-- lastEmpList stmt2"+RESET);
	
	// sql 전송해서 실행한 결과값
	ResultSet rs = stmt.executeQuery();
	ResultSet rs2 = stmt2.executeQuery();
	
	// 일반적인 자료구조모델로 변경(ResultSet --> ArrayList) 
	ArrayList<Employees> empList = new ArrayList<Employees>();
	while(rs.next()){								// rs.next()가 가리키는 데이터가 있으면(true이면)
		Employees e = new Employees();				// Employees 객체 생성
		e.empNo = rs.getInt("empNo");				// rs가 가르키는 데이터를 객체에 저장
		e.birthDate = rs.getString("birthDate");
		e.firstName = rs.getString("firstName");
		e.lastName = rs.getString("lastName");
		e.gender = rs.getString("gender");
		e.hireDate = rs.getString("hireDate");
		empList.add(e);								// 객체를 ArrayList에 추가
	}
	
	// 전체 행의 수
	int totalRow = 0;
	if(rs2.next()){
		totalRow = rs2.getInt("count(*)");
	}
	// 마지막 페이지 = 전체 행의 수 / 페이지당 출력 행의 수
	int lastPage = totalRow / rowPerPage;
	// 전체 행의 수 / 페이지당 출력 행의 수가 나눠 떨어지지 않는다면 페이지 수 + 1 
	if(totalRow % rowPerPage != 0){
		lastPage = lastPage + 1;
	}
	// 페이지 넘길 때 체크된 월을 넘기기 위한 문자열
	String hrefs = "";
	if(intCkMonth != null){	// intCkMonth이 null이 아니면
		for(int i=0; i< intCkMonth.length ; i += 1) {
			hrefs += "&ckMonth=" + intCkMonth[i];
		}
	}
	// 변수값 디버깅 
	System.out.println(PUPPLE+" "+BG_CYAN+totalRow + " <-- lastEmpList totalRow"+RESET);
	System.out.println(PUPPLE+" "+BG_CYAN+lastPage + " <-- lastEmpList lastPage"+RESET);
	System.out.println(PUPPLE+" "+BG_CYAN+hrefs + " <-- lastEmpList hrefs"+RESET);
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>lastEmpList</title>
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
	
	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
	<div class="container">
		<h1>직원 리스트</h1>
		<table class="table table-bordered">
			<tr>
				<th class="table-dark">번호</th>
				<th class="table-dark">생년월일</th>
				<th class="table-dark">이름</th>
				<th class="table-dark"></th>
				<th class="table-dark">성별</th>
				<th class="table-dark">고용일</th>
			</tr>
			<%
				for(Employees e : empList) {
			%>
					<tr>
						<td><%=e.empNo %></td>
						<td><%=e.birthDate %></td>
						<td><%=e.firstName %></td>
						<td><%=e.lastName %></td>
						<td><%=e.gender %></td>
						<td><%=e.hireDate %></td>
					</tr>
			<%	
				}
			%>
		</table>
		<form action="./lastEmpList.jsp" method="get">
		<%
			// 1월 ~ 12월
			// 체크 검사용 boolean 배열
			boolean[] checked = {false, false, false, false, false, false, false, false, false, false, false, false};
			int[] months = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
			for(int m : months) {
				if(intCkMonth != null) {
					// 체크한 월이면 true 대입
					for(int i : intCkMonth) {
						if(i == m) {
							checked[i-1] = true;
						}
					}
				}
				// ture이면 체크
				if (checked[m-1] == true) {
		%>
					<input type="checkbox" name="ckMonth" value="<%=m%>" checked="checked"> <%=m%>월
		<%	
				} else {
		%>
					<input type="checkbox" name="ckMonth" value="<%=m%>"> <%=m%>월
		<%			
				}		
			}
		%>
			<button type="submit">검색</button>
		</form>
		<%
			// 현재 페이지가 2 이상일 때 이전 화살표 표시 
			if(currentPage > 1) {
		%>
				<a href="./lastEmpList.jsp.jsp?currentPage=<%=currentPage-1%><%=hrefs%>"><image src="./img/왼쪽화살표.png"></a>
		<%	
			}
		%>
			<%=currentPage%>
		<%
			// 현재 페이지가 마지막 페이지보다 작을 때 다음 화살표 표시 
			if(currentPage < lastPage){
		%>
				<a href="./lastEmpList.jsp?currentPage=<%=currentPage+1%><%=hrefs%>"><image src="./img/오른쪽화살표.png"></a>
		<%	
			}
		%>
	</div>
</body>
</html>

결과화면

0개의 댓글