ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 달력 만들기
    SpringFrameWork/Spring 프로젝트 할때 참고 하면 좋은것들 2022. 10. 8. 10:38
    728x90

    간단한 달력 만들기 

     

    Controller

    public class CalendarController {
    	@Autowired
    	CalendarService calendarService;
    	
      // 달력내역 가져오기
    	@RequestMapping(value="/calendar", method=RequestMethod.GET)
    	public String calendarGet() {
    		calendarService.getCalendar();
    		return "calendar/calendar/calendar";
    	}
    
    }

    Service

    public interface CalendarService {
    	public void getCalendar();
    }

    ServiceImpl

    public class CalendarServiceImpl implements CalendarService {
    
    	@Override
    	public void getCalendar() {
    	  // model객체를 사용하게되면 불필요한 메소드가 많이 따라오기에 여기서는 request객체를 사용했다.
    		HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
    		
    		// 오늘 날짜 저장시켜둔다.(calToday변수, 년(toYear), 월(toMonth), 일(toDay))
    		Calendar calToday = Calendar.getInstance();
    		int toYear = calToday.get(Calendar.YEAR);
    		int toMonth = calToday.get(Calendar.MONTH);
    		int toDay = calToday.get(Calendar.DATE);
    				
    		// 화면에 보여줄 해당 '년(yy)/월(mm)'을 셋팅하는 부분(처음에는 오늘 년도와 월을 가져오지만, '이전/다음'버튼 클릭하면 해당 년과 월을 가져오도록 한다.
    		Calendar calView = Calendar.getInstance();
    		int yy = request.getParameter("yy")==null ? calView.get(Calendar.YEAR) : Integer.parseInt(request.getParameter("yy"));
    	  int mm = request.getParameter("mm")==null ? calView.get(Calendar.MONTH) : Integer.parseInt(request.getParameter("mm"));
    	  
    	  if(mm < 0) { // 1월에서 전월 버튼을 클릭시에 실행
    	  	yy--;
    	  	mm = 11;
    	  }
    	  if(mm > 11) { // 12월에서 다음월 버튼을 클릭시에 실행
    	  	yy++;
    	  	mm = 0;
    	  }
    	  calView.set(yy, mm, 1);		// 현재 '년/월'의 1일을 달력의 날짜로 셋팅한다.
    	  
    	  int startWeek = calView.get(Calendar.DAY_OF_WEEK);  						// 해당 '년/월'의 1일에 해당하는 요일값을 숫자로 가져온다.
    	  int lastDay = calView.getActualMaximum(Calendar.DAY_OF_MONTH);  // 해당월의 마지막일자(getActualMaxximum메소드사용)를 구한다.
    	  
    	  // 화면에 보여줄 년월기준 전년도/다음년도를 구하기 위한 부분
    	  int prevYear = yy;  			// 전년도
    	  int prevMonth = (mm) - 1; // 이전월
    	  int nextYear = yy;  			// 다음년도
    	  int nextMonth = (mm) + 1; // 다음월
    	  
    	  if(prevMonth == -1) {  // 1월에서 전월 버튼을 클릭시에 실행..
    	  	prevYear--;
    	  	prevMonth = 11;
    	  }
    	  
    	  if(nextMonth == 12) {  // 12월에서 다음월 버튼을 클릭시에 실행..
    	  	nextYear++;
    	  	nextMonth = 0;
    	  }
    	  
    	  // 현재달력에서 앞쪽의 빈공간은 '이전달력'을 보여주고, 뒷쪽의 남은공간은 '다음달력'을 보여주기위한 처리부분(아래 6줄)
    	  Calendar calPre = Calendar.getInstance(); // 이전달력
    	  calPre.set(prevYear, prevMonth, 1);  			// 이전 달력 셋팅
    	  int preLastDay = calPre.getActualMaximum(Calendar.DAY_OF_MONTH);  // 해당월의 마지막일자를 구한다.
    	  
    	  Calendar calNext = Calendar.getInstance();// 다음달력
    	  calNext.set(nextYear, nextMonth, 1);  		// 다음 달력 셋팅
    	  int nextStartWeek = calNext.get(Calendar.DAY_OF_WEEK);  // 다음달의 1일에 해당하는 요일값을 가져온다.
    	  
    	  /* ---------  아래는  앞에서 처리된 값들을 모두 request객체에 담는다.  -----------------  */
    	  
    	  // 오늘기준 달력...
    	  request.setAttribute("toYear", toYear);
    	  request.setAttribute("toMonth", toMonth);
    	  request.setAttribute("toDay", toDay);
    	  
    	  // 화면에 보여줄 해당 달력...
    	  request.setAttribute("yy", yy);
    	  request.setAttribute("mm", mm);
    	  request.setAttribute("startWeek", startWeek);
    	  request.setAttribute("lastDay", lastDay);
    	  
    	  // 화면에 보여줄 해당 달력 기준의 전년도, 전월, 다음년도, 다음월 ...
    	  request.setAttribute("preYear", prevYear);
    		request.setAttribute("preMonth", prevMonth);
    		request.setAttribute("nextYear", nextYear);
    		request.setAttribute("nextMonth", nextMonth);
    		
    		// 현재 달력의 '앞/뒤' 빈공간을 채울, 이전달의 뒷부분과 다음달의 앞부분을 보여주기위해 넘겨주는 변수
    		request.setAttribute("preLastDay", preLastDay);				// 이전달의 마지막일자를 기억하고 있는 변수
    		request.setAttribute("nextStartWeek", nextStartWeek);	// 다음달의 1일에 해당하는 요일을 기억하고있는 변수
    	}
    }

    JSP

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    <c:set var="ctp" value="${pageContext.request.contextPath}"/>
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>calendar.jsp(달력연습)</title>
    	<%@ include file="/WEB-INF/views/include/bs4.jsp" %>
      <style>
        #td1,#td8,#td15,#td22,#td29,#td36 {
          color: red;
        }
        #td7,#td14,#td21,#td28,#td35,#td42 {
          color: blue;
        }
        .today {
          font-size: 1.5em;
          background-color: pink;
          color: #fff;
          /* text-align: center; */
        }
      </style>
    </head>
    <body>
    <div class="container">
      <div class="col-sm-12" style="margin:30px 0px;font-size:1.4em;text-align:center">
        <button class="btn btn-secondary btn-sm" onclick="location.href='${ctp}/study/calendar?yy=${yy-1}&mm=${mm}'" title="이전년도">◁◁</button>
        <button class="btn btn-secondary btn-sm" onclick="location.href='${ctp}/study/calendar?yy=${yy}&mm=${mm-1}'" title="이전월">◀</button>
        &nbsp; <font size="5">${yy}년 ${mm+1}</font> &nbsp;
        <button class="btn btn-secondary btn-sm" onclick="location.href='${ctp}/study/calendar?yy=${yy}&mm=${mm+1}'" title="다음월">▶</button>
        <button class="btn btn-secondary btn-sm" onclick="location.href='${ctp}/study/calendar?yy=${yy+1}&mm=${mm}'" title="다음년도">▷▷</button>
        &nbsp; &nbsp;
        <button class="btn btn-secondary btn-sm" onclick="location.href='${ctp}/study/calendar'" title="오늘날짜"><i class="fa fa-home"></i></button>
      </div>
      <br/>
      <div class="row">
        <div class="col-sm-12" style="height:450px;">
          <table class="table table-bordered" style="height:100%">
            <tr style="text-align:center;font-size:1em;background-color:#eee;height:10%;">
              <th style="color:red;width:13%;vertical-align:middle;">일</th>
              <th style="width:13%;vertical-align:middle;">월</th>
              <th style="width:13%;vertical-align:middle;">화</th>
              <th style="width:13%;vertical-align:middle;">수</th>
              <th style="width:13%;vertical-align:middle;">목</th>
              <th style="width:13%;vertical-align:middle;">금</th>
              <th style="color:blue;width:13%;vertical-align:middle;">토</th>
            </tr>
            <tr>
              <c:set var="cnt" value="1"/>
              <!-- 이전월의 마지막 날짜를 이용하여 앞쪽의 빈 공백을 채워준다.(요일의 숫자는 일요일은 '1', 토요일은 '7'이다. -->
              <!-- 즉, 2022년 1월을 예로들면 12월은 마지막날짜(preLastDay)가 31이고, 1월의 첫번째요일은 토요일(7)이기에 출력할 이전월(12월)의 시작일은 '31-(7-2)=26'일부터 출력해야한다.(-2는 상수값이다) -->
              <c:forEach var="preDay" begin="${preLastDay - (startWeek - 2) }" end="${preLastDay}">	<!-- 이전월(12월)의 26일부터 마지막일자(preLastDay : 31일)까지 출력한다. -->
                <td id="td${cnt}" style="color: #ddd;font-size:0.6em">
                  ${preYear}-${preMonth+1}-${preDay}
                </td>
                <c:set var="cnt" value="${cnt=cnt+1}"/>
              </c:forEach>
              
              <!-- 해당월에 대한 날짜를 반복 출력한다. -->
              <c:forEach begin="1" end="${lastDay}" varStatus="st">
                <c:set var="todaySw" value="${yy == toYear && mm == toMonth && st.count == toDay ? 1 : 0}"/>	<!-- 오늘날짜가 맞으면 toDay변수에 1을 셋팅 -->
                <td id="td${cnt}" ${todaySw == 1 ? 'class=today' : '' } style="font-size:0.9em;padding:8px;">	<!-- 오늘날짜가 맞으면 지정한 class로 디자인처리한다. -->
                  ${st.count}
                </td>
                <c:if test="${cnt % 7 == 0}">		<!-- 한행이 꽉찾으면 다음줄로 넘어간다. -->
                  </tr><tr>
                </c:if>
                <c:set var="cnt" value="${cnt=cnt+1}"/>	<!-- 일수를 한개 증가 누적한다. -->
              </c:forEach>
              
              <!-- 다음월의 날짜를 출력한다.(출력시작위치는 다음달 1일에 해당하는 요일(nextStartWeek)부터이다. -->
              <c:forEach begin="${nextStartWeek}" end="7" varStatus="nextDay">
                <td id="td${cnt}" style="color: #ddd;font-size:0.6em">
                  ${nextYear}-${nextMonth+1}-${nextDay.count}
                </td>
                <c:set var="cnt" value="${cnt=cnt+1}"/>
              </c:forEach>
            </tr>
          </table>
        </div>
      </div>
    </div>
    </body>
    </html>
    728x90

    댓글

Designed by Tistory.