Spring学习第四天

SSH整合

1、上次课回顾

1.1Spring的AOP的注解

  • AOP的相关注解
    • @Aspect :定义切面
    • 通知的注解
      • @Before :前置通知
      • @AfterReturning :后置通知
      • @Around :环绕通知
      • @AfterThrowing :异常抛出通知
      • @After :最终通知(总是会被执行)
    • 切入点
      • @Pointcut :切入点

1.2Spring的JDBC的模板

  • Spring有持久层的解决方案
  • 手动使用JDBC模板
  • 将连接池和JDBC的模板交给Spring管理
  • 配置开源的连接池
    • DBCP
    • C3P0
  • 使用JDBC的模板完成CRUD的操作

1.3Spring的事务管理

  • 事务回顾
  • Spring的事务管理的API
    • PlatformTransactionManager :平台事务管理器(真正管理事务)
      • DataSourceTransactionManager
      • HibernateTransactionManager
    • TransactionDefinition :事务定义信息
    • TransactionStatus :事务状态
  • Spring的事务管理
    • 编程式事务管理
    • 声明式事务管理里
      • xml
        • 引入aop开发包
        • 配置增强tx:Advance
        • 配置aop
      • 注解
        • 引入aop开发包
        • 配置事务管理器
        • 开启注解事务
        • 在业务层添加注解

2、SSH整合方式一:无障碍整合

2.1 SSH整合

2.1.1创建web项目,引入jar包
  • Struts2的jar包
    • Struts2中有一些包需要了解
      • struts2-convention-plugin-2.3.24.jar -->Struts2的注解开发包
      • struts2-json-plugin-2.3.24.jar -->Struts2的整合ajax的开发包
      • struts2-spring-plugin-2.3.24.jar -->Struts2的整合Spring的开发包
  • Hibernate的jar包
    • Hibernate开发的必须的包
    • MySQL驱动的包
    • 日志记录
    • 注*:Struts2和Hibernate都引入了一个相同的jar包(javassist.jar),删除其中一个。
  • Spring的jar包
    • IOC的开发
    • AOP的开发
    • JDBC模板的开发
    • 整合web项目的开发
    • 整合单元测试的开发
    • 整合Hibernate的开发

2.2 引入配置文件

  • Struts2的配置文件
    • web.xml
    <!-- Struts2 的核心过滤器================== -->
    <filter>
    <filter-name>Struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>Struts2</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    • struts.xml
  • Hibernate的配置文件
    • hibernate.cfg.cml
      • 删除与线程绑定的session和隔离级别
    • 映射文件
  • Spring的配置文件
    • web.xml
    • applicationContext.xml
    • 日志记录
<!-- Spring的核心监听器===================  -->
 <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 加载Spring的配置文件的路径,默认加载的是WEB-INFO/applicationContext.xml -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>

2.3创建包结构和类

  • 创建dao
  • 创建service
  • 创建domain
  • 创建web.action

2.4创建和编写类

  • 创建和编写Customer类,用于封装客户信息
  • 创建和编写web层类
    • 创建CustomerAction类
    • 继承ActionSupport
    • 实现ModelDriven
  • 创建和编写Service层类
    • 创建CustomerService接口
    • 创建CustomerService的实现类
  • 创建和编写DAO层类
    • 创建CustomerDao接口
    • 创建CustomerDao的实现类

2.5 Spring 整合Struts2方式一:Action由Struts2自身创建

  • 编写action,提交数据到Action
//模型驱动使用的对象
Customer customer = new Customer();
	
	@Override
	public Customer getModel() {
		return customer;
	}
	
	//保存客户的方法:save
	public String save() {
		System.out.println("Action中的Save方法执行了");
		return NONE;
	}
  • 配置action
    • 在Struts.xml中配置
<!-- 配置Action -->
<package name="ssh1" extends="struts-default" namespace="/*">
	<action name="Customer_*" class="com.musapir.ssh.web.action.CustomerAction" method="{1}"></action>
</package>
  • 在Action中引入Service
    • 传统方式
    //如果web层没有使用Struts2,获取业务层的类就必须如下进行编写
    WebApplicationContext applicationContext =	WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
    CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
    
    • 进行Spring和Struts2的整合
      • 引入struts-spring-plugins.jar
    • 将Service交给Spring管理
    <!-- 配置Service================== -->
    <bean id="customerService" class="com.musapir.ssh.Service.impl.CustomerServiceImpl"></bean>
    
  • Action注入Service
	//注入CustomerService
	private CustomerService customerService;
	public void setCustomerService(CustomerService customerService) {
		this.customerService = customerService;
	}

2.6 Spring整合Struts2方式二:Action交给Spring管理(推荐)

  • 引入插件包
    • 引入struts-spring-plugin.jar
  • 将Action交给Spring管理
<!-- 配置Action -->
<bean id="customerAction" class="com.musapir.ssh.web.action.CustomerAction"></bean>
  • 在struts.xml中配置action
<!-- 配置Action -->
<package name="ssh1" extends="struts-default" namespace="/*">
	<!-- class中写的是Spring的配置Action的id(也就是上面的id) -->
	<action name="Customer_*" class="customerAction" method="{1}"></action>
</package>
  • 注意*:
    • 需要配置Action为多例的
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SA1sXZ25-1572754056932)(images/20191101203327887_14054.png)]
    • 需要手动注入Service
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laqfq4Kt-1572754056938)(images/20191101203711976_8678.png)]

2.7 Service调用DAO

  • 将DAO交给Spring管理
<!-- 配置DAO -->
<bean id="customerDao" class="com.musapir.ssh.DAO.impl.CustomerDaoImpl"></bean>
  • 在业务层注入DAO
//注入DAO
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
	this.customerDao = customerDao;
}
<!-- 配置Service================== -->
<bean id="customerService" class="com.musapir.ssh.Service.impl.CustomerServiceImpl">
	<property name="customerDao" ref="customerDao"/>
</bean>

2.8Spring 整合Hibernate框架

  • 创建数据库和表
create database ssh;
use ssh;
CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  • 编写实体和映射
  • Spring和Hibernate整合
    • 在Spring的配置文件中,引入Hibernate的配置的信息
<!-- Spring 整合Hibernate -->
<!-- 引入Hibernate的配置的信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
	<!-- 引入Hibernate的配置文件 -->
	<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
  • 在Spring和Hibernate整合后,Spring提供了一个Hibernate的模板类简化Hibernate开发。
    • 改写DAO层继承HibernateDaoSupport
    • 配置的时候再DAO中直接注入sessionFactory
<!-- 配置DAO -->
<bean id="customerDao" class="com.musapir.ssh.DAO.impl.CustomerDaoImpl">
	<property name="sessionFactory" ref="sessionFactory"/>
</bean>
  • 在DAO中使用Hibernate的模板完成保存操作
@Override
public void save(Customer customer) {
	System.out.println("DAO层的save方法执行了。。。。。。。。。");
	this.getHibernateTemplate().save(customer);
}

2.9配置Spring的事务管理

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

3、SSH整合方式二:将Hibernate的配置交给Spring管理(不带Hibernate配置文件)

3.1创建web项目,搭建开发环境

  • Hibernate的配置文件中有哪些内容?
    • 数据库连接的配置
    • Hibernate的相关的属性的配置
      • 方言
      • 显示SQL
      • 格式化SQL
      • 。。。
    • C3P0连接池
    • 映射文件
  • 将Hibernate的配置文件交给Spring管理
<!-- 引入外部属性文件=============== -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	<!-- 配置C3连接池===== -->
	<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">
		 <!-- 注入连接池 -->
		 <property name="dataSource" ref="dataSource"/>
		 <!-- 配置Hibernate的 相关属性 -->
		 <property name="hibernateProperties">
		 	<props>
		 		<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="mappingResource">
			<list>
				<value>com/musapir/ssh/domain/Customer.hbm.xml</value>
			</list>
		</property>
	</bean>

4、Hibernate的模板的使用

4.1Hibernate模板的常用方法

  • 保存操作
    • save(Object obj)
  • 修改操作
    • update(Object obj)
  • 删除操作
    • delete(Object obj)
  • 查询操作
    • 查询一个
      • get(Class,Serializable id)
      • get(Class,Serializable id)
    • 查询多个
      • List find(HQL,Object...args)
      • List findByCriteria(DetachedCriteria)
      • List findByCriteria(DetachedCriteria, int firstResult, MaxResult)

5、延迟加载问题的解决

5.1Spring提供了延迟加载的解决方案

  • 在SSH整合开发中哪些地方会出现延迟加载
    • 使用load方法查询某一个对象的时候(不常用)
  • 解决延加载的方法:在web.xml中配置如下过滤器
  <!-- 解决延迟加载问题的过滤器 -->
  <filter>
  	<filter-name>OpenSessionInViewFilter</filter-name>
  	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>OpenSessionInViewFilter</filter-name>
  	<url-pattern>*.action</url-pattern>
  </filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值