在示范中心項(xiàng)目中,我們把ActionForm中日期類(lèi)型的字段指定為String類(lèi)型,而在對(duì)應(yīng)的JavaBean中指定為java.sql.Date類(lèi)型。當(dāng)用戶(hù)提交表單的時(shí)候,在Action里使用BeanUtils.copyProperties()方法從ActionForm構(gòu)造JavaBean對(duì)象(詳見(jiàn)利用BeanUtils在對(duì)象間復(fù)制屬性)。這個(gè)方法在大部分時(shí)候都很好,但有一個(gè)問(wèn)題,就是當(dāng)用戶(hù)沒(méi)有填寫(xiě)日期類(lèi)型字段時(shí)(而該字段并非必填),validator不會(huì)提出警告,而在copyProperties()時(shí)會(huì)報(bào)類(lèi)型轉(zhuǎn)換異常,原因是這時(shí)ActionForm中的該字段的值是空字符串(""),負(fù)責(zé)字符串向Date轉(zhuǎn)換的SqlDateConverter類(lèi)調(diào)用Date.valueOf("")方法,顯然""是無(wú)法轉(zhuǎn)換為日期的,所以會(huì)拋出異常。
通過(guò)查看代碼和資料,我發(fā)現(xiàn)這個(gè)問(wèn)題的解決方法其實(shí)非常簡(jiǎn)單。只要把帶缺省值參數(shù)的SqlDateConverter重新注冊(cè)一下,覆蓋原有的注冊(cè)信息就可以了,這個(gè)注冊(cè)語(yǔ)句一般是寫(xiě)在系統(tǒng)初試化的地方,對(duì)于Struts應(yīng)用程序,當(dāng)然做在PlugIn里最方便。代碼如下:




















注意SqlDateConverter的構(gòu)造方法是帶有參數(shù)null的,這表示遇到不能解析的字符串就返回空值。而deregister()方法的作用是恢復(fù)ConvertUtils的缺省注冊(cè)表。為了使這個(gè)PlugIn起作用,要在struts-config.xml里增加一句話(huà):

日期字段往往會(huì)給我們的開(kāi)發(fā)帶來(lái)麻煩,其實(shí)在Struts應(yīng)用程序里,只要把這些轉(zhuǎn)換類(lèi)搞熟了,總可以找到很方便的辦法。常見(jiàn)的問(wèn)題還有如何指定日期輸入格式,怎樣處理java.util.Date的轉(zhuǎn)換,等等,在這個(gè)鏈接里有解決這些問(wèn)題的方法,道理都是一樣的。