日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Struts2 datetimepicker 日期月份乱码解决

發布時間:2024/4/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Struts2 datetimepicker 日期月份乱码解决 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在使用 Struts2 dateTimePicker 控件時, 9月份后會出現亂碼現象。 (本人以struts2-dojo-plugin-2.2.1為例子) 請替換或直接修改以下文件(并保存為UTF-8格式): struts2-dojo-plugin-2.2.1.jar\org\apache\struts2\static\dojo\nls\ dojo_zh.js 和?dojo_zh-cn.js 文件
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 日期月份乱码解决的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。