今天忙了一天,收獲不小。到公司接到個小項目,需求很簡單,時間也很寬松,我就想用spring+hibernate來做,其實有點殺雞用牛刀的味道,但我覺得能通過實踐來學習spring和hibernate,也還是不錯的。
spring和hibernate我也是剛學,各看了本書,然后搞了搞spring的sample,就是那個jpetstore和petclinic,一個是用ibatis,一個用hibernate做persistence層。同時有一個剛進公司的人跟著我做,我也就得先把項目初始化好,寫好配置文件,分好包和層次結構,然后放cvs上。既然用spring+hibernate,配置文件肯定是很多的,我基本是參照petclinic,分了dao, dao.hibernate, model, model.logic, service, web這幾個包,配置文件定義了applicationContext.xml,app-servlet.xml(我用spring mvc) , log4j.properties,jdbc.properties, mail.properties,說到spring的配置文件,其實也不復雜,搞懂了它的IoC(DI)和AOP就很容易配了,層次定義清楚,在頭腦中對誰ref誰有概念,基本就不大會配錯了。錯了也沒關系,它的log功能強大,定義好log4j,出了什么錯都能有詳細的記錄。我搞spring的sample時就是把這個配置改改,那個刪掉,自己寫個類,替換它的。。。。。。這樣很快就對它的配置文件有了深刻的理解。這次算是我第一個正式用spring的項目,但因為前面在理論上和零星的實踐中對它有了較深的認識,也就大大降低了項目的風險(技術預研真的很重要啊!)。
雖然是小項目,但也得規范一下,定好項目計劃,統一大家使用的工具和環境,簡單交代編程的注意事項,如代碼規范,cvs的使用,多寫test類等。我們采用eclipse3.1+ myeclipse+tomcat5+mysql作為各自的開發和單元測試環境,上線使用websphere5+db2。我是要求先在mysql上能跑,然后能方便的遷移到db2上的,這樣方便進行單元測試,也能在事實上與數據庫解耦合,用hibernate很容易做到這一點。
但要能順利的上線到websphere5,我就沒什么把握了,畢竟它還是使用ibm 的jdk1.3,而且很多東西跟tomcat不同,更會不會有什么lib沖突等問題。我先把兼容性測試放在了開發的前面,否則在tomcat上開發好了,websphere不支持或出現難以解決的問題,就麻煩了,嚴重的可能要推倒重來。因為沒在實際項目中使用過spring,周圍又沒什么人可問(我畢業一年多,沒有高手指導,全靠自學和實際項目中領悟),所以有這些疑問也是正常的。不管如何,先把項目在tomcat上跑起來再說。改了一通配置文件,配好tomcat的數據源,往mysql加一個最簡單的表(id一個字段),寫了2張最簡單的jsp(測試spring mvc的multiaction用),一個jsp顯示從數據庫獲得的id。開啟和關閉幾次tomcat(我比較粗心大意,配錯好幾處),id就能在頁面上顯示了。Tomcat上基本配置完成,這也忙了個3、4個小時。
然后就是做兼容性測試了。我們有個websphere的測試環境,先把項目deploy到它上面。測試環境沒用ND,我先deploy到server1上,這樣能重啟應用。Deploy完成,頁面都出不來,500錯,應用就沒起來。先看日志,哇!一堆錯。分析日志,好像是先裝載的DispatcherServlet, 然后才是ContextLoaderServlet,當然出問題了,不過至少說明它找到了lib下的spring.jar也能work。我使用的Listener而不是Servlet來load context,估計是這個原因導致的,tomcat工作正常,websphere對Listener就不保證先啟動了。于是改成使用Servlet,tomcat測試通過,我將改過的web.xml覆蓋服務器(這里要覆蓋2個地方,一個是應用下的,還有一個config/cells…..下的), 重啟應用,再看日志,還是錯。不過這次是先啟動ContextLoaderServlet了,但一上來就錯了,報錯:javax.naming.NamingException: Attempted to use a 4.0 DataSource from a 2.3 (or higher) servlet。這不是spring的問題,呵呵!我用的數據源V4,結果用了j2ee2.3,再改web.xml,頭上改成用j2ee2.2,再覆蓋,再啟應用。這次首頁出來了,看日志,一切正常。呵呵!沒那么多問題嘛,jdk1.3照樣跑最新的spring和hibernate。
今天從零開始把spring和hibernate跑了起來,也算是一次不錯的實戰,就作為spring+hibernate實戰的第一篇吧,接下來幾天,我在項目中的體會也會記錄下來,當成一個一個系列吧。