更系統地掌握Struts1.x/Struts2.x+Hibernate+Spring框架組合,請學習SpringSide或Appfuse

終於,終於將SSH整合成功了,弄了幾個小時,可以休息了(有的朋友弄了半個月,甚至重裝了系統也沒弄好,哎,慶幸啊)。碰到問題千萬不要放棄,要相信沒有解決不了的問題!

項目結構圖:

 

jsp部分爲:index.jsp;success.jsp;fail.jsp

UserDAO.java,User.hbm.xml自動生成,HibernateSessionFactory是多餘的。

相關的配置文件、類文件詳細信息,請參看Struts+Spring+Hibernate/SSH整合開發詳細二

以前是整過這三個框架的,可是工作期間都不曾用過,不知不覺之中,學的東西全忘了。這次又要開始找工作了,看着招聘啓事上都寫着:要求熟練掌握Struts,Hibernate或Spring框架……,沒得辦法,重新學唄。

Spring in Action中文版下載地址(ftp協議)   ftp://222.214.218.61/book5/20080228/cf8b35cc-5bcd-4973-b6b7-37ae3ec78391.rar 如果無法下載,可以在http://www.gougou.com裏重新搜索

首先開始搭建項目環境,步驟如下:

使用平臺:MyEclipse 6.0

框架版本:Struts 1.2 Hibernate 3.0 Spring 2.0

1>     添加過程:

         <1> 新建項目。 Package Explorer視圖下,右鍵單擊 New -> Web Project;
         <2> 添加Struts框架。菜單欄MyEclipse -> Capabilities,或者右鍵單擊新建的項目名,選擇快捷菜單中的"MyEclipse"下的二級菜單;設置相關的包名後,請寫一個Struts的小例子,用來測試Struts是否可用;
         <3> 添加Spring。步驟同2所述,只不過這次是加入Spring Capabilities。詳細添加步驟如下圖所示;
         

 

 

 


          <4> 配置數據源。打開數據庫視圖,Windows -> Open Perspective -> MyEclipse DataBase Explorer。新建數據源, 在DB Browser下,右鍵單擊 New ,配置信息類似下圖,

 

 

           點擊Next,選擇"Display all schemas","Finish"完工。
          <5> 點擊MyEclipse右上角 >>按鈕,返回到MyEclipse Java Enterprise視圖。按類似於2的步驟,添加Hibernate框架,詳細步驟如圖所示

請選擇Hibernate 3.0的版本

 

 

 

 

 

 

 

 

          <6>通過MyEclipse生成操作數據庫的Dao類(UserDao),並自動生成映射表的配置文件(在本示例中包含在applicationContext.xml中),將視圖切換到MyEclipse Database Explorer,打開我們在前面配置的數據鏈接,選擇我們操作的表User,右鍵單擊,選擇:Hibernate Reverse Engineering。詳細步驟如下圖所示:

 

 

 

 

 

         <7> 至此,項目環境己經搭建完成。

         需要指出的是,爲了使用日誌管理的功能,你只須拷貝log4j.properties即可,將其放入到src根目錄下。

          log4j.properties配置內容如下(對具體配置不太瞭解的朋友可以在這之後學一下,此處,你只須修改日誌文件存儲路徑即可):

                
                    log4j.rootLogger=info,A1

                    log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
                    log4j.appender.A1.Append=true

                    # log文件存儲路徑,請轉換爲相應的目錄
                    log4j.appender.A1.File=E:/workspace/ssh2/logs/log4j.log

                    log4j.appender.A1.DatePattern = '.'yyyy-MM-dd'.log'

                     log4j.appender.A1.layout=org.apache.log4j.PatternLayout
                    log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} Method:   %l%n%m%n 。

                      # 無詳細類名、方法名信息
                     #log4j.appender.A1.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} %m%n

                     # -X號:X信息輸出時左對齊;
                     # %p:日誌信息級別
                      # %d{}:日誌信息產生時間
                     # %c:日誌信息所在地(類名)
                     # %m:產生的日誌具體信息
                     # %n:輸出日誌信息換行

Spring,Hibernate已經整合在一起了,現在需要將Struts與Spring進行整合。Spring與Struts整合實現方式
第一,在struts-config.xml中加入

<!--配置一個插件去集成spring -->
<plug-in
       className="org.springframework.web.struts.ContextLoaderPlugIn">
       <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>

第二,修改struts-config.xml中action節點的配置信息,將原來定義的
<action path="/validateUser"
    type="com.wuwei.struts.action.ValidateUserAction" name="userForm">
    <forward name="success" path="/success.jsp"></forward>
    <forward name="fail" path="/fail.jsp"></forward>
   </action>
中的type改爲: type="org.springframework.web.struts.DelegatingActionProxy">或者你也可以不改,而在<plug-in>標籤前加入如下定義

<!-- 加上controller就不用再配置action的type屬性了/或者說type屬性不用改爲
   type="org.springframework.web.struts.DelegatingActionProxy" -->
<controller
   processorClass="org.springframework.web.struts.DelegatingRequestProcessor">
</controller>

第三,在applicationContext.xml中爲ValidateUserAction添加定義,將userDao的實例化加給Spring,這也是Spring中的依賴注入
<!-- Struts -->
<bean name="/validateUser"
   class="com.wuwei.struts.action.ValidateUserAction">
   <property name="userDAO" ref="userDao" />

</bean>

當然,這裏ref(引用)的Bean userDao也是在applicationContext.xml中己定義好的

<!-- 通過HibernateDaoSupport來操作數據庫,需要植入sessionFactory
   UserDao繼承自HibernateDaoSupport
-->
<bean id="userDao" class="com.wuwei.struts.dao.UserDAO">
   <property name="sessionFactory" ref="sessionFactory" />
</bean>

 

如此這般,現在可以運行你的程序了。爲了測試三個框架是否整合成功,你可以在action裏什麼都不做,只是寫一條輸入語句即可。因爲搭建SSH項目時,最容易碰到的錯誤就是:Servlet action is not available。如果連action都訪問不了,後面的就不需要談了(文章B http://blog.csdn.net/shendiaodaxia/archive/2007/12/29/2002805.aspx應該可以解決此類問題)。測試不成功?依然是Servlet action is not available?這個時候log4j.log就起到關鍵作用了,你可以看下里面出現了什麼異常。我在調試時碰到了:

1. java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor   和

2. net.sf.cglib.core.CodeGenerationException: java.lang.reflect.InvocationTargetException-->null
Caused by: java.lang.reflect.InvocationTargetException
Caused by: java.lang.SecurityException: class "com.wuwei.struts.bean.User$$EnhancerByCGLIB$$1016ffbf"'s signer information does not match signer information of other classes in the same package

的錯誤。

1的解決辦法是:

在使用Spring的AOP編程時,會用到這幾個lib:
(版本不一樣,文件名也不一樣)
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar

Hibernate使用如下lib:
asm.jar
asm-attrs.jar
其中asm-2.2.3.jar與asm.jar存在類上的衝突!!!
使用其中之一或兩者都使用,可能會出現如下錯誤:
java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor
java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。
解決辦法是:
1.去掉類路徑上的關於Hibernate的3個lib
asm.jar
asm-attrs.jar
cglib-2.1.3.jar
2.加入Spring中的以下4個lib
asm-2.2.3.jar
asm-commons-2.2.3.jar
asm-util-2.2.3.jar
cglib-nodep-2.1_3.jar

2的解決辦法是:

在….hbm.xml文件中,將class標籤的lazy屬性改爲false(默認爲true)<class name="com.wuwei.struts.bean.User" table="user" lazy="false">。如果有schema="dbo" catalog="test"配置信息,請將其刪除

再次運行,打印語句成功 "I'm in a Action" 搭建成功!

補充:

我用的是SQLServer數據庫,測試表是User表,調試時出現了
java.sql.SQLException: 在關鍵字 'user' 附近有語法錯誤。這是因爲MS SQL中的User表是系統表,不能直接查詢select username from user,需要將user用中括號包圍[user],同樣,爲了保證hibernate能正常工作,需將user.hbm.xml中class元素的table改爲     table="[user]"

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/guo_qiang929/archive/2009/11/26/4876908.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章