Javaとjspを使用したカレンダーの作成


はこの感覚の機能かもしれません.
これは私の個人情報-カレンダーページで全文に挿入されたデータを確認する機能です.
先月の动态図には先月の内容しか表示されていませんでしたが、以前、过去のカレンダーを阅覧することもできます.この日付に登録内容のポスターが印刷され、その日付に2つ以上のコンテンツが登録されている場合、ポスターの右下隅に+アイコンが表示され、マウスの通過とクリック時に、以下のように引き延ばして残りのコンテンツのポスターが表示されます.
私が担当している機能ではありませんが、いつの間にか実現してしまいました.もともと担当していたメンバーがGoogleカレンダーやフルカレンダーなどのAPIを使って実現しようとしていたのですが、どう考えてもAPIを使う意味がなく、逆に私たちが実現したい機能が実現できなくて本当に申し訳ないと思いましたが、APIの使用を断念することにしました.今考えてもごめんなさい...なにしろ...
JavaのCalendarクラスとjspを利用したfor:各重複文で実装されます.この文章を参照して、java部分だけを理解するのに半日かかりました.これにより、実装が非常に簡単になります.ありがとうございます.
著者らは,純計算日のDateUtilクラスを分離し,ControllerとJSPの3つのクラスを適切に利用して実現しており,グループメンバを理解するために多くの注釈を加えた部分を以下に示す.
まずDataUtilクラスの一部です
public Map<String, Object> today_info(DateUtil dateData) {
		Map<String, Object> today_Data = new HashMap<String, Object>();
		
		// 날짜 함수를 이용하기 위한 Calendar 클래스의 인스턴스 호출
		Calendar cal = Calendar.getInstance();
		
		// getter setter를 이용해서 지정된 연도와 월의 값이 있을 경우 캘린더 값을 초기 설정해준다
		cal.set(Integer.parseInt(dateData.getYear()), Integer.parseInt(dateData.getMonth()), 1);

		int startDay = cal.getMinimum(java.util.Calendar.DATE);
		int endDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
		int start = cal.get(java.util.Calendar.DAY_OF_WEEK);

		// 오늘 날짜에 해당하는 연도와 월 등의 정보를 알기 위한 호출
		Calendar todayCal = Calendar.getInstance();
		
		// 연도의 표시 형식 지정
		SimpleDateFormat ysdf = new SimpleDateFormat("yyyy");
		SimpleDateFormat msdf = new SimpleDateFormat("M");

		// 현재 연도를 위에 지정한 yyyy의 형식으로 int 타입 변수에 저장
		int today_year = Integer.parseInt(ysdf.format(todayCal.getTime()));
		int today_month = Integer.parseInt(msdf.format(todayCal.getTime()));

		// 지정한 연도와 달이 있을 경우
		int search_year = Integer.parseInt(dateData.getYear());
		int search_month = Integer.parseInt(dateData.getMonth()) + 1;

		int today = -1;
		// 지정한 연도와 달이 현재 연도와 달과 일치할 경우
		if (today_year == search_year && today_month == search_month) {
			SimpleDateFormat dsdf = new SimpleDateFormat("dd");
			today = Integer.parseInt(dsdf.format(todayCal.getTime()));
		}

		search_month = search_month - 1;

		Map<String, Integer> before_after_calendar = before_after_calendar(search_year, search_month);

		today_Data.put("start", start);
		today_Data.put("startDay", startDay);
		today_Data.put("endDay", endDay);
		today_Data.put("today", today);
		today_Data.put("search_year", search_year);
		today_Data.put("search_month", search_month + 1);
		today_Data.put("before_year", before_after_calendar.get("before_year"));
		today_Data.put("before_month", before_after_calendar.get("before_month"));
		today_Data.put("after_year", before_after_calendar.get("after_year"));
		today_Data.put("after_month", before_after_calendar.get("after_month"));

		// sql문 조건 설정을 위한 시작 날짜와 끝 날짜 값 설정
		this.db_startDate = String.valueOf(search_year) + "-" + String.valueOf(search_month + 1) + "-"
				+ String.valueOf(startDay);
		this.db_endDate = String.valueOf(search_year) + "-" + String.valueOf(search_month + 1) + "-"
				+ String.valueOf(endDay);
		
		// 인자값으로 사용하기 위해 Map에 넣어준다
		today_Data.put("db_startDate", db_startDate);
		today_Data.put("db_endDate", db_endDate);
		
		return today_Data;
	}
最初は、そのdb startDateとdb endDateの役割が何なのか、mapperを使うためにsql文を作成して実行するときに知ったと思います.
上記の2つの値がない場合、2022年4月16日にコンテンツを登録しても、すべての年/月16日にコンテンツが連続して出力されます.これは致命的なエラーです.
db startDateとdb endDateの設定は年月条件チェックを許可します.
上記で作成したDataUtilクラスは、コントローラでこのように使用されます.
public String calendar(Model model, HttpSession session, HttpServletRequest request, DateUtil dateData) {

		// 날짜 함수를 이용하기 위한 Calendar 클래스의 인스턴스 호출
		Calendar cal = Calendar.getInstance();

		DateUtil calendarData;

		// 따로 지정한 연도와 월이 없는경우 현재 연도와 월을 set
		if (dateData.getDate().equals("") && dateData.getMonth().equals("")) {
			dateData = new DateUtil(String.valueOf(cal.get(Calendar.YEAR)), String.valueOf(cal.get(Calendar.MONTH)),
					String.valueOf(cal.get(Calendar.DATE)), null, null);
		}

		Map<String, Object> today_info = dateData.today_info(dateData);
		List<DateUtil> dateList = new ArrayList<DateUtil>();

		String db_startDate = String.valueOf(today_info.get("db_startDate"));
		String db_endDate = String.valueOf(today_info.get("db_endDate"));

		// 본 컨텐츠 내역 불러와서 저장
		ArrayList<CalendarVO> contents_list = calenderService.selectList(mem_num, db_startDate, db_endDate, dateData);
最後の文はmapperを実行するためのサービス呼び出しです.
次はmapper文ですが、なんだか長くなってきました.
@Select(
"SELECT 
	TO_CHAR(custom_date, 'YYYY-MM-DD') custom_date, 
    contents_num, 
    contents_type, 
    poster_path 
FROM dcontents_cal 
WHERE mem_num=#{mem_num} 
	AND custom_date BETWEEN #{db_startDate} AND #{db_endDate} "
)
public ArrayList<CalendarVO> selectList(
@Param("mem_num") Integer mem_num, 
@Param("db_startDate") String db_startDate, 
@Param("db_endDate") String db_endDate, 
DateUtil dateData);
@paramのロールは、複数のパラメータを受信したときに各パラメータを接続する役割を果たします.
1. 뷰에서 날짜 정보를 가져옴 
2-1. (특정 날짜의 달력을 열람하고 있을 경우)
해당 달력의 연/월/일의 값을 db_startDate와 db_endDate에 입력
2-2. (특정 날짜의 달력을 열람하고 있는게 아닐 경우)
오늘에 해당하는 연/월/일의 값을 db_startDate와 db_endDate에 입력
3. custom_date BETWEEN @@년 @@월 1일 AND @@년 @@월 말일 의 where절을 갖게 되는 것이다.
以上の手順では、特定の月のコンテンツ情報のみをロードできます.
(まだカレンダーのコードを見ていないので、次の記事に続きます…)