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