我的SSH集成(spring管理Action)

我的SSH集成,版本分別是:spring2.0 Struts1.3 Hibernate3.2, Myeclipse 版本是6.01.(本文僅爲記錄自己的SSH集成步驟而爲,中間會有很多錯誤,如果不想被誤導,還是不要看了吧!)

首先新建一個web項目
按照 Struts Spring Hibernate的順序爲項目添加jar包,均使用內置的library

Struts 使用1.3版本,類庫無法選擇,默認即可。

Spring 選擇JDBC library,並將spring.jar和commons-pool.jar、Mysql連接包放到項目WEB-INF/lib下(如果沒有將spring.jar放到lib下,則很有可能報錯)

Hibernate 默認即可

注意:如果不引入hibernate.cfg.xml,即將配置集成到applicationContext.xml中,那麼則需要commons-dbcp.jar 和 commons-pool.jar。但是如果引入hibernate.cfg.xml文件,上面兩個jar包並不需要

下面進入重頭戲,配置xml文件:

在web.xml中

<!-- 配置Spring 如果在Struts中配置了plugin,那麼就不要在這裏配置listener了,兩者功能一樣,都是啓動Spring,不過在struts-config.xml中配置plugin時,此項目總是報錯,大概信息爲無法找到plugin類,但是我已經將spring-struts.jar引入了,暫時無法解決。此處仍然使用listener的方式-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:applicationContext.xml
</param-value>
</context-param>


另外,還可以加入session的過期時間
<!-- Session過期時間配置,此處時間單位是分鐘 -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>


struts-config.xml中

<form-beans>
<form-bean name="loginForm" type="com.king.web.form.LoginForm"></form-bean>
</form-beans>


<action path="/user/Login" parameter="method" name="loginForm" scope="request" 
type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="login" path="/user/login.jsp"></forward>
<forward name="mainPage" path="/user/mainPage.jsp"></forward>
</action>


Spring配置文件

<bean id="King" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/ssh"></property>
<property name="username" value="root"></property>
<property name="password" value="test"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="King" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- <property name="mappingResources">-->
<!-- <list>-->
<!-- <value>com/king/domain/maps/User.hbm.xml</value>-->
<!-- <value>com/king/domain/maps/Account.hbm.xml</value>-->
<!-- </list>-->
<!-- </property>-->
<property name="mappingDirectoryLocations">
<list>
<value>classpath*:com/king/domain/maps</value>
</list>
</property>
</bean>

<!-- 配置Action Service Dao -->
<!-- User相關配置 -->
<bean id="userDao" class="com.king.dao.impl.UserDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>

<bean id="userService" class="com.king.service.impl.UserServiceImpl">
<property name="userDAO" ref="userDao"></property>
</bean>

<bean name="/user/Login" class="com.king.web.action.LoginAction">
<property name="userService" ref="userService"></property>
</bean>


先記錄到這裏,剩下的就是java類和jsp頁面的編寫



啓動時出現如下錯誤,經檢查是Spring和Hibernate的包發生了衝突
嚴重: StandardWrapper.Throwable 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V
Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V


方案:
在使用Spring的AOP編程時,會用到這幾個lib:
asm-2.2.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
Hibernate使用如果lib:
asm.jar
asm-attrs.jar
其中asm-2.2.2.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.2.jar
asm-commons-2.2.2.jar
asm-util-2.2.2.jar
cglib-nodep-2.1_3.jar


按照上面的方法進行操作後,我這裏還是會出現上述問題。我的解決方案是替換Spring和Hibernate的版本及其包,按照如下步驟:
1、在項目lib中,僅保留mysql的連接數據庫包,其餘全部刪除
2、在buildPath中,將spring 和 Hibernate 的library移除
3、複製如下包到lib中

Spring 2.5.6版本:
aspectjweaver.jar
cglib-nodep-2.1_3.jar
commons-dbcp-1.2.1.jar
commons-logging-1.0.4.jar
commons-pool-1.2.jar
dom4j-1.6.1.jar
log4j-1.2.15.jar
spring.jar
spring-agent.jar
spring-aspects.jar
spring-tomcat-weaver.jar
spring-webmvc-struts.jar



hibernate3.3.1支持jar包
antlr-2.7.6.jar
asm.jar
c3p0-0.9.0.jar
cglib-2.1.3.jar
commons-collections-3.1.jar
concurrent-1.3.2.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
slf4j-api-1.5.2.jar
slf4j-log4j12-1.5.2.jar


替換之後,重新部署,在applicationContext.xml中,會由一個錯誤,不用管它。
重新部署後,一切正常。搞定

對自己的建議:
SSH集成時,儘量使用自己建立的User Library,使用Myeclipse自帶的Library經常會出現包衝突的問題。至於Struts,如果不使用Struts2,可以用Myeclipse的1.3庫,不會發生什麼衝突。

上面的jar分別是我的Spring2.5.6和Hibernate3.3.1的庫,挺好用的,呵呵!

注:

所有Action繼承DispatchAction,Form繼承ActionForm。和正常的寫法沒有什麼區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章