Spring第四阶段

Spring

案例:CRM的保存案例(SSH完成)

SSH 整合方式一:零障碍整合

意思就是没有注解用所有的配置文件,最原始的那种写法

SSH基本回顾

第一步:创建项目,引入jar包

33个

  • Struts2 中基本的开发包:struts-blanks中找 13个
    • struts2中的依赖包(看需求):sturts/lib/
      • 例:spring :Struts2整合Spring
      • convention :注解
      • json :整合AJAX的开发包
  • 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

具体实现

  1. 创建包结构
  2. 引入相关的页面
  3. 修改页面的路径

Struts2 和Spring的整合

  • Action类由Struts2的自身创建
    1. 引入一个Struts2中的lib包中的spring
    2. 在jar包中有一个配置文件:struts-plugins.xml
      • 在struts核心包中的default.properties,有下面这个常量:
      • Struts中的是默认将这个常量注释的,在插件包中将其开启,这个常量的开启会引发下面一系列常量的开启
      • 开启后只需要在action中加一个Service的变量跟set方法,即可直接使用Service,配置文件中只要有名字跟他对上了即可使用

  • Action类交给Spring管理(建议使用)
    1. 在Spring中创建一个Action的实例,
    2. 因为Struts配置文件中已经有了action的实例,所以需要把Struts中的class改为spring中实例的id
      • 注意:Actioin是多例的,所以要在Spring中的action实例中加一个scope=prototyte
      • Service的属性需要在Spring中手动注入

建议使用交给Spring,因为Spring中有AOP,可以方便增强

Spring整合Hibernate

  • 编写Dao,配置Dao
  • 创建数据库和实体类,配置文件

    • 因为隔离级别跟绑定当前线程都交给Spring管了,所以在这里就把配置文件中的删掉。
  • 在Spring中引入Hibernate的信息

    1. 在Spring的配置文件中构建一个SessionFactory(注意版本5),并注入configLoaction属性
    2. 定义Hibernate模板,并注入到Dao中去


      然后在Dao中写模板的变量跟set方法即可。
    3. 因为写一个Dao就得注入一次,特麻烦,所以可以让Dao继承HibernateDaoSupport,里面有模板的变量跟set方法
    4. 还能更简单:HibernateDaoSupport中有getHibernateTemplate的方法,里面的内容是有模板就能用,没有就创建一个模板,所以只需要在Dao中注入SessionFactory,然后再调用getHibernateTemplate方法即可。
  • 在Spring跟Hibernate的整合上修改数据库时,必须使用事务管理,要不然会抛出read-only异常。

添加事务管理

  • 配置事务管理器
1
2
3
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
   <property name="sesssionFactory" ref="sessionFactory" />
</bean>
  • 开启注解事务
1
<tx:annotation-driven transaction-manager="transactionManager" />
  • 在业务层添加注解
1
2
@Transactional
public class CustomerServiceImpl implements CustomerService{}

SSH整合方式二:不带Hibernate配置文件

web 项目复制之后过去不能直接用,必须修改项目属性中的 Web Project Settings

在Spring中配置连接池

  • 提供属性文件(数据库连接)
  • 引入外部属性文件
    <context:property-placeholder location="classspath:jdbc.properties" />
  • 配置连接池
1
2
3
4
5
6
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSSource">
   <property name="driverClass" value="${jdbc.driverClass}"/>
   <property name="jdbcUrl" value="${jdbc.url}"/>
   <property name="user" value="${jdbc.user}"/>
   <property name="password" value="${jdbc.password}"/>
</bean>
  • 构建连接池,构建一个SessionFactory
1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
   <!--  注入连接池 -->
   <property name="dataSource" ref="dataSource" />
   <!-- 设置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">updata</prop>
      </props>
   </property>
</bean>
  • 设置Hibernate的映射文件
1
2
3
4
5
<property name="mappingResources">
   <list>
     <value>com/spring/ssh/...</value>
   </list>
</property>
  • 在加载映射文件的时候还有很多种方式:
    • 具体到包中所有的映射文件 : <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中。

    1
    2
    3
    4
    5
    6
    7
    8
      <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>
张冲 wechat
欢迎扫一扫上面的微信关注我,一起交流!
坚持原创技术分享,您的支持将鼓励我继续创,点击打赏!