• struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法


    

    作者:Junsan.Jin
    邮箱:junsanjin@gmail.com
    QQ:1305896503

    本文原始地址:http://www.rsky.com.cn/Article/java/201005/11748.html
    欢迎转载,请保留作者信息,谢谢。

    最近项目使用Spring+Struts2+JPA(Hibernate)的框架进行开发,大量使用了Struts2的标签库,确实让JSP页面干净了不少,也大大提高了开发的效率。

    但是在使用sx:datetimepicker标签时发现一个问题,就是在输入日期内容,然后删除内容,输入框内为""时,再点击日期选择的弹出控件时,发现日期全部变成了NaN。

    下面分析原因和找到解决办法。如果只是想看解决办法,请直接看最后的 最终的解决办法 部分。

    基本解决办法

    开始的解决办法是,对日期的格式进行了校验,如果选择了NaN的日期提交,就提示日期格式错误,不让提交。


    查找原因

    然后网上查了一下,都没有彻底解决的办法,大都是说这个是个BUG,提交前校验就可以了。几年前就有的BUG了,估计Struts也没有心思去解决,所以,就准备自己去修正。

    因为是使用了sx:datetimepicker标签,所以,先去看了一下该标签的源代码。

    在源码包中struts-2.1.8/src/plugins/dojo/src/main/java/org/apache/struts2/dojo/components找到了DateTimePicker.java,查看了一下只是一个初始化设置和写出html代码的普通标签库而已。

    所以,去看看它最终生成了什么样子的代码。生成的代码大致如下


    <div  dojoType="struts:StrutsDatePicker"    id="app.beginDate"    value="2010-05-13T09:27:31"    name="app.beginDate"    inputName="dojo.app.beginDate"    displayFormat="yyyy-MM-dd"  saveFormat="rfc"></div>
    <script language="JavaScript" type="text/javascript">djConfig.searchIds.push("app.beginDate");</script>

    头部声明部分引入了


    <script language="JavaScript" type="text/javascript"
            src="/应用名称/struts/dojo/struts_dojo.js"></script>
    struts_dojo.js这个js。

    同时进行了dojo设置,


    <script language="JavaScript" type="text/javascript">
        // Dojo configuration
        djConfig = {
            isDebug: false,
            bindEncoding: "utf-8"
              ,baseRelativePath: "/dcap/struts/dojo/"
              ,baseScriptUri: "/dcap/struts/dojo/"
             ,parseWidgets : false
           
        };
    </script>


    使用了dojo,所以,不出意外StrutsDatePicker这个小组件应该在struts_dojo.js这个文件中定义。

    在该js中去搜索StrutsDatePicker,找到了


    dojo.provide("struts.widget.StrutsDatePicker");


    发现其又使用了


    dojo.widget.DropdownDatePicker这个小组件。

    继续查DropdownDatePicker,找到dojo.provide("dojo.widget.DropdownDatePicker");,在其代码中找到了


    if(_e5f==""){
    this.datePicker.setDate("");
    }


    这段代码,而_e5f就是改变为控制后的存储字符串,直接把


    this.datePicker.setDate("");


    注释掉,测试一下,发现不会再出现那个讨厌的NaN了。

    但是显示的日期是清空输入框日期前的那个旧的日期,按照普通的逻辑,输入框日期为空,应该显示当前日期,和初始化时候的保持一致么。

    继续找,发现了


    this.datePicker=dojo.widget.createWidget("DatePicker",_e5b,this.containerNode,"child");


    这行代码,是一个DatePicker小组件。

    所以搜索DatePicker,找到了


    dojo.provide("dojo.widget.DatePicker");


    找到setDate函数,发现调用了this._preInitUI函数,继续查找,最终在_preInitUI函数中发现了


    if(_e14<this.startDate||_e14>this.endDate){
    _e14=new Date((_e14<this.startDate)?this.startDate:this.endDate);
    }


    只对日期大小做了校验,而没有对日期的""做校验,原因就在这里了。所以在


    if(_e14<this.startDate||_e14>this.endDate){


    之前加入


    if(_e14==""){
     _e14=new Date();
    }


    修改后的前后代码大概如下:

    this.startDate.setHours(0,0,0,0);
    this.endDate.setHours(24,0,0,-1);
    if(_e14==""){
     _e14=new Date();
    }
    if(_e14<this.startDate||_e14>this.endDate){
    _e14=new Date((_e14<this.startDate)?this.startDate:this.endDate);
    }

    测试一下,一切OK,到此完满解决。


    最终的解决办法

    找到使用的
    struts2-dojo-plugin-2.1.8.1.jar
    解压缩到struts2-dojo-plugin-2.1.8.1文件夹,然后找到
    struts2-dojo-plugin-2.1.8.1/org/apache/struts2/static/dojo
    下的struts_dojo.js文件。
    打开文件
    找到
    dojo.provide("dojo.widget.DatePicker");


    然后往下找到


    if(_e14<this.startDate||_e14>this.endDate){
    _e14=new Date((_e14<this.startDate)?this.startDate:this.endDate);
    }


    在其前面添加


    if(_e14==""){
     _e14=new Date();
    }
    保存。
    然后使用winrar或者winzip,进入struts2-dojo-plugin-2.1.8.1文件夹,将选择该文件夹下的所有文件压缩,注意选择zip格式压缩,压缩好之后,修改为将.zip修改为.jar即可。

    好了,现在覆盖项目中对应的jar包,重新部署即可。测试的时候,注意清空浏览器的缓存,然后刷新即可。否则,还是bug时候的struts-dojo.js文件在客户端。

  • 相关阅读:
    SpringBoot-整合多数据源
    SpringBoot-整合@transactional注解
    SpringBoot-整合mybatis
    SpringBoot-区分不同环境配置文件
    SpringBoot-@value自定义参数
    SpringBoot-@async异步执行方法
    bias与variance,欠拟合与过拟合关系
    从贝叶斯到深度学习各个算法
    基础机器学习算法
    推荐算法总结
  • 原文地址:https://www.cnblogs.com/archermeng/p/7537502.html
Copyright © 2020-2023  润新知