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文件在客户端。
struts 2.1.8.1的sx:datetimepicker标签出现NaN错误的原因和解决办法的更多相关文章
- struts从2.3.X升级到2.5.18中遇到的问题及解决办法
1,2.5.X版本不再提供xwork.jar ,整合到了 struts-core包中.2,需要升级替换的jar文件:commons-langcommons-lang3ognl其他所有struts2开头 ...
- javascript 获取 sx:datetimepicker 的值
<div align="center"><sx:datetimepicker label="Start_Time" id="S ...
- struts2:表单标签续(datetimepicker标签)
18. datetimepicker标签 18.1 拷贝JAR包 在struts-2.x.x压缩包的lib目录中拷贝struts2-dojo-plugin-2.3.8.jar到WEB-INF/lib目 ...
- struts 2 报错Could not find action or resul 常见错误原因分析
1.struts.xml配置的action与我们访问的action或返回的result确实没有匹配导致.这个时候要仔细检查Struts.xml配置文件: 2.我们的action输入正确,返回结果经过无 ...
- struts中的dojo控件sx:submit布局问题
想在一个四列的表格中插入两个按钮,希望实现下面的布局效果: 其中保存按钮为<sx:submit />控件.按照下面的代码布局: <tr><td align="c ...
- struts.xml中出现Package struts2 extends undefined package struts-default解决办法
在struts.xml中出现extends undefined package struts-default,经过查阅资料原来是因为没有联网的缘故.这样解决:在myeclipse中关联本地的dtd文件 ...
- 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 ...
- 【转载】struts应用在断网情况下启动报错解决办法(java/net/AbstractPlainSocketImpl.java:178:-1)
无意间struts应用在有网络的情况下启动正常,在断网的情况下启动报错,报错代码如下图所示: SEVERE: Exception starting filter struts2 Class: java ...
- 在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 ...
随机推荐
- Pmw大控件(二)
Pmw大控件英文名Pmw Python megawidgets 官方参考文档:Pmw 1.3 Python megawidgets 一,如何使用Pmw大控件 下面以创建一个计数器(Counter)为例 ...
- 洛谷P1002 过河卒(动态规划)
题目描述 棋盘上 AA 点有一个过河卒,需要走到目标 BB 点.卒行走的规则:可以向下.或者向右.同时在棋盘上 CC 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为 ...
- 收藏基本Java项目开发的书
一.Java项目开发全程实录 第1章 进销存管理系统(Swing+SQL Server2000实现) 第2章企业内部通信系统(Swing+JavaDB实现) 第3章 企业人事管理系统( Swing+H ...
- IT培训行业变革大会,7月11日启程!
自上世纪八十年代PC时代起,IT行业走过了以2G移动网络和宽带网络.PC终端为主要载体,软件产品.应用软件和门户网站为特征产品的PC互联网时代. 以3/4G移动和高速宽带和移动终端为主要载体,移动支付 ...
- 02)MFC那几个基本文件介绍
1)首先是 类目录: 2)在这个工程里面,你找不到主函数,没有主函数,你能看到的 仅仅有这五个类 但是 你还看不到 这五个类对应的对象子啊哪里 而且 我们在写MFC程序的时候 我压 ...
- My97DatePicker日历插件
My97DatePicker具有强大的日期功能,能限制日期范围,对于编写双日历比较简便. 注意事项: My97DatePicker目录是一个整体,不可以破坏 My97DatePicker.html 是 ...
- 如何编写一个vue应用
1.vue应用的组成 1.1 vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 通常 ...
- tensorflow2使用中的一些问题
from tensorflow import keras import tensorflow as tf import numpy as np print(tf.__name__,tf.__versi ...
- E - Rebuild UVALive - 7187 (二次函数极值问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5531 Problem Description Archaeologists find ruins of ...
- F 乘法(第k大问题)(二分)
题:https://ac.nowcoder.com/acm/contest/3979/F 题意:俩个序列俩俩相乘得到n*m个数,求第k大的数是哪个 分析:二分 #include<bits/std ...