SSh=struts2+spring+hibernate

struts2 2.3.24

spring 4.2.4

hibernate 5.0.7

关于xml配置文件的整合方式

SSH整合jar包

Struts2框架需要jar包

SSH框架整合_struts

Asm 是关于字节码操作

Commons-fileupload 关于文件上传

Commons-io 关于io流操作工具

Commons-lang 也是一个工具,包含了关于数据与字符串操作

Freemaker 标签库模板文件

Javassist 它也是关于字节码操作,动态代理可以使用它实现(类似于cglib)

Log4j关于日志

Ognl 关于ognl表达式

Struts2-core xwork-cor struts2框架底层是使用xwork


SSH框架整合_struts_02

Struts2与spring整合还需要这个包


如果需要使用struts2提供的json处理

SSH框架整合_SSH整合_03


注意:如果使用注解方案,我们还需要导入一个jar包

SSH框架整合_struts_04


Hibernate框架需要的jar包

SSH框架整合_hibernate_05

Antlr 语法解析包

Dom4j 解析xml

Geronimo-jta apache geronimo它是一个开源javaEE服务器 Geronimo-jta是这个开源项目提供jar包,在hibernate中是关于jta事务相关

Hibernate-commoins-annotations

这个包是我们在hibernate下来使用jpa相关的注解,这样它不依赖于hibernate

Hibernate-core 开发hibernate必须

Hibernate-jpa 它是关于hibernate对jpa的支持

Jandex 用于索引annotation

Javassist 关于字节码操作(注意:strtus2中也引入这个jar包了)

Jboss-logging 它是关于jboss统一日志处理


如果使用关于jpa相关操作需要导入jpa依赖jar包

SSH框架整合_hibernate_06


C3p0连接池

SSH框架整合_hibernate_07

还需要数据库相关的驱动jar包

SSH框架整合_struts_08


还需要静态日志处理

SSH框架整合_spring_09

Spring框架需要的jar包

Spring最基本jar包

SSH框架整合_hibernate_10

SSH框架整合_struts_11

AOP开发

SSH框架整合_hibernate_12

SSH框架整合_spring_13

Spring jdbc

SSH框架整合_hibernate_14

Spring 事务管理需要tx

Spring整合hibernate

SSH框架整合_spring_15

Spring整合web开发

SSH框架整合_spring_16

如果使用到junit测试

SSH框架整合_SSH整合_17


还需要commons-loggin jar包

SSH框架整合_SSH整合_18


创建工程完成整合前期准备

需要的配置文件:

Strtsu2框架 src/strtus.xml

Hibernate框架 src/hibernate.cfg.xml 在domain有 Xxx.hbm.xml

Spring框架 src/applicationContext.xml

关于日志 log4j.properties

关于数据库连接 db.properties


Spring整合hibernate

    基本原理:就是由spring来管理hibernate的SessionFactory

方式一:零障碍整合(了解)

    我们只需要使用spring中提供的一个LocalSessionFacotry来加载Hibernate的配置文件。

    SSH框架整合_spring_19


Ssh-xml工程加载到服务器后,如果可以自动创建表,就代表spring整合hibernate ok.

注意:我们必须配置spring的ContextLoaderListener

SSH框架整合_SSH整合_20

方式二(spring管理hibernate配置)

不在需要hibernate.cfg.xml文件,所有关于hibernate.cfg.xml文件中的配置都在spring的配置文件中来配置。


首先要配置数据源

SSH框架整合_hibernate_21

接下来引入properties文件

SSH框架整合_spring_22

SSH框架整合_hibernate_23

创建LocalSessionFactoryBean来完成spring管理hibernate中的SessionFactory

SSH框架整合_struts_24

上述的props可以简化成下面方案

SSH框架整合_spring_25


加载hbm.xml配置文件

SSH框架整合_SSH整合_26

mappingResources它类似于我们之前<mapping resource="">

mappingLocations它加载时是根据类路径加载 classpath:路径

SSH框架整合_hibernate_27

mappingJarLocations它会加载jar文件中的hbm.xml文件

mappingDirectoryLocations 它加载的目录


spring整合hibernate后的DAO

spring整合hiberante后,我们的dao只需要继承HibernateDaoSupport类

在HibernateDaoSupport中只需要注入SessionFactory就可以获得到HibernateTemplate,它是对hibernate操作的一个简单封装,可以让我们方便使用原来hibernate的操作.

SSH框架整合_SSH整合_28


SSH框架整合_hibernate_29

编写service及测试

SSH框架整合_struts_30


测试

SSH框架整合_struts_31

事务管理

SSH框架整合_SSH整合_32


HibernateTemplate API介绍

保存操作 session.save()

SSH框架整合_SSH整合_33

修改操作 session.update()

SSH框架整合_SSH整合_34

删除操作 session.delete()

SSH框架整合_hibernate_35

类似于session.saveOrUpdate()根据持久化对象的状态来判断执行save或update

SSH框架整合_spring_36

获取操作 get() load()

SSH框架整合_hibernate_37

SSH框架整合_SSH整合_38


Find操作 类似于session.createQuery().setParameter().list()

SSH框架整合_struts_39

类似于hibernate中的QBC查询,完全的面向对象方案

SSH框架整合_hibernate_40

SSH框架整合_hibernate_41

SSH框架整合_spring_42

下面这个可以执行命名查询

可以在User.hbm.xml文件中定义hql或sql

SSH框架整合_hibernate_43


SSH框架整合_spring_44

SSH框架整合_spring_45

Spring整合struts2框架

前期准备

创建一个addUser.jsp页面

SSH框架整合_SSH整合_46

创建UserAction类

SSH框架整合_spring_47

Struts.xml文件中配置

SSH框架整合_struts_48


Spring整合struts2原理分析


  1. spring整合struts2框架必须导入一个jar包 struts2-spring-plugin.jar
     
  2. struts2框架配置文件加载顺序

  1. default.properties
  2. struts-default.xml
  3. strtus-plugin.xml

  1. 在struts2框架中所有的action interceptor result全是bean,在struts2框架中默认是使用strtus2自己bean初化操作. SSH框架整合_struts_49
    SSH框架整合_hibernate_50
     
  2. 当我们在工程中导入struts2-spring-plugin.jar文件 就会加载这个包下的strtus-plugin.xml
    SSH框架整合_struts_51
    这时bean的创建由spring来管理。
     
  3. 这时在创建Action时它执行的代码 上述代码,在执行时,首先会从spring容器中来获取,如果获取不到,会buildBean通过上述分析,spring整合struts2框架它的方式有两种

  1. spring管理action(简单说就是在applicationContext.xml文件中来声明action)
  2. action自动装配service



spring整合struts2框架方式一(掌握)

这种方案是基于spring管理action


  1. 在applicationContext.xml文件中配置 SSH框架整合_spring_52
     
  2. 在action类中 SSH框架整合_struts_53
     
  3. 在struts.xml文件 SSH框架整合_struts_54
    Class的值就是bean的id值
     
    注意:必须在web.xml文件中配置struts2框架的Filter
    SSH框架整合_hibernate_55

Spring整合struts2框架方式二(action中自动注入service)

Struts.xml文件中

SSH框架整合_spring_56

Class还是类的全名


这时就会将action类中需要的注入servcie自动注入

SSH框架整合_SSH整合_57

在default.properties中有一段配置

SSH框架整合_spring_58

这时就会根据名称进行autoWires


我们可以修改注入的方式

SSH框架整合_hibernate_59

我们在struts.xml文件中修改了注入的方式,根据type进行注入


Spring整合struts2框架总结


  1. 如果在struts.xml文件中<action class="cn.itheima.action.UserAction">如果写的是全类名,我们使用action自动装配service方案
  2. 如果在struts.xml文件中<action class="userAction">这时,在applicationContext.xml文件中要配置<bean id="userAction" class=" cn.itheima.action.UserAction">
  3. 以上操作的前提是必须导入struts2-spring-plugin.xml文件 在这个文件中它改变struts2的bean工厂
  4. 默认情况下如果采用action自动装配service方案,这时每一次请求都会新创建一个action,并且service的装配类型是by name
  5. 如果我们采用的是spring管理action这种方案我们必须在<bean>声明中添加scope=prototype",原因是struts2框架的action每一次请求都应该是一个新的action

关于annotation整合方式

Jar包导入

在原来的xml基础上在多导入一个jar包

SSH框架整合_struts_60

只有导入这个jar包后,我们才能使用struts2框架的注解 @Namespace @Action


配置文件

Web.xml文件中要配置

SSH框架整合_struts_61

Spring的配置文件 applicationContext.xml

Struts2的配置文件 struts.xml


使用JPA注解来定义PO类

@Entity 定义实体类

@Table 定义表

@Id 主键

@GeneratedValue 生成主键策略

@Column 定义列

SSH框架整合_hibernate_62

Spring整合hibernate

SSH框架整合_SSH整合_63

Dao编写

如何在dao中得到HibernateTemplate对象,原来是在applicationContext.xml文件中通过配置方案注入了一个SessionFactory对象,UserDao的父类HibernateDaoSupport,会帮助我们根据SessionFactory来得到HibernateTemplate


SSH框架整合_spring_64

Service编写

SSH框架整合_SSH整合_65


SSH框架整合_SSH整合_66


问题:service需要事务管理,怎样处理?

SSH框架整合_struts_67


SSH框架整合_hibernate_68


SSH框架整合_hibernate_69

Action编写

SSH框架整合_spring_70

使用@Controller @Scope

以上注解的作用是由spring管理action,它是一个多例的。


问题:如何完成struts2框架的流程?

SSH框架整合_struts_71


基于annotation的ssh整合总结

在ssh的annotation整合时,必须要多导入的一个包

SSH框架整合_spring_72

对于dao,service,action我们使用

@Repository @Service @Controller来完成bean注册。

在dao中我们使用以下方案将SessionFactory注入,在dao中就可以使用HibernateTemplate

SSH框架整合_spring_73

在service及action中使用@Autowire来注入dao及service

SSH框架整合_hibernate_74

SSH框架整合_spring_75

一定要在applicationContext.xml文件中开启注解扫描

SSH框架整合_SSH整合_76

对于PO类我们使用JPA的注解 @Entiry @Table @Id @GeneratedValue @Column

要在applicationContext.xml文件中配置SessionFactory时来确定扫描包

SSH框架整合_spring_77


对于Struts2框架,我们需要@Namespace @Action @ParentPakcage @Result来定义struts2流程

SSH框架整合_SSH整合_78

要求action类必须是在action actions struts struts2这样的包中才会扫描struts2相关注解


SSH整合延迟加载问题解决


  1. 修改UserDao中的findById SSH框架整合_hibernate_79
  2. 添加一个user.jsp页面 SSH框架整合_struts_80
     
  3. 在UserAction中处理user_findById请求 以上程序在执行后,报错解决no session问题:
  4. 基本的原理就是将session的关闭操作不在service层完成,而是在web层才关闭session.
    注意:openSessionInViewFilter一定要在Struts2 Filter前配置.

  1. 不使用延迟加载
  2. 手动将延迟加载初始化 Hibernate.initialize(延迟对象)
  3. 使用spring提供的一个OpenSessionInViewFilter来解决