Struts2+Spring+hibernate整合

Struts 2,Spring 2,Hibernate 整合 html

整合完畢的項目下載地址http://download.csdn.net/detail/woaiwoaini121/4599429 java

下載以後導入到myeclipse9.0中可直接使用mysql

開發工具Eclipse
1.首先建立一個web工程,咱們暫且啓明爲s2sh 
這裏咱們選擇的是Java EE 5.0 

 

finish 
2.向工程加入hibernate支持,這裏咱們使用的是hibernate 3.2 

 

默認就能夠,不要忘記將jar包加入到/WebRoot/WEB-INF/lib 

 

接着next 

 

實際上這裏的hibernate.cfg.xml不起做用,由於該配置文件的內容由後面的spring配置文件進行管理,咱們能夠在建立以後將其刪除 
默認next 

 

咱們根本不用hibernate.cfg.xml,因此這裏根本不須要進行數據庫配置,固然默認也無所謂。 
繼續next 

 

sessionFactory咱們在以後也會直接使用spring爲咱們提供的,因此這裏不須要建立。 
finish 
3.向工程加入spring支持,這裏咱們使用的是spring2 

 

這裏咱們選擇的是spring2, 

 

不要忘記選中這5個庫包: 
Spring 2.0 AOP Libraries 
Spring 2.0 Core Libraries 
Spring 2.0 Persistence Core Libraries 
Spring 2.0 Persistence JDBC Libraries 
Spring 2.0 Web Libraries 
也不要忘記將jar包加入到/WebRoot/WEB-INF/lib。 
next 

 

這裏咱們不須要Enable AOP 因此不須要選中 
不要忘記將配置文件applicationContext.xml指定在/WEB-INF目錄下,否則服務器啓動時沒法加載 
next 

 

這裏的sessionFactory咱們也不須要,以後會手動配置。 
finish 
4.加入struts2支持,因爲MyEclipse並無加入Struts2的支持,因此咱們須要手動導入相關jar包。 
這裏咱們使用的是struts 2.0.11版本 
須要的相關jar包以下: 
freemarker-2.3.8.jar 
ognl-2.6.11.jar 
struts2-core-2.0.11.jar 
xwork-2.0.4.jar 
struts2-spring-plugin-2.0.11.jar 

4.進行相關文件的配置 
首先咱們須要在src下加入struts的配置文件struts.xml 
Xml代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5. <struts>  
  6.     <package name="s2sh" extends="struts-default">  
  7.     </package>  
  8. </struts>  

接下來咱們配置web.xml 
Xml代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  7. <!-- 配置struts2的過濾器 -->  
  8. <filter>  
  9.     <filter-name>struts2</filter-name>  
  10.     <filter-class>  
  11.         org.apache.struts2.dispatcher.FilterDispatcher  
  12.     </filter-class>  
  13. </filter>  
  14.   
  15. <filter-mapping>  
  16.     <filter-name>struts2</filter-name>  
  17.     <url-pattern>/*</url-pattern>  
  18. </filter-mapping>  
  19.   
  20. <!-- 配置spring的監聽器 -->  
  21. <listener>  
  22.     <listener-class>  
  23.         org.springframework.web.context.ContextLoaderListener  
  24.     </listener-class>  
  25. </listener>  
  26.   
  27.   <welcome-file-list>  
  28.     <welcome-file>index.jsp</welcome-file>  
  29.   </welcome-file-list>  
  30.   
  31. </web-app>  

到目前爲止咱們的整合工做已經完成。咱們能夠將該工程打包,以備下次直接使用。 
這裏由一個問題就是若是採用myeclipse加載hibernate和spring的lib包形式發佈項目的時候會出現異常,咱們能夠手動去掉一個asm-2.2.3jar便可。 

5.下面咱們作一個簡單的應用來驗證。 
(1)首先咱們使用的是mysql,不要忘記將mysql-jdbc的jar包導入到咱們的工程中 
咱們建立s2sh數據庫,並建立表person 
Sql代碼   收藏代碼
  1. -- Table "person" DDL  
  2. CREATE TABLE `person` (  
  3.   `id` int(11) NOT NULL,  
  4.   `namevarchar(20) NOT NULL,  
  5.   `age` int(11) NOT NULL,  
  6.   PRIMARY KEY  (`id`)  
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

(2)首先咱們建立test.s2sh.bean包,在下面建立咱們person表對應的Entity Bean及其映射文件 
Person.java 
Java代碼   收藏代碼
  1. package test.s2sh.bean;  
  2.   
  3. public class Person {  
  4.     private Integer id;  
  5.     private String name;  
  6.     private int age;  
  7.     public Integer getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(Integer id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public int getAge() {  
  20.         return age;  
  21.     }  
  22.     public void setAge(int age) {  
  23.         this.age = age;  
  24.     }  
  25. }  

Person.hbm.xml 
Xml代碼   收藏代碼
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5. <hibernate-mapping>  
  6.     <class name="test.s2sh.bean.Person" table="person">  
  7.         <id name="id" type="java.lang.Integer" column="id">  
  8.             <generator class="increment"></generator>  
  9.         </id>  
  10.         <property name="name" type="string" column="name"  
  11.          length="20"></property>  
  12.          <property name="age" type="java.lang.Integer" column="age"></property>  
  13.     </class>  
  14. </hibernate-mapping>  


(3)在spring配置文件applicationContext.xml配置hibernate的鏈接數據庫信息及sessionFactory建立方式 
Xml代碼   收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">  
  6. <!-- apache.dbcp鏈接池的配置 -->  
  7. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  8.     <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>  
  9.     <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&amp;characterEncoding=UTF-8"></property>  
  10.     <property name="username" value="root"></property>  
  11.     <property name="password" value=""></property>  
  12.     <!-- 最大活動鏈接數 -->  
  13.     <property name="maxActive" value="100"></property>  
  14.     <!-- 最大可空閒鏈接數 -->  
  15.     <property name="maxIdle" value="30"></property>  
  16.     <!-- 最大可等待鏈接數 -->  
  17.     <property name="maxWait" value="500"></property>  
  18.     <!-- 默認的提交方式(若是不須要事務能夠設置成true,在實際應用中通常設置爲false,默認爲false) -->  
  19.     <property name="defaultAutoCommit" value="true"></property>  
  20. </bean>  
  21. <!-- 這裏直接使用spring對hibernate3支持的sessionFactory -->  
  22. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  23.     <property name="dataSource" ref="dataSource"></property>  
  24.     <!-- hibernate方言等相關配置 -->  
  25.     <property name="hibernateProperties">  
  26.         <props>  
  27.             <prop key="connection.useUnicode">true</prop>  
  28.             <prop key="connection.characterEncoding">utf-8</prop>  
  29.             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  30.             <prop key="hibernate.show_sql">true</prop>  
  31.         </props>  
  32.     </property>  
  33.     <!-- hbm.xml的映射文件 -->  
  34.     <property name="mappingResources">  
  35.         <list>  
  36.             <value>test/s2sh/bean/Person.hbm.xml</value>  
  37.         </list>  
  38.     </property>  
  39. </bean>  
  40.   
  41. </beans>  

若是出現亂碼問題,能夠考慮以下解決方案 
Xml代碼   收藏代碼
  1. <property name="hibernateProperties">  
  2.     <props>  
  3.         <prop key="connection.useUnicode">true</prop>  
  4.         <prop key="connection.characterEncoding">utf-8</prop>  
  5.         <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>  
  6.         <prop key="hibernate.show_sql">true</prop>  
  7.     </props>  
  8. </property>  

或者將url後面加入編碼串,以下 
Xml代碼   收藏代碼
  1. <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&amp;characterEncoding=UTF-8"></property>  

注意 : 這裏個人數據庫編碼是utf-8 
具體那種方案好用你們能夠嘗試一下,我基本上直接將兩種方式都加上了。 

(4)下面咱們開始寫DAO層,首先建立test.s2sh.dao包放置Dao類的接口,建立test.s2sh.dao.impl包放置Dao類的實現。 
PersonDAO.java 
Java代碼   收藏代碼
  1. package test.s2sh.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import test.s2sh.bean.Person;  
  6.   
  7. public interface PersonDAO {  
  8.     void savePerson(Person p);  
  9.     void removePerson(Person p);  
  10.     Person findPersonById(Integer id);  
  11.     List<Person> findAllPersons();  
  12.     void updatePerson(Person p);  
  13. }  

因爲使用了spring,因此DAO的實現類咱們能夠繼承HibernateDaoSupport進行實現 
PersonDAOImpl.java 
Java代碼   收藏代碼
  1. package test.s2sh.dao.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  6.   
  7. import test.s2sh.bean.Person;  
  8. import test.s2sh.dao.PersonDAO;  
  9.   
  10. public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {  
  11.   
  12.     public List<Person> findAllPersons() {  
  13.         String hql = "from Person p order by p.id desc";  
  14.         return (List<Person>)this.getHibernateTemplate().find(hql);  
  15.     }  
  16.   
  17.     public Person findPersonById(Integer id) {  
  18.         Person p = (Person) this.getHibernateTemplate().get(Person.class, id);  
  19.         return p;  
  20.     }  
  21.   
  22.     public void removePerson(Person p) {  
  23.         this.getHibernateTemplate().delete(p);  
  24.     }  
  25.   
  26.     public void savePerson(Person p) {  
  27.         this.getHibernateTemplate().save(p);  
  28.     }  
  29.   
  30.     public void updatePerson(Person p) {  
  31.         this.getHibernateTemplate().update(p);  
  32.     }  
  33.   
  34. }  

(5)下面咱們開始進行service層的設計,這裏的service層僅是簡單調用DAO層的的方法。 
一樣是建立接口包(test.s2sh.service),實現包和接口類(test.s2sh.service.impl),實現類 
PersonService.java 
Java代碼   收藏代碼
  1. package test.s2sh.service;  
  2.   
  3. import java.util.List;  
  4.   
  5. import test.s2sh.bean.Person;  
  6.   
  7. public interface PersonService {  
  8.     List<Person> findAll();  
  9.     void save(Person p);  
  10.     void delete(Person p);  
  11.     Person findById(Integer id);  
  12.     void update(Person p);  
  13. }  

這裏咱們須要使用spring的ioc將DAO諸如到service中,因此不要忘記在service實現類中加入DAO做爲屬性。 
PersonServiceImpl.java 
Java代碼   收藏代碼
  1. package test.s2sh.service.impl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import test.s2sh.bean.Person;  
  6. import test.s2sh.dao.PersonDAO;  
  7. import test.s2sh.service.PersonService;  
  8.   
  9. public class PersonServiceImpl implements PersonService {  
  10.     private PersonDAO personDAO;  
  11.     public void delete(Person p) {  
  12.         this.personDAO.removePerson(p);  
  13.     }  
  14.   
  15.     public List<Person> findAll() {  
  16.         return this.personDAO.findAllPersons();  
  17.     }  
  18.   
  19.     public Person findById(Integer id) {  
  20.         return this.personDAO.findPersonById(id);  
  21.     }  
  22.   
  23.     public void save(Person p) {  
  24.         this.personDAO.savePerson(p);  
  25.     }  
  26.   
  27.     public void update(Person p) {  
  28.         this.personDAO.updatePerson(p);  
  29.     }  
  30.   
  31.     public PersonDAO getPersonDAO() {  
  32.         return personDAO;  
  33.     }  
  34.   
  35.     public void setPersonDAO(PersonDAO personDAO) {  
  36.         this.personDAO = personDAO;  
  37.     }  
  38.   
  39. }  


(6)接下來咱們開始對action層進行設置,實際項目中的action可能會有不少,因此咱們這裏須要對action進行分包,由於咱們這裏針對Person進行操做,因此咱們建立test.s2sh.action.person. 
這裏先作保存操做 
SavePersonAction.java 
Java代碼   收藏代碼
  1. package test.s2sh.action.person;  
  2.   
  3. import test.s2sh.bean.Person;  
  4. import test.s2sh.service.PersonService;  
  5.   
  6. import com.opensymphony.xwork2.ActionSupport;  
  7.   
  8. public class SavePersonAction extends ActionSupport {  
  9.     private Person p;  
  10.     private PersonService service;  
  11.     public Person getP() {  
  12.         return p;  
  13.     }  
  14.     public void setP(Person p) {  
  15.         this.p = p;  
  16.     }  
  17.     public PersonService getService() {  
  18.         return service;  
  19.     }  
  20.     public void setService(PersonService service) {  
  21.         this.service = service;  
  22.     }  
  23.       
  24.     public String execute() throws Exception {  
  25.         this.service.save(p);  
  26.         return this.SUCCESS;  
  27.     }  
  28.       
  29.     public void validate() {  
  30.         if(p.getName()==null||"".equals(p.getName())){  
  31.             this.addFieldError("p.name""name is not null");  
  32.         }  
  33.     }  
  34.       
  35. }  

下面建立一個保存人員的提交頁面 
save.jsp 
Java代碼   收藏代碼
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3.   
  4. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  5. <html>  
  6.   <head>  
  7.       
  8.     <title>Save Person</title>  
  9.   
  10.   </head>  
  11.     
  12.   <body>  
  13.     <s:form action="savePerson">  
  14.         <s:textfield name="p.name" label="name"></s:textfield>  
  15.         <s:textfield name="p.age" label="age"></s:textfield>  
  16.         <s:submit></s:submit>  
  17.     </s:form>  
  18.   </body>  
  19. </html>  

操做成功頁面 
save-success.jsp 
Java代碼   收藏代碼
  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
  2.   
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  4. <html>  
  5.   <head>  
  6.     <title>Save OK</title>  
  7.   </head>  
  8.     
  9.   <body>  
  10.     保存成功 <br>  
  11.   </body>  
  12. </html>  

接下來咱們須要配置struts.xml,建立action 
Xml代碼   收藏代碼
  1. <action name="savePerson" class="savePersonAction">  
  2.     <result name="success" type="redirect">/save-success.jsp</result>  
  3.     <result name="input">/save.jsp</result>  
  4. </action>  

因爲如今的action的建立已經由spring所接管,因此這裏class裏面使用的是別名,該別名與applicationContext.xml中的id對應. 

接下來咱們須要配置applicationContext的ioc。 
Xml代碼   收藏代碼
  1. <bean id="personDAO" class="test.s2sh.dao.impl.PersonDAOImpl" scope="singleton">  
  2.     <!-- 因爲該類是繼承於HibernateDaoSupport,因此須要將sessionFactory注入 -->  
  3.     <property name="sessionFactory" >  
  4.         <ref bean="sessionFactory"/>  
  5.     </property>  
  6. </bean>  
  7. <bean id="personService" class="test.s2sh.service.impl.PersonServiceImpl">  
  8.     <property name="personDAO" ref="personDAO"></property>  
  9. </bean>  
  10. <bean id="savePersonAction" class="test.s2sh.action.person.SavePersonAction" scope="prototype">  
  11.     <property name="service" ref="personService"></property>  
  12. </bean>  

這裏說明一下spring中的單例與設計模式中的單例不一樣,設計模式的單例是在jvm中只產生一個實例,而spring中的單例 
是針對每一個ioc容器來言,若是存在兩個ioc容器,那麼每一個ioc容器都會生成惟一的類實例 
將sessionFactory注入Dao中,這裏的Dao來講是無狀態的,能夠設置爲單例singleton。這裏的action是使用spring建立的。 
struts2與struts1的action有所不一樣,由於struts2中的action中可能存在屬性,這裏是Person,因此struts2的action多是有狀態的。 
若是是有狀態的咱們就須要將scope設置成原型模式,即每次請求都新建一個action。 
否則可能會出現若是表單提交的第一次出錯,以後就再也提交不過去了,值就是應爲使用默認的singleton, 

當第一次的時候就將FieldError中加入了錯誤,每次都是這個action,始終帶着這個錯誤,因此就提交不過去了。web

S2SH整個項目的下載地址:http://download.csdn.net/detail/woaiwoaini121/4599429spring

下載以後能夠直接使用。sql

相關文章
相關標籤/搜索