作者: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文件在客户端。

struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法的更多相关文章

  1. struts从2.3.X升级到2.5.18中遇到的问题及解决办法

    1,2.5.X版本不再提供xwork.jar ,整合到了 struts-core包中.2,需要升级替换的jar文件:commons-langcommons-lang3ognl其他所有struts2开头 ...

  2. javascript 获取 sx:datetimepicker 的值

     <div align="center"><sx:datetimepicker label="Start_Time" id="S ...

  3. struts2:表单标签续(datetimepicker标签)

    18. datetimepicker标签 18.1 拷贝JAR包 在struts-2.x.x压缩包的lib目录中拷贝struts2-dojo-plugin-2.3.8.jar到WEB-INF/lib目 ...

  4. struts 2 报错Could not find action or resul 常见错误原因分析

    1.struts.xml配置的action与我们访问的action或返回的result确实没有匹配导致.这个时候要仔细检查Struts.xml配置文件: 2.我们的action输入正确,返回结果经过无 ...

  5. struts中的dojo控件sx:submit布局问题

    想在一个四列的表格中插入两个按钮,希望实现下面的布局效果: 其中保存按钮为<sx:submit />控件.按照下面的代码布局: <tr><td align="c ...

  6. struts.xml中出现Package struts2 extends undefined package struts-default解决办法

    在struts.xml中出现extends undefined package struts-default,经过查阅资料原来是因为没有联网的缘故.这样解决:在myeclipse中关联本地的dtd文件 ...

  7. Tomcat启动报错java.net.AbstractPlainSocketImpl(java/net/AbstractPlainSocketImpl.java:178:-1)Struts在网络复杂情况下启动报错解决办法

    SSH项目 在网络复杂的情况(具体规律未知)下,Tomcat启动时,报如下错误: [ERROR] 2014-08-12 14:52:58,484 [org.apache.struts2.dispatc ...

  8. 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)

    无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java ...

  9. 在Eclipse IDE进行Struts开发时提示错误:java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.FilterDispatcher的解决办法

    If you have... included all necessary jars Configured build path correctly added them all in deploym ...

随机推荐

  1. AI 领域与概述

    概述 数据分析行业主要的职业发展. 业务:业务分析师.数据产品经理.产品总监 技术:算法师.架构师.研发经理.研发总监 美工:BI工程师 人工智能,是数据分析的子集.人工智能主要包括 语音识别 自然语 ...

  2. JavaScript—面向对象 贪吃蛇最终

    效果 代码 //食物对象 ;(function () { function Food(element) { this.width = 20 this.height = 20 this.backgrou ...

  3. 计蒜客 引爆炸弹(DFS、并查集)

    在一个 n×m 的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹,需要手动 ...

  4. 面试必问之http以及浏览器相关知识

    /** 1.HTTP以及HTTPS概念 HTTP是超文本传输协议,是一个用于传输超媒体文档的应用层协议,被用于在web浏览器和网站服务器之间,以明文方式传递信息, 不提供任何方式的饿数据加密,因此使用 ...

  5. 我是如何从Java转型为Go区块链工程师

    我是如何从Java转型为Go区块链工程师 本文来自于一个比原链核心开发的陈述 前言 IT部落在加入比原链之前一直是做Java开发的,当初看到Go还有点犹豫,还怕过不了面试,结果是否掌握一门语言的考量确 ...

  6. python字符串——"奇葩“的内置函数

      一.前言 python编程语言里的字符串与我们初期所学的c语言内的字符串还是有一定不同的,比如python字符串里的内置函数就比语言的要多得多:字符串内的书写格式也会有一点差异,例:字符串内含有引 ...

  7. abstract关键字、final关键字、static关键字、访问修饰符详解

     abstract关键字.final关键字.static关键字.访问修饰符详解 abstract关键字: final关键字: static关键字: 访问修饰符:

  8. 如何优雅的设计APP页面?

    页面框架设计只是整个产品设计中的一环,不要把眼界局限在这一环,也不要只站需求.只站在交互.只站在视觉上思考问题,从多个角度看问题,你才会学会成长. 产品设计是一个系统工程,单独拧出来其中一个流程来讲, ...

  9. SLAM领域资源链接

    半闲居士高翔博客: https://www.cnblogs.com/gaoxiang12/ 视觉大佬冯兵博客: http://www.fengbing.net/ SLAMCN http://www.s ...

  10. 关于tomcat启动错误:At least one JAR was scanned for TLDs yet contained no TLDs

    一.问题原因: 1.出现这个问题的原因就是Tomcat启动时会扫描大量jar包,如果含有不符合TLD规范的就会出现这个问题 2.以后基本上不会使用JSP作为视图层,所以我们可能根本不需要TLD这个东西 ...