終於,終於將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