作者: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文件在客户端。
分享到:
相关推荐
解决了原struts2-dojo-plugin-2.1.8.1.jar中使用datetimepicker时,在中文情况下会产生乱码的问题
在探讨《struts2.0中s:datetimepicker标签使用范例》这一主题时,我们首先需要理解struts2框架以及其内置的s:datetimepicker标签的用途与配置方法。Struts2是一个开源的Web应用框架,基于MVC(Model-View-Controller...
原先的.jar包是在运用datetimepicker标签时出现乱码,经过上传者修正后,中文显示正常
修复datetimepicker月份显示乱码BUG。只需在标签内添加<sx:head extraLocales="UTF-8"/>即可
struts2-dojo-plugin-2.2.1.jar 解决了datetimepicker显示月份乱码的问题,<sx:datetimepicker>显示9、10、11、12月份时出现乱码,本包修改了该bug
DateTimePicker DatePicker/DateTimePicker/HourMinutePicker/TimePicker/YMDHPickerallprojects { repositories { ... maven { url '...
### JavaScript中读取Struts2标签DateTimePicker的值 在Web开发中,特别是涉及到日期时间选择的情况下,如何在客户端(JavaScript)与服务器端(如Struts2框架)之间有效地交互和处理日期时间数据是非常重要的。...
struts2-dojo-plugin-2.1.6.jar 解决了datetimepicker显示月份乱码的问题,<sx:datetimepicker>显示9、10、11、12月份时出现乱码,本包修改了该bug
1. `org.apache.struts2.components`:这个包包含视图组件,如UI标签,Struts2增强了这些组件,新增了多个有用的功能,例如`updownselect`, `doubleselect`, `datetimepicker`, `token`, `tree`等,并支持自定义主题...
9. `s:datetimepicker` 标签:此标签提供了一个日期和时间选择器,用于用户输入日期和时间。 10. `s:debug` 标签:在开发过程中非常有用,它可以显示当前请求的所有详细信息,包括session、request、application等...
Struts 2 标签库(文档手册) Tags-API-CLSW-JSP <%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-...
1. CSS文件:这些文件包含了datetimepicker的样式,可能是`bootstrap.css`(Bootstrap的基础样式)和`bootstrap-datetimepicker.css`(datetimepicker插件的定制样式)。 2. JS文件:JavaScript文件负责实现...
DateTimePicker是Android开发中常用的控件之一,尤其在需要用户输入日期或时间的场景中,它的易用性和可定制性使其成为了开发者们的首选。在这个项目中,DateTimePicker被设计为一款简约、美观的日期时间选择器,...
Struts2是一个强大的MVC框架,它源自WebWork并整合了Struts1的优点,提供了更加稳定和高效的解决方案。本文将详细讲解Struts2中的各种标签,帮助开发者更好地理解和使用这个框架。 A. `<s:a>` 和 `<s:action>`: 1....
Bootstrap-Datetimepicker.js是一款基于Bootstrap框架的日期时间选择器插件,它为用户提供了便捷的方式来选取日期和时间,尤其在Web应用中常用于表单输入。这个插件的设计风格与Bootstrap一致,确保了与Bootstrap...
Struts2是一个强大的MVC框架,它提供了丰富的标签库,使得开发者可以更加便捷地构建动态网页。以下是对Struts2标签的详细解释: A部分: 1. `<s:a>`:创建一个链接,与HTML的`<a>`标签相似,允许传递参数。 2. `<s:...
标题中的“datetimepicker 日期NaN错误 中文乱码”是一个常见的编程问题,通常发生在尝试处理日期和时间输入时。在JavaScript环境下,`NaN`代表"非数字",当日期格式不正确或者无法解析为日期对象时,JavaScript会...
Struts2是一个流行的Java Web应用程序框架,它继承和发展了Struts1.x的一些特性,同时又采用了WebWork框架的核心技术,使得Struts2在设计理念和技术实现上都有了显著的进步。 #### Struts2与WebWork的关系 Struts2...
Struts2.0 是一款基于MVC设计模式的开源Java Web框架,它的核心部分包括了丰富的标签库,这些标签极大地简化了JSP页面中的代码,提高了开发效率。在Struts2.0中,标签不再像Struts1.x那样分为html、bean、logic、...