自從6月份寫過一些博客之后,有將近5個月沒寫博客了,或者由于工作繁忙,或者由于懶于書筆,又或者最近沒有研究技術(shù)上的東西,根本無從寫起。雖然從事項目管理工作,但深知沒有技術(shù)根底,管理好一個IT項目談何容易。難得近期各項目走上正軌,有點閑心回憶一下技術(shù)方面的東西,那就拿ssh開刀吧,誰叫它是最流行的J2EE框架組合呢。

花了將近3個小時終于把一個ssh整合的例子做完,感嘆不如當(dāng)年勇啊,雖說經(jīng)驗豐富了很多,但是實打?qū)嵉鼐幋a工作,可真不是靠吹牛吹出來的,到處都存在問題,需要花時間一一解決。好了,廢話少說,下面列一下用到的一些技術(shù)以及注意點,為了避免誤導(dǎo)人,或致人懶惰,這里就不將所有代碼一一列出,只是貼一些關(guān)鍵的代碼段。

用到的技術(shù)如下:
1)MySql,在本機(jī)上能跑的最小數(shù)據(jù)庫。
2)Hibernate3,有了注解功能后,感覺比Hibernate2方便多了
3)Spring3
4)Struts2
5)Junit4,用于測試service的方法
6)Log4j
7)需要的jar包如下,



1、MySql
    這個就不多說了,安裝過程非常簡單。創(chuàng)建一個數(shù)據(jù)庫:test,用grant語句創(chuàng)建用戶test,密碼test;創(chuàng)建一張表:ACCOUNT。
2、Hibernate3
    1)創(chuàng)建一個domain對象:Account,和表ACCOUNT對應(yīng);在上面加注解@Entity @Table(name="ACCOUNT"),這樣就省去了些hbm文件
    2)創(chuàng)建AccountDao,實現(xiàn)增刪改查功能;
3、spring3
    1)創(chuàng)建spring配置文件:spring.xml,定義datasource,sessionFactory等;
    2)創(chuàng)建AccountService,實現(xiàn)業(yè)務(wù)邏輯,調(diào)用AccountDao;
4、Struts2
    1)創(chuàng)建web.xml,將spring.xml放入ContextConfigLocation;
    2)創(chuàng)建struts.xml,定義package和action及跳轉(zhuǎn);
    3)創(chuàng)建LoginAction類,從頁面獲取用戶名和密碼,調(diào)用AccountService的用于驗證方法

總結(jié),在做這個例子的過程中,出現(xiàn)很多問題,很大一部分都是來自于jar包的缺失和沖突,以下幾點是比較難于發(fā)現(xiàn)的,
  1)Springframework的jar包版本不一致,會出現(xiàn)很奇怪的問題;
  2)缺少struts2-spring-plugin-2.2.3的jar包,會導(dǎo)致spring的bean無法實例化成功,總是獲取到null;
  3)javaee.jar和servlet-api.jar的沖突,個人感覺后者是前者的精簡版,在Tomcat容器的lib目錄下存在,會和工程中的lib沖突,解決方案是把Tomcat下的servlet-api.jar換成javaee.jar;
  4)如果想通過標(biāo)記的方式來注入bean,必須在spring配置文件中,添加以下代碼:
       <context:annotation-config />
       <context:component-scan base-package="com.glen" />

另外,還有兩個問題未解決,望能人幫之,

  1)兩表關(guān)聯(lián),PrimaryKeyJoinColumn不起作用,只能插數(shù)據(jù)到主表,不能將數(shù)據(jù)插入關(guān)聯(lián)表;
  2)mysql數(shù)據(jù)庫,插入中文時報錯,
[2011/11/27 11:30:45:045 CST] ERROR org.hibernate.util.JDBCExceptionReporter:(JDBCExceptionReporter.java:101): Incorrect string value: '\xE5\xBC\xA0\xE7\x9B\x8A...' for column 'chinese_name' at row 1
[2011/11/27 11:30:46:046 CST] ERROR org.hibernate.event.def.AbstractFlushingEventListener:(AbstractFlushingEventListener.java:324): Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update