[구디아카데미][IT국비지원][TIL] Calendar API를 사용하여 달력 만들기(일정 입력 폼 추가)

Seokhyun Jeong·2023년 4월 24일
0

과제

목록 보기
13/19
post-thumbnail

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

코드

calendar.jsp

<%@page import="java.time.DayOfWeek"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Calendar" %>
<%
	int targetYear = 0;
	int targetMonth = 0;
	
	
	if(request.getParameter("targetYear") == null || request.getParameter("targetMonth") == null){
		Calendar today = Calendar.getInstance();
		targetYear = today.get(Calendar.YEAR);
		targetMonth = today.get(Calendar.MONTH);
	} else {
		targetYear = Integer.parseInt(request.getParameter("targetYear"));
		targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
		if(targetMonth == -1) {
			targetMonth = 11;
			targetYear = targetYear - 1;
		} else if(targetMonth == 12) {
			targetMonth = 0;
			targetYear = targetYear + 1;
		}
	}
	
	//디버깅
	//http://localhost/ex0417/calendar.jsp?targetYear=2023&targetMonth=11
	//http://localhost/ex0417/calendar.jsp
	System.out.println(targetYear + " <-- targetYear");
	System.out.println(targetMonth + " <-- targetMonth");
	
	// 달력 1일 앞의 공백 수
	// 현재월의 1일의 DAY_OF_WEEk(일 1, 월 2, . . . 토 7) - 1
	int startTdBlank = 0;
	// 출력하고자 하는 년/월/1일
	Calendar firstDate = Calendar.getInstance();
	firstDate.set(Calendar.YEAR, targetYear);
	firstDate.set(Calendar.MONTH, targetMonth);
	firstDate.set(Calendar.DATE, 1);
	startTdBlank = firstDate.get(Calendar.DAY_OF_WEEK) - 1;
	
	Calendar today = Calendar.getInstance();
	int day = today.get(Calendar.DATE);
	System.out.println(day + " <-- day");
	
	//전달 마지막 일
	int lastDate = 0;
	Calendar PreMonth = Calendar.getInstance();
	PreMonth.set(Calendar.YEAR, targetYear);
	PreMonth.set(Calendar.MONTH, targetMonth-1);
	lastDate = PreMonth.getActualMaximum(Calendar.DATE);
	
	// 디버깅
	System.out.println(lastDate + " <-- lastDate");
	System.out.println(startTdBlank + " <-- preTdBlank");
	
	// 출력하고자 하는 년/월/마지막날짜
	int endDateNum = firstDate.getActualMaximum(Calendar.DATE);
	System.out.println(endDateNum + " <-- endDateNum");
	
	// 달력 마지막날짜 출력후 공백(td) 수
	int endTdBlank = 0;
	if ((startTdBlank + endDateNum) % 7 != 0) {
		endTdBlank = 7 - ((startTdBlank + endDateNum) % 7);
	}
	
	// 전체 칸 수
	int totalTdCnt = startTdBlank + endDateNum + endTdBlank;
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>calendar.jsp</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>
		<a href="./calendar.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth-1 %>">이전달</a>
		<%=targetYear %>년 <%=targetMonth+1 %>월
		<a href="./calendar.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth+1 %>">다음달</a>
	</h1>
		<table class="table table-bordered">
			<thead class="table-dark">
				<tr>
					<th></th>
					<th></th>
					<th></th>
					<th></th>
					<th></th>
					<th></th>
					<th></th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<%
						for(int i=0; i<totalTdCnt; i++) {
							if(i%7 == 0){
					%>
								</tr><tr>
					<%
							}
							int dateNum = i - startTdBlank + 1;
							if(dateNum > 0 && dateNum <= endDateNum){
								if(i%7 == 0){
									if(dateNum == day){
					%>
										<td class="table-warning"><a class="text-danger" href="./schedule.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth %>&targetDate=<%=dateNum %>" style="text-decoration: none"><%=dateNum %></a></td>
					<%
									}else {
					%>
										<td><a class="text-danger" href="./schedule.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth %>&targetDate=<%=dateNum %>" style="text-decoration: none"><%=dateNum %></a></td>
					<%		
									}
								} else {
									if(dateNum == day){
					%>
										<td class="table-warning"><a class="text-body" href="./schedule.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth %>&targetDate=<%=dateNum %>" style="text-decoration: none"><%=dateNum %></a></td>
					<%
									}else {
					%>
										<td><a class="text-body" href="./schedule.jsp?targetYear=<%=targetYear %>&targetMonth=<%=targetMonth %>&targetDate=<%=dateNum %>" style="text-decoration: none"><%=dateNum %></a></td>
					<%		
									}
								}
					
							} else if(dateNum < 1) {
					%>
								<td class="text-muted table-light"><%=lastDate + (dateNum) %></td>
					<%		
							} else {
					%>
								<td class="text-muted table-light"><%=i - (endDateNum + startTdBlank) + 1 %></td>
					<%	
							}
						}
					%>
				</tr>
			</tbody>
		</table>
	</div>
</body>
</html>

schedule.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Calendar" %>
<%
	int targetYear = 0;
	int targetMonth = 0;
	int targetDate = 0;
	
	targetYear = Integer.parseInt(request.getParameter("targetYear"));
	targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
	targetDate = Integer.parseInt(request.getParameter("targetDate"));
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>schedule.jsp</title>
</head>
<body>
	<h1><%=targetYear %>년 <%=targetMonth+1 %>월 <%=targetDate %>일</h1>
	<h3>일정등록</h3>
	<form>
		<table>
			<tr>
				<th>제목</th>
				<td><input type="text" size="53"> <input type="checkbox">중요</td>
			</tr>
			<tr>
				<th>장소</th>
				<td><input type="text" size="53"></td>
			</tr>
			<tr>
				<th>일시</th>
				<td><input type="datetime-local"> - <input type="datetime-local"></td>
			</tr>
			<tr>
				<th style="vertical-align: top">설명</th>
				<td><textarea cols="55" rows="7"></textarea></td>
			</tr>
			<tr>
				<td colspan="2"><button type="button">등록</button>&nbsp;&nbsp;<button type="button">취소</button></td>
			</tr>
		</table>
	</form>
</body>
</html>

결과화면


날짜 클릭시 나오는 일정 입력 폼

0개의 댓글