Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

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:20

 

WebApp07

 


 

 


01
SendAndReceive07


 

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


 

 

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>