[구디아카데미][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>