SSH整合

目录

 

一.SSH整合方式一(无障碍整合)

1.1 框架整合开发回顾

1.2 整合实现

1.2.1 创建web项目,引入jar包

1.2.2 引入配置文件

1.2.3 创建包结构并添加相关类

1.2.4 Spring整合Struts2(方式一):Action由Struts2自身创建

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

1.2.6  Service调用DAO

1.2.7 Spring整合Hibernate框架

1.2.8 配置Spring的事务管理并使用

二.SSH整合方式二(不带hibernate配置文件)

2.1 hibernate配置文件中有哪些内容?

2.2 将Hibernate的配置交给Spring

三.Hibernate模板的使用

四.延迟加载问题的解决


一.SSH整合方式一(无障碍整合)

1.1 框架整合开发回顾

1.2 整合实现

1.2.1 创建web项目,引入jar包

  • Struts2的jar包
    • struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.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的开发的必须的包   
      • hibernate-release-5.0.7.Final\lib\required\*.jar
    • MySQL驱动
    • 日志记录
    • 使用C3P0连接池
    • 注意:Struts2和Hibernate都引入了一个相同的jar包(javassist包)。删除一个******
  • Spring的jar包
    • IOC的开发
    • AOP的开发
    • JDBC模板的开发
    • 事务管理
    • 整合web项目的开发
    • 整合单元测试的开发
    • 整合hibernate的开发

1.2.2 引入配置文件

  • Struts的配置文件
    • 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
    • <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE struts PUBLIC
      	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
      	"http://struts.apache.org/dtds/struts-2.3.dtd">
      <struts>
      	<!-- 配置Struts2的常量 -->
      	<constant name="struts.action.extension" value="action"/>
      	
      
      </struts>

       

  • Hibernate的配置文件
    • hibernate.cfg.xml
      • 无需设置事务隔离级别并删除那个与线程绑定的session
      • <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE hibernate-configuration PUBLIC
        	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
        <hibernate-configuration>
        	<session-factory>
        		<!-- 连接数据库的基本参数 -->
        		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        		<property name="hibernate.connection.url">jdbc:mysql:///ssh1</property>
        		<property name="hibernate.connection.username">root</property>
        		<property name="hibernate.connection.password">abc</property>
        		<!-- 配置Hibernate的方言 -->
        		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        		
        		<!-- 可选配置================ -->
        		<!-- 打印SQL -->
        		<property name="hibernate.show_sql">true</property>
        		<!-- 格式化SQL -->
        		<property name="hibernate.format_sql">true</property>
        		<!-- 自动创建表 -->
        		<property name="hibernate.hbm2ddl.auto">update</property>
        		
        		<!-- 配置C3P0连接池 -->
        		<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        		<!--在连接池中可用的数据库连接的最少数目 -->
        		<property name="c3p0.min_size">5</property>
        		<!--在连接池中所有数据库连接的最大数目  -->
        		<property name="c3p0.max_size">20</property>
        		<!--设定数据库连接的过期时间,以秒为单位,
        		如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
        		<property name="c3p0.timeout">120</property>
        		 <!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
        		<property name="c3p0.idle_test_period">3000</property>
        		
        
        	</session-factory>
        </hibernate-configuration>
    • ​​​​​​映射文件
      • 后续配置
  • Spring的配置文件
    • web.xml
    •   <!-- Spring的核心监听器 -->
        <listener>
        	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <!-- 加载Spring的配置文件的路径的,默认加载的/WEB-INF/applicationContext.xml -->
        <context-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>classpath:applicationContext.xml</param-value>
        </context-param>

       

    • applicationContext.xml
    • <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns:context="http://www.springframework.org/schema/context"
      	xmlns:aop="http://www.springframework.org/schema/aop"
      	xmlns:tx="http://www.springframework.org/schema/tx"
      	xsi:schemaLocation="http://www.springframework.org/schema/beans 
      	http://www.springframework.org/schema/beans/spring-beans.xsd
      	http://www.springframework.org/schema/context
      	http://www.springframework.org/schema/context/spring-context.xsd
      	http://www.springframework.org/schema/aop
      	http://www.springframework.org/schema/aop/spring-aop.xsd
      	http://www.springframework.org/schema/tx 
      	http://www.springframework.org/schema/tx/spring-tx.xsd">
      	
          <!-- Spring的核心监听器 -->
        <listener>
        	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        
        <!-- 加载Spring的配置文件的路径的,默认加载的/WEB-INF/applicationContext.xml -->
        <context-param>
        	<param-name>contextConfigLocation</param-name>
        	<param-value>classpath:applicationContext.xml</param-value>
        </context-param>
      
      </beans>
      

       

    • 日志记录
      • log4j.properties

1.2.3 创建包结构并添加相关类

1.2.4 Spring整合Struts2(方式一):Action由Struts2自身创建

①编写Action

/**
 * 客户管理的Action的类
 * 
 */
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
	// 模型驱动使用的对象:
	private Customer customer = new Customer();

	@Override
	public Customer getModel() {
		return customer;
	}
	
	/**
	 * 保存客户的方法:save
	 */
	public String save() {
		// 如果web层没有使用Struts2,获取业务层的类就必须如下进行编写:	
		System.out.println("Action中的save方法执行了...");
		customerService.save(customer);
		return NONE;
	}
}

②配置Action

struts.xml

	<!-- 配置Action -->
	<package name="ssh1" extends="struts-default" namespace="/">
		<action name="customer_*" class="ssh.web.action.CustomerAction" method="{1}">
			
		</action>
	</package>

③在Action中引入Service

方式一:

/**
 * 保存客户的方法:save
 */
public String save() {
	// 如果web层没有使用Struts2,获取业务层的类就必须如下进行编写:
	WebApplicationContext applicationContext = WebApplicationContextUtils
			.getWebApplicationContext(ServletActionContext.getServletContext());
	CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");
	
	System.out.println("Action中的save方法执行了...");
	customerService.save(customer);
	return NONE;
}

方式二:

引入struts-spring-plugin.jar,在插件包的xml文件中有如下配置

struts-spring-plugin.jar帮我们开启了一个常量:在Struts2中只有开启这个常量就会引发下面常量生效

配置applicationcontext.xml 让Action按照名称自动注入Service

	<!-- 配置Service================== -->
	<bean id="customerService" class="ssh.service.impl.CustomerServiceImpl">
	</bean>

修改Action类 

/**
 * 客户管理的Action的类
 * 
 */
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
	// 模型驱动使用的对象:
	private Customer customer = new Customer();

	@Override
	public Customer getModel() {
		return customer;
	}
	
	// 注入CustomerService:
	private CustomerService customerService;

	public void setCustomerService(CustomerService customerService) {
		this.customerService = customerService;
	}
/**
 * 保存客户的方法:save
 */
public String save() {
	// 如果web层没有使用Struts2,获取业务层的类就必须如下进行编写:
	/*WebApplicationContext applicationContext = WebApplicationContextUtils
			.getWebApplicationContext(ServletActionContext.getServletContext());
	CustomerService customerService = (CustomerService) applicationContext.getBean("customerService");*/
	
	System.out.println("Action中的save方法执行了...");
	customerService.save(customer);
	return NONE;
}
}

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

①引入插件包:struts-spring-plugin.jar

②配置applicationContext.xml 将Action交给Spring,需要手动注入Service,并设置action为多例

		<!-- 配置Action=================== -->
	<bean id="customerAction" class="ssh.web.action.CustomerAction" scope="prototype">
		<property name="customerService" ref="customerService"/>
	</bean>

③修改struts.xml中Action的配置方式,

	<!-- 配置Action -->
	<package name="ssh1" extends="struts-default" namespace="/">
		<action name="customer_*" class="customerAction" method="{1}">
			<!-- 这里class的值变为applicationcontext.xml 中配置action的id值 -->
		</action>
	</package>

该种方式优点:管理方便、容易增强Action

1.2.6  Service调用DAO

① 配置applicationcontext.xml 将DAO交给Spring管理

		<!-- 配置DAO====================== -->
	<bean id="customerDao" class="ssh.dao.impl.CustomerDaoImpl">

	</bean>

②修改 Service类

public class CustomerServiceImpl implements CustomerService {

	// 注入DAO;
	private CustomerDao customerDao;
	
	public void setCustomerDao(CustomerDao customerDao) {
		this.customerDao = customerDao;
	}

	@Override
	public void save(Customer customer) {
		System.out.println("Service中的save方法执行了...");
		customerDao.save(customer);
	}

}

③修改 applicationcontext.xml对service进行属性注入

	<!-- 配置Service================== -->
	<bean id="customerService" class="ssh.service.impl.CustomerServiceImpl">
		<property name="customerDao" ref="customerDao"/>
	</bean>

1.2.7 Spring整合Hibernate框架

①创建表

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;

②编写实体和映射

/**
 * 客户管理的实体
 */
public class Customer {
	private Long cust_id;
	private String cust_name;
	private String cust_source;
	private String cust_industry;
	private String cust_level;
	private String cust_phone;
	private String cust_mobile;
	public Long getCust_id() {
		return cust_id;
	}
	public void setCust_id(Long cust_id) {
		this.cust_id = cust_id;
	}
	public String getCust_name() {
		return cust_name;
	}
	public void setCust_name(String cust_name) {
		this.cust_name = cust_name;
	}
	public String getCust_source() {
		return cust_source;
	}
	public void setCust_source(String cust_source) {
		this.cust_source = cust_source;
	}
	public String getCust_industry() {
		return cust_industry;
	}
	public void setCust_industry(String cust_industry) {
		this.cust_industry = cust_industry;
	}
	public String getCust_level() {
		return cust_level;
	}
	public void setCust_level(String cust_level) {
		this.cust_level = cust_level;
	}
	public String getCust_phone() {
		return cust_phone;
	}
	public void setCust_phone(String cust_phone) {
		this.cust_phone = cust_phone;
	}
	public String getCust_mobile() {
		return cust_mobile;
	}
	public void setCust_mobile(String cust_mobile) {
		this.cust_mobile = cust_mobile;
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<!-- 建立类与表的映射 -->
	<class name="ssh.domain.Customer" table="cst_customer">
		<!-- 建立类中的属性与表中的主键对应 -->
		<id name="cust_id" column="cust_id" >
			<!-- 主键生成策略 -->
			<generator class="native"/>
		</id>
		
		<!-- 建立类中的普通的属性和表的字段的对应 -->
		<property name="cust_name" column="cust_name"  />
		<property name="cust_source" column="cust_source" />
		<property name="cust_industry" column="cust_industry"/>
		<property name="cust_level" column="cust_level"/>
		<property name="cust_phone" column="cust_phone"/>
		<property name="cust_mobile" column="cust_mobile"/>
	</class>
</hibernate-mapping>

③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中使用Hibernate的模板完成保存操作

 

/**
 * 客户管理的DAO层的实现类
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
	@Override
	public void save(Customer customer) {
		System.out.println("DAO中的save方法执行了...");
		this.getHibernateTemplate().save(customer);
	}
}
  • 修改applicationContext.xml 在配置Dao中直接注入SessionFactory
		<!-- 配置DAO====================== -->
	<bean id="customerDao" class="ssh.dao.impl.CustomerDaoImpl" >
		<!-- 注入后可以帮我们创建模板 -->
		<property name="sessionFactory" ref="sessionFactory"/>
	</bean>

1.2.8 配置Spring的事务管理并使用

在applicationContext.xml中配置

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

	// 注入DAO;
	private CustomerDao customerDao;
	
	public void setCustomerDao(CustomerDao customerDao) {
		this.customerDao = customerDao;
	}

	@Override
	public void save(Customer customer) {
		System.out.println("Service中的save方法执行了...");
		customerDao.save(customer);
	}

}

二.SSH整合方式二(不带hibernate配置文件)

2.1 hibernate配置文件中有哪些内容?

  • 数据库连接的配置
  • Hibernate的相关的属性的配置
    • 方言
    • 显示SQL
    • 格式化SQL
  • C3P0连接池
  • 映射文件

2.2 将Hibernate的配置交给Spring

①在src下新建文件jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mytest
jdbc.username=root
jdbc.password=rootjdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mytest
jdbc.username=root
jdbc.password=root

②在 applicationContext.xml中配置c3p0连接池以及Hibernate的属性

	<!-- 引入外部属性文件=============================== -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 配置C3P0连接池=============================== -->
	<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.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>ssh/domain/Customer.hbm.xml</value>
			</list>
		</property>
	</bean>

 

 

 

 

③删除 hibernate.cfg.xml

四.Hibernate模板的使用

/**
 * 客户管理的DAO层的实现类
 *
 */
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
	//保存
	@Override
	public void save(Customer customer) {
		System.out.println("DAO中的save方法执行了...");
		this.getHibernateTemplate().save(customer);
	}
	//修改
	@Override
	public void update(Customer customer) {
		this.getHibernateTemplate().update(customer);
	}

	//删除
	@Override
	public void delete(Customer customer) {
		this.getHibernateTemplate().delete(customer);
	}

	//根据ID查单个用户
	@Override
	public Customer findById(Long cust_id) {
//		return this.getHibernateTemplate().get(Customer.class, cust_id);
		return this.getHibernateTemplate().load(Customer.class, cust_id);
	}

	//根据HQL查询所有用户
	@Override
	public List<Customer> findAllByHQL() {
		List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer");
		return list;
	}

	//使用QBC查询所有用户
	@Override
	public List<Customer> findAllByQBC() {
		DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
		List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
		return list;
	}

	//命名查询
	@Override
	public List<Customer> findAllByNamedQuery() {
		return (List<Customer>) this.getHibernateTemplate().findByNamedQuery("queryAll");
	}
}

在customer.hbm.xml 中配置命名查询

		<query name="queryAll">from Customer</query>

五.延迟加载问题的解决

在web.xml中配置过滤器

  <!-- 解决延迟加载问题的过滤器 -->
  <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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值