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代码
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="<SPAN class=hilite1>s2sh</SPAN>" 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代码
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. `name` varchar(20) NOT NULL,
5. `age` int(11) NOT NULL,
6. PRIMARY KEY (`id`)
7.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Sql代码
1.-- Table "person" DDL
2.CREATE TABLE `person` (
3. `id` int(11) NOT NULL,
4. `name` varchar(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代码
.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.}
1Java代码
1.package test.<SPAN class=hilite1>s2sh</SPAN>.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代码
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.<SPAN class=hilite1>s2sh</SPAN>.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&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.<?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/<SPAN class=hilite1>s2sh</SPAN>?useUnicode=true&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/<SPAN class=hilite1>s2sh</SPAN>/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&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>
[/code如果出现乱码问题,可以考虑如下解决方案
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>
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&characterEncoding=UTF-8"></property>
Xml代码
1.<property name="url" value="jdbc:mysql://localhost:3306/<SPAN class=hilite1>s2sh</SPAN>?useUnicode=true&characterEncoding=UTF-8"></property>
<property name="url" value="jdbc:mysql://localhost:3306/s2sh?useUnicode=true&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.}
Java代码
1.package test.<SPAN class=hilite1>s2sh</SPAN>.dao;
2.
3.import java.util.List;
4.
5.import test.<SPAN class=hilite1>s2sh</SPAN>.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.}
Java代码
1.package test.<SPAN class=hilite1>s2sh</SPAN>.dao.impl;
2.
3.import java.util.List;
4.
5.import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
6.
7.import test.<SPAN class=hilite1>s2sh</SPAN>.bean.Person;
8.import test.<SPAN class=hilite1>s2sh</SPAN>.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.}
Java代码
1.package test.<SPAN class=hilite1>s2sh</SPAN>.service;
2.
3.import java.util.List;
4.
5.import test.<SPAN class=hilite1>s2sh</SPAN>.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.}