[flash=200,200]本文介绍
1.Struts2+Spring2.5+Hibernate3.3的整合
2.采用单元测试
3.加入了lob类型的操作配置
4.介绍oralce驱动 本文采用oracle11g
5.在HIbernate中采用“枚举”设置映射关系
Oralce的驱动介绍
Java代码
1.class12.jar(jdk 1.2 / 1.3 )
2.class14.jar(jdk 1.4 / 1.5)
3.其实只要安装了oralce 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。
class12.jar(jdk 1.2 / 1.3 )
class14.jar(jdk 1.4 / 1.5)
其实只要安装了oralce 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。
SSH2整合需要的Jar
1.Strusts
Java代码
1.javassist-3.4.GA.jar
2.commons-fileupload-1.2.1.jar
3.commons-logging-1.0.4.jar
4.freemarker-2.3.15.jar
5.ognl-2.7.3.jar
6.struts2-core-2.1.8.jar
7.xwork-core-2.1.6.jar
8.struts2-spring-plugin-2.1.8.jar
javassist-3.4.GA.jar
commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
struts2-spring-plugin-2.1.8.jar
2.Hibernate
Java代码
1.commons-collections-3.1.jar
2.dom4j-1.6.1.jar
3.ehcache-1.2.3.jar
4.ejb3-persistence.jar
5.hibernate-annotations.jar
6.hibernate-cglib-repack-2.1_3.jar
7.hibernate-commons-annotations.jar
8.hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
9.hibernate3.jar
10.javassist-3.4.GA.jar
11.jta-1.1.jar
12.log4j.jar
13.slf4j-api-1.5.2.jar
14.slf4j-log4j12.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar
3.Spring
Java代码
1.aspectjrt.jar
2.aspectjweaver.jar
3.c3p0-0.9.1.2.jar
4.cglib-nodep-2.1_3.jar
5.common-annotations.jar
6.log4j-1.2.15.jar
7.spring.jar
aspectjrt.jar
aspectjweaver.jar
c3p0-0.9.1.2.jar
cglib-nodep-2.1_3.jar
common-annotations.jar
log4j-1.2.15.jar
spring.jar
整合步骤先整合 Spring2.5+Hibernate3.3 成功后在整合 Struts2 这样就不容易报错,而且 报错误后也便于找出问题。
spring配置文件模版可以到 spring自带的一些例子中进行赋值。
applicationContext.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8"?>
2.<?xml version="1.0" encoding="UTF-8"?>
3.<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns="http://www.springframework.org/schema/beans"
5. xmlns:context="http://www.springframework.org/schema/context"
6. xmlns:aop="http://www.springframework.org/schema/aop"
7. xmlns:tx="http://www.springframework.org/schema/tx"
8. xsi:schemaLocation="http://www.springframework.org/schema/beans
9. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
10. http://www.springframework.org/schema/context
11. http://www.springframework.org/schema/context/spring-context-2.5.xsd
12. http://www.springframework.org/schema/aop
13. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
14. http://www.springframework.org/schema/tx
15. http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
16.
17.<!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->
18.<context:component-scan base-package="com.sh"/>
19.
20.<!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->
21.<!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->
22.<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
23. <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
24. <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
25. <property name="user" value="luob"/>
26. <property name="password" value="m123"/>
27. <!-- 连接池中的最大连接数 -->
28. <property name="maxPoolSize" value="150"/>
29.
30. <!-- 连接池中的最小连接数 -->
31. <property name="minPoolSize" value="1"></property>
32.
33. <!-- 初始化连接池中的 连接数,取值 在 minPoolSize 和 maxPoolSize 之间,default:3-->
34. <property name="initialPoolSize" value="3"/>
35.
36. <!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->
37. <property name="maxIdleTime" value="60"/>
38.
39. <!-- 当连接数不够时,每次同时创建多少个连接 -->
40. <property name="acquireIncrement" value="1"/>
41.
42. <!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->
43. <property name="idleConnectionTestPeriod" value="60"/>
44.</bean>
45.
46.<!--从c3p0数据源中抽取出JDBC的代理对象-->
47.<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" lazy-init="true" />
48.
49.<!--9i: org.springframework.jdbc.support.lob.OracleLobHandler -->
50.<!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个) -->
51.<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
52. <!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->
53. <property name="nativeJdbcExtractor">
54. <ref local="nativeJdbcExtractor" />
55. </property>
56.</bean>
57.
58.<!-- 将Hibernate中的事物交给Spring进行接管 -->
59.<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
60. <!-- 指定sessiongFactory中的数据源 -->
61. <property name="dataSource" ref="dataSource"/>
62.
63. <!-- 指定hibernate的属性 -->
64. <property name="hibernateProperties">
65. <value>
66. <!-- hibernate使用的 方言 -->
67. hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
68. <!-- 根据实体的映射文件生成表结构 -->
69. hibernate.hbm2ddl.auto=update
70. <!-- 格式化sql -->
71. hibernate.format_sql=false
72. <!-- 是否打印出sql语句 -->
73. hibernate.show_sql=false
74. </value>
75. </property>
76. <!-- 定义lob操作对象 -->
77. <property name="lobHandler">
78. <ref bean="lobHandler" />
79. </property>
80. <!-- 指定hibernate的映射文件 -->
81. <property name="mappingResources">
82. <list>
83. <value>com/sh/employee/model/Employee.hbm.xml</value>
84. </list>
85. </property>
86.</bean>
87.
88.<!-- 配置使用基于Hibernate的事务管理器 -->
89.<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
90. <!-- spring需要通过sessionFactory来开启事务 -->
91. <property name="sessionFactory" ref="sessionFactory"/>
92.</bean>
93.
94.<!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->
95.<tx:annotation-driven transaction-manager="txManager"/>
96.
97.</beans>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->
<context:component-scan base-package="com.sh"/>
<!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->
<!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
<property name="user" value="luob"/>
<property name="password" value="m123"/>
<!-- 连接池中的最大连接数 -->
<property name="maxPoolSize" value="150"/>
<!-- 连接池中的最小连接数 -->
<property name="minPoolSize" value="1"></property>
<!-- 初始化连接池中的 连接数,取值 在 minPoolSize 和 maxPoolSize 之间,default:3-->
<property name="initialPoolSize" value="3"/>
<!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->
<property name="maxIdleTime" value="60"/>
<!-- 当连接数不够时,每次同时创建多少个连接 -->
<property name="acquireIncrement" value="1"/>
<!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->
<property name="idleConnectionTestPeriod" value="60"/>
</bean>
<!--从c3p0数据源中抽取出JDBC的代理对象-->
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" lazy-init="true" />
<!--9i: org.springframework.jdbc.support.lob.OracleLobHandler -->
<!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个) -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<!-- 将Hibernate中的事物交给Spring进行接管 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 指定sessiongFactory中的数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定hibernate的属性 -->
<property name="hibernateProperties">
<value>
<!-- hibernate使用的 方言 -->
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
<!-- 根据实体的映射文件生成表结构 -->
hibernate.hbm2ddl.auto=update
<!-- 格式化sql -->
hibernate.format_sql=false
<!-- 是否打印出sql语句 -->
hibernate.show_sql=false
</value>
</property>
<!-- 定义lob操作对象 -->
<property name="lobHandler">
<ref bean="lobHandler" />
</property>
<!-- 指定hibernate的映射文件 -->
<property name="mappingResources">
<list>
<value>com/sh/employee/model/Employee.hbm.xml</value>
</list>
</property>
</bean>
<!-- 配置使用基于Hibernate的事务管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- spring需要通过sessionFactory来开启事务 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
Employee.java
Java代码
1.package com.sh.employee.model;
2.
3.public class Employee {
4. private String username;
5. private String password;
6. //枚举类型
7. private Gender gender=Gender.MAN;
8. public String getUsername() {
9. return username;
10. }
11. public void setUsername(String username) {
12. this.username = username;
13. }
14. public String getPassword() {
15. return password;
16. }
17. public void setPassword(String password) {
18. this.password = password;
19. }
20. public Gender getGender() {
21. return gender;
22. }
23. public void setGender(Gender gender) {
24. this.gender = gender;
25. }
26. public Employee(String username, String password) {
27. super();
28. this.username = username;
29. this.password = password;
30. }
31. public Employee() {
32. super();
33. // TODO Auto-generated constructor stub
34. }
35. public Employee(String username, String password, Gender gender) {
36. super();
37. this.username = username;
38. this.password = password;
39. this.gender = gender;
40. }
41.
42.}
package com.sh.employee.model;
public class Employee {
private String username;
private String password;
//枚举类型
private Gender gender=Gender.MAN;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public Employee(String username, String password) {
super();
this.username = username;
this.password = password;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(String username, String password, Gender gender) {
super();
this.username = username;
this.password = password;
this.gender = gender;
}
}
Gender.java
Java代码
1.package com.sh.employee.model;
2.
3.public enum Gender {
4. //分为字面值 :MAN / WOMAN
5. //索引值:0 1
6. MAN,WOMAN
7.
8.}
package com.sh.employee.model;
public enum Gender {
//分为字面值 :MAN / WOMAN
//索引值:0 1
MAN,WOMAN
}
Employee.hbm.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8" ?>
2.<!DOCTYPE hibernate-mapping PUBLIC
3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5.<hibernate-mapping package="com.sh.employee.model">
6. <class name="Employee">
7. <id name="username" length="20"/>
8. <property name="password" length="20" not-null="true"/>
9. <property name="gender" not-null="true" length="5">
10. <type name="org.hibernate.type.EnumType">
11. <param name="enumClass">com.sh.employee.model.Gender</param>
12. <!--type:12 为java.sql.Types.VARCHAR常量值,即保存枚举字面值到数据库。
13. 如果不指定(删除)type:则保存枚举索引值到数据库(从0 开始) -->
14. <param name="type">12</param>
15. </type>
16. </property>
17. </class>
18.</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 package="com.sh.employee.model">
<class name="Employee">
<id name="username" length="20"/>
<property name="password" length="20" not-null="true"/>
<property name="gender" not-null="true" length="5">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">com.sh.employee.model.Gender</param>
<!--type:12 为java.sql.Types.VARCHAR常量值,即保存枚举字面值到数据库。
如果不指定(删除)type:则保存枚举索引值到数据库(从0 开始) -->
<param name="type">12</param>
</type>
</property>
</class>
</hibernate-mapping>
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.
8. <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
9. <context-param>
10. <param-name>contextConfigLocation</param-name>
11. <!-- 如果有多个文件 使用 "," 分开 -->
12. <param-value>classpath:applicationContext.xml</param-value>
13. </context-param>
14.
15. <!-- 对spring容器进行实例化 -->
16. <listener>
17. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
18. </listener>
19.
20. <!--配置Struts2的过滤器 -->
21. <filter>
22. <filter-name>struts2</filter-name>
23. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
24. </filter>
25. <filter-mapping>
26. <filter-name>struts2</filter-name>
27. <url-pattern>/*</url-pattern>
28. </filter-mapping>
29.
30. <welcome-file-list>
31. <welcome-file>index.jsp</welcome-file>
32. </welcome-file-list>
33.</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">
<!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 如果有多个文件 使用 "," 分开 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 对spring容器进行实例化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置Struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
EmployeeService.java
Java代码
1.package com.sh.employee.interfaces;
2.
3.import java.util.List;
4.
5.import com.sh.employee.model.Employee;
6.
7.public interface EmployeeService {
8. void save(Employee employee);
9. void update(Employee employee);
10. Employee find(String userName);
11. void delete(String... userName);
12. List<Employee> list();
13.}
package com.sh.employee.interfaces;
import java.util.List;
import com.sh.employee.model.Employee;
public interface EmployeeService {
void save(Employee employee);
void update(Employee employee);
Employee find(String userName);
void delete(String... userName);
List<Employee> list();
}
EmployeeServiceBean.java
Java代码
1.package com.sh.employee.service;
2.
3.import java.util.List;
4.
5.import javax.annotation.Resource;
6.
7.import org.hibernate.Session;
8.import org.hibernate.SessionFactory;
9.import org.hibernate.Transaction;
10.import org.springframework.stereotype.Service;
11.import org.springframework.transaction.annotation.Propagation;
12.import org.springframework.transaction.annotation.Transactional;
13.
14.import com.sh.employee.interfaces.EmployeeService;
15.import com.sh.employee.model.Employee;
16.
17./**
18. *@author LuoB.
19. */
20.
21.//@Service: 定义业务层。采用扫描加注解 将这个类交给spring管理 。
22.//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean
23.
24.//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
25.//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
26.@Service @Transactional
27.public class EmployeeServiceBean implements EmployeeService {
28. //采用注解方式注入SessionFactory
29. //factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
30. //spring的事物管理一般是先获取当前的session,然后 将这个begin。
31. //factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
32.
33.
34. @Resource SessionFactory factory;
35. public void delete(String... userName) {
36. //中间的load 替换了 get方法 因为速度和效率 比get 高
37. for (String string : userName) {
38. factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
39. }
40. }
41.
42. @Transactional(propagation=Propagation.NOT_SUPPORTED)
43. public Employee find(String userName) {
44. // TODO Auto-generated method stub
45. return (Employee)factory.getCurrentSession().get(Employee.class, userName);
46. }
47.
48. @SuppressWarnings("unchecked")
49. public List<Employee> list() {
50. //Hql 进行查询
51. /*Session session=factory.openSession();
52. Transaction ts= session.beginTransaction();
53. ts.commit();
54. ts.rollback();*/
55. return factory.getCurrentSession().createQuery("from Employee").list();
56. }
57.
58. public void save(Employee employee) {
59. //持久化方法 -内部还是调用save方法
60. factory.getCurrentSession().persist(employee);
61. }
62.
63. public void update(Employee employee) {
64. // merge对update更新了有 save和update的功能
65. factory.getCurrentSession().merge(employee);
66. }
67.
68.}
package com.sh.employee.service;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;
/**
*@author LuoB.
*/
//@Service: 定义业务层。采用扫描加注解 将这个类交给spring管理 。
//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean
//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
@Service @Transactional
public class EmployeeServiceBean implements EmployeeService {
//采用注解方式注入SessionFactory
//factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
//spring的事物管理一般是先获取当前的session,然后 将这个begin。
//factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
@Resource SessionFactory factory;
public void delete(String... userName) {
//中间的load 替换了 get方法 因为速度和效率 比get 高
for (String string : userName) {
factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
}
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public Employee find(String userName) {
// TODO Auto-generated method stub
return (Employee)factory.getCurrentSession().get(Employee.class, userName);
}
@SuppressWarnings("unchecked")
public List<Employee> list() {
//Hql 进行查询
/*Session session=factory.openSession();
Transaction ts= session.beginTransaction();
ts.commit();
ts.rollback();*/
return factory.getCurrentSession().createQuery("from Employee").list();
}
public void save(Employee employee) {
//持久化方法 -内部还是调用save方法
factory.getCurrentSession().persist(employee);
}
public void update(Employee employee) {
// merge对update更新了有 save和update的功能
factory.getCurrentSession().merge(employee);
}
}
EmployeeAction.java
Java代码
1.package com.sh.employee.action;
2.
3.import javax.annotation.Resource;
4.
5.import org.springframework.stereotype.Controller;
6.
7.import com.opensymphony.xwork2.ActionContext;
8.import com.sh.employee.interfaces.EmployeeService;
9.
10.//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
11.@Controller
12.public class EmployeeAction {
13. @Resource EmployeeService employeeService;
14. public String execute(){
15. ActionContext.getContext().put("employees",employeeService.list());
16. return "list";
17. }
18.}
package com.sh.employee.action;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
@Controller
public class EmployeeAction {
@Resource EmployeeService employeeService;
public String execute(){
ActionContext.getContext().put("employees",employeeService.list());
return "list";
}
}
EmployeeManageAction.java
Java代码
1.package com.sh.employee.action;
2.
3.import javax.annotation.Resource;
4.
5.import org.springframework.context.annotation.Scope;
6.import org.springframework.stereotype.Controller;
7.
8.import com.opensymphony.xwork2.ActionContext;
9.import com.sh.employee.interfaces.EmployeeService;
10.import com.sh.employee.model.Employee;
11.
12.//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action
13.//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
14.//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
15.//所以 我们需要 将action 声明为 原型 @Scope("prototype")
16.@Controller @Scope("prototype")
17.public class EmployeeManageAction {
18. @Resource EmployeeService employeeService;
19.
20. //如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据
21. //比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
22. private Employee employee;
23.
24. public Employee getEmployee() {
25. return employee;
26. }
27.
28. public void setEmployee(Employee employee) {
29. this.employee = employee;
30. }
31.
32. public String addUI(){
33. return "add";
34. }
35.
36. public String add(){
37. employeeService.save(employee);
38. ActionContext.getContext().put("msg", "保存成功!");
39. return "message";
40. }
41.}
package com.sh.employee.action;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;
//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action
//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
//所以 我们需要 将action 声明为 原型 @Scope("prototype")
@Controller @Scope("prototype")
public class EmployeeManageAction {
@Resource EmployeeService employeeService;
//如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据
//比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
private Employee employee;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public String addUI(){
return "add";
}
public String add(){
employeeService.save(employee);
ActionContext.getContext().put("msg", "保存成功!");
return "message";
}
}
struts.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8" ?>
2.<!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
4. "http://struts.apache.org/dtds/struts-2.3.dtd">
5.
6.<struts>
7. <!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->
8. <!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置
9. 如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->
10. <constant name="struts.objectFactory" value="spring"/>
11.
12. <package name="employee" namespace="/employee" extends="struts-default">
13. <!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。
14. 需要写上action在spring中的简单类名 -->
15. <!-- http://localhost:8080/SSH2/employee/list.action -->
16. <action name="list" class="employeeAction">
17. <result name="list">/WEB-INF/page/employee.jsp</result>
18. </action>
19.
20. <!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->
21. <action name="manage_*" class="employeeManageAction" method="{1}">
22. <result name="add">/WEB-INF/page/employeeAdd.jsp</result>
23. <result name="message">/WEB-INF/page/message.jsp</result>
24. </action>
25. </package>
26.
27.</struts>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->
<!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置
如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->
<constant name="struts.objectFactory" value="spring"/>
<package name="employee" namespace="/employee" extends="struts-default">
<!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。
需要写上action在spring中的简单类名 -->
<!-- http://localhost:8080/SSH2/employee/list.action -->
<action name="list" class="employeeAction">
<result name="list">/WEB-INF/page/employee.jsp</result>
</action>
<!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->
<action name="manage_*" class="employeeManageAction" method="{1}">
<result name="add">/WEB-INF/page/employeeAdd.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>
employee.jsp
Html代码
1.<body>
2. 采用OGNL表达式获取<br/>
3. <s:iterator value="#request.employees">
4. <s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>
5. </s:iterator>
6. <br/>采用JSTL/EL表达式获取<br/>
7. <c:forEach var="emp" items="${employees}" varStatus="st">
8. ${emp.username},${emp.password},${gender}<br/>
9. </c:forEach>
10. [url=<s:url action=]">员工添加[/url]
11. </body>
<body>
采用OGNL表达式获取<br/>
<s:iterator value="#request.employees">
<s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>
</s:iterator>
<br/>采用JSTL/EL表达式获取<br/>
<c:forEach var="emp" items="${employees}" varStatus="st">
${emp.username},${emp.password},${gender}<br/>
</c:forEach>
[url=<s:url action=]">员工添加[/url]
</body>
employeeAdd.jsp
Html代码
1.<body>
2. <s:form action="manage_add" namespace="/employee" method="post" theme="simple">
3. 用户名:<s:textfield name="employee.username"/><br/>
4. 密码:<s:textfield name="employee.password"/><br/>
5. 性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>
6. <s:submit value="保存"/>
7. </s:form>
8. </body>
<body>
<s:form action="manage_add" namespace="/employee" method="post" theme="simple">
用户名:<s:textfield name="employee.username"/><br/>
密码:<s:textfield name="employee.password"/><br/>
性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>
<s:submit value="保存"/>
</s:form>
</body>
message.jsp
Html代码
1.<body>
2. <h1><font color="red">${msg}</font></h1>
3. 返回员工列表
4. </body>
<body>
<h1><font color="red">${msg}</font></h1>
返回员工列表
</body>
--访问http://localhost:8080/SSH2/employee/list.action
--访问http://localhost:8080/SSH2/employee/list.action
Spring,Struts,Hibernate,Oracle
Struts2, Spring, Hibernate, Oracle, prototype
[/flash]
1.Struts2+Spring2.5+Hibernate3.3的整合
2.采用单元测试
3.加入了lob类型的操作配置
4.介绍oralce驱动 本文采用oracle11g
5.在HIbernate中采用“枚举”设置映射关系
Oralce的驱动介绍
Java代码
1.class12.jar(jdk 1.2 / 1.3 )
2.class14.jar(jdk 1.4 / 1.5)
3.其实只要安装了oralce 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。
class12.jar(jdk 1.2 / 1.3 )
class14.jar(jdk 1.4 / 1.5)
其实只要安装了oralce 就不用下载驱动包了,在安装程序中就有D:\app\Admin\product\11.1.0\db_1\jdbc\lib 这个目录下 根据使用的jdk 选择对应的驱动包就可以了。
SSH2整合需要的Jar
1.Strusts
Java代码
1.javassist-3.4.GA.jar
2.commons-fileupload-1.2.1.jar
3.commons-logging-1.0.4.jar
4.freemarker-2.3.15.jar
5.ognl-2.7.3.jar
6.struts2-core-2.1.8.jar
7.xwork-core-2.1.6.jar
8.struts2-spring-plugin-2.1.8.jar
javassist-3.4.GA.jar
commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.jar
xwork-core-2.1.6.jar
struts2-spring-plugin-2.1.8.jar
2.Hibernate
Java代码
1.commons-collections-3.1.jar
2.dom4j-1.6.1.jar
3.ehcache-1.2.3.jar
4.ejb3-persistence.jar
5.hibernate-annotations.jar
6.hibernate-cglib-repack-2.1_3.jar
7.hibernate-commons-annotations.jar
8.hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
9.hibernate3.jar
10.javassist-3.4.GA.jar
11.jta-1.1.jar
12.log4j.jar
13.slf4j-api-1.5.2.jar
14.slf4j-log4j12.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar //为了使用 枚举 类型的映射 这个包
hibernate3.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar
3.Spring
Java代码
1.aspectjrt.jar
2.aspectjweaver.jar
3.c3p0-0.9.1.2.jar
4.cglib-nodep-2.1_3.jar
5.common-annotations.jar
6.log4j-1.2.15.jar
7.spring.jar
aspectjrt.jar
aspectjweaver.jar
c3p0-0.9.1.2.jar
cglib-nodep-2.1_3.jar
common-annotations.jar
log4j-1.2.15.jar
spring.jar
整合步骤先整合 Spring2.5+Hibernate3.3 成功后在整合 Struts2 这样就不容易报错,而且 报错误后也便于找出问题。
spring配置文件模版可以到 spring自带的一些例子中进行赋值。
applicationContext.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8"?>
2.<?xml version="1.0" encoding="UTF-8"?>
3.<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4. xmlns="http://www.springframework.org/schema/beans"
5. xmlns:context="http://www.springframework.org/schema/context"
6. xmlns:aop="http://www.springframework.org/schema/aop"
7. xmlns:tx="http://www.springframework.org/schema/tx"
8. xsi:schemaLocation="http://www.springframework.org/schema/beans
9. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
10. http://www.springframework.org/schema/context
11. http://www.springframework.org/schema/context/spring-context-2.5.xsd
12. http://www.springframework.org/schema/aop
13. http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
14. http://www.springframework.org/schema/tx
15. http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
16.
17.<!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->
18.<context:component-scan base-package="com.sh"/>
19.
20.<!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->
21.<!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->
22.<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
23. <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
24. <property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
25. <property name="user" value="luob"/>
26. <property name="password" value="m123"/>
27. <!-- 连接池中的最大连接数 -->
28. <property name="maxPoolSize" value="150"/>
29.
30. <!-- 连接池中的最小连接数 -->
31. <property name="minPoolSize" value="1"></property>
32.
33. <!-- 初始化连接池中的 连接数,取值 在 minPoolSize 和 maxPoolSize 之间,default:3-->
34. <property name="initialPoolSize" value="3"/>
35.
36. <!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->
37. <property name="maxIdleTime" value="60"/>
38.
39. <!-- 当连接数不够时,每次同时创建多少个连接 -->
40. <property name="acquireIncrement" value="1"/>
41.
42. <!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->
43. <property name="idleConnectionTestPeriod" value="60"/>
44.</bean>
45.
46.<!--从c3p0数据源中抽取出JDBC的代理对象-->
47.<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" lazy-init="true" />
48.
49.<!--9i: org.springframework.jdbc.support.lob.OracleLobHandler -->
50.<!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个) -->
51.<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
52. <!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->
53. <property name="nativeJdbcExtractor">
54. <ref local="nativeJdbcExtractor" />
55. </property>
56.</bean>
57.
58.<!-- 将Hibernate中的事物交给Spring进行接管 -->
59.<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
60. <!-- 指定sessiongFactory中的数据源 -->
61. <property name="dataSource" ref="dataSource"/>
62.
63. <!-- 指定hibernate的属性 -->
64. <property name="hibernateProperties">
65. <value>
66. <!-- hibernate使用的 方言 -->
67. hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
68. <!-- 根据实体的映射文件生成表结构 -->
69. hibernate.hbm2ddl.auto=update
70. <!-- 格式化sql -->
71. hibernate.format_sql=false
72. <!-- 是否打印出sql语句 -->
73. hibernate.show_sql=false
74. </value>
75. </property>
76. <!-- 定义lob操作对象 -->
77. <property name="lobHandler">
78. <ref bean="lobHandler" />
79. </property>
80. <!-- 指定hibernate的映射文件 -->
81. <property name="mappingResources">
82. <list>
83. <value>com/sh/employee/model/Employee.hbm.xml</value>
84. </list>
85. </property>
86.</bean>
87.
88.<!-- 配置使用基于Hibernate的事务管理器 -->
89.<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
90. <!-- spring需要通过sessionFactory来开启事务 -->
91. <property name="sessionFactory" ref="sessionFactory"/>
92.</bean>
93.
94.<!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->
95.<tx:annotation-driven transaction-manager="txManager"/>
96.
97.</beans>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 采用扫描 + 注解的方式进行开发 可以提高开发效率,后期维护变的困难了,可读性变差了 -->
<context:component-scan base-package="com.sh"/>
<!-- 采用c3p0数据源 这个是在企业中用的比较多的一个数据源 -->
<!-- destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
<property name="user" value="luob"/>
<property name="password" value="m123"/>
<!-- 连接池中的最大连接数 -->
<property name="maxPoolSize" value="150"/>
<!-- 连接池中的最小连接数 -->
<property name="minPoolSize" value="1"></property>
<!-- 初始化连接池中的 连接数,取值 在 minPoolSize 和 maxPoolSize 之间,default:3-->
<property name="initialPoolSize" value="3"/>
<!-- 最大空闲时间,60s内该连接没有被使用则被丢弃,若为0 永不丢弃.default:0 -->
<property name="maxIdleTime" value="60"/>
<!-- 当连接数不够时,每次同时创建多少个连接 -->
<property name="acquireIncrement" value="1"/>
<!-- 每60s检查连接池中的所有空间连接,如果没有被使用,就被放弃, default:0 -->
<property name="idleConnectionTestPeriod" value="60"/>
</bean>
<!--从c3p0数据源中抽取出JDBC的代理对象-->
<bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor" lazy-init="true" />
<!--9i: org.springframework.jdbc.support.lob.OracleLobHandler -->
<!--10g以后:org.springframework.jdbc.support.lob.DefaultLobHandler(mysql,DB2等都可以用这个) -->
<bean id="lobHandler" class="org.springframework.jdbc.support.lob.OracleLobHandler" lazy-init="true">
<!-- 9i: 指定操作lob类型数据的jdbc代理对象 如果上面的 lobHandler 换了下面的就不需要了 -->
<property name="nativeJdbcExtractor">
<ref local="nativeJdbcExtractor" />
</property>
</bean>
<!-- 将Hibernate中的事物交给Spring进行接管 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 指定sessiongFactory中的数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 指定hibernate的属性 -->
<property name="hibernateProperties">
<value>
<!-- hibernate使用的 方言 -->
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
<!-- 根据实体的映射文件生成表结构 -->
hibernate.hbm2ddl.auto=update
<!-- 格式化sql -->
hibernate.format_sql=false
<!-- 是否打印出sql语句 -->
hibernate.show_sql=false
</value>
</property>
<!-- 定义lob操作对象 -->
<property name="lobHandler">
<ref bean="lobHandler" />
</property>
<!-- 指定hibernate的映射文件 -->
<property name="mappingResources">
<list>
<value>com/sh/employee/model/Employee.hbm.xml</value>
</list>
</property>
</bean>
<!-- 配置使用基于Hibernate的事务管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- spring需要通过sessionFactory来开启事务 -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!--Spring中的事物配置声明.1 基于xml 配置方式 2.基于注解来声明那些类-->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
Employee.java
Java代码
1.package com.sh.employee.model;
2.
3.public class Employee {
4. private String username;
5. private String password;
6. //枚举类型
7. private Gender gender=Gender.MAN;
8. public String getUsername() {
9. return username;
10. }
11. public void setUsername(String username) {
12. this.username = username;
13. }
14. public String getPassword() {
15. return password;
16. }
17. public void setPassword(String password) {
18. this.password = password;
19. }
20. public Gender getGender() {
21. return gender;
22. }
23. public void setGender(Gender gender) {
24. this.gender = gender;
25. }
26. public Employee(String username, String password) {
27. super();
28. this.username = username;
29. this.password = password;
30. }
31. public Employee() {
32. super();
33. // TODO Auto-generated constructor stub
34. }
35. public Employee(String username, String password, Gender gender) {
36. super();
37. this.username = username;
38. this.password = password;
39. this.gender = gender;
40. }
41.
42.}
package com.sh.employee.model;
public class Employee {
private String username;
private String password;
//枚举类型
private Gender gender=Gender.MAN;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
public Employee(String username, String password) {
super();
this.username = username;
this.password = password;
}
public Employee() {
super();
// TODO Auto-generated constructor stub
}
public Employee(String username, String password, Gender gender) {
super();
this.username = username;
this.password = password;
this.gender = gender;
}
}
Gender.java
Java代码
1.package com.sh.employee.model;
2.
3.public enum Gender {
4. //分为字面值 :MAN / WOMAN
5. //索引值:0 1
6. MAN,WOMAN
7.
8.}
package com.sh.employee.model;
public enum Gender {
//分为字面值 :MAN / WOMAN
//索引值:0 1
MAN,WOMAN
}
Employee.hbm.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8" ?>
2.<!DOCTYPE hibernate-mapping PUBLIC
3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
5.<hibernate-mapping package="com.sh.employee.model">
6. <class name="Employee">
7. <id name="username" length="20"/>
8. <property name="password" length="20" not-null="true"/>
9. <property name="gender" not-null="true" length="5">
10. <type name="org.hibernate.type.EnumType">
11. <param name="enumClass">com.sh.employee.model.Gender</param>
12. <!--type:12 为java.sql.Types.VARCHAR常量值,即保存枚举字面值到数据库。
13. 如果不指定(删除)type:则保存枚举索引值到数据库(从0 开始) -->
14. <param name="type">12</param>
15. </type>
16. </property>
17. </class>
18.</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 package="com.sh.employee.model">
<class name="Employee">
<id name="username" length="20"/>
<property name="password" length="20" not-null="true"/>
<property name="gender" not-null="true" length="5">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">com.sh.employee.model.Gender</param>
<!--type:12 为java.sql.Types.VARCHAR常量值,即保存枚举字面值到数据库。
如果不指定(删除)type:则保存枚举索引值到数据库(从0 开始) -->
<param name="type">12</param>
</type>
</property>
</class>
</hibernate-mapping>
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.
8. <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
9. <context-param>
10. <param-name>contextConfigLocation</param-name>
11. <!-- 如果有多个文件 使用 "," 分开 -->
12. <param-value>classpath:applicationContext.xml</param-value>
13. </context-param>
14.
15. <!-- 对spring容器进行实例化 -->
16. <listener>
17. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
18. </listener>
19.
20. <!--配置Struts2的过滤器 -->
21. <filter>
22. <filter-name>struts2</filter-name>
23. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
24. </filter>
25. <filter-mapping>
26. <filter-name>struts2</filter-name>
27. <url-pattern>/*</url-pattern>
28. </filter-mapping>
29.
30. <welcome-file-list>
31. <welcome-file>index.jsp</welcome-file>
32. </welcome-file-list>
33.</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">
<!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 如果有多个文件 使用 "," 分开 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 对spring容器进行实例化 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置Struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
EmployeeService.java
Java代码
1.package com.sh.employee.interfaces;
2.
3.import java.util.List;
4.
5.import com.sh.employee.model.Employee;
6.
7.public interface EmployeeService {
8. void save(Employee employee);
9. void update(Employee employee);
10. Employee find(String userName);
11. void delete(String... userName);
12. List<Employee> list();
13.}
package com.sh.employee.interfaces;
import java.util.List;
import com.sh.employee.model.Employee;
public interface EmployeeService {
void save(Employee employee);
void update(Employee employee);
Employee find(String userName);
void delete(String... userName);
List<Employee> list();
}
EmployeeServiceBean.java
Java代码
1.package com.sh.employee.service;
2.
3.import java.util.List;
4.
5.import javax.annotation.Resource;
6.
7.import org.hibernate.Session;
8.import org.hibernate.SessionFactory;
9.import org.hibernate.Transaction;
10.import org.springframework.stereotype.Service;
11.import org.springframework.transaction.annotation.Propagation;
12.import org.springframework.transaction.annotation.Transactional;
13.
14.import com.sh.employee.interfaces.EmployeeService;
15.import com.sh.employee.model.Employee;
16.
17./**
18. *@author LuoB.
19. */
20.
21.//@Service: 定义业务层。采用扫描加注解 将这个类交给spring管理 。
22.//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean
23.
24.//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
25.//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
26.@Service @Transactional
27.public class EmployeeServiceBean implements EmployeeService {
28. //采用注解方式注入SessionFactory
29. //factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
30. //spring的事物管理一般是先获取当前的session,然后 将这个begin。
31. //factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
32.
33.
34. @Resource SessionFactory factory;
35. public void delete(String... userName) {
36. //中间的load 替换了 get方法 因为速度和效率 比get 高
37. for (String string : userName) {
38. factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
39. }
40. }
41.
42. @Transactional(propagation=Propagation.NOT_SUPPORTED)
43. public Employee find(String userName) {
44. // TODO Auto-generated method stub
45. return (Employee)factory.getCurrentSession().get(Employee.class, userName);
46. }
47.
48. @SuppressWarnings("unchecked")
49. public List<Employee> list() {
50. //Hql 进行查询
51. /*Session session=factory.openSession();
52. Transaction ts= session.beginTransaction();
53. ts.commit();
54. ts.rollback();*/
55. return factory.getCurrentSession().createQuery("from Employee").list();
56. }
57.
58. public void save(Employee employee) {
59. //持久化方法 -内部还是调用save方法
60. factory.getCurrentSession().persist(employee);
61. }
62.
63. public void update(Employee employee) {
64. // merge对update更新了有 save和update的功能
65. factory.getCurrentSession().merge(employee);
66. }
67.
68.}
package com.sh.employee.service;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;
/**
*@author LuoB.
*/
//@Service: 定义业务层。采用扫描加注解 将这个类交给spring管理 。
//-----此时 在spring容器中默认的bean的名称为 这个类的简单类名 employeeServiceBean
//@Transactional:定义这个类采用事物管理。这样所有的方法都有事物特性了。
//-----如果某个方法不需要事物 采用这个标识:@Transactional(propagation=Propagation.NOT_SUPPORTED)
@Service @Transactional
public class EmployeeServiceBean implements EmployeeService {
//采用注解方式注入SessionFactory
//factory.openSession(); 表示开启一个新的session,这样就不能使用spring的事物管理了
//spring的事物管理一般是先获取当前的session,然后 将这个begin。
//factory.getCurrentSession();【在Hibernate3.0后才提供的这样的一个方法】得到 spring事物管理创建好的session
@Resource SessionFactory factory;
public void delete(String... userName) {
//中间的load 替换了 get方法 因为速度和效率 比get 高
for (String string : userName) {
factory.getCurrentSession().delete(factory.getCurrentSession().load(Employee.class, string));
}
}
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public Employee find(String userName) {
// TODO Auto-generated method stub
return (Employee)factory.getCurrentSession().get(Employee.class, userName);
}
@SuppressWarnings("unchecked")
public List<Employee> list() {
//Hql 进行查询
/*Session session=factory.openSession();
Transaction ts= session.beginTransaction();
ts.commit();
ts.rollback();*/
return factory.getCurrentSession().createQuery("from Employee").list();
}
public void save(Employee employee) {
//持久化方法 -内部还是调用save方法
factory.getCurrentSession().persist(employee);
}
public void update(Employee employee) {
// merge对update更新了有 save和update的功能
factory.getCurrentSession().merge(employee);
}
}
EmployeeAction.java
Java代码
1.package com.sh.employee.action;
2.
3.import javax.annotation.Resource;
4.
5.import org.springframework.stereotype.Controller;
6.
7.import com.opensymphony.xwork2.ActionContext;
8.import com.sh.employee.interfaces.EmployeeService;
9.
10.//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
11.@Controller
12.public class EmployeeAction {
13. @Resource EmployeeService employeeService;
14. public String execute(){
15. ActionContext.getContext().put("employees",employeeService.list());
16. return "list";
17. }
18.}
package com.sh.employee.action;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
//@Controller 标识这个action为spring中的一个控制层,在spring中为类的简单类名
@Controller
public class EmployeeAction {
@Resource EmployeeService employeeService;
public String execute(){
ActionContext.getContext().put("employees",employeeService.list());
return "list";
}
}
EmployeeManageAction.java
Java代码
1.package com.sh.employee.action;
2.
3.import javax.annotation.Resource;
4.
5.import org.springframework.context.annotation.Scope;
6.import org.springframework.stereotype.Controller;
7.
8.import com.opensymphony.xwork2.ActionContext;
9.import com.sh.employee.interfaces.EmployeeService;
10.import com.sh.employee.model.Employee;
11.
12.//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action
13.//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
14.//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
15.//所以 我们需要 将action 声明为 原型 @Scope("prototype")
16.@Controller @Scope("prototype")
17.public class EmployeeManageAction {
18. @Resource EmployeeService employeeService;
19.
20. //如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据
21. //比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
22. private Employee employee;
23.
24. public Employee getEmployee() {
25. return employee;
26. }
27.
28. public void setEmployee(Employee employee) {
29. this.employee = employee;
30. }
31.
32. public String addUI(){
33. return "add";
34. }
35.
36. public String add(){
37. employeeService.save(employee);
38. ActionContext.getContext().put("msg", "保存成功!");
39. return "message";
40. }
41.}
package com.sh.employee.action;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.opensymphony.xwork2.ActionContext;
import com.sh.employee.interfaces.EmployeeService;
import com.sh.employee.model.Employee;
//因为Struts2在每次接受到请求后,会迅速的创建actionContext,ValueStack,action
//然后把Action存在在ValueStack中 所以Action可以被OGNL访问.
//但是把Action交给Spring管理后,action 就是单利模式了,这样 就违背了Struts2的设计理念。
//所以 我们需要 将action 声明为 原型 @Scope("prototype")
@Controller @Scope("prototype")
public class EmployeeManageAction {
@Resource EmployeeService employeeService;
//如果 某个action 不声明为原型(比如: EmployeeAction) 千万不要在该action中 保存用户提交过来的数据
//比如下面 如果是但单利模式 所有的请求都可以访问这个对象了
private Employee employee;
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
public String addUI(){
return "add";
}
public String add(){
employeeService.save(employee);
ActionContext.getContext().put("msg", "保存成功!");
return "message";
}
}
struts.xml
Xml代码
1.<?xml version="1.0" encoding="UTF-8" ?>
2.<!DOCTYPE struts PUBLIC
3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
4. "http://struts.apache.org/dtds/struts-2.3.dtd">
5.
6.<struts>
7. <!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->
8. <!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置
9. 如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->
10. <constant name="struts.objectFactory" value="spring"/>
11.
12. <package name="employee" namespace="/employee" extends="struts-default">
13. <!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。
14. 需要写上action在spring中的简单类名 -->
15. <!-- http://localhost:8080/SSH2/employee/list.action -->
16. <action name="list" class="employeeAction">
17. <result name="list">/WEB-INF/page/employee.jsp</result>
18. </action>
19.
20. <!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->
21. <action name="manage_*" class="employeeManageAction" method="{1}">
22. <result name="add">/WEB-INF/page/employeeAdd.jsp</result>
23. <result name="message">/WEB-INF/page/message.jsp</result>
24. </action>
25. </package>
26.
27.</struts>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 设置struts的对象工厂,由spring进行创建 (更换Struts2的工厂)-->
<!-- 实际上这个常量不配置也可以,如果项目中使用了struts2-spring-plugin-2.1.8.jar 那么可以不用配置
如果使用了其他的第三方plugin,建议明确配置struts2的对象工厂 -->
<constant name="struts.objectFactory" value="spring"/>
<package name="employee" namespace="/employee" extends="struts-default">
<!-- 此时action开始由spring进行创建和管理,因此不用写上action的类名。
需要写上action在spring中的简单类名 -->
<!-- http://localhost:8080/SSH2/employee/list.action -->
<action name="list" class="employeeAction">
<result name="list">/WEB-INF/page/employee.jsp</result>
</action>
<!-- http://localhost:8080/SSH2/employee/manage_addUI.action -->
<action name="manage_*" class="employeeManageAction" method="{1}">
<result name="add">/WEB-INF/page/employeeAdd.jsp</result>
<result name="message">/WEB-INF/page/message.jsp</result>
</action>
</package>
</struts>
employee.jsp
Html代码
1.<body>
2. 采用OGNL表达式获取<br/>
3. <s:iterator value="#request.employees">
4. <s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>
5. </s:iterator>
6. <br/>采用JSTL/EL表达式获取<br/>
7. <c:forEach var="emp" items="${employees}" varStatus="st">
8. ${emp.username},${emp.password},${gender}<br/>
9. </c:forEach>
10. [url=<s:url action=]">员工添加[/url]
11. </body>
<body>
采用OGNL表达式获取<br/>
<s:iterator value="#request.employees">
<s:property value="username"/>,<s:property value="password"/>,<s:property value="gender"/><br/>
</s:iterator>
<br/>采用JSTL/EL表达式获取<br/>
<c:forEach var="emp" items="${employees}" varStatus="st">
${emp.username},${emp.password},${gender}<br/>
</c:forEach>
[url=<s:url action=]">员工添加[/url]
</body>
employeeAdd.jsp
Html代码
1.<body>
2. <s:form action="manage_add" namespace="/employee" method="post" theme="simple">
3. 用户名:<s:textfield name="employee.username"/><br/>
4. 密码:<s:textfield name="employee.password"/><br/>
5. 性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>
6. <s:submit value="保存"/>
7. </s:form>
8. </body>
<body>
<s:form action="manage_add" namespace="/employee" method="post" theme="simple">
用户名:<s:textfield name="employee.username"/><br/>
密码:<s:textfield name="employee.password"/><br/>
性别:<s:radio list="#{'MAN':'男','WOMEN':'女'}" listKey="key" listValue="value" name="employee.gender"/><br/>
<s:submit value="保存"/>
</s:form>
</body>
message.jsp
Html代码
1.<body>
2. <h1><font color="red">${msg}</font></h1>
3. 返回员工列表
4. </body>
<body>
<h1><font color="red">${msg}</font></h1>
返回员工列表
</body>
--访问http://localhost:8080/SSH2/employee/list.action
--访问http://localhost:8080/SSH2/employee/list.action
Spring,Struts,Hibernate,Oracle
Struts2, Spring, Hibernate, Oracle, prototype
[/flash]
发表评论
-
Data publish Module
2013-02-27 11:42 8201.1 目的 本文主要是描述在统一产品数据发 ... -
团队的成才
2012-11-30 12:05 644小技术团队的成长 ... -
tutututu
2012-11-22 16:18 0package com.huawei.cb.publish.a ... -
格式化Eclipse
2012-11-12 16:17 967<?xml version="1.0" ... -
javaMiWen
2012-11-12 16:15 0<?xml version="1.0" ... -
java语言的特点
2012-09-17 09:21 772java 语言基础 一、java语言的特点: 1.平台无关 j ... -
远程调试的方法
2012-09-17 09:18 785把文本配置到:eclipse.ini 文件中 -Djava.c ...
相关推荐
标题中的"SSH2+oracle数据库"指的是一种技术整合,其中SSH2代表Secure Shell Version 2,这是一种网络协议,主要用于安全地远程登录到服务器,执行命令,传输数据,以及管理网络服务。Oracle则是世界上最广泛使用的...
SSH2 (Secure Shell 2) 是一种网络协议,用于安全地远程访问和管理服务器,而Oracle则是一款广泛应用的关系型数据库管理系统。在这个特定的上下文中,"ssh2+oracle 全注解 annotation lib包" 指的是一个包含了支持...
SSH2+AJAX+ORACLE10G项目是一个综合性的Web开发示例,结合了Spring、Struts2和Hibernate三个框架,以及AJAX技术与Oracle 10g数据库。这个项目展示了如何在Java环境中构建高效、动态且具有交互性的应用程序。 **SSH2...
ExtJs4.1+Jbpm4+SSH2+Oracle10g视频教程 视频教程正在上传中!先共享代码,有了代码,还买啥教程额! SSH2+JBPM+ExtJs4实战,JBPM是重点讲解。实战与demo的区别我不再多说,在以前工作中走过一些弯路,一些实现都是...
SSH+Oracle整合是一个常见的企业级应用开发模式,它结合了Struts2、Spring和Hibernate三个开源框架,并且与Oracle数据库进行集成。这个模式在大型项目中广泛应用,因为它提供了良好的分层架构、强大的持久化能力以及...
SSH整合是指将Struts2、Spring和Hibernate这三个Java开源框架集成在一起,用于构建高效、灵活的企业级Web应用程序。Oracle 11g则是一款强大的关系型数据库管理系统,常用于大型企业级应用。 Struts2是MVC(Model-...
在IT行业中,SSH和Oracle是两个非常重要的技术概念。SSH是指Spring、Struts和Hibernate这三个开源框架的组合,它们在Java Web开发中被广泛应用。Oracle则是一款强大的关系型数据库管理系统,广泛用于大型企业级应用...
SSH2(Spring、Struts2、Hibernate2)和EXTJS是两种常见的开源技术,用于构建企业级Web应用程序。本项目实例结合了这两种技术,提供了一个基础的增删改查(CRUD)应用,展示了EXTJS在用户界面设计上的强大功能以及...
在IT行业中,构建高效、动态的Web应用是关键任务之一,而"ajax+jQuery+ssh+oracle级联实例"提供了一个具体的实现方案。这个实例涵盖了前端到后端的关键技术,包括异步数据交互(Ajax)、JavaScript库(jQuery)、...
在IT行业中,SSH和Oracle是两个非常重要的技术组件。SSH是指Spring、Struts和Hibernate这三个开源框架的组合,常用于构建Java Web应用程序。而Oracle则是一款功能强大的关系型数据库管理系统,广泛应用于大型企业级...
SSH+Oracle企业费用办公管理系统是一种基于Java开发的高效能、安全的企业级应用,它整合了Struts、Spring和Hibernate三个框架,与Oracle数据库相结合,为企业提供了一套完整的费用管理和办公自动化解决方案。...
【SSH+Oracle 整合详解】 SSH(Struts2、Spring、Hibernate)是Java开发中常用的三大开源框架,它们各自负责Web应用的不同层面:Struts2处理MVC模式中的Controller部分,Spring作为整体的IoC(Inversion of Control...
资源名字:基于javaEE+SSH+oracle的健康管理系统设计与实现(源码+文档)_JAVAEE_SSH_oracle_健康管理系统 资源类型:项目全套源码+文档+辅导视频 源码说明: 全部项目源码都是经过测试校正后百分百成功运行。 适合...
在“ssh+oracle分页”这个主题中,我们将深入探讨如何利用这三个框架与Oracle数据库进行集成,并实现数据的分页显示。 1. **Struts框架**:Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架。...
【Java SSH Oracle SQLServer 学习笔记】 Java是一种广泛使用的面向对象的编程语言,它以其跨平台、开源和丰富的库而闻名。SSH是三个开源框架的缩写,分别是Spring、Struts和Hibernate,它们在Java Web开发中起着至...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架,它整合了三大开源框架,用于构建高效、可维护的Web应用。Oracle则是一款广泛使用的商业关系型数据库管理系统,适用于大型企业级应用。在"SSH+...
ssh+jdbc+oracle所有依赖包(commons-pool2-2.8.0.jar,commons-collections-3.2.2.jar,commons-dbcp2-2.7.0.jar,ojdbc8.jar)
ExtJs4.1+Jbpm4+SSH2+Oracle10g视频教程 视频教程正在上传中!先共享代码,有了代码,还买啥教程额! SSH2+JBPM+ExtJs4实战,JBPM是重点讲解。实战与demo的区别我不再多说,在以前工作中走过一些弯路,一些实现都是...
SSH+Oracle OA管理系统是一个专为新手设计的综合型管理平台,它结合了Spring、Struts2和Hibernate(SSH)三大主流Java开发框架,以及Oracle数据库技术,为用户提供了一个功能全面的办公自动化(OA)解决方案。...
【SSH+Oracle+MyEclipse框架搭建详解】 SSH框架,由Struts、Spring和Hibernate三个开源框架组成,常用于构建企业级的Java Web应用程序。在MyEclipse6.5环境中,我们将结合Oracle数据库来搭建一个登录框架。以下是...