<struts-config>
<data-sources />
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings >
<action path="/customer" type="org.springframework.web.struts.DelegatingActionProxy">
<forward name="success" path="/index.jsp" />
</action>
</action-mappings>
<message-resources parameter="com.ssh.struts.ApplicationResources" />
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/classes/applicationContext.xml"/>
</plug-in>
</struts-config>
注:粗體字為修改的內容
分析:你一定要做到:1、確保spring-struts.jar導入項目。2、保證applicationContext.xml文件路徑正確。我們在導入spring包時就提到,applicationContext.xml文件放在src下,編譯部署后,文件默認存放在WEB-INF/classes下。所以上面的配置為:value="/WEB-INF/classes/applicationContext.xml"/>。
2、配置applicationContext.xml
在這個文件中,我們的任務是加入我們需要的bean。到目前為止,我們要加入兩個bean,即:CustomerDAO與CustomerAction。修改后的內容為:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean name="/customer" class="com.ssh.struts.action.CustomerAction" >
<property name="customerDAO"><ref bean="customerDAO"/></property>
</bean>
<bean name="customerDAO" class="com.ssh.beans.dao.CustomerDAO" />
</beans>
注:粗體字為添加的內容
分析:在這個文件中你要確保:第一,CustomerAction bean中<bean>標簽的屬性name值(name="/customer")一定與struts-config.xml中屬性path的值(path="/customer")一致。第二、<property>標簽的屬性name值在CustomerAction中一定有對應的屬性。第三、<ref>標簽的屬性bean值一定與CustomerDAO bean的<bean>標簽的屬性name值一致(注:這就是注入目標對象)。第四、CustomerDAO bean中<bean>標簽的屬性class值一定是一個實現類(不能為接口)。
3、修改CustomerAction.java
這一步很簡單,只要把setCustomerDAO(new CustomerDAO());這條語句去掉就好。因為我們已經在applicationContext.xml給customerDAO進行了setter注入。(呵呵,至于什么是setter注入,不了解的朋友先看看spring的IOC)。
好的,到現在為止,我們已經對struts和spring進行了融合。再來測試一下,如果輸入同樣的內容,就OK!
如果以上操作大家都沒有問題,我們就向下看。來吧,一起融合spring與hibernate
第二篇 Spring與Hibernate的融合
有的朋友可能只希望知道spring與hibernate的融合。所以在講struts+spring+hibernate之前,我們跳過使用stuts,先說一下spring+hibernate的融合。如果仍然用SSHProject這個項目,需要把po和dao包下面的類刪除,因為我們在生成影射文件和DAO時可能會出現重名文件。還有applicationContext.xml中的bean同樣刪除。
第一步 配置數據環境
既然我們用到hibernate,就要給他配置數據庫,這里我們使用的是mysql5.0。eclipse3.2.2一下的版本與3.2.2版本數據庫的配置是不同的,這里我們只講3.2.2的配置。
1、打開DB Brower

2、新建數據庫連接
在DB Brower中右鍵>新建打開下面對話框,選擇輸入正確的配置。提示:注意你的數據庫名、密碼、和驅動器。

單擊“完成”,測試如果連接到數據庫,就OK。
第二步 選擇hibernate與包的導入
1、hibernate的選擇
上面我們已經提到,spring1.2只支持hibernate3.0以下的版本,所以如果你選擇的是spring1.2一定要注意這個問題。這里我使用的是hibernate3.1
2、包的導入





單擊“完成”OK。
分析:在導入包時出現幾個問題:1、在找spring建好的applicationContext.xml文件時沒有找到路徑,被迫把其他項目的數據庫連接bean考到該文件內((注:僅僅是我存在的問題)。2、把自動生成的sessionFactory刪除。3、最后可能會出現找不到包,所以你要手動添加幾個包。
現在我們看看applicationContext.xml文件內容有什么變化,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/pullhand">
</property>
<property name="username" value="root"></property>
<property name="password" value="815241"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>
</beans>
注:粗體字為自動加入的內容。
第三步 創建影射文件po及dao
1、創建影射文件
首先你要確定所需要的包都導入classpath路徑中,否則在創建影射文件中會出現一些不能操作的對象。如果出現問題,建議大家多重復做幾次。




單擊"完成",就OK。
在包資源管理器中我們可以看到,自動生成四個文件,包括CustomerDAO。

為了方便操作我們包CustomerDAO放在dao包下。如果你沒有刪除ICustomerDAO接口,那我們就使用它了(因為spring是面對接口的,所以我們的操作都應該經過接口)。
接下來,我們再看看applicationContext.xml有什么變化。內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="
xmlns:xsi="
xsi:schemaLocation="http://www.springframework.org/schema/beans
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/pullhand">
</property>
<property name="username" value="root"></property>
<property name="password" value="815241"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/beans/po/Customer.hbm.xml</value></list>
</property>
</bean>
<bean id="CustomerDAO" class="com.ssh.beans.dao.CustomerDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
</beans>
注:粗體字為新內容。提醒:如果你沒有改CustomerDAO的路徑,它應該在po包下。
2、創建dao。
CustomerDAO.java我們使用hibernate自動生成,ICustomerDAO.java接口使用我們以前建好的。
3、創建測試類
既然我們不使用action,那么我們就新建一個類Test.java用于測試。內容如下:
package com.ssh.struts.action;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ssh.beans.dao.CustomerDAO;
public class Test{
private ApplicationContext context;
private void test(){
CustomerDAO customerDAO=(CustomerDAO)context.getBean("customerDAO");
List list=customerDAO.findAll();
if(list!=null&&list.size()>0){
System.out.println("list.size():"+list.size());
}else{
System.out.println("ERROR or NULL");
}
}
private void run(){
context=new ClassPathXmlApplicationContext("applicationContext.xml");
test();
}
public static void main(String[] args){
new Test().run();
}
}
分析:在測試中可能出現兩個異常:
異常一、java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool。如果出現這個異常說明缺少commons-pool-1.2.jar包。
異常二、org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver';;;Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。如果出現這個異常,說明在構建路徑中沒有驅動包。
好的,我們現在測試一下,如果System.out.println("list.size():"+list.size());執行,說明我們對spring與hibernate的融合成功了。
第三篇 整合struts+spring+hibernate
我們在上兩篇的基礎只要再對applicationContext.xml文件進行修改,就可以達到我們整合的目地。
第一步 完善applicationContext.xml內容
1、添加事務處理。內容如下:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="customerDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="customerDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
2、CustomerAction Bean注入事務處理。內容如下:
<bean name="/customer" class="com.ssh.struts.action.CustomerAction" >
<property name="customerDAO"><ref bean="customerDAOProxy"/></property>
</bean>
3、最終applicationContext.xml文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="
xmlns:xsi="
xsi:schemaLocation="http://www.springframework.org/schema/beans
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url"
value="jdbc:mysql://localhost:3306/pullhand">
</property>
<property name="username" value="root"></property>
<property name="password" value="815241"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/ssh/beans/po/Customer.hbm.xml</value></list>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<bean id="customerDAOProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="customerDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="customerDAO" class="com.ssh.beans.dao.CustomerDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean name="/customer" class="com.ssh.struts.action.CustomerAction" >
<property name="customerDAO"><ref bean="customerDAOProxy"/></property>
</bean>
</beans>
第二步,修改CustomerAction
最后內容如下:
package com.ssh.struts.action;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.ssh.beans.dao.ICustomerDAO;
import com.ssh.beans.po.Customer;
public class CustomerAction extends Action {
ICustomerDAO customerDAO=null;
public void setCustomerDAO(ICustomerDAO customerDAO){
this.customerDAO=customerDAO;
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
List list=new ArrayList();
Customer customer=null;
if(customerDAO!=null){
list=customerDAO.getALLCustomer();
for(int i=0;i<list.size();i++){
customer=(Customer)list.get(i);
System.out.println("OK:"+customer.getCustName());
}
}else{
System.out.println("ERROR or NULL");
}
return mapping.findForward("success");
}
}
第三步 解決找不到Action問題
初學者會經常遇到下面這個問題:
HTTP Status 404 - Servlet action is not available
type Status report
message Servlet action is not available
description The requested resource (Servlet action is not available) is not available.
Apache Tomcat/5.0.28
就是找不到我們的action。
當你努力去解決這個問題時,會發現去掉applicationContext.xml下面這個<property>標簽,一切正常:
<property name="mappingResources">
<list>
<value>
com/ssh/beans/po/Customer.hbm.xml
</value>
</list>
</property>
那是什么原因呢?我想大家都會首先想到下面兩個問題:
1、路徑是否正確:即com/ssh/beans/po/Customer.hbm.xml的路徑正確么?
2、文件是否正確:即Customer.hbm.xml的文件內容對么?
當你費了一身力氣發現一切OK,到底什么原因???
問題在于構件路徑(lib)內的包重疊(提示:前提是你要保證這個問題出現之前都正常),所以你要確定構建路徑里的包不能重復!
建議:大家在導入包時,按照默認導入,不要把所有的包都導進工程,在操作中在把需要的jar包導進去(最好不要把整個liberaries導進去),這樣即可以減小工程的大小,又能確保struts\spring\hibernate之間的包不會重疊或者被替換。
好了,我的任務完成了,大家刪包去吧!祝你好運!