[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>