[JSP & Servlet]/[개념 정리] - JSP & Servlet

[JSP & Servlet] 처음부터 재작성 복습 ② - Retry2SendAndReceive07

Jelly-fish 2023. 12. 12. 09:08

 

 

Retry2SendAndReceive07.jsp

 

<%@page import="java.util.Calendar"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<% 
	Calendar cal = Calendar.getInstance();
	
	// 사용자가 선택한 연, 월을 저장할 변수 선언
	int selectYear, selectMonth;


	// 현재 날짜 받아오기
	int nowYear = cal.get(Calendar.YEAR);
	int nowMonth = cal.get(Calendar.MONTH)+1;
	int nowDay = cal.get(Calendar.DATE);
	
	
	// 사용자가 선택한 연, 월 변수의 초기값을 현재 날짜로 설정.
	
	selectYear = nowYear;
	selectMonth = nowMonth;
	
	
	// 사용자 선택 값(select 객체를 통해 선택한 값)을 받아오기.
	
	String strYear = request.getParameter("year");
	String strMonth = request.getParameter("month");
	
	// 만약, 사용자가 선택한 값이 null이 아니라면(선택값 존재)
	// selectYear, selectMonth의 값을 사용자 선택값으로 덮어쓰기
	
	if (strYear!=null || strMonth != null)
	{
		selectYear = Integer.parseInt(strYear);
		selectMonth = Integer.parseInt(strMonth);
	}
	
	System.out.println("selectYear : " + selectYear);
	System.out.println("selectMonth : " + selectMonth);
	
	// 옵션 값을 구성하기.
	// (선택 연도-10년) ~ 선택 연도 ~ (선택연도+10년)
	
	String yearOptions = "";
	
	for (int i = selectYear-10 ; i <= selectYear+10; i++)
	{
		// 사용자 선택값이 없고, 옵션년도 i의 값이 현재 날짜일 때 디폴트 값으로 설정
		if (strYear==null && i==nowYear)
		{
			yearOptions += "<option value='" + i + "' selected='selected'>" + i + "</option>";
		}
		// 사용자 선택값이 있고, 옵션년도 i의 값이 사용자 선택 값일 때 selected 속성 설정
		else if (strYear!=null && i==selectYear)
		{
			yearOptions += "<option value='" + i + "' selected='selected'>" + i + "</option>";
		}
		// 위의 두 조건에 해당하지 않을 경우, 초기값이 아니거나 사용자가 선택하지 않은 값임.
		else
		{
			yearOptions += "<option value='" + i + "'>" + i + "</option>";
		}
	}

	// 옵션 값을 구성하기.
	// 1월 ~ 12월 (현재 날짜에 해당하는 월을 기본 디폴트값으로 설정.)
	
	String monthOptions = "";
	
	for (int m = 1; m <= 12; m++)
	{
		// 사용자 선택값이 없고, 옵션 월이 현재 날짜일 때 디폴트 값으로 설정
		if (strMonth==null && m==nowMonth)
		{
			monthOptions += "<option value='" + m + "' selected='selected'>" + m + "</option>";	
		}
		
		// 사용자 선택값이 있고, 옵션 월이 사용자 선택 값일 때 selected 속성 설정
		
		else if (strMonth!=null && m==selectMonth)
		{
			monthOptions += "<option value='" + m + "' selected='selected'>" + m + "</option>";	
		}
		// 위의 두 조건에 해당하지 않을 경우, 초기값이 아니거나 사용자가 선택하지 않은 값임.
		else
		{
			monthOptions += "<option value='" + m + "'>" + m + "</option>";
		}
	}
	
	
	// 달력 그리기
	
	// 총 일수 구하기, 요일 구하기, 해당 월의 마지막 날짜 구하기
	
	// 이전 년도까지의 일수
	int totYearDay = (selectYear-1)*365 + (selectYear-1)/4 - (selectYear-1)/100 + (selectYear-1)/400;
	
	// 올해의 월 일수
	int[] monthArr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	
	if (selectYear%4==0 && selectYear%100!=0 || selectYear%400==0)
		monthArr[1] = 29;
	
	int totMonthDay = 0;
	for (int i = 0; i < selectMonth-1; i++)
	{
		totMonthDay += monthArr[i];
	}
	
	// 총 일수 구하기
	int totDay = totYearDay + totMonthDay;
	// 요일 구하기
	int dayOfWeek = totDay % 7;
	// 해당 월의 마지막 날짜 구하기
	int lastDay = monthArr[selectMonth-1];
	
	
	
	// 요일 행 만들기
	
	String tableStr = "";
	
	String[] yoilArr = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
	
	tableStr += "<table border='1'>";
	
	tableStr += "<tr>";
	for (int i = 0; i < 7; i++)
	{
		if (i == 0)
			tableStr += "<th style='color: red;'>" + yoilArr[i] + "</th>";
		else if (i == 6)
			tableStr += "<th style='color: blue;'>" + yoilArr[i] + "</th>";
		else
			tableStr += "<th>" + yoilArr[i] + "</th>";
	}
	
	tableStr += "</tr>";
	
	// 공백 찍기
	
	tableStr += "<tr>";
	for (int i = 0; i<dayOfWeek; i++)
	{
		tableStr += "<td></td>";
	}
	
	for (int d = 1; d<lastDay; d++)
	{
		dayOfWeek++;
		
		if  (selectYear==nowYear && selectMonth==nowMonth && d==nowDay && dayOfWeek%7==0)
		{
			tableStr += "<td style='color: blue;'>" + d + "</td>";
		}
		else if  (selectYear==nowYear && selectMonth==nowMonth && d==nowDay && dayOfWeek%7==1)
		{
			tableStr += "<td style='color: red;'>" + d + "</td>";
		}
		else if (selectYear==nowYear && selectMonth==nowMonth && d == nowDay)
		{
			tableStr += "<td style='background-color: orange;'>" + d + "</td>";
		}
		else if (dayOfWeek % 7 == 0)
		{
			tableStr += "<td style='color: blue'>" + d + "</td>";
		}
		else if (dayOfWeek % 7 == 1)
		{
			tableStr += "<td style='color: red'>" + d + "</td>";
		}
		else
			tableStr += "<td>" + d + "</td>";
		
		if (dayOfWeek % 7 == 0)
		{
			tableStr += "</tr><tr>";
		}
		
	}
	// 일 출력하기 (+ 일요일마다 개행하기)
	
	// 남은 빈칸 채우기
	
	
	tableStr += "</table>";
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Retry2SendAndReceive07.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">

<script type="text/javascript">
	
	function calendarAction(obj)
	{
		obj.submit();
	}
	
</script>
</head>
<body>

<!-- 
	○ 데이터 송수신 실습 07
	
	   - 달력을 출력하는 JSP 페이지를 구성한다.
	   - 페이지 레이아웃은 연도와 월을 입력받아
	     화면에 출력해주는 형태의 페이지로 구성한다.
	   - 단, submit 버튼 없이 이벤트 처리를 할 수 있도록 한다.
	   - 전송한 내용을 스스로 수신해서 출력해주는 형태의 페이지로 구성한다.
	   - 연도 선택 기본 구성은 현재의 연도를 기준으로
	     이전 10년, 이후 10년 으로 구성한다.
	     (기본적으로 만년달력 형태로 구성하는데
	      현재의 연, 월은 달력 객체로부터 확인할 수 있도록 한다.)
	   - 월 선택 기본 구성은 1월 부터 12월 까지로 구성한다.
	   
	       2013
	        :
	     [ 2023 ▼ ] 년 [ 12 ▼] 월
	        :
	       2033
	       
	    --------------------------------
	    --------------------------------
	    --------------------------------
	    --------------------------------
	    
	 - 연도 select 나 월 select 의 내용이 변화되면
	   해당 연 월의 달력을 출력해주는 형태의 페이지로 구성한다.
	   
	 - 사용자 최초 요청 주소는
	   http://localhost:3306/WebApp07/SendAndReceive07.jsp 로 한다.

  ○ SendAndReceive07.jsp
  
-->

<div>
	<form action="" method="get">
		<select name="year" onchange="calendarAction(this.form)">
			<!-- 년도 옵션 넣을 부분 -->
			<%=yearOptions %>
		</select>년
		<select name="month" onchange="calendarAction(this.form)">
			<!-- 월 옵션 넣을 부분 -->
			<%=monthOptions %>
		</select>월
	</form>
</div>

<div>
	결과 출력
	<%= tableStr %>
</div>


</body>
</html>