Spring
案例:CRM的保存案例(SSH完成)
SSH 整合方式一:零障碍整合
意思就是没有注解用所有的配置文件,最原始的那种写法
SSH基本回顾
第一步:创建项目,引入jar包
33个
- Struts2 中基本的开发包:struts-blanks中找 13个
- struts2中的依赖包(看需求):
sturts/lib/
- 例:
spring
:Struts2整合Spring convention
:注解json
:整合AJAX的开发包
- 例:
- struts2中的依赖包(看需求):
- Hibernate5 基本:
lib/required
里面的所有9个- 还需要 日志记录
log4j
跟数据库驱动connector
- 有可能用的到数据库的连接池:
- C3P0 (3个):5的版本,3的版本的时候只需要一个C3P0即可
- 还需要 日志记录
- Spring 基本:
IOC
基本 6个,四个核心包,两个日志AOP
基本 4个,两个核心包,两个依赖- 事务管理 :
tx
- JDBC :
jdbc
跟数据库驱动connector
- 整合web :
web
- 整合单元测试 :
test
- 整合其他框架(Hibernate反正在这):
orm
Struts跟Hibernate同时包含了这个,删除一个低版本的
引入配置文件
- Struts2
- web.xml
- struts.xml
- Hibernate5
- hibernate.cfg.xml
- 映射文件
- Spring
- applicationContext.xml
- log4j.properties
- web.xml 核心监听器
ContextLoaderListener
具体实现
- 创建包结构
- 引入相关的页面
- 修改页面的路径
Struts2 和Spring的整合
- Action类由Struts2的自身创建
- 引入一个Struts2中的lib包中的
spring
包 - 在jar包中有一个配置文件:
struts-plugins.xml
- 在struts核心包中的
default.properties
,有下面这个常量: - Struts中的是默认将这个常量注释的,在插件包中将其开启,这个常量的开启会引发下面一系列常量的开启
- 开启后只需要在action中加一个Service的变量跟set方法,即可直接使用Service,配置文件中只要有名字跟他对上了即可使用
- 在struts核心包中的
- 引入一个Struts2中的lib包中的
- Action类交给Spring管理(建议使用)
- 在Spring中创建一个Action的实例,
- 因为Struts配置文件中已经有了action的实例,所以需要把Struts中的class改为spring中实例的id
- 注意:Actioin是多例的,所以要在Spring中的action实例中加一个
scope=prototyte
- Service的属性需要在Spring中手动注入
- 注意:Actioin是多例的,所以要在Spring中的action实例中加一个
建议使用交给Spring,因为Spring中有AOP,可以方便增强
Spring整合Hibernate
- 编写Dao,配置Dao
创建数据库和实体类,配置文件
- 因为隔离级别跟绑定当前线程都交给Spring管了,所以在这里就把配置文件中的删掉。
在Spring中引入Hibernate的信息
- 在Spring的配置文件中构建一个
SessionFactory
(注意版本5),并注入configLoaction
属性 - 定义Hibernate模板,并注入到Dao中去
然后在Dao中写模板的变量跟set方法即可。 - 因为写一个Dao就得注入一次,特麻烦,所以可以让Dao继承
HibernateDaoSupport
,里面有模板的变量跟set方法 - 还能更简单:
HibernateDaoSupport
中有getHibernateTemplate
的方法,里面的内容是有模板就能用,没有就创建一个模板,所以只需要在Dao中注入SessionFactory
,然后再调用getHibernateTemplate
方法即可。
- 在Spring的配置文件中构建一个
在Spring跟Hibernate的整合上修改数据库时,必须使用事务管理,要不然会抛出
read-only
异常。
添加事务管理
- 配置事务管理器
|
|
- 开启注解事务
|
|
- 在业务层添加注解
|
|
SSH整合方式二:不带Hibernate配置文件
web 项目复制之后过去不能直接用,必须修改项目属性中的 Web Project Settings
在Spring中配置连接池
- 提供属性文件(数据库连接)
- 引入外部属性文件
<context:property-placeholder location="classspath:jdbc.properties" />
- 配置连接池
|
|
- 构建连接池,构建一个SessionFactory
|
|
- 设置Hibernate的映射文件
|
|
- 在加载映射文件的时候还有很多种方式:
- 具体到包中所有的映射文件 :
<property name="mappingDirectoryLocations"> <array> <value>classpath:cn/itcast/domain</value> </array> </property>
- 使用通配符的概念加载映射文件 :
<property name="mappingLocations"> <array> <value>classpath:cn/itcast/domain/*.hbm.xml</value> </array> </property>
- 具体到包中所有的映射文件 :
Hibernation 模板的使用
- save(Object obj)
- update(Object obj)
- delete(Object obj)
- T get(Class clazz,Serializable id);
- List/
find(String hql); - List/
findByCriteria(DetachedCriteria c);
修改跟删除
查询一个
查询多个
HQL:
QBC:
延迟加载的解决
延迟加载问题:就是想用Load的时候,因为已经在service使用了事务,所以当延迟加载的时候,到Service的时候就把session关闭了,所以当action中用到查询的东西的时候,没有办法去获得数据了,就会报错
解决办法:用
OpenSessionInViewFilter
过滤器,把session的开启跟关闭放在action中。12345678<filter><filter-name>OpenSessionInViewFilter</filter-name><filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class></filter><filter-mapping><filter-name>OpenSessionInViewFilter</filter-name><url-pattern>*.action</url-pattern></filter-mapping>