struts經驗談

作者:郭哲卿

一些很膚淺的東西,不過在你用struts做項目的時候很有可能碰到,而且好像還沒見有什麼書上提到過這些問題,有興趣的可以看下...如果有什麼不對的地方還請高手指出(我用的版本是1.1,  1.2沒研究過)

1.如果你自己寫form bean的話,字段屬性不要用Date,最好用String代替.因爲如果你用Date型,在網頁表單中相應輸入項又不輸入數據的話,提交時程序就無法對你的form bean完成初始化.而且一點錯誤提示都沒有,log中也不會打印錯誤堆棧,保證急死你.而且validator也同時不起作用,你自己寫validate方法也一樣.(很奇怪,如果你是刷新頁面來提交表單的話有可以了...)
這個問題我曾在apache的bugzilla上提出過::URL::http://issues.apache.org/bugzilla/show_bug.cgi?id=34385
他們給我的回答是:
ActionForms used to hold HTML form input should be using String fields.
(不過這個說法被人罵了,在bug 22730裏面:
It actually works quite well for Number types. And for the Date with the 
default format. 

I do not understand why it's so difficult for you to make one step forward 
instead of 10 backwards saying that you do support any types but String.)
笑昏掉...

不用擔心在寫數據庫的時候會出問題,因爲Date型和String型寫入形式都一樣,如果你是用PreparedStatement的話,用setString()來對Date字段付值也可以.


2. 不要以爲在Struts的jsp頁裏只能用Struts的<html:html>標籤,普通的html標籤同樣可以用,而且在有的情況下Struts的標籤非常的不好用,用普通的html卻非常方便,要看情況選擇.

總體來說,struts的標籤最大好處在於他可以動態綁定某個form bean及其字段屬性或其他東東,而普通的html標籤不具備這個功能.比如說在page範圍內有一個xxxFrom的bean,其中有個字段xxx的值爲yyy,表單名爲xxxFrom,那麼如果你用<html:text property="xxx"/>的話,將會生成<input type="text" name="xxx" value="yyy"/>的輸入框,但是如果你用普通html標籤的話,value值將不會被顯示(也可以定義一個變量等於xxxForm.getXxx(),在value中用<%= %>動態顯示,但是比用struts標籤麻煩多了)

這對錶單驗證很有幫助.比如說如果你輸入的某些數據不符合你定義的嚴整規則,出錯返回時,用struts標籤的字段將自動添入你剛纔已經輸入過的數據,不用你再次輸入,但是如果你用普通html標籤的話將不具備這個功能.

但是這個特點也帶來一些讓人不舒服的東西.比如說如果你有個字段定義爲int型,而int型的默認初值爲0,不能爲空,
那當你第一次訪問該表單的時候,所有int型字段的輸入框將被自動添上0,看起來很不舒服.

所以建議在int型字段輸入框上加一個
<logic:equal value="0" name="xxxForm" property="xxx">
<input type="text" name="xxx"/>
</logic:equal>
<logic:notEqual value="0" name="xxxForm" property="xxx">
<html:text property="xxx"/>
</logic:notEqual>
這樣看起來舒服多了.當然如果這個項本來就可以輸入0的話,就不要用這個方法了.

struts框架還有一個不好的地方就是不支持嵌套使用,比如說<html:text property="<bean:write name="xxxForm" property="xxx"/>"/>之類的使用將拋出錯誤.如果你要把標籤的某個屬性用struts標籤來定義,那就不得不使用<input type="text" name="<bean:write name="xxxForm" property="xxx"/>" />了,或者你也可以用<bean:define id="xxx" name="xxxxForm" property="xxx" />來定義一個變量然後再在屬性裏面用<%=xxx%>來顯示. 

3.如果你手動寫form bean的話,建議extends ValidatorForm或者ValidatorActionForm,這樣你裝個Validator插件,只需要在validation.xml裏面配置一下驗證規則就可以實現對輸入字段的驗證了,省去了你寫一大堆字段驗證的代碼的麻煩事,高效又快捷.爽得很... 

4.如果你是用mysql做數據庫的話,如果你輸入的Date類型數據不合法,數據庫不會拋出錯誤提示,而會把值設爲0000-00-00保存,但是用java.sql.ResultSet讀取的時候就會出錯.無論是你用getDate()或者getString()都一樣,因爲實際上ResultSet在進行匹配的時候並不是你用getXxx()他就會以get 的類型去進行匹配,他是根據從數據庫讀出來的數據的類型匹配以後在進行相應的類型轉換(出這種錯誤的時候看一下錯誤堆棧就知道了)

所以建議在寫數據庫的時候做一下判斷,當出現空值或其他有可能出現的錯誤數據時,寫入另外一個不可能用到的特定值,然後在在view層顯示的時候再做一下判斷,如果等於那個你預先設定好的值時顯示爲未知啊,出錯了啊什麼的... 

注:請尊重版權,轉載請保持原文並註明來源,謝謝...
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章