ssh2+oracle

[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]

你可能感兴趣的:(ssh2+oracle)