SSH

SHH:
Struts2(2.3.24) + Spring(4.2.4) + Hibernate(5.0.7)

基于配置文件的SSH框架整合:
jar包:
Struts2与Spring整合的jar包:
struts2-spring-plugin-2.3.24.jar
Struts2注解jar包:
struts2-convention-plugin-2.3.24.jar
Hibernate对jpa操作的jar包:
hibernate-entitymanager-5.0.7.Final.jar
连接池jar包:
数据库相关jar包:
静态日志处理jar包:
Spring整合Hibernate的jar包:
spring-orm-4.2.4.RELEASE.jar
注意事项:
javassist:关于字节码操作的jar包,struts2和hibernte都有该jar包,使用一个即可,hibernateG高版本
配置文件:
src/struts.xml
src/hibernate.cfg.xml
domain/Xxx.hbm.xml
src/applicationContext.xml
log4j.properties
db.properties

1、Spring整合Hibernate
方式一:零障碍整合(了解)
使用Spring提供的LocalSessionFactory来加载Hibernate的配置文件
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
在web.xml中配置监听器:
<!-- 配置Sring核心配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring web开发的过滤器加载核心配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
-->启动服务器,若成功自动创建表即整合成功
方式二:Spring管理Hibernate配置:【*****】
在hibernate的核心配置文件中:
<!-- 加载数据库配置信息 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 配置连接池 -->
<bean id="连接池" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${key}"/>
<property name="jdbcUrl" value="${key}"/>
<property name="user" value="${key}"/>
<property name="password" value="${key}"/>
</bean>

<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 配置连接池信息 -->
<property name="dataSource" ref="连接池"/>

<!-- Hibernate的必要属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">true</prop> <!-- 显示sql语句 -->
<prop key="hibernate.format_sql">true</prop> <!-- 格式化sql语句 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <!-- hibernate方言 -->
<prop key="hibernate.hbm2ddl.auto">update</prop> <!-- 自动创建表 -->
</props>

<!-- 也可写成以下形式 -->
<value>
hibernate.show_sql=true
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.hbm2ddl.auto=update
hibernate.format_sql=true
</value>
</property>

<!-- 加载Xxx.hbm.xml配置文件 -->
<property name="mappingResources">
<list>
<value>hbm配置文件的路径</value>
</list>
</property>
</bean>
<!-- 声明式事务 -->
......

-->关于hbm配置文件
mappingResources:
mappingLocations-->加载classpath:路径
mappingJarLocations-->加载jar文件中的hbm文件
mappingDirectoryLocations-->加载目录

Spring整合Hibernate的Dao:
Spring整合Hibernate后,Dao继承HibernateDaoSupport类,在HibernateDaoSupport中只需注入SessionFactory既可以获得HibernateTemplate
HibernateTemplate API:
save(Object entity) --> session.save(Object enetity)
update(Object entity) --> session.update(Object entity)
delete(Object enetity) --> sesion.delete(Object enetity)
saveOrUpdate(Object enetity) --> saveOrUpdate(Object enetity)
get(Class<T> entityClass,Serializable id)
load(Class<T> entityClass,Serializable id)
find(String queryString,Object...values)
findByCriteria(DetachedCriteria dc)
findByNamedQuery(String queryName,Object ...values)
-->SQL命名查询可以用<return class=""/>指定返回值类型
2、Spring整合Struts2
原理分析:
1、Spring整合Struts2框架的jar包:
2、struts2框架配置文件加载的顺序:
default.properties
struts-default.xml
struts-plugin.xml
3、在Struts2框架中的action,interceptor,result全是bean,在struts2框架中默认使用struts2自己bean初始化操作
4、当我们导入spring与struts2整合的jar包后,就会加载该包下的struts-plugin.xml,这是bean的创建有spring管理
5、在创建Action是,首先会从Spring容器中获取,如果获取不到会buildBean
-->Spring整合Struts2框架的方式:
a、Spring管理Action(简单说就是在applicationContext.xml文件中声明Action)
b、Action自动装配service
Spring整合Struts框架方式一【*****】
在applicationCaontext中:
<bean id="action" class="">
<property name="service" ref=""/>
</bean>
在action类中注入service
在struts.xml中:
<action name="" class="action的id/name" method=""/>
<result name=""></result>
</action>
注意:
在web.xml中必须配置Struts2的核心拦截器
Spring整合Struts2框架方式二:
在struts.xml中:
<action name="" class="action的全路径" method=""/>
<result name=""></result>
</action>
在action类中注入service
-->默认按照名称进行注入:
在default.properties中:strtus.objectFactory.spring.autoWire=name
-->可在struts.xml中配置参数:
<constant name="struts.objectFactory.spring.autoWire" value="typr"/>
-->根据类型进行注入
Spring整合Struts2框架总结:
1、如果struts.xml文件中action的class写的是全类名,我们使用action自动装配service方案
2、如果struts.xml文件中action的class写的不是全类名,我们需要在applicationContext.xml中配置action的bean
3、以上操作的前提是必须导入struts2-spring-plugin.jar,在这个文件中它改变了struts2的bean工厂
4、默认情况下如果参与action自动装配service方案,这是每一次请求都会新创建一个action,并且service的装配类型是byName
5、如果我们采用Spring管理action我们必须在bean中声明scope="prototype",因为每一次请求都应该是一个新的action

基于annotation的整合:
jar包:
在原来的xml基础上多导入一个struts2-convention-plugin-2.3.24.jar
配置文件:
在web.xml中:
配置Spring的监听器
配置Struts2的核心拦截器
applicationContext.xml
开启注解扫描:
<context:component-sacn base-package=""/>
配置事务管理器:
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
配置事务注解驱动:
<tx:accotation-driven transaction-manager="transactionManager"/>
strtus.xml
对PO类的注解:
@Entity 定义实体类
@Table 定义表
@ID 主键
@GeneratedValue 主键生成策略
@Column 定义列
-->在sessionFactory的加载注解类:
<property name="packagesToScan">
<list>
<value>包名/指定PO类</value>
<list>
</property>
对Dao的编写:
因为dao类继承了HibernateDaoSupport,所有我们只需注入SessionFactory即可得到HibernateTemplate
@Autowired
@Qualifier("")
public void setSuperSessionFactor(SessionFactory factory){
super.setSessionFactory(factory);
}
对action的编写:
需要注解:@Scoper("prototype")

SSH整合延迟加载问题:
1、不使用延迟加载
2、手动将延迟加载初始化Hibernate.initialize(延迟对象)
3、使用Spring提供一个OpenSessionInViewFilter
-->在web.xml中:
<!-- 配置延迟加载 -->
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
  
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->基本原理:
将Session的关闭操作不在service层完成,而是在web层才关闭
-->注意:
openSessionInViewFilter要在Struts2的核心配置文件的前
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值