基于java实现的简单网页日历功能,有兴趣得可以把它转换到前端实现

简介:   之前做项目的时候,因为要用到不同日期显示不同的内容,就自己做了一个日期的显示和选择功能,今天抽空把以前的代码理了一下,顺便就把之前做的日期功能给拿出来回顾一下,大家可以提点意见,帮忙完善下设计。先上一张完成后的显示效果,本人是后端程序员,对于前端的一些效果不是很熟悉,画面不好请见谅。

  之前做项目的时候,因为要用到不同日期显示不同的内容,就自己做了一个日期的显示和选择功能,今天抽空把以前的代码理了一下,顺便就把之前做的日期功能给拿出来回顾一下,大家可以提点意见,帮忙完善下设计。先上一张完成后的显示效果,本人是后端程序员,对于前端的一些效果不是很熟悉,画面不好请见谅。。

  下面切入正题:

  我设计的日历表是11*3的显示,加上上一个月和下一个月的选项,对于大月的月份刚好足够,但小月和二月就会有空格。为了方便我在页面上展现日历,我将上一月、下一月、空字符和日期一起封装在了list集合中,使其在页面中直接循环显示出来

  能够实现当前日期的显示和人工手动选择日期的功能,在后台都可以得到选择的日期的各项参数,可以进行你想要的操作

  在设计和实现日历的时候,我首先想要解决的就是得到今天这个日期在日历表中的显示情况,那必定需要得到今天的日期,还有今天所在月的总天数

  对于得到当前所在月的天数的功能,我进行简单的封装,将list集合对象里面的内容补满33个,方便在页面中用循环的方式展现出来

  封装选择日期所在月份的日历表代码如下

 1 public static List<String> getMonthDays(Date date){ 
 2         Calendar cal = Calendar.getInstance();  
 3         cal.setTime(date);  
 4         cal.set(cal.DATE, 1);//日期设置为1号  
 5         cal.roll(cal.DATE, -1);
 6         //roll和add的区别,add会减到上一个月,即1号减1会到上一个月的最后一天,而roll则只在当月进行加减,即1号减1跳转到当月的最后一天, 
 7         Integer num = cal.get(cal.DAY_OF_MONTH);//获得天数
 8         List<String> days = new ArrayList<String>();
 9         days.add("《上一月");//日历第一格位置始终为上一月选项
10         for(int i=1;i<=num;i++){
11             
12             if(i<10){
13                 days.add("0"+i);
14             }else{
15                 days.add(i+"");
16             }
17         }
18         int index = 33-days.size();//得到33个位置剩下多少个位置
19         for(int i=1;i<=index;i++){
20             if(i==index){
21                 days.add("下一月》");//最后一个位置为下一月选项    
22             }else{
23                 days.add("");//其它位置添加空字符
24             }
25         }
26         return days;
27 
28     }

封装选择日期月份的代码实现了,那我就要实现将当前天在日历表中的日期给展示出来的代码了:

public class MonthDate {
    private String chooseMonth; //当前选择的日期月份
    private String chooseDay;    //当前选择的日期天数
    private String chooseYear;    //当前选择的日期年份
    private List<String> days;    //当前选择的日期所在月份的天数,并加上上一个月、下一个月,空字符等内容
    
    
    public String getChooseMonth() {
        return chooseMonth;
    }
    public void setChooseMonth(String chooseMonth) {
        this.chooseMonth = chooseMonth;
    }

    public String getChooseDay() {
        return chooseDay;
    }

    public void setChooseDay(String chooseDay) {
        this.chooseDay = chooseDay;
    }

    public String getChooseYear() {
        return chooseYear;
    }
    public void setChooseYear(String chooseYear) {
        this.chooseYear = chooseYear;
    }
    public List<String> getDays() {
        return days;
    }
    public void setDays(List<String> days) {
        this.days = days;
    }

    public String monthDay(){
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("MM");
        SimpleDateFormat sdf2 = new SimpleDateFormat("dd");
        SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy");
        chooseMonth = sdf.format(d);
        chooseDay = sdf2.format(d);
        chooseYear = sdf3.format(d);
        //我这边是方便处理,如果觉得这样麻烦,可以不转化时间成String对象,到时候在页面直接通过<s:date name='' format=''/>实现显示
        days = MonthNum.getMonthDays(d);//得到当前日期月份的封装对象
        
        return "String";
    }

  日历需要显示的属性都得到了,接下来就是页面的显示了,显示页面非常的简单,但我在设计的时候css样式调试了很久

 

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3 <%@ taglib prefix="s" uri="/struts-tags" %>
 4 
 5 
 6 <!DOCTYPE HTML >
 7 <html>
 8   <head>
 9     <title>简单日期显示功能</title>
10     <link rel="stylesheet" type="text/css" href="<c:url value="/css/date.css"/>"/>
11     <link rel="stylesheet" type="text/css" href="<c:url value="/css/reset.css"/>"/>
12       <script type="text/javascript">
13           function choosedate(e){
14             
15             var day = e.innerHTML;
16             if(day=="《上一月"){
17                 var month = document.getElementById("month").innerHTML;
18                 var inputM = document.getElementById("inputM");
19                 var year = document.getElementById("year").innerHTML;
20                 var inputY = document.getElementById("inputY");
21                 if(month-1==0){//判断当前月是否为1月
22                     month=12;//是则月份换为12月且年份减1
23                     year=year-1;
24                     inputM.value = month;
25                 }else if(month-1<10){
26                     inputM.value = "0"+(month-1);
27                 }else{
28                     inputM.value = month-1;
29                 }
30                 inputY.value = year;
31                 var day = document.getElementById("day").innerHTML;
32                 var inputD = document.getElementById("inputD");
33                 inputD.value = day;
34                 var form = document.getElementById("dateForm");
35                 form.submit();
36             }else if(day=="下一月》"){
37                 var year = document.getElementById("year").innerHTML;
38                 var inputY = document.getElementById("inputY");
39                 var month = document.getElementById("month").innerHTML;
40                 var inputM = document.getElementById("inputM");
41                 if(month-1+2>12){//判断当前月份是否为12月份,先减后加是为了将month对象转化成Number对象
42                     month="01";//若为12,则下一月月份为01,且年份加1
43                     year = year-1+2;
44                     inputM.value=month;
45                 }else if(month-1+2<10){
46                     inputM.value = "0"+(month-1+2);
47                 }else{
48                     inputM.value = month-1+2;
49                 }
50                 inputY.value = year;
51                 var day = document.getElementById("day").innerHTML;
52                 var inputD = document.getElementById("inputD");
53                 inputD.value = day;
54                 var form = document.getElementById("dateForm");
55                 form.submit();
56             }else if(day!=""){
57                 var year = document.getElementById("year").innerHTML;
58                 var inputY = document.getElementById("inputY");
59                 inputY.value = year;
60                 var month = document.getElementById("month").innerHTML;
61                 var inputM = document.getElementById("inputM");
62                 inputM.value = month;
63                 var inputD = document.getElementById("inputD");
64                 inputD.value = e.innerHTML;
65                 var form = document.getElementById("dateForm");
66                 form.submit();
67             }
68         }
69       </script>
70   </head>
71   <body>
72     <!-- 日期选择 -->
73         <div  class="datediv" >
74             <!-- 左侧年份和月份的显示 -->
75             <div >
76                 <font id="year" style=""><s:property value="chooseYear"/></font>
77                 <span id="month" style=""><s:property value="chooseMonth"/></span>
78             </div>
79             <!-- 循环显示出月份内的日期和按钮功能 -->
80             <ul >
81                 <s:iterator var="d" status="index" value="days">
82                     <s:if test="#d==chooseDay"><li id="day" style="background-color: #CAE1EF;">${d }</li></s:if>
83                     <s:else><li onclick="choosedate(this)" >${d }</li></s:else>
84                 </s:iterator>
85             </ul>
86         </div>
87         <form method="post" action="<c:url value="/MonthDate_monthDayByDate.action"/>" id="dateForm">
88               <input id="inputY" type="hidden" name="chooseYear"/>
89               <input id="inputM" type="hidden" name="chooseMonth"/>
90               <input id="inputD" type="hidden" name="chooseDay"/>
91           </form>    
92   </body>
93 </html>

 

  日历的显示功能也实现了,接下来就实现日期选择的功能,我上面已经预留了js方法,为实现选择日期做准备,通过js得到鼠标选择的对象和当前的年份和月份

  因为日历表中有上一月,下一月和空字符的选项,所以要对他们进行区分和处理,将处理得到的新的日期通过form表单提交到后台处理,为了图方便,我将javascript代码直接写在jsp中了。

 1 function date(e){
 2             var day = e.innerHTML;
 3             if(day=="《上一月"){
 4                 
 5                 var month = document.getElementById("month").innerHTML;
 6                 var inputM = document.getElementById("inputM");
 7                 var year = document.getElementById("year").innerHTML;
 8                 var inputY = document.getElementById("inputY");
 9                 if(month-1==0){//判断当前月是否为1月
10                     month=12;//是则月份换为12月且年份减1
11                     year=year-1;
12                     inputM.value = month;
13                 }else if(month-1<10){
14                     inputM.value = "0"+(month-1);
15                 }else{
16                     inputM.value = month-1;
17                 }
18                 inputY.value = year;
19                 var day = document.getElementById("day").innerHTML;
20                 var inputD = document.getElementById("inputD");
21                 inputD.value = day;
22                 var form = document.getElementById("dateForm");
23                 form.submit();
24             }else if(day=="下一月》"){
25                 var year = document.getElementById("year").innerHTML;
26                 var inputY = document.getElementById("inputY");
27                 var month = document.getElementById("month").innerHTML;
28                 var inputM = document.getElementById("inputM");
29                 if(month-1+2>12){//判断当前月份是否为12月份,先减后加是为了将month对象转化成Number对象
30                     month="01";//若为12,则下一月月份为01,且年份加1
31                     year = year-1+2;
32                     inputM.value=month;
33                 }else if(month-1+2<10){
34                     inputM.value = "0"+(month-1+2);
35                 }else{
36                     inputM.value = month-1+2;
37                 }
38                 inputY.value = year;
39                 var day = document.getElementById("day").innerHTML;
40                 var inputD = document.getElementById("inputD");
41                 inputD.value = day;
42                 var form = document.getElementById("dateForm");
43                 form.submit();
44             }else if(day!=""){
45                 var year = document.getElementById("year").innerHTML;
46                 var inputY = document.getElementById("inputY");
47                 inputY.value = year;
48                 var month = document.getElementById("month").innerHTML;
49                 var inputM = document.getElementById("inputM");
50                 inputM.value = month;
51                 var inputD = document.getElementById("inputD");
52                 inputD.value = e.innerHTML;
53                 var form = document.getElementById("dateForm");
54                 form.submit();
55             }
      }

  接下来是处理选择特定日期的日历显示代码

 1     public String monthDayByDate(){
 2         //选择日期的时候跳转
 3         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 4         date = chooseYear+"-"+chooseMonth+"-"+"01";//将form表单传递过来的参数组合成时间,这里用01,而不用传递过来的天,是为了避免传过来的天数超过当前月份的总天数,而被加到下一个月
 5         try {
 6             days = Tool.getMonthDays(sdf.parse(date));//得到新选择的日期的所在月份集合
 7         } catch (ParseException e) {
 8             days = Tool.getMonthDays(new Date());//如果转换失败则得到当前时间的月份集合
 9             e.printStackTrace();
10         }
11         int chooseD = Integer.parseInt(chooseDay);
12         //上一月下一月的切换,传递过来的选择的天数还是之前的日期,所以要对这个第几天进行判断是否存在,即选择的是30号,但它是2月,则需要将天数转换
13         if("02".equals(chooseMonth)&&chooseD>=29){//判断是否为2月且选择的天是大于等于29的
14             if("".equals(days.get(29))){//则判断这个2月份是否有29号,有则选择天数为29,否则则选择的是28号
15                 chooseDay = "28";
16             }else{
17                 chooseDay="29";
18             }
19         }
20         else if("".equals(days.get(31))&&chooseD==31){//判断大小月和选择的日期是否是31
21             chooseDay = chooseD-1+"";
22         }
23         return "monthday";
24     }

  最后将得到当前的日期和自己选择的日期后台功能整合在一起,用选择的日期是否为空来判断是当天的还是自己选择日期的日历,将页面上的form表单提交的地址改为修改后的地址就可以通过一个地址来实现当前天和自己选择的日期功能了

 1 public String monthDate(){
 2         if(chooseDay==null){
 3             Date d = new Date();
 4             SimpleDateFormat sdf = new SimpleDateFormat("MM");
 5             SimpleDateFormat sdf2 = new SimpleDateFormat("dd");
 6             SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy");
 7             chooseMonth = sdf.format(d);
 8             chooseDay = sdf2.format(d);
 9             chooseYear = sdf3.format(d);
10             //我这边是方便处理,如果觉得这样麻烦,可以不转化时间成String对象,到时候在页面直接通过<s:date name='' format=''/>实现显示
11             days = MonthNum.getMonthDays(d);//得到当前日期月份的封装对象
12         }else{
13             //选择日期的时候跳转
14             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
15             date = chooseYear+"-"+chooseMonth+"-"+"01";//将form表单传递过来的参数组合成时间,这里用01,而不用传递过来的天,是为了避免传过来的天数超过当前月份的总天数,而被加到下一个月
16             try {
17                 days = Tool.getMonthDays(sdf.parse(date));//得到新选择的日期的所在月份集合
18             } catch (ParseException e) {
19                 days = Tool.getMonthDays(new Date());//如果转换失败则得到当前时间的月份集合
20                 e.printStackTrace();
21             }
22             int chooseD = Integer.parseInt(chooseDay);
23             //上一月下一月的切换,传递过来的选择的天数还是之前的日期,所以要对这个第几天进行判断是否存在,即选择的是30号,但它是2月,则需要将天数转换
24             if("02".equals(chooseMonth)&&chooseD>=29){//判断是否为2月且选择的天是大于等于29的
25                 if("".equals(days.get(29))){//则判断这个2月份是否有29号,有则选择天数为29,否则则选择的是28号
26                     chooseDay = "28";
27                 }else{
28                     chooseDay="29";
29                 }
30             }
31             else if("".equals(days.get(31))&&chooseD==31){//判断大小月和选择的日期是否是31
32                 chooseDay = chooseD-1+"";
33             }
34         }
35         return "monthday";
36     }

  这样在服务器上运行起来就可以在网页上实现简单的日历功能了!

 

点击这里下载源码

 

相关文章
|
11天前
|
前端开发 开发者
在前端开发中,webpack 作为一个强大的模块打包工具,为我们提供了丰富的功能和扩展性
【9月更文挑战第1天】在前端开发中,Webpack 作为强大的模块打包工具,提供了丰富的功能和扩展性。本文重点介绍 DefinePlugin 插件,详细探讨其原理、功能及实际应用。DefinePlugin 可在编译过程中动态定义全局变量,适用于环境变量配置、动态加载资源、接口地址配置等场景,有助于提升代码质量和开发效率。通过具体配置示例和注意事项,帮助开发者更好地利用此插件优化项目。
38 13
|
17天前
|
编解码 前端开发 开发者
【前端设计达人必备】揭秘CSS尺寸单位的魔力:从基础到实战,打造灵动响应式网页!
【8月更文挑战第26天】本文深入探讨了CSS中常用的尺寸单位,包括像素(px)、百分比(%)、视窗单位(vw/vh/vmin/vmax)、可伸缩相对单位(em/rem)以及Flexbox和Grid中的fr单位。通过具体案例展示了每种单位的特点及其适用场景。像素适用于固定尺寸元素;百分比和em/rem利于构建响应式布局;视窗单位适合全屏设计;fr单位则能有效管理复杂网格布局的空间分配。掌握这些单位有助于开发者设计出更加灵活、高质量的网页布局。
35 4
|
16天前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
19 1
|
19天前
|
XML JavaScript 前端开发
哇塞!Web 前端惊现 DOM 元素神操作,一场惊心动魄的网页变革,你准备好了吗?
【8月更文挑战第23天】在Web前端开发中,熟练操作DOM元素至关重要。DOM作为一种编程接口,将HTML/XML文档表示为节点树,便于使用JavaScript访问及修改文档内容与结构。
40 0
|
22天前
|
前端开发 Java 数据库
Java系列之 Long类型返回前端精度丢失
这篇文章讨论了Java后端实体类中Long类型数据在传递给前端时出现的精度丢失问题,并提供了通过在实体类字段上添加`@JsonSerialize(using = ToStringSerializer.class)`注解来确保精度的解决方法。
|
24天前
|
前端开发 IDE Java
"揭秘前端转Java的秘径:SpringBoot Web极速入门,掌握分层解耦艺术,让你的后端代码飞起来,你敢来挑战吗?"
【8月更文挑战第19天】面向前端开发者介绍Spring Boot后端开发,通过简化Spring应用搭建,快速实现Web应用。本文以创建“Hello World”应用为例,展示项目基本结构与运行方式。进而深入探讨三层架构(Controller、Service、DAO)下的分层解耦概念,通过员工信息管理示例,演示各层如何协作及依赖注入的使用,以此提升代码灵活性与可维护性。
33 2
|
11天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
32 0
|
11天前
|
开发者 Android开发 iOS开发
Xamarin开发者的神器!揭秘你绝不能错过的插件和工具,让你的开发效率飞跃式提升
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程,保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用介绍 Xamarin.Forms 的基本功能和工作原理。首先配置 Visual Studio 开发环境,然后创建并运行一个包含标题、按钮和消息标签的示例应用,展示如何定义界面布局及处理按钮点击事件。这帮助开发者快速入门 Xamarin.Forms,提高跨平台应用开发效率。
26 0
|
11天前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
24 0
|
12天前
|
JavaScript 前端开发 开发者
Vue.js的未来已来:掌握最新功能,驾驭前端开发的新浪潮!
【8月更文挑战第30天】Vue.js作为前端开发领域的明星框架,凭借其轻量级、响应式及组件化特性,深受全球开发者喜爱。它持续进化,引入新功能并优化性能,如提升渲染速度和减小打包体积,增强TypeScript支持,简化组件编写流程,进一步提升应用响应性和加载速度,改善开发者体验。活跃的社区和丰富的开源项目如“vuejs-challenges”推动其不断发展。未来,Vue.js将探索更多新特性,如宏和非虚拟DOM模式,巩固其在现代前端框架中的领先地位。
21 0