s2sh整合<一>

Struts 2,Spring 2,Hibernate 整合
开发工具Eclipse 6.5/6.6 GA
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>  
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	<package name="s2sh" extends="struts-default">
	</package>
</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>  
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- 配置struts2的过滤器 -->
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>
		org.apache.struts2.dispatcher.FilterDispatcher
	</filter-class>
</filter>

<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 配置spring的监听器 -->
<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

</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;  
-- Table "person" DDL
CREATE TABLE `person` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  `age` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) 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. }  
package test.s2sh.bean;

public class Person {
	private Integer id;
	private String name;
	private int age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}


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>  
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
	<class name="test.s2sh.bean.Person" table="person">
		<id name="id" type="java.lang.Integer" column="id">
			<generator class="increment"></generator>
		</id>
		<property name="name" type="string" column="name"
		 length="20"></property>
		 <property name="age" type="java.lang.Integer" column="age"></property>
	</class>
</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 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">
<!-- apache.dbcp连接池的配置 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
	<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
	<property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&amp;characterEncoding=UTF-8"></property>
	<property name="username" value="root"></property>
	<property name="password" value=""></property>
	<!-- 最大活动连接数 -->
	<property name="maxActive" value="100"></property>
	<!-- 最大可空闲连接数 -->
	<property name="maxIdle" value="30"></property>
	<!-- 最大可等待连接数 -->
	<property name="maxWait" value="500"></property>
	<!-- 默认的提交方式(如果不需要事务可以设置成true,在实际应用中一般设置为false,默认为false) -->
	<property name="defaultAutoCommit" value="true"></property>
</bean>
<!-- 这里直接使用spring对hibernate3支持的sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
	<property name="dataSource" ref="dataSource"></property>
	<!-- hibernate方言等相关配置 -->
	<property name="hibernateProperties">
		<props>
			<prop key="connection.useUnicode">true</prop>
			<prop key="connection.characterEncoding">utf-8</prop>
			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
			<prop key="hibernate.show_sql">true</prop>
		</props>
	</property>
	<!-- hbm.xml的映射文件 -->
	<property name="mappingResources">
		<list>
			<value>test/s2sh/bean/Person.hbm.xml</value>
		</list>
	</property>
</bean>

</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>  
	<property name="hibernateProperties">
		<props>
			<prop key="connection.useUnicode">true</prop>
			<prop key="connection.characterEncoding">utf-8</prop>
			<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
			<prop key="hibernate.show_sql">true</prop>
		</props>
	</property>


或者将url后面加入编码串,如下

Xml代码 复制代码
  1. <property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&amp;characterEncoding=UTF-8"></property>  
<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. }  
package test.s2sh.dao;

import java.util.List;

import test.s2sh.bean.Person;

public interface PersonDAO {
	void savePerson(Person p);
	void removePerson(Person p);
	Person findPersonById(Integer id);
	List<Person> findAllPersons();
	void updatePerson(Person p);
}


由于使用了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. }  
package test.s2sh.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import test.s2sh.bean.Person;
import test.s2sh.dao.PersonDAO;

public class PersonDAOImpl extends HibernateDaoSupport implements PersonDAO {

	public List<Person> findAllPersons() {
		String hql = "from Person p order by p.id desc";
		return (List<Person>)this.getHibernateTemplate().find(hql);
	}

	public Person findPersonById(Integer id) {
		Person p = (Person) this.getHibernateTemplate().get(Person.class, id);
		return p;
	}

	public void removePerson(Person p) {
		this.getHibernateTemplate().delete(p);
	}

	public void savePerson(Person p) {
		this.getHibernateTemplate().save(p);
	}

	public void updatePerson(Person p) {
		this.getHibernateTemplate().update(p);
	}

}


(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. }  
package test.s2sh.service;

import java.util.List;

import test.s2sh.bean.Person;

public interface PersonService {
	List<Person> findAll();
	void save(Person p);
	void delete(Person p);
	Person findById(Integer id);
	void update(Person p);
}

 

你可能感兴趣的:(spring,Hibernate,mysql,bean,struts)