Everything has an expiration date
★★★★★[JSP & Servlet] 20231211 [프로그램소스] - SendAndReceive07, SendAndReceive08 본문
[JSP & Servlet]/Program source (JSP & Servlet)
★★★★★[JSP & Servlet] 20231211 [프로그램소스] - SendAndReceive07, SendAndReceive08
Jelly-fish 2023. 12. 11. 17:20WebApp07
01
SendAndReceive07.jsp
<%@page import="java.util.Calendar"%>
<%@ page contentType="text/html; charset=UTF-8"%>
<%
// 자기 자신 페이지로부터 데이터 수신
// → year, month
String sYear = request.getParameter("year");
String sMonth = request.getParameter("month");
// ⓐ Calendar 객체 생성
Calendar cal = Calendar.getInstance();
// ⓑ import 구문 없이 작성하는 법.
// java.util.Calendar cal = java.util.Calendar.getInstance();
//Calendar cal = Calendar.getInstance();
// 현재 년, 월, 일 확인
int nowYear = cal.get(Calendar.YEAR); //-- 2023
int nowMonth = cal.get(Calendar.MONTH)+1; //-- 12
int nowDay = cal.get(Calendar.DAY_OF_MONTH); //-- 11
// 표시할 달력의 년, 월 구성 → 페이지 최초 요청을 감안한 코드
int selectYear = nowYear;
int selectMonth = nowMonth;
// 페이지에 대한 요청이 최초 요청이 아닐 경우
// → Line 6 ~ 7 을 통해 수신한 데이터로 표시할 달력의 년, 월 구성
if (sYear != null || sMonth != null)
{
selectYear = Integer.parseInt(sYear);
selectMonth = Integer.parseInt(sMonth);
}
// 테스트
//out.print("<h1>selectYear : " + selectYear + "</h1>");
//out.print("<h1>selectMonth: " + selectMonth + "</h1>");
// 확인한 날짜로 년도 select option 구성
// <option value="2013">2013</option>
// <option value="2013">2013</option>
// <option value="2013">2013</option>
// :
// <option value="2013" selected="selected">2013</option>
// <option value="2031">2013</option>
// <option value="2032">2013</option>
// <option value="2033">2013</option>
String yOptions = "";
for (int year=(selectYear-10); year<=(selectYear+10); year++) // 2013 ~ 2023
{
// 관찰1.
// "<option value=" + 2013 + ">" + 2013 + "</option>"
// "<option value=2013>2013</option> (Ⅹ) → "2013" 따옴표가 없다!
// "<option value="2013">2013</option> (○)
//yOptions += "<option value='" + year + "'>" + year + "</option>";
// 관찰2.
//if (year==nowYear) //-- year가 현재 년도이면, 기본 선택값으로 설정.
// yOptions += "<option value='" + year + "' selected='selected'>" + year + "</option>";
//else
// yOptions += "<option value='" + year + "'>" + year + "</option>";
// 상황1. 페이지 최초 요청일 때. → sYear는 null / 현재 년도와 옵션이 같을 때 → selected(○)
// 상황2. 페이지 최초 요청이 아닐 때. → sYear는 null 아님 / 선택 년도와 옵션이 같을 때 → selected(○)
// 상황3. 나머지 → selected(Ⅹ)
if (sYear==null && year==nowYear)
yOptions += "<option value='" + year + "' selected='selected'>" + year + "</option>";
else if (sYear!=null && year==Integer.parseInt(sYear))
yOptions += "<option value='" + year + "' selected='selected'>" + year + "</option>";
else
yOptions += "<option value='" + year + "'>" + year + "</option>";
}
// 확인한 날짜로 월 select options 구성
// <option value="1">1</option>
// <option value="2">2</option>
// <option value="3">3</option>
// :
// <option value="12" selected="selected">12</option>
String mOptions = "";
for (int month=1; month<=12; month++) // 1 ~ 12
{
// 관찰1.
//mOptions += "<option value='" + month + "'>" + month + "</option>";
// 관찰2.
//if (month==nowMonth)
// mOptions += "<option value='" + month + "' selected='selected'>" + month + "</option>";
//else
// mOptions += "<option value='" + month + "'>" + month + "</option>";
// 상황1. 페이지 최초 요청일 때 → sMonth 는 null / 현재 월과 옵션이 같을 때 → selected(○)
// 상황2. 페이지 최초 요청 아닐 때 → sMonth 는 null 아님 / 선택 월과 옵션이 같을 때 → selected(○)
// 상황3. 나머지 → selected(Ⅹ)
if (sMonth==null && month==nowMonth)
mOptions += "<option value'" + month + "' selected='selected'>" + month + "</option>";
else if (sMonth!=null && month==Integer.parseInt(sMonth))
mOptions += "<option value'" + month + "' selected='selected'>" + month + "</option>";
else
mOptions += "<option value'" + month + "'>" + month + "</option>";
}
// 그려야 할 달력의 1일이 무슨 요일인지 확인 필요
// (만년 달력)
// 각자~!!!
/* int totYearDay = (nowYear-1) * 365 + (nowYear-1)/4 - (nowYear-1)/100 + (nowYear-1)/400;
int[] monthArr = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int totMonthDay = 0;
for (int i = 0; i < selectMonth-1; i++)
{
totMonthDay += monthArr[i];
}
int totDay = totYearDay + totMonthDay + 1;
int lastDay = monthArr[selectMonth-1];
// 0 : 일
// 1 : 월
// 2 : 화
// 3 : 수
// 4 : 목
// 5 : 금
// 6 : 토
// 실험용 출력~~
int dayOfWeek = totDay%7;
for (int i = 0; i < dayOfWeek; i++)
{
out.print("○");
}
for (int j = 1; j <= lastDay; j++)
{
out.print(j);
if ((dayOfWeek+j)%7 == 0)
out.print("<br>");
} */
// 각 달의 마지막 날짜 배열 구성
int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 윤년인지 평년인지 확인
if (selectYear%4==0 && selectYear%100!=0 || selectYear%400==0)
months[1] = 29;
// 총 날수를 저장할 변수 선언
int nalsu;
// 요일 항목 배열 구성
String[] weekNames = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
// 현재 년도 → 입력받은 년도 이전 년도까지의 날 수 계산
nalsu = (selectYear-1)*365 + (selectYear-1)/4 - (selectYear-1)/100 + (selectYear-1)/400;
// 현재 월 → 입력받은 월의 이전 월까지의 날 수 추가
for (int i = 0; i < selectMonth-1 ; i++)
nalsu += months[i];
nalsu++; // + 1
int week = nalsu % 7; //-- 요일 변수
int lastDay = months[selectMonth-1]; //-- 마지막 날짜 변수
//System.out.println(week);
//--==>> 5
// 달력 그리기 -----------------------------------------------------------
String calStr = "";
calStr += "<table border='1'>"; //-- start table
// 요일 이름 발생
calStr += "<tr>";
for (int i = 0; i < weekNames.length; i++)
{
if (i==0) //-- 일요일
calStr += "<th style='color:red;'>" + weekNames[i] + "</th>";
else if (i==6) //-- 토요일
calStr += "<th style='color:blue;'>" + weekNames[i] + "</th>";
else //-- 평일
calStr += "<th>" + weekNames[i] + "</th>";
}
calStr += "</tr>";
// 빈 칸 공백 td 발생
calStr += "<tr>";
for (int i = 1; i <= week; i++)
calStr += "<td></td>";
// 날짜 td 발생
for (int i = 1; i <= lastDay; i++)
{
week++; //-- 날짜가 하루씩 찍힐 때 마다(구성이 이루어질 때 마다)
// 요일도 함께 1씩 증가할 수 있도록 처리
//calStr += "<td>" + i + "</td>";
//=====================================================================
// [오늘 날짜에 맞게, 일 칸(day 칸)에 <td> 추가(class 부여)하기!!]
//=====================================================================
if (selectYear==nowYear && selectMonth==nowMonth && i==nowDay && week%7==0)
{
// 토요일인 오늘
calStr += "<td class='nowSat'>" + i + "</td>";
}
else if (selectYear==nowYear && selectMonth==nowMonth && i==nowDay && week%7==1)
{
// 일요일인 오늘
calStr += "<td class='nowSun'>" + i + "</td>";
}
else if (selectYear==nowYear && selectMonth==nowMonth && i==nowDay)
{
// 평일인 오늘
calStr += "<td class='now'>" + i + "</td>";
}
else if (week%7==0)
{
// 오늘이 아닌 토요일
calStr += "<td class='sat'>" + i + "</td>";
}
else if (week%7==1)
{
// 오늘이 아닌 일요일
calStr += "<td class='sun'>" + i + "</td>";
}
else
{
//[오늘이 아닌 평일에는 스타일을 입힐 필요가 없으므로]
//[클래스 속성을 추가해 주지 않았음.]
// 오늘이 아닌 평일
calStr += "<td>" + i + "</td>";
}
// 상황1. 오늘
if (week%7==0)
calStr += "</tr><tr>";
}
// 빈 칸 공백 td 발생
for (int i = 0; i <= week; i++, week++)
{
if (week%7==0)
break;
calStr += "<td></td>";
}
if (week%7!=0)
calStr += "</tr>";
calStr += "</table>"; //-- end table
// ------------------------------------------------------------ 달력 그리기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SendAndReceive07_1.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
td {text-align: right;}
td.sun {color: red;}
td.sat {color: blue;}
td.now {background-color: aqua; font-weight: bold;} /* 평일인 오늘 */
td.nowSat {background-color: aqua; font-weight: bold; color: blue;}; /* 토요일인 오늘 */
td.nowSun {background-color: aqua; font-weight: bold; color: red;}; /* 일요일인 오늘 */
</style>
<script type="text/javascript">
function formCalendar(obj)
{
// 유효성 검사가 필요할 경우 삽입할 수 있는 영역~!!!
// ...
obj.submit();
}
</script>
</head>
<body>
<div>
<h1>데이터 송수신 실습07</h1>
<hr>
</div>
<%--
<%=nowYear %>
<%=nowMonth %>
<%=nowDay %>
--%>
<!--
○ 데이터 송수신 실습 07
- 달력을 출력하는 JSP 페이지를 구성한다.
- 페이지 레이아웃은 연도와 월을 입력받아
화면에 출력해주는 형태의 페이지로 구성한다.
- 단, submit 버튼 없이 이벤트 처리를 할 수 있도록 한다.
- 전송한 내용을 스스로 수신해서 출력해주는 형태의 페이지로 구성한다.
- 연도 선택 기본 구성은 현재의 연도를 기준으로
이전 10년, 이후 10년 으로 구성한다.
(기본적으로 만년달력 형태로 구성하는데
현재의 연, 월은 달력 객체로부터 확인할 수 있도록 한다.)
- 월 선택 기본 구성은 1월 부터 12월 까지로 구성한다.
2013
:
[ 2023 ▼ ] 년 [ 12 ▼] 월
:
2033
--------------------------------
--------------------------------
--------------------------------
--------------------------------
- 연도 select 나 월 select 의 내용이 변화되면
해당 연 월의 달력을 출력해주는 형태의 페이지로 구성한다.
- 사용자 최초 요청 주소는
http://localhost:3306/WebApp07/SendAndReceive07.jsp 로 한다.
○ SendAndReceive07.jsp
-->
<!-- 맨 처음에는, 이번 년도, 이번 달의 달력이 출력되어 있는 상태. -->
<!-- selected 값이 바뀔 때마다 submit. <select onchange="함수호출"> -->
<!-- 맨 위에는, 스크립트릿 (입력값 받고 자바언어로 처리)
submit(셀렉트 바뀔 때마다...) 이 값을 받아와서 달력을 변경할 수 있도록 하자.
-->
<div>
<form action="" method="get">
<select id="year" name="year" onchange="formCalendar(this.form)">
<%=yOptions %>
</select>년
<select id="month" name="month" onchange="formCalendar(this.form)">
<%=mOptions %>
</select>월
</form>
</div>
<%-- [내 풀이]==========================================================
<% int day = 1; %>
<div>
<table border="1">
<tr>
<%
for (int i = 0; i < dayOfWeek; i++)
{
%>
<td></td>
<%
}
%>
<%
for (int i = dayOfWeek; i < 7; i++)
{
%>
<td><%=day++ %></td>
<%
}
%>
</tr>
<%for (int k = 0; k < 5; k++)
{%>
<tr>
<%for (int j = 0; j < 7; j++)
{%>
<%if (day > lastDay)
break;%>
<td><%=day++ %></td>
<%}%>
<%if (((day-1)+dayOfWeek) % 7 != 0)
{%>
<%for (int i = ((day-1)+dayOfWeek) % 7; i <= 6; i++)
{%>
요일 : <%=((day-1)+dayOfWeek) %>
날짜 : <%=day %> <br>
<%day++;%>
<td></td>
<%}%>
<%}%>
</tr>
<%}%>
</table>
</div> --%>
<hr>
<div>
달력을 그리게 될 지점
<%=calStr %>
</div>
</body>
</html>
01
SendAndReceive08.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@page import="java.util.Calendar"%>
<%
/*
// 자기 자신 페이지로부터 데이터 수신
// → year, month
String sYear = request.getParameter("year");
String sMonth = request.getParameter("month");
// ⓐ Calendar 객체 생성
Calendar cal = Calendar.getInstance();
// ⓑ import 구문 없이 작성하는 법.
// java.util.Calendar cal = java.util.Calendar.getInstance();
//Calendar cal = Calendar.getInstance();
// 현재 년, 월, 일 확인
int nowYear = cal.get(Calendar.YEAR); //-- 2023
int nowMonth = cal.get(Calendar.MONTH)+1; //-- 12
int nowDay = cal.get(Calendar.DAY_OF_MONTH); //-- 11
// 표시할 달력의 년, 월 구성 → 페이지 최초 요청을 감안한 코드
int selectYear = nowYear;
int selectMonth = nowMonth;
// 페이지에 대한 요청이 최초 요청이 아닐 경우
// → Line 6 ~ 7 을 통해 수신한 데이터로 표시할 달력의 년, 월 구성
if (sYear != null || sMonth != null)
{
selectYear = Integer.parseInt(sYear);
selectMonth = Integer.parseInt(sMonth);
if (selectMonth > 12)
{
selectMonth = 1;
selectYear++;
}
if (selectMonth < 1 && selectYear != 1)
{
selectMonth = 12;
selectYear--;
}
} */
//int nowYear = 2023;
//int nowMonth = 12;
// Calendar 객체 생성
Calendar cal = Calendar.getInstance();
// 오늘 날짜 가져오기
int nowYear = cal.get(Calendar.YEAR);
int nowMonth = cal.get(Calendar.MONTH) + 1;
int nowDay = cal.get(Calendar.DAY_OF_MONTH);
// 이전 페이지(SendAndReceive08.jsp)로부터 넘어온 데이터 수신
// → year, month
String strYear = request.getParameter("year");
String strMonth = request.getParameter("month");
// 표시할 달력의 년, 월
int year = nowYear;
int month = nowMonth;
if (strYear!=null)
year = Integer.parseInt(strYear);
if (strMonth!=null)
month = Integer.parseInt(strMonth);
// 이전과 이후 구성
int preYear = year;
int preMonth = month-1;
if(preMonth < 1)
{
preYear = year-1;
preMonth = 12;
}
int nextYear = year;
int nextMonth = month+1;
if (nextMonth > 12)
{
nextYear = year+1;
nextMonth = 1;
}
// 각 달의 마지막 날짜 배열 구성
int[] months = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 윤년인지 평년인지 확인
if (year%4==0 && year%100!=0 || year%400==0)
months[1] = 29;
// 총 날수를 저장할 변수 선언
int nalsu;
// 요일 항목 배열 구성
String[] weekNames = {"일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"};
// 현재 년도 → 입력받은 년도 이전 년도까지의 날 수 계산
nalsu = (year-1)*365 + (year-1)/4 - (year-1)/100 + (year-1)/400;
// 현재 월 → 입력받은 월의 이전 월까지의 날 수 추가
for (int i = 0; i < month-1 ; i++)
nalsu += months[i];
nalsu++; // + 1
int week = nalsu % 7; //-- 요일 변수
int lastDay = months[month-1]; //-- 마지막 날짜 변수
//System.out.println(week);
//--==>> 5
// 달력 그리기 -----------------------------------------------------------
String calStr = "";
calStr += "<table border='1'>"; //-- start table
// 요일 이름 발생
calStr += "<tr>";
for (int i = 0; i < weekNames.length; i++)
{
if (i==0) //-- 일요일
calStr += "<th style='color:red;'>" + weekNames[i] + "</th>";
else if (i==6) //-- 토요일
calStr += "<th style='color:blue;'>" + weekNames[i] + "</th>";
else //-- 평일
calStr += "<th>" + weekNames[i] + "</th>";
}
calStr += "</tr>";
// 빈 칸 공백 td 발생
calStr += "<tr>";
for (int i = 1; i <= week; i++)
calStr += "<td></td>";
// 날짜 td 발생
for (int i = 1; i <= lastDay; i++)
{
week++; //-- 날짜가 하루씩 찍힐 때 마다(구성이 이루어질 때 마다)
// 요일도 함께 1씩 증가할 수 있도록 처리
//calStr += "<td>" + i + "</td>";
//=====================================================================
// [오늘 날짜에 맞게, 일 칸(day 칸)에 <td> 추가(class 부여)하기!!]
//=====================================================================
if (year==nowYear && month==nowMonth && i==nowDay && week%7==0)
{
// 토요일인 오늘
calStr += "<td class='nowSat'>" + i + "</td>";
}
else if (year==nowYear && month==nowMonth && i==nowDay && week%7==1)
{
// 일요일인 오늘
calStr += "<td class='nowSun'>" + i + "</td>";
}
else if (year==nowYear && month==nowMonth && i==nowDay)
{
// 평일인 오늘
calStr += "<td class='now'>" + i + "</td>";
}
else if (week%7==0)
{
// 오늘이 아닌 토요일
calStr += "<td class='sat'>" + i + "</td>";
}
else if (week%7==1)
{
// 오늘이 아닌 일요일
calStr += "<td class='sun'>" + i + "</td>";
}
else
{
//[오늘이 아닌 평일에는 스타일을 입힐 필요가 없으므로]
//[클래스 속성을 추가해 주지 않았음.]
// 오늘이 아닌 평일
calStr += "<td>" + i + "</td>";
}
// 상황1. 오늘
if (week%7==0)
calStr += "</tr><tr>";
}
// 빈 칸 공백 td 발생
for (int i = 0; i <= week; i++, week++)
{
if (week%7==0)
break;
calStr += "<td></td>";
}
if (week%7!=0)
calStr += "</tr>";
calStr += "</table>"; //-- end table
// ------------------------------------------------------------ 달력 그리기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SendAndReceive08.jsp</title>
<link rel="stylesheet" type="text/css" href="css/main.css">
<style type="text/css">
a {text-decoration: none;}
</style>
</head>
<body>
<!--
○ 데이터 송수신 실습 08
- 달력을 출력하는 JSP 페이지를 구성한다.
- 전송한 내용을 수신해서 출력해주는 형태의 단독 페이지로 구성한다.
- submit 버튼 없이 이벤트 처리를 한다.
◀ 2023년 12월 ▶
-------------------------------------------
-------------------------------------------
-------------------------------------------
-------------------------------------------
-------------------------------------------
- 『◀』 이나 『▶』 클릭 시
해당 년 월의 달력을 출력해주는 형태의 페이지로 구현한다.
- 사용자 최초 요청 주소는
http://localhost:3306/WebApp07/SendAndReceive08.jsp 로 한다.
○ SendAndReceive08.jsp
-->
<div>
<form action="" method="get">
<%--
<a href="/WebApp07/SendAndReceive08.jsp?year=<%=selectYear%>&month=<%=selectMonth-1%>">◀</a>
<%=selectYear%>년<%=selectMonth%>월
<a href="/WebApp07/SendAndReceive08.jsp?year=<%=selectYear%>&month=<%=selectMonth+1%>">▶</a>
--%>
<a href="SendAndReceive08.jsp?year=<%=preYear %>&month=<%=preMonth%>">◀</a>
<span><%=year %>년 <%=month %>월</span>
<a href="SendAndReceive08.jsp?year=<%=nextYear %>&month=<%=nextMonth%>">▶</a>
</form>
</div>
<div>
달력을 그리게 될 지점
<%=calStr %>
</div>
</body>
</html>