——本文环境:
也可以使用
mappingDirectoryLocations属性直接指定包,spring会自动去扫描:
或者直接指定包名,让spring自动扫描加载:
如果使用的是hibernate4包下的,就可以这样来获取session对象:
但是hibernate3下的不支持这种方法,他必须使用spring提供的HibernateTemplate模板类来代替Session操作数据,使用以下方式获取:
HibernateTemplate类中提供了许多类似Session类的方法,当然使用起来就没有原来的Session得心应手了,在此就不适用这种方式了,有兴趣的可以去查阅资料
(2)spring配置文件中dao实例bean的配置:
事务由session开启,当然得为其注入SessionFactory对象
(2)配置事务增强:
在配置时以下几点很容易遗忘:
①SessionFactory的bean一定要注入dataSource属性
②配置action时,scope一定要改为prototype类型
③配置dao时,一定要注入SessionFactory对象,才能在里面使用
④配置事务管理bean的时候一定要注入SessionFactory,因为事务是由session开启的
⑤web.xml中OpenSessionInView模式的过滤器一定要在Struts2的过滤器之前
Oracle、JDK1.7、Tomcat7.0、spring4.0.6、hibernate4、struts2,我这里有已经整理好的ssh所有jar包(点击下载)
——HelloWorld需求:
使用ssh实现简单的展示所有用户列表的功能
1.搭建系统框架
我在这里已经搭建好了2.配置数据源(这里以dbcp数据源为例)
在 applicationContext.xml文件中配置:- <!-- 配置dbcp数据源 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
- <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
- <property name="username" value="scott"></property>
- <property name="password" value="tiger"></property>
- </bean>
3.配置SessionFactory
spring提供了LocalSessionFactoryBean类来创建SessionFactory,这里使用的是hibernate4版本,所以选择4包下的:(1)数据源信息同在spring配置文件中时
- <!-- 配置SessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <!-- 引用上面定义的数据源 -->
- <property name="dataSource" ref="dataSource"/>
- <!-- 配置hibernate的其他属性 -->
- <property name="hibernateProperties">
- <props>
- <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
- <prop key="show_sql">true</prop>
- <prop key="format_sql">true</prop>
- </props>
- </property>
- </bean>
(2)数据源信息仍放在hibernate.cfg.xml文件中
当应用中仍然存在独立的Hibernate配置文件hibernate.cfg.xml时,可以使用configLocation属性为SessionFactoryBean赋值:- <!-- 配置SessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <property name="configLocation">
- <value>classpath:hibernate.cfg.xml</value>
- </property>
- <!-- 省略其他配置 -->
- </bean>
4.SessionFactory中实体类的映射配置:
(1)配置基于映射文件的实体类
可以用 mappingResources属性指定所有映射文件的完整名称:- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <!-- 省略其他 -->
- <property name="mappingResources">
- <list>
- <value>com/wzj/entity/User.hbm.xml</value>
- <!-- 如有更多,可以继续添加 -->
- </list>
- </property>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <!-- 省略其他 -->
- <property name="mappingDirectoryLocations">
- <list>
- <value>classpath:com/wzj/entity</value>
- </list>
- </property>
- </bean>
(2)配置基于注解映射的实体类
以上的配置方式只是支持xml形式的映射文件,当实体类使用的是注解映射的时候,这时候就可以使用 org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean类来定义SessionFactory的bean(其实现在在spring高版本中LocalSessionFactoryBean也支持注解了,但是为了不出麻烦,还是换下吧)- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
- <!-- 省略其他 -->
- <property name="annotatedClasses">
- <list>
- <value>com/wzj/entity/User.hbm.xml</value>
- </list>
- </property>
- </bean>
- <property name="packagesToScan" value="com.wzj.entity"/>
5.配置Dao层的Bean
(1)首先来说下dao实现类的写法,以前都是使用SessionFactory工厂创建Session对象,现在SessionFactory已经交由了spring管理,所以,在实现类中只需要继承spring提供好的HibernateDaoSupport类,然后配置中为Dao实例注入SessionFactory对象即可,因为这个属性是在HibernateDaoSupport定义的;- package com.wzj.dao.impl;
- import java.util.List;
- import org.hibernate.Session;
- import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
- import com.wzj.dao.UserDao;
- import com.wzj.entity.User;
- public class UserDaoImpl extends HibernateDaoSupport implements UserDao{
- @Override
- public List<User> selectAllUsers() {
- //获取session
- Session session=super.currentSession();
- return session.createCriteria(User.class).list();
- }
- }
- Session session=super.currentSession();
- HibernateTemplate h=super.getHibernateTemplate();
(2)spring配置文件中dao实例bean的配置:
- <!-- 配置Dao -->
- <bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl">
- <!-- 一定要为dao注入SessionFactory对象 -->
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
6.配置业务层的bean
实体类中只是声明UserDao接口的变量,由spring来注入- package com.wzj.service.impl;
- import java.util.List;
- import com.wzj.dao.UserDao;
- import com.wzj.entity.User;
- import com.wzj.service.UserService;
- public class UserServiceImpl implements UserService{
- private UserDao userDao;
- @Override
- public List<User> getAllUsers() {
- return userDao.selectAllUsers();
- }
- //省略get、set方法
- }
配置文件中:
- <!-- 配置业务实例 -->
- <bean id="userService" class="com.wzj.service.impl.UserServiceImpl">
- <property name="userDao" ref="userDao"/>
- </bean>
7.配置action
上面的内容基本上都是整合Hibernate的部分,配置action则就是整合Struts2了,其实整合Struts2来说相对简单,在struts2-spring-plugin-2.3.16.3.jar中有一个struts-plugin.xml文件,此插件xml在内部将创建Action的Struts类替换成了集成spring的类,可以在创建Action的时候也为其注入属性,可以就像配置一个普通Bean一样配置Action- <!-- 配置Action,注意bean的scope属性! -->
- <bean id="userAction" class="com.wzj.action.UserAction" scope="prototype">
- <property name="userService" ref="userService"/>
- </bean>
8.为业务层添加声明式事务
(1)首先要创建事务管理对象,spring已经提供好了HibernateTransactionManager类:
- <!-- 配置事务管理Bean -->
- <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
(2)配置事务增强:
- <tx:advice id="txAdvice" transaction-manager="txManager">
- <tx:attributes>
- <!-- spring支持对不同的方法使用不同的事物机制(propagation),方法名支持通配符 -->
- <tx:method name="get*" propagation="REQUIRED"/>
- <tx:method name="*" propagation="REQUIRED"/>
- </tx:attributes>
- </tx:advice>
(3)配置切面(粘合增强和切点):
- <aop:config>
- <aop:pointcut expression="execution(public * com.wzj.service.impl.*.*(..))" id="pt"/>
- <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
- </aop:config>
9.配置struts.xml文件
- <package name="UserPackage" namespace="/" extends="struts-default">
- <!-- 跟以往不同,这里的class要写在spring配置中的action的id属性 -->
- <action name="showall" class="userAction" method="showAllUsers">
- <result name="success">/show.jsp</result>
- </action>
- </package>
10.配置web.xml文件
spring、struts、hibernate已经配置好了,但是spring实例初始化的工作还没有做,在web.xml文件里做如下配置:【web.xml】文件的完整代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"
- 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_3_0.xsd">
- <display-name></display-name>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <!-- 配置字符集乱码问题 -->
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>
- org.springframework.web.filter.CharacterEncodingFilter
- </filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!--
- 1.配置spring配置文件的位置,contextConfigLocation为固定名称,
- 若配置文件位于src目录下,则使用 classpath:; 若其位于WEB-INF下则为 /WEB-INF/classes/applicationContext.xml
- -->
- <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>
- <!-- 2.配置OpenSessionInView模式,防止延迟加载机制带来的问题 -->
- <filter>
- <filter-name>OpenSessionInView</filter-name>
- <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
- <!--
- 如果spring中SessionFactory的bean的id不是“sessionFactory”,使用以下方式说明SessionFactory的名称
- 否则,可以省略掉下面的初始化参数
- -->
- <init-param>
- <param-name>sessionFactoryBeanName</param-name>
- <param-value>sessionFactory</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>OpenSessionInView</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <!-- 3.配置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>
- </web-app>
【applicationContext.xml】文件的完整代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:util="http://www.springframework.org/schema/util"
- 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-4.0.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-4.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <!-- 配置dbcp数据源 -->
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
- <property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
- <property name="username" value="scott"></property>
- <property name="password" value="tiger"></property>
- </bean>
- <!-- 配置SessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
- <!-- 引用上面定义的数据源 -->
- <property name="dataSource" ref="dataSource"/>
- <!-- 配置hibernate的其他属性 -->
- <property name="hibernateProperties">
- <props>
- <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
- <prop key="show_sql">true</prop>
- <prop key="format_sql">true</prop>
- </props>
- </property>
- <!-- 配置实体类映射文件 -->
- <property name="mappingDirectoryLocations">
- <list>
- <value>classpath:com/wzj/entity</value>
- </list>
- </property>
- </bean>
- <!-- 配置Dao -->
- <bean id="userDao" class="com.wzj.dao.impl.UserDaoImpl">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- <!-- 配置业务实例 -->
- <bean id="userService" class="com.wzj.service.impl.UserServiceImpl">
- <property name="userDao" ref="userDao"/>
- </bean>
- <!-- 配置Action -->
- <bean id="userAction" class="com.wzj.action.UserAction" scope="prototype">
- <property name="userService" ref="userService"/>
- </bean>
- <!-- 配置事务管理Bean -->
- <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- <!-- 配置事务增强 -->
- <tx:advice id="txAdvice" transaction-manager="txManager">
- <tx:attributes>
- <!-- spring支持对不同的方法使用不同的事物机制(propagation),方法名支持通配符 -->
- <tx:method name="get*" propagation="REQUIRED"/>
- <tx:method name="*" propagation="REQUIRED"/>
- </tx:attributes>
- </tx:advice>
- <!-- 配置切面 -->
- <aop:config>
- <aop:pointcut expression="execution(public * com.wzj.service.impl.*.*(..))" id="pt"/>
- <aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
- </aop:config>
- </beans>
【struts.xml】文件的完整代码:
- <?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>
- <package name="UserPackage" namespace="/" extends="struts-default">
- <!-- 跟以往不同,这里的class要写在spring配置中的action的id属性 -->
- <action name="showall" class="userAction" method="showAllUsers">
- <result name="success">/show.jsp</result>
- </action>
- </package>
- </struts>
①SessionFactory的bean一定要注入dataSource属性
②配置action时,scope一定要改为prototype类型
③配置dao时,一定要注入SessionFactory对象,才能在里面使用
④配置事务管理bean的时候一定要注入SessionFactory,因为事务是由session开启的
⑤web.xml中OpenSessionInView模式的过滤器一定要在Struts2的过滤器之前