Struts2 datetimepicker 日期月份乱码解决
1. 文件 "dojo_zh.js" ------------------------------------------------------------------------------
dojo.provide("nls.dojo_zh");dojo.provide("dojo.i18n.calendar.nls.gregorian"); dojo.i18n.calendar.nls.gregorian._built=true;dojo.provide("dojo.i18n.calendar.nls.gregorian.zh"); dojo.i18n.calendar.nls.gregorian.zh={ "days-standAlone-narrow":["日","一","二","三","四","五","六"], "eras":["公元前","公元"], "am":"上午", "months-format-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"], "pm":"下午", "months-format-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"], "days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"], "field-weekday":"Day of the Week", "dateFormat-medium":"yyyy MMM d", "field-second":"Second", "field-week":"Week", "timeFormat-full":"HH:mm:ss z", "field-year":"Year", "field-minute":"Minute", "timeFormat-medium":"HH:mm:ss", "field-hour":"Hour", "dateFormat-long":"yyyy MMMM d", "field-day":"Day", "field-dayperiod":"Dayperiod", "field-month":"Month", "dateFormat-short":"yy/MM/dd", "field-era":"Era", "timeFormat-short":"HH:mm", "timeFormat-long":"HH:mm:ss z", "dateFormat-full":"EEEE, yyyy MMMM dd", "field-zone":"Zone" }; dojo.provide("dojo.i18n.calendar.nls.gregorianExtras"); dojo.i18n.calendar.nls.gregorianExtras._built=true; dojo.provide("dojo.i18n.calendar.nls.gregorianExtras.zh"); dojo.i18n.calendar.nls.gregorianExtras.zh={"dateFormat-yearOnly":"yyyy'年'"}; dojo.provide("dojo.i18n.calendar.nls.gregorian"); dojo.i18n.calendar.nls.gregorian._built=true; dojo.provide("dojo.i18n.calendar.nls.gregorian.zh"); dojo.i18n.calendar.nls.gregorian.zh={ "days-standAlone-narrow":["日","一","二","三","四","五","六"], "eras":["公元前","公元"], "am":"上午", "months-format-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"], "pm":"下午","months-format-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"], "days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"], "field-weekday":"Day of the Week", "dateFormat-medium":"yyyy MMM d", "field-second":"Second", "field-week":"Week", "timeFormat-full":"HH:mm:ss z", "field-year":"Year", "field-minute":"Minute", "timeFormat-medium":"HH:mm:ss", "field-hour":"Hour", "dateFormat-long":"yyyy MMMM d", "field-day":"Day", "field-dayperiod":"Dayperiod", "field-month":"Month", "dateFormat-short":"yy/MM/dd", "field-era":"Era", "timeFormat-short":"HH:mm", "timeFormat-long":"HH:mm:ss z", "dateFormat-full":"EEEE, yyyy MMMM dd", "field-zone":"Zone" }; dojo.provide("dojo.widget.nls.TimePicker"); dojo.widget.nls.TimePicker._built=true; dojo.provide("dojo.widget.nls.TimePicker.zh"); dojo.widget.nls.TimePicker.zh={"any":"any"}; dojo.provide("dojo.widget.nls.DropdownTimePicker"); dojo.widget.nls.DropdownTimePicker._built=true; dojo.provide("dojo.widget.nls.DropdownTimePicker.zh"); dojo.widget.nls.DropdownTimePicker.zh={"selectTime":"Select time"}; dojo.provide("dojo.widget.nls.DropdownDatePicker"); dojo.widget.nls.DropdownDatePicker._built=true; dojo.provide("dojo.widget.nls.DropdownDatePicker.zh"); dojo.widget.nls.DropdownDatePicker.zh={"selectDate":"Select a date"};
=============================================================================
2. 文件 "dojo_zh-cn.js" ------------------------------------------------------------------------------
dojo.provide("nls.dojo_zh-cn"); dojo.provide("dojo.i18n.calendar.nls.gregorian"); dojo.i18n.calendar.nls.gregorian._built=true; dojo.provide("dojo.i18n.calendar.nls.gregorian.zh_cn"); dojo.i18n.calendar.nls.gregorian.zh_cn={ "dateFormat-medium":"yyyy-M-d", "field-second":"秒鐘", "field-week":"周", "timeFormat-full":"ahh'時'mm'分'ss'秒' z", "field-year":"年", "field-minute":"分鐘", "timeFormat-medium":"ahh:mm:ss", "field-hour":"小時", "dateFormat-long":"yyyy'年'M'月'd'日'", "field-day":"日", "field-dayperiod":"上午/下午", "field-month":"月", "dateFormat-short":"yy-M-d", "field-era":"時期", "timeFormat-short":"ah:mm", "timeFormat-long":"ahh'時'mm'分'ss'秒'", "dateFormat-full":"yyyy'年'M'月'd'日'EEEE", "field-weekday":"周天", "field-zone":"區域", "days-standAlone-narrow":["日","一","二","三","四","五","六"],"eras":["公元前","公元"], "am":"上午", "months-format-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"], "pm":"下午", "months-format-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"], "days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"] }; dojo.provide("dojo.i18n.calendar.nls.gregorianExtras"); dojo.i18n.calendar.nls.gregorianExtras._built=true; dojo.provide("dojo.i18n.calendar.nls.gregorianExtras.zh_cn"); dojo.i18n.calendar.nls.gregorianExtras.zh_cn={"dateFormat-yearOnly":"yyyy'年'"}; dojo.provide("dojo.i18n.calendar.nls.gregorian"); dojo.i18n.calendar.nls.gregorian._built=true; dojo.provide("dojo.i18n.calendar.nls.gregorian.zh_cn"); dojo.i18n.calendar.nls.gregorian.zh_cn={ "dateFormat-medium":"yyyy-M-d", "field-second":"秒鐘", "field-week":"周", "timeFormat-full":"ahh'時'mm'分'ss'秒' z", "field-year":"年", "field-minute":"分鐘", "timeFormat-medium":"ahh:mm:ss", "field-hour":"小時", "dateFormat-long":"yyyy'年'M'月'd'日'", "field-day":"日", "field-dayperiod":"上午/下午", "field-month":"月", "dateFormat-short":"yy-M-d", "field-era":"時期", "timeFormat-short":"ah:mm", "timeFormat-long":"ahh'時'mm'分'ss'秒'", "dateFormat-full":"yyyy'年'M'月'd'日'EEEE", "field-weekday":"周天", "field-zone":"區域", "days-standAlone-narrow":["日","一","二","三","四","五","六"], "eras":["公元前","公元"], "am":"上午", "months-format-abbr":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "days-format-abbr":["周日","周一","周二","周三","周四","周五","周六"], "pm":"下午", "months-format-wide":["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"], "months-standAlone-narrow":["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"], "days-format-wide":["星期日","星期一","星期二","星期三","星期四","星期五","星期六"] }; dojo.provide("dojo.widget.nls.TimePicker"); dojo.widget.nls.TimePicker._built=true; dojo.provide("dojo.widget.nls.TimePicker.zh_cn"); dojo.widget.nls.TimePicker.zh_cn={"any":"any"}; dojo.provide("dojo.widget.nls.DropdownTimePicker"); dojo.widget.nls.DropdownTimePicker._built=true; dojo.provide("dojo.widget.nls.DropdownTimePicker.zh_cn"); dojo.widget.nls.DropdownTimePicker.zh_cn={"selectTime":"Select time"}; dojo.provide("dojo.widget.nls.DropdownDatePicker"); dojo.widget.nls.DropdownDatePicker._built=true; dojo.provide("dojo.widget.nls.DropdownDatePicker.zh_cn"); dojo.widget.nls.DropdownDatePicker.zh_cn={"selectDate":"Select a date"}; **************************************************************************************************
最近項目使用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 datetimepicker 日期月份乱码解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: struts 2.x版本 datetim
- 下一篇: tomcat的端口修改