[구디아카데미][IT국비지원][TIL] 직원 리스트

Seokhyun Jeong·2023년 4월 26일
0

과제

목록 보기
15/19
post-thumbnail

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

코드

empList.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="emp.*" %>
<%
	// 현재 페이지
	int currentPage = 1;
	// 요청된 현재 페이지 값 유효성 검사
	if(request.getParameter("currentPage") != null) {							// 요청된 현재 페이지 값이 null이 아니면
		currentPage = Integer.parseInt(request.getParameter("currentPage"));	// 요청된 현재 페이지 값을 현재 페이지 변수에 저장
	}
	// 디버깅(현재 페이지 확인)
	System.out.println(currentPage + "<--currentPage"); 
	// 페이지당 출력 행의 수
	int rowPerPage = 10;
	// 시작 행 번호
	int startRow = 0 + (currentPage-1) * rowPerPage;
	
	//request 인코딩 설정
	request.setCharacterEncoding("utf-8");

	//드라이버 로딩
	Class.forName("org.mariadb.jdbc.Driver");
	// DB 접속
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees", "root", "java1234");
	// employees 테이블에 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
	String sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees LIMIT ?, ?;";
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, startRow); // 1번째 ? = startRow
	stmt.setInt(2, rowPerPage);  // 2번째 ? = rowPerPage
	// 디버깅(sql 확인)
	System.out.println(stmt + " <-- empList sql");
	// sql을 전송한 결과값
	ResultSet rs = stmt.executeQuery();
	
	// ResultSet --> ArrayList
	ArrayList<Employees> empList = new ArrayList<Employees>();
	while(rs.next()){
		Employees e = new Employees();
		e.empNo = rs.getInt("empNo");
		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);
	}
	
	// 마지막 페이지
	// emoloyees 테이블의 데이터의 개수(행의 수)를 구하는 sql 전송
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	// sql을 전송한 결과 값
	ResultSet rs2 = stmt2.executeQuery();
	// 전체 행의 수
	int totalRow = 0;
	if(rs2.next()){
		totalRow = rs2.getInt("count(*)");
	}
	// 마지막 페이지 = 전체 행의 수 / 페이지당 출력 행의 수
	int lastPage = totalRow / rowPerPage;
	// 전체 행의 수 / 페이지당 출력 행의 수가 나눠 떨어지지 않는다면 페이지 수 + 1 
	if(totalRow % rowPerPage != 0){
		lastPage = lastPage + 1;
	}
	
	// 현재 날짜
	Calendar today = Calendar.getInstance();
	int year = today.get(Calendar.YEAR);
	int month = today.get(Calendar.MONTH);
	int day = today.get(Calendar.DATE);
	System.out.println(year + " <-- empList year");
	System.out.println(month + " <-- empList month");
	System.out.println(day + " <-- empList day");
	
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empList</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>
		<form action="" method="post">
			<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>
							<%
								// String birthDate를 년, 월, 일로 쪼개서 int로 변환
								int birthYear = Integer.parseInt(e.birthDate.substring(0, 4));
								int birthMonth = Integer.parseInt(e.birthDate.substring(5, 7));
								int birthDay = Integer.parseInt(e.birthDate.substring(8));
								// 나이 = 현재 년도 - 태어난 년도
								int age = year - birthYear;
								// 현재 월, 일이 태어난 월, 일을 지났으면 나이 + 1 
								if(month > birthMonth && day > birthDay) {
							%>
									<td><%=age + 1 %></td>
							<%	
								} else {
							%>
									<td><%=age %></td>
							<%	
								}
							%>
							<td><%=e.firstName %></td>
							<td><%=e.lastName %></td>
							<td><image src="./img/<%=e.gender %>.png" width="50" height="50"></td>
							<td><%=e.hireDate %></td>
						</tr>
				<%			
					}
				%>
			</table>
		</form>
		<%
			// 현재 페이지가 2 이상일 때 이전 화살표 표시 
			if(currentPage > 1) {
		%>
				<a href="./empList.jsp?currentPage=<%=currentPage-1%>"><image src="./img/왼쪽화살표.png"></a>
		<%	
			}
		%>
			<%=currentPage%>
		<%
			// 현재 페이지가 마지막 페이지보다 작을 때 다음 화살표 표시 
			if(currentPage < lastPage){
		%>
				<a href="./empList.jsp?currentPage=<%=currentPage+1%>"><image src="./img/오른쪽화살표.png"></a>
		<%	
			}
		%>
	</div>
</body>
</html>

정렬 기능 추가

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="vo.*" %>
<%
	// 현재 페이지
	int currentPage = 1;
	// 요청된 현재 페이지 값 유효성 검사
	if(request.getParameter("currentPage") != null) {							// 요청된 현재 페이지 값이 null이 아니면
		currentPage = Integer.parseInt(request.getParameter("currentPage"));	// 요청된 현재 페이지 값을 현재 페이지 변수에 저장
	}
	// 디버깅(현재 페이지 확인)
	System.out.println(currentPage + "<--currentPage"); 
	// 페이지당 출력 행의 수
	int rowPerPage = 10;
	// 시작 행 번호
	int startRow = 0 + (currentPage-1) * rowPerPage;
	
	//request 인코딩 설정
	request.setCharacterEncoding("utf-8");

	//드라이버 로딩
	Class.forName("org.mariadb.jdbc.Driver");
	// DB 접속
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees", "root", "java1234");
	
	// 정렬하기
	String col = "emp_no";
	String ascDesc = "ASC";
	if(request.getParameter("col") != null 
			&& request.getParameter("ascDesc") != null) {
		col = request.getParameter("col");
		ascDesc = request.getParameter("ascDesc");
	}
	
	// employees 테이블에 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
	String sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees ORDER BY " + col + " " + ascDesc +" LIMIT ?, ?;"; 
	PreparedStatement stmt = conn.prepareStatement(sql);
	stmt.setInt(1, startRow); // 1번째 ? = startRow
	stmt.setInt(2, rowPerPage);  // 2번째 ? = rowPerPage
	// 디버깅(sql 확인)
	System.out.println(stmt + " <-- empList sql");
	// sql을 전송한 결과값
	ResultSet rs = stmt.executeQuery();
	
	// ResultSet --> ArrayList
	ArrayList<Employees> empList = new ArrayList<Employees>();
	while(rs.next()){
		Employees e = new Employees();
		e.empNo = rs.getInt("empNo");
		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);
	}
	
	// 마지막 페이지
	// emoloyees 테이블의 데이터의 개수(행의 수)를 구하는 sql 전송
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	// sql을 전송한 결과 값
	ResultSet rs2 = stmt2.executeQuery();
	// 전체 행의 수
	int totalRow = 0;
	if(rs2.next()){
		totalRow = rs2.getInt("count(*)");
	}
	// 마지막 페이지 = 전체 행의 수 / 페이지당 출력 행의 수
	int lastPage = totalRow / rowPerPage;
	// 전체 행의 수 / 페이지당 출력 행의 수가 나눠 떨어지지 않는다면 페이지 수 + 1 
	if(totalRow % rowPerPage != 0){
		lastPage = lastPage + 1;
	}
	
	// 현재 날짜
	Calendar today = Calendar.getInstance();
	int year = today.get(Calendar.YEAR);
	int month = today.get(Calendar.MONTH);
	int day = today.get(Calendar.DATE);
	System.out.println(year + " <-- empList year");
	System.out.println(month + " <-- empList month");
	System.out.println(day + " <-- empList day");
	
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empList</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>
		<form action="" method="post">
			<table class="table table-bordered">
				<tr>
					<th class="table-dark">
						번호
						<a href="./empList.jsp?col=emp_no&ascDesc=ASC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=emp_no&ascDesc=DESC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
					<th class="table-dark">
						나이
						<a href="./empList.jsp?col=birth_date&ascDesc=DESC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=birth_date&ascDesc=ASC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
					<th class="table-dark">
						이름
						<a href="./empList.jsp?col=first_name&ascDesc=ASC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=first_name&ascDesc=DESC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
					<th class="table-dark"><a href="./empList.jsp?col=last_name&ascDesc=ASC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=last_name&ascDesc=DESC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
					<th class="table-dark">
						성별
						<a href="./empList.jsp?col=gender&ascDesc=ASC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=gender&ascDesc=DESC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
					<th class="table-dark">
						고용일
						<a href="./empList.jsp?col=hire_Date&ascDesc=ASC"><image src="./img/위쪽화살표.png" class="rounded"></a>
						<a href="./empList.jsp?col=hire_Date&ascDesc=DESC"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					</th>
				</tr>
				<%
					for(Employees e : empList) {
				%>
						<tr>
							<td><%=e.empNo %></td>
							<%
								// String birthDate를 년, 월, 일로 쪼개서 int로 변환
								int birthYear = Integer.parseInt(e.birthDate.substring(0, 4));
								int birthMonth = Integer.parseInt(e.birthDate.substring(5, 7));
								int birthDay = Integer.parseInt(e.birthDate.substring(8));
								// 나이 = 현재 년도 - 태어난 년도
								int age = year - birthYear;
								// 현재 월, 일이 태어난 월, 일을 지났으면 나이 + 1 
								if(month > birthMonth && day > birthDay) {
							%>
									<td><%=age + 1 %></td>
							<%	
								} else {
							%>
									<td><%=age %></td>
							<%	
								}
							%>
							<td><%=e.firstName %></td>
							<td><%=e.lastName %></td>
							<td><image src="./img/<%=e.gender %>.png" width="50" height="50"></td>
							<td><%=e.hireDate %></td>
						</tr>
				<%			
					}
				%>
			</table>
		</form>
		<%
			// 현재 페이지가 2 이상일 때 이전 화살표 표시 
			if(currentPage > 1) {
		%>
				<a href="./empList.jsp?currentPage=<%=currentPage-1%>&col=<%=col%>&ascDesc=<%=ascDesc%>"><image src="./img/왼쪽화살표.png"></a>
		<%	
			}
		%>
			<%=currentPage%>
		<%
			// 현재 페이지가 마지막 페이지보다 작을 때 다음 화살표 표시 
			if(currentPage < lastPage){
		%>
				<a href="./empList.jsp?currentPage=<%=currentPage+1%>&col=<%=col%>&ascDesc=<%=ascDesc%>"><image src="./img/오른쪽화살표.png"></a>
		<%	
			}
		%>
	</div>
</body>
</html>

성별 검색 기능 추가

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="vo.*" %>
<%
	// 현재 페이지
	int currentPage = 1;
	// 요청된 현재 페이지 값 유효성 검사
	if(request.getParameter("currentPage") != null) {							// 요청된 현재 페이지 값이 null이 아니면
		currentPage = Integer.parseInt(request.getParameter("currentPage"));	// 요청된 현재 페이지 값을 현재 페이지 변수에 저장
	}
	// 디버깅(현재 페이지 확인)
	System.out.println(currentPage + "<--currentPage"); 
	// 페이지당 출력 행의 수
	int rowPerPage = 10;
	// 시작 행 번호
	int startRow = 0 + (currentPage-1) * rowPerPage;
	
	// 요청값 gender 유효성 검사
	String gender = "";
	if(request.getParameter("gender") != null) {
		gender = request.getParameter("gender");
	}

	//request 인코딩 설정
	request.setCharacterEncoding("utf-8");

	//드라이버 로딩
	Class.forName("org.mariadb.jdbc.Driver");
	// DB 접속
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees", "root", "java1234");
	
	String sql = null;
	PreparedStatement stmt = null;
	
	// 성별로 검색하기
	if (gender.equals("")) {									// 성별을 선택하지 않으면
		// employees 테이블에 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees LIMIT ?, ?;";
		stmt = conn.prepareStatement(sql);
		stmt.setInt(1, startRow); // 1번째 ? = startRow
		stmt.setInt(2, rowPerPage);  // 2번째 ? = rowPerPage
	} else if(gender.equals("M") || gender.equals("F")) {		// 성별을 선택하면
		// employees 테이블에 gender와 성별이 같은 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
		sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees WHERE gender=? LIMIT ?, ?;";
		stmt = conn.prepareStatement(sql);
		stmt.setString(1, gender); // 1번째 ? = gender
		stmt.setInt(2, startRow); // 2번째 ? = startRow
		stmt.setInt(3, rowPerPage);  // 3번째 ? = rowPerPage
	}
	
	// 디버깅(sql 확인)
	System.out.println(stmt + " <-- empList sql");
	// sql을 전송한 결과값
	ResultSet rs = stmt.executeQuery();
	
	// ResultSet --> ArrayList
	ArrayList<Employees> empList = new ArrayList<Employees>();
	while(rs.next()){
		Employees e = new Employees();
		e.empNo = rs.getInt("empNo");
		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);
	}
	
	// 마지막 페이지
	// emoloyees 테이블의 데이터의 개수(행의 수)를 구하는 sql 전송
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	// sql을 전송한 결과 값
	ResultSet rs2 = stmt2.executeQuery();
	// 전체 행의 수
	int totalRow = 0;
	if(rs2.next()){
		totalRow = rs2.getInt("count(*)");
	}
	// 마지막 페이지 = 전체 행의 수 / 페이지당 출력 행의 수
	int lastPage = totalRow / rowPerPage;
	// 전체 행의 수 / 페이지당 출력 행의 수가 나눠 떨어지지 않는다면 페이지 수 + 1 
	if(totalRow % rowPerPage != 0){
		lastPage = lastPage + 1;
	}
	
	// 현재 날짜
	Calendar today = Calendar.getInstance();
	int year = today.get(Calendar.YEAR);
	int month = today.get(Calendar.MONTH);
	int day = today.get(Calendar.DATE);
	System.out.println(year + " <-- empList year");
	System.out.println(month + " <-- empList month");
	System.out.println(day + " <-- empList day");
	
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empList</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>
		<form action="./empList2.jsp" method="get">
			<div class="row">
	  			<div class="col-sm-10"></div>
			  		<div class="col-sm-2" style="text-align: right;">
			  			<select name="gender">
							<option value="">성별선택</option>
							<option value="M"></option>
							<option value="F"></option>
						</select>
					<button type="submit">성별선택</button>
			  		</div>
				</div>
			<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>
							<%
								// String birthDate를 년, 월, 일로 쪼개서 int로 변환
								int birthYear = Integer.parseInt(e.birthDate.substring(0, 4));
								int birthMonth = Integer.parseInt(e.birthDate.substring(5, 7));
								int birthDay = Integer.parseInt(e.birthDate.substring(8));
								// 나이 = 현재 년도 - 태어난 년도
								int age = year - birthYear;
								// 현재 월, 일이 태어난 월, 일을 지났으면 나이 + 1 
								if(month > birthMonth && day > birthDay) {
							%>
									<td><%=age + 1 %></td>
							<%	
								} else {
							%>
									<td><%=age %></td>
							<%	
								}
							%>
							<td><%=e.firstName %></td>
							<td><%=e.lastName %></td>
							<td><image src="./img/<%=e.gender %>.png" width="50" height="50"></td>
							<td><%=e.hireDate %></td>
						</tr>
				<%			
					}
				%>
			</table>
		</form>
		<%
			// 현재 페이지가 2 이상일 때 이전 화살표 표시 
			if(currentPage > 1) {
		%>
				<a href="./empList2.jsp?currentPage=<%=currentPage-1%>&gender=<%=gender %>"><image src="./img/왼쪽화살표.png"></a>
		<%	
			}
		%>
			<%=currentPage%>
		<%
			// 현재 페이지가 마지막 페이지보다 작을 때 다음 화살표 표시 
			if(currentPage < lastPage){
		%>
				<a href="./empList2.jsp?currentPage=<%=currentPage+1%>&gender=<%=gender %>"><image src="./img/오른쪽화살표.png"></a>
		<%	
			}
		%>
	</div>
</body>
</html>

정렬 기능과 성별 검색 기능 합치기

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<%@ page import="java.util.*" %>
<%@ page import="vo.*" %>
<%
	// 현재 페이지
	int currentPage = 1;
	// 요청된 현재 페이지 값 유효성 검사
	if(request.getParameter("currentPage") != null) {							// 요청된 현재 페이지 값이 null이 아니면
		currentPage = Integer.parseInt(request.getParameter("currentPage"));	// 요청된 현재 페이지 값을 현재 페이지 변수에 저장
	}
	// 디버깅(현재 페이지 확인)
	System.out.println(currentPage + "<--currentPage"); 
	// 페이지당 출력 행의 수
	int rowPerPage = 10;
	// 시작 행 번호
	int startRow = 0 + (currentPage-1) * rowPerPage;
	
	// 요청값 gender 유효성 검사
	String gender = "";
	if(request.getParameter("gender") != null) {
		gender = request.getParameter("gender");
	}

	//request 인코딩 설정
	request.setCharacterEncoding("utf-8");

	//드라이버 로딩
	Class.forName("org.mariadb.jdbc.Driver");
	// DB 접속
	Connection conn = DriverManager.getConnection("jdbc:mariadb://127.0.0.1:3306/employees", "root", "java1234");
	
	String sql = null;
	PreparedStatement stmt = null;
	// 열별로 정렬하기 위한 변수
	String col = "emp_no";
	String ascDesc = "ASC";
	
	// 정렬 및 성별 검색
	if (gender.equals("")) {									// 성별을 선택하지 않았고
		if(request.getParameter("col") != null 					// 정렬을 선택했다면
				&& request.getParameter("ascDesc") != null) {
			col = request.getParameter("col");
			ascDesc = request.getParameter("ascDesc");
			// employees 테이블에 startRow 번째부터 rowPerPage 개의 데이터를 정렬하여 조회하는 sql 전송
			sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees ORDER BY " + col + " " + ascDesc +" LIMIT ?, ?;";
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, startRow); // 1번째 ? = startRow
			stmt.setInt(2, rowPerPage);  // 2번째 ? = rowPerPage
		} else {												// 정렬은 선택하지 않았다면
			// employees 테이블에 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
			sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees LIMIT ?, ?;";
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, startRow); // 1번째 ? = startRow
			stmt.setInt(2, rowPerPage);  // 2번째 ? = rowPerPage
		}
	} else if(gender.equals("M") || gender.equals("F")) {		// 성별을 선택하고
		if(request.getParameter("col") != null 					// 정렬을 선택했다면
				&& request.getParameter("ascDesc") != null) {
			col = request.getParameter("col");
			ascDesc = request.getParameter("ascDesc");
			// employees 테이블에 gender와 성별이 같은 startRow 번째부터 rowPerPage 개의 데이터를 정렬하여 조회하는 sql 전송
			sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees WHERE gender=? ORDER BY " + col + " " + ascDesc +" LIMIT ?, ?;";
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, gender); // 1번째 ? = gender
			stmt.setInt(2, startRow); // 2번째 ? = startRow
			stmt.setInt(3, rowPerPage);  // 3번째 ? = rowPerPage
		} else {												// 정렬은 선택하지 않았다면
			// employees 테이블에 gender와 성별이 같은 startRow 번째부터 rowPerPage 개의 데이터를 조회하는 sql 전송
			sql = "SELECT emp_no empNo, birth_date birthDate, first_name firstName, last_name lastName, gender gender, hire_date hireDate FROM employees WHERE gender=? LIMIT ?, ?;";
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, gender); // 1번째 ? = gender
			stmt.setInt(2, startRow); // 2번째 ? = startRow
			stmt.setInt(3, rowPerPage);  // 3번째 ? = rowPerPage
		}
	}
	
	// 디버깅(sql 확인)
	System.out.println(stmt + " <-- empList sql");
	// sql을 전송한 결과값
	ResultSet rs = stmt.executeQuery();
	
	// ResultSet --> ArrayList
	ArrayList<Employees> empList = new ArrayList<Employees>();
	while(rs.next()){
		Employees e = new Employees();
		e.empNo = rs.getInt("empNo");
		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);
	}
	
	// 마지막 페이지
	// emoloyees 테이블의 데이터의 개수(행의 수)를 구하는 sql 전송
	String sql2 = "SELECT count(*) FROM employees";
	PreparedStatement stmt2 = conn.prepareStatement(sql2);
	// sql을 전송한 결과 값
	ResultSet rs2 = stmt2.executeQuery();
	// 전체 행의 수
	int totalRow = 0;
	if(rs2.next()){
		totalRow = rs2.getInt("count(*)");
	}
	// 마지막 페이지 = 전체 행의 수 / 페이지당 출력 행의 수
	int lastPage = totalRow / rowPerPage;
	// 전체 행의 수 / 페이지당 출력 행의 수가 나눠 떨어지지 않는다면 페이지 수 + 1 
	if(totalRow % rowPerPage != 0){
		lastPage = lastPage + 1;
	}
	
	// 현재 날짜
	Calendar today = Calendar.getInstance();
	int year = today.get(Calendar.YEAR);
	int month = today.get(Calendar.MONTH);
	int day = today.get(Calendar.DATE);
	System.out.println(year + " <-- empList year");
	System.out.println(month + " <-- empList month");
	System.out.println(day + " <-- empList day");
	
	
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>empList</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>
		<form action="./empList3.jsp" method="get">
			<div class="row">
	  			<div class="col-sm-10"></div>
			  		<div class="col-sm-2" style="text-align: right;">
			  			<select name="gender">
							<option value="">성별선택</option>
							<option value="M"></option>
							<option value="F"></option>
						</select>
					<button type="submit">성별선택</button>
			  		</div>
				</div>
			<table class="table table-bordered">
				<tr>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8">번호</div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=emp_no&ascDesc=ASC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=emp_no&ascDesc=DESC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8">나이</div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=birth_date&ascDesc=DESC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=birth_date&ascDesc=ASC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8">이름</div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=first_name&ascDesc=ASC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=first_name&ascDesc=DESC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8"></div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=last_name&ascDesc=ASC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=last_name&ascDesc=DESC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8">성별</div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=gender&ascDesc=ASC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=gender&ascDesc=DESC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
					<th class="table-dark">
						<div class="row">
				 			<div class="col-sm-8">고용일</div>
					  		<div class="col-sm-4" style="text-align: right;">
					  			<a href="./empList3.jsp?col=hire_Date&ascDesc=ASC&gender=<%=gender %>"><image src="./img/위쪽화살표.png" class="rounded"></a>
								<a href="./empList3.jsp?col=hire_Date&ascDesc=DESC&gender=<%=gender %>"><image src="./img/아래쪽화살표.png" class="rounded"></a>
					  		</div>
						</div>
					</th>
				</tr>
				<%
					for(Employees e : empList) {
				%>
						<tr>
							<td><%=e.empNo %></td>
							<%
								// String birthDate를 년, 월, 일로 쪼개서 int로 변환
								int birthYear = Integer.parseInt(e.birthDate.substring(0, 4));
								int birthMonth = Integer.parseInt(e.birthDate.substring(5, 7));
								int birthDay = Integer.parseInt(e.birthDate.substring(8));
								// 나이 = 현재 년도 - 태어난 년도
								int age = year - birthYear;
								// 현재 월, 일이 태어난 월, 일을 지났으면 나이 + 1 
								if(month > birthMonth && day > birthDay) {
							%>
									<td><%=age + 1 %></td>
							<%	
								} else {
							%>
									<td><%=age %></td>
							<%	
								}
							%>
							<td><%=e.firstName %></td>
							<td><%=e.lastName %></td>
							<td><image src="./img/<%=e.gender %>.png" width="50" height="50"></td>
							<td><%=e.hireDate %></td>
						</tr>
				<%			
					}
				%>
			</table>
		</form>
		<%
			// 현재 페이지가 2 이상일 때 이전 화살표 표시 
			if(currentPage > 1) {
		%>
				<a href="./empList3.jsp?currentPage=<%=currentPage-1%>&col=<%=col%>&ascDesc=<%=ascDesc%>&gender=<%=gender %>"><image src="./img/왼쪽화살표.png"></a>
		<%	
			}
		%>
			<%=currentPage%>
		<%
			// 현재 페이지가 마지막 페이지보다 작을 때 다음 화살표 표시 
			if(currentPage < lastPage){
		%>
				<a href="./empList3.jsp?currentPage=<%=currentPage+1%>&col=<%=col%>&ascDesc=<%=ascDesc%>&gender=<%=gender %>"><image src="./img/오른쪽화살표.png"></a>
		<%	
			}
		%>
	</div>
</body>
</html>

결과화면

정렬 기능 추가

성별 검색 기능 추가

정렬 기능과 성별 검색 기능 합치기

0개의 댓글