这学期刚学JavaWeb,看到B站有一个UP做了一个很漂亮的日历,想着自己也做一个。
首先,日历嘛,当然需要有年·月·日咯。
那么我们开始吧~
1.先在VScode上将HTML网页大致先写好。
没有用什么高端的框架,只是普普通通的CSS+HTML。做出来效果如下图所示:
图1 HTML + CSS
2.接下来在IDEA中编写JSP代码
因为只是一个小小日历,所以大部分的代码都写在JSP页面上了。(虽说要减少JSP中的Java代码,但这只是个小日历,所以先不管他)
在第一步编写HTML的时候,左侧就是今天的日期和今天是周几;而在右侧我们需要有三个部分。
1.其他部分
- 首先编写左侧部分
- 实例化GregorianCalendar类的对象,并获取当前时间,存放到三个变量中
// Calendar的.get(Calendar.DAY_OF_MONTH)方法,规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
GregorianCalendar calendar= (GregorianCalendar) Calendar.getInstance();
// calendar.set(2002,Calendar.FEBRUARY,17); // 设定日期
int current_year = calendar.get(Calendar.YEAR);
int current_month = calendar.get(Calendar.MONTH);
int current_day = calendar.get(Calendar.DAY_OF_MONTH);
int day_of_week = calendar.get(Calendar.DAY_OF_WEEK); // Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
- 为后面建立三个数组(月份名称,周日到周六的名称,周名缩写)
String[] monthsENG = {
"January", "February", "March", "April",
"May", "June", "July", "August",
"September", "October", "November", "December"};
// Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
String[] weekNamesENG = {
"","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
};
String[] weekShortNamesENG = {
"S","M","T","W","T","F","S"
};
- 放入相对应的div中
<div class="left">
<div class="week"><%=weekNamesENG[calendar.get(Calendar.DAY_OF_WEEK)]%></div>
<div class="day"><%=calendar.get(Calendar.DAY_OF_MONTH)%></div>
</div>
- 接下来编写右侧,右侧分为三部分,上面显示当前月份名称和当前年份,中间显示缩写名,接下来是主体部分。
- 将相对应的信息放入div中
<div class="right">
<div class="year"><%=monthsENG[current_month]%> <%=current_year%></div>
<div class="calendar">
<div class="weeks">
<%
// 这里输出星期几的名字缩写
for(int i = 0; i < 7; i++){
out.print("<div class=\"item\">" + weekShortNamesENG[i] + "</div>");
}
%>
</div>
2. 日历部分
分析:我们要用到三个月的信息,需要知道每个月的总日子数量。
编写一个函数用来处理这个问题。(这里用了
package cn.king;
import java.util.GregorianCalendar;
public class DateProcess {
public int MaxDayNumber(int current_year, int current_month) {
GregorianCalendar calendar = new GregorianCalendar();
int max_day = 30;
if (current_month == 0 || current_month == 2 || current_month == 4 || current_month == 6 || current_month == 7 || current_month == 9 || current_month == 11)
max_day = 31;
else if (calendar.isLeapYear(current_year) && current_month == 1)
max_day = 29;
else if (!calendar.isLeapYear(current_year) && current_month == 1)
max_day = 28;
return max_day;
}
}
- 写上一个月的末尾首先要知道当前月第一个日子之前有多少空白;是否要进行填充。
// 实例化dateProcess 调用里面的方法。
DateProcess dateProcess = new DateProcess();
// 1.写当前月的上一个月首先要获取当前月第一个日子之前有多少空白。
// 现在是当前月, 首先设置当前日期是1号
calendar.set(Calendar.DATE, 1);
int start_day = calendar.get(Calendar.DAY_OF_WEEK) - 1;
// System.out.println("1. start_day = " + start_day);
boolean isYearPlus_Flag = false; // 建立一个flag用来判断年份是否 -1 了。
// 已经获取当前月 1号 之前有多少日子放进blank_day中
// 切换到上一个月
// 如果当前月是1月,则手动调整为 上一年( -1 ) 的12月
if (current_month == 0){
calendar.set(Calendar.YEAR,current_year - 1);
calendar.set(Calendar.MONTH, Calendar.DECEMBER);
isYearPlus_Flag = true;
}
// 否则只需要月份 - 1
else {
calendar.set(Calendar.MONTH, current_month - 1);
}
// 刷新当前月期和年份
current_year = calendar.get(Calendar.YEAR);
current_month = calendar.get(Calendar.MONTH);
// System.out.println("1. currentYear = " + current_year);
// System.out.println("1. currentMonth = " + current_month);
// System.out.println("1. currentDay = " + current_day);
// 输出到屏幕上
int max_day = dateProcess.MaxDayNumber(current_year, current_month);
// System.out.println("1. max_day = " + max_day);
// System.out.println();
int temp = max_day - start_day + 1;
for (int i = 0; i < start_day; i++) {
// 此时这里还需要一个数字来从最大日期从大到小输出数字
out.print("<div class=\"pre_Month_day\">" + temp + "</div>");
temp++;
}
- 将本月打印在屏幕上。本月就很简单了,只要知道有多少天,然后将其填充上去就行。(需要将今天和其他日子分开)
// 2.上一个月已经输出完了,现在输出当前月份。
// 切换到当前月份
// 先判断年份是否变动
if (isYearPlus_Flag) {
calendar.set(Calendar.YEAR,current_year + 1);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
} // 没变动则直接月份 + 1
else {
calendar.set(Calendar.MONTH, current_month + 1);
}
// 刷新当前月期和年份
current_year = calendar.get(Calendar.YEAR);
current_month = calendar.get(Calendar.MONTH);
// System.out.println("2. currentYear = " + current_year);
// System.out.println("2. currentMonth = " + current_month);
// System.out.println("2. currentDay = " + current_day);
max_day = dateProcess.MaxDayNumber(current_year, current_month);
// System.out.println("2. max_day = " + max_day);
// 输出日期到屏幕上
// 因为style设置,当前日期的class内容不同于其他日期,所以单独处理
for (int i = 1; i < current_day; i++) {
out.print("<div class=\"day\">"+ i +"</div>");
}
out.print("<div class=\"day today\">"+ current_day +"</div>");
for (int i = current_day + 1; i <= max_day; i++) {
out.print("<div class=\"day\">"+ i +"</div>");
}
// Java中规定了每周第一天是星期日,所以星期日=1,星期一=2…星期六=7
calendar.set(Calendar.DATE, max_day);
// 计算最后一天后面是否有空格
int left_blank = 7 - calendar.get(Calendar.DAY_OF_WEEK);
// System.out.println("2. left_blank = " + left_blank);
// System.out.println();
- 输出下一个月填充到本月末尾,只需要判断要输出几天,或者不输出即可。
// 3. 该输出下一个月了,这个月需要了解上一个月最后一天是不是星期6,如果是就不输出。
// 首先判断本月最后一天是否是周六
// if (!isLastDaySaturday){
// 切换到下一个月
// 判断是否是12月 ,是就要同时切换年份
if (current_month == 11) {
// 设置年份 +1, 月份为 1月
calendar.set(Calendar.YEAR, current_year-1);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
}
else {
// 否则直接月份 +1
calendar.set(Calendar.MONTH, current_month + 1);
}
// 切换月份完毕,准备输出下一个月的开始日期,在第二部分已经计算了当前月份后面有多少空白(left_blank)。
// 输出日期
for (int i = 1; i <= left_blank; i++){
out.print("<div class=\"next_Month_day\">"+ i +"</div>");
}
// 刷新当前月期和年份
current_year = calendar.get(Calendar.YEAR);
current_month = calendar.get(Calendar.MONTH);
原始计划已经完成了,最终效果如下所示,我还想加两个按钮切换查看上一个月和下一个月;以及将节日添加上去,完善这个小项目。
未完待续…
下一步目标:加上节日提示