SSH整合学习笔记(二)
SSH整合方式
1、方式一:无障碍整合
说明:以下内容按照步骤进行。
1.1 创建Web项目,引入jar包
Struts2
的jar
包- 所必需的包
- 其他一些需要了解的包
struts2-convention-plugin-2.5.25
Struts2
的注解开发包struts2-json-plugin-2.5.25
Struts2
的整合AJAX
的开发包struts2-spring-plugin-2.5.25
Struts2
的整合Spring
的开发包
Hibernate
的jar
包- 所必需的包
MySQL
驱动包- 日志记录包(
log4j
)log4j-1.2.16
(与Struts2
和Spring
中的日志包重复,但可删可不删)slf4j-api-1.6.1
slf4j-log4j12-1.7.2
- 使用
C3P0
连接池(可选项)c3p0-0.9.5.5
(与Spring
中有重复,选择一个即可)hibernate-c3p0-5.4.23.Final
mchange-commons-java-0.2.19
- 需要注意的是:
Struts2
和Hibernate
都引入的一个jar
包javassist
,需要删除一个(版本不一致会出错)
Spring
的jar
包- 注意:
Spring
各版本之间存在一定的差异,在进行开发时注意各模块之间jar
包的依赖关系。 IOC
的开发com.springsource.org.apache.commons.logging-1.1.1
com.springsource.org.apache.log4j-1.2.15.jar
(日志包与前两个框架重合,可删可不删)spring-beans-5.2.11.RELEASE
spring-context-5.2.11.RELEASE
spring-core-5.2.11.RELEASE
spring-expression-5.2.11.RELEASE
AOP
的开发spring-aspects-5.2.11.RELEASE
com.springsource.org.aspectj.weaver-1.6.8.RELEASE
spring-aop-5.2.11.RELEASE
spring-aspects-5.2.11.RELEASE
JDBC
模板的开发spring-jdbc-5.2.11.RELEASE
spring-tx-5.2.11.RELEASE
- 事务管理
spring-tx-5.2.11.RELEASE
- 整合
Web
项目的开发spring-web-5.2.11.RELEASE
- 整合单元测试的开发
spring-test-5.2.11.RELEASE
- 整合
Hibernate
的开发spring-orm-5.2.11.RELEASE
- 注意:
1.2 引入配置文件
Struts2
的配置文件web.xml
struts.xml
Hibernate
的配置文件hibernate.cfg.xml
- 映射文件
- 日志文件
Spring
的配置文件web.xml
applicationContext.xml
- 日志记录(与
Hibernate
选择其一)
1.3 创建包结构
dao
domain
service
web.action
1.4 创建相关类
1.5 引入相关页面
1.6 修改相关页面
1.7 Spring整合Struts2
1.7.1 方式一
方式一:Action
由Struts2
自身创建
-
编写
Action
-
配置
Action
,在struts.xml
中 -
引入
Service
(Action
中调用Service
层提供服务时)-
方式一:传统方式
-
方式二:进行
Spring
和Struts2
的整合① 引入
jar
包:struts2-spring-plugin-2.3.24
② 在该
jar
包下有struts-plugin.xml
配置文件,在该配置文件中,包含如下配置信息:<!-- Make the Spring object factory the automatic default --> <constant name="struts.objectFactory" value="spring" />
可见该配置开启了一个常量,该常量在
default.properties
(在struts2
核心包下)中默认是关闭的。一旦将这个常量打开,会引发之后一些常量的生效。<!-- 默认是关闭状态 --> # struts.objectFactory = spring <!-- 打开后,其后的一些值会生效 --> ### specifies the autoWiring logic when using the SpringObjectFactory. ### valid values are: name, type, auto, and constructor (name is the default) struts.objectFactory.spring.autoWire = name
故可以让
Action
按照名称自动注入Service
:1)将
Service
交给Spring
管理<!-- 在Spring配置文件中配置需要用到的Service实现类 --> <!-- 配置Service --> <bean id="customerService" class="com.poetr.service.impl.CustomerServiceImpl"> </bean>
2)在
Action
中注入Service
// 在Action代码中 // 注入CustomerService private CustomerService customerService; public void setCustomerService(CustomerService customerService) { this.customerService = customerService; } // 在具体方法中调用即可 customerService.save(customer);
-
1.7.2 方式二(**)
方式二:Action
交给Spring
管理
-
引入插件包:
struts2-spring-plugin-2.3.24
-
将
Action
交给Spring
-
首先在
Spring
配置文件中配置Action
<!-- 配置Action --> <bean id="customerAction" class="com.poetr.web.action.CustomerAction"> </bean>
-
之后在
struts2
配置文件中配置Action
<!-- 注意:这里action属性中的class值是在Spring配置文件中配置的Action的id号 --> <action name="customer_*" class="customerAction" method="{1}"> </action>
-
-
引入
Service
操作与方式一类似 -
注意:
-
以这种方式配置的
Action
是单例的,故需要重新配置Action
为多例模式<!-- 配置Action --> <bean id="customerAction" class="com.poetr.web.action.CustomerAction" scope="prototype"> </bean>
-
需要手动注入
Service
<!-- 配置Action --> <bean id="customerAction" class="com.poetr.web.action.CustomerAction" scope="prototype"> <property name="customerService" ref="customerService"></property> </bean>
-
1.8 完成Service调用Dao的操作
- 将
Dao
交给Spring
管理(在Spring
配置文件中配置Dao
) - 在
Service
中注入Dao
1.9 Spring整合Hibernate框架
-
引入
jar
包:spring-orm-4.3.29.RELEASE
-
在
Spring
配置文件中引入Hibernate
的配置信息<!-- Spring与Hibernate整合 --> <!-- 引入Hibernate配置信息 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 引入Hibernate配置文件 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean>
-
在
Spring
和Hibernate
整合后,Spring
提供了一个Hibernate
的模板类简化Hibernate
的开发-
首先让
Dao
继承HibernateDaoSupport
(类似于之前的JdbcTemplate
) -
在
Spring
配置文件中配置Dao
时直接注入SessionFactory
<!-- 配置Dao --> <bean id="customerDao" class="com.poetr.dao.impl.CustomerDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
-
-
配置
Spring
的事务管理-
引入
jar
包:spring-tx
包 -
配置
Spring
的事务管理器<!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
-
开启注解事务
<!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager"/>
-
在业务层使用注解
在业务层实现类上
@Transactional
-
2、方式二:将Hibernate的配置交给Spring管理
说明:在第二种整合方式中,其他操作与方式一样,在进行Spring
与Hibernate
的整合时,需要将之前Hibernate
的配置文件中的内容在Spring
中以Spring
中的方式重新配置。
<!-- 配置C3P0连接池 -->
<!-- 引入属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 进行配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- Spring与Hibernate整合 -->
<!-- 引入Hibernate配置信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 配置Hibernate的相关属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 设置映射文件 -->
<property name="mappingResources">
<list>
<value>com/poetr/domain/Customer.hbm.xml</value>
<value>com/poetr/domain/User.hbm.xml</value>
</list>
</property>
</bean>
3、Hibernate模板的使用
3.1 常用操作
this.getHibernateTemplate().
-
保存
save(Object obj);
-
修改
update(Object obj);
-
删除
delete(Object obj);
-
查询
-
查询一个
get(Class c, Serializable id);
load(Class c, Serializabe id);
-
查询所有
List find(String hql, Object... args);
List findByCriteria(DetachedCriteria dc);
List findByCriteria(DetachedCriteria dc, int firstResult, int maxResults);
List findByNamedQuery(String name, Object... args);
(name
是在映射文件中配置HQL
的值)
-
4、延迟加载问题的解决
Spring
提供了延迟加载的解决方案- 解决方案:
OpenSessionInViewFilter
:提供过滤器
- 解决方案:
- 在
SSH
整合开发中会出现延迟加载的地方- 使用
load
方法查询某一个对象的时候 - 查询到某个对象以后,显示其关联对象
- 使用
5、补充(截止2020年12月30日)
在进行实际项目训练过程中,选择的各框架版本分别是:
Hibernate
:hibernate-release-5.4.23.Final
Struts2
:struts-2.3.24-all
Spring
:spring-framework-4.3.29.RELEASE-dist
6、遇到的问题
6.1 问题一(在无障碍整合时)
-
在按照方式一进行
Struts2
和Spring
的整合时,遇到了问题,即在去掉Action
中的getBean()
加载customerService
时,程序一直报错,在导入spring-web
包后依然报错。搜索资料发现,需要在web.xml
中配置包含org.springframework.web.context.ContextLoaderListener
的监听器,同时需要在web.xml
中配置Spring
配置文件的名称及路径,代码如下:<!--设置Spring配置文件的名称--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param>
在完成以上配置之后,在
Action
中可以省略如下代码:ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
6.2 问题二(在无障碍整合时)
- 在进行
Hibernate
和Spring
的整合时,在继承HibernateDaoSupport
类时,开发工具报错,查询原因是未引入spring-tx
包,在导入该包中,错误消失。
6.3 问题三(在无障碍整合时)
- 在进行
Hibernate
和Spring
的整合时,在开启Spring
事务的过程中,出现了错误 - 解决办法:引入
spring-jdbc
和spring-aop
包
? 开发工具注意事项
在Eclipse
中可以直接复制java
项目,但在复制web
项目后,需要修改一个属性值:
右键项目->属性(Properties
)->Web Project Settings
->修改项目名称为新的项目名称