1. 程式人生 > >Spring第四天:SSH框架整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用

Spring第四天:SSH框架整合、HibernateTemplate的使用、OpenSessionInViewFilter的使用

目錄

1.SSH整合方式一:無障礙整合

1.1SSH框架整合開發回顧

1.2SSH整合

1.2.1第一步:建立web專案,引入jar包

1.2.2第二步:引入配置檔案

1.2.3第三步:建立包結構

1.2.4第四步:建立相關類

1.2.5第五步:引入相關的頁面

1.2.6第六步:修改add.jsp

1.2.7第七步:Spring整合Struts2方式一:Action由Struts2自身建立的

1.2.8第八步:Spring整合Struts2方式二:Action交給Spring管理(推薦)

1.2.9第九步:Service呼叫DAO

1.2.10第十步:Spring整合Hibernate框架

1.2.11第十一步:配置Spring的事務管理

2.SSH整合方式二:將hibernate的配置交給Spring管理(不帶hibernate配置檔案)

2.1複製一個專案

2.2hibernate配置檔案中的內容:

2.3將Hibernate的配置交給Spring

3.Hibernate的模板的使用

3.1儲存操作

3.2修改操作

3.3刪除操作

3.4查詢操作

4.延遲載入問題的解決

4.1Spring提供了延遲載入的解決方案

4.2在SSH整合開發中哪些地方會出現延遲載入

原始碼下載:


 

 

1.SSH整合方式一:無障礙整合

1.1SSH框架整合開發回顧

1.2SSH整合

1.2.1第一步:建立web專案,引入jar包

  1. Struts2的jar包
    1. struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar
    2. Struts2中有一些包需要了解的:
      1. struts2-convention-plugin-2.3.24.jar                      ----Struts2
        的註解開發包。
      2. struts2-json-plugin-2.3.24.jar                                    ----Struts2的整合AJAX的開發包。
      3. struts2-spring-plugin-2.3.24.jar                                ----Struts2的整合Spring的開發包。
  2. Hibernate的jar包
    1. Hibernate的開發的必須的包    
      1. hibernate-release-5.0.7.Final\lib\required\*.jar
    2. MySQL驅動
    3. 日誌記錄

    1. 使用C3P0連線池:

 

*****注意:Struts2Hibernate都引入了一個相同的jar包(javassist包)。刪除一個******

  • Spring的jar包
    • IOC的開發

  • AOP的開發

  • JDBC模板的開發

  • 事務管理

  • 整合web專案的開發

  • 整合單元測試的開發

整合hibernate的開發

1.2.2第二步:引入配置檔案

  1. Struts的配置檔案
    1. web.xml

 

<!-- Struts2配置核心過濾器 -->

   <filter>

     <filter-name>struts</filter-name>

     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

   </filter>

  

   <filter-mapping>

     <filter-name>struts</filter-name>

     <url-pattern>/*</url-pattern>

</filter-mapping>
    1. struts.xml
  1. Hibernate的配置檔案
    1. hibernate.cfg.xml
      1. 刪除那個與執行緒繫結的session
    2. 對映檔案
  2. Spring的配置檔案
    1. 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>

 
    1. applicationContext.xml

 

    1. 日誌記錄
      1. log4j.properties

1.2.3第三步:建立包結構

1.2.4第四步:建立相關類

1.2.5第五步:引入相關的頁面

1.2.6第六步:修改add.jsp

1.2.7第七步:Spring整合Struts2方式一:ActionStruts2自身建立的

  1. 編寫Action

package com.albertyy.ssh.web.action;



import com.albertyy.ssh.entity.Customer;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;



/**

 * 客戶管理的Action的類

 *

 * @author yxy

 */

public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {

     /**

      *

      */

     private static final long serialVersionUID = 1L;

     // 模型驅動使用的物件:

     private Customer customer = new Customer();



     @Override

     public Customer getModel() {

         return customer;

     }

    

     /**

      * 儲存客戶的方法:save

      */

     public String save() {

         System.out.println("Action中的save方法執行了...");

         return NONE;

     }

}

  1. 配置Action
    1. 在struts.xml中配置

 

<!-- 配置Action -->

     <package name="ssh1" extends="struts-default" namespace="/">

         <action name="customer_*" class="com.albertyy.ssh.web.action.CustomerAction" method="{1}">

             

         </action>

</package>
  1. 在Action中引入Service
  • 傳統方式

  •  
  • 進行SpringStruts2的整合:
  1. 引入struts-spring-plugin.jar
  2. 在外掛包中有如下配置

*****開啟一個常量:在Struts2中只要開啟這個常量就會引發下面常量生效:

      • Action按照名稱自動注入Service
    1. Service交給Spring管理

 

<!-- 配置Service================== -->

<bean id="customerService" class="com.albertyy.ssh.serviceImpl.CustomerServiceImpl">

        

</bean>
  1. Action注入Service


 

package com.albertyy.ssh.web.action;



import com.albertyy.ssh.entity.Customer;

import com.albertyy.ssh.service.CustomerService;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;



/**

 * 客戶管理的Action的類

 *

 * @author yxy

 */

public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {

     /**

      *

      */

     private static final long serialVersionUID = 1L;

     // 模型驅動使用的物件:

     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.8第八步:Spring整合Struts2方式二:Action交給Spring管理(推薦)

  1. 引入外掛包
    • 引入struts-spring-plugin.jar
  2. Action交給Spring

 

<!-- 配置Action=================== -->

<bean id="customerAction" class="com.albertyy.ssh.web.action.CustomerAction" scope="prototype">

        

</bean>
  1. struts.xml中配置Action

  1. 注意:
    1. 需要配置Action為多例的:
    2. 需要手動注入Service
<!-- 配置Action=================== -->

     <bean id="customerAction" class="com.albertyy.ssh.web.action.CustomerAction" scope="prototype">

         <property name="customerService" ref="customerService"/>

     </bean>

1.2.9第九步:Service呼叫DAO

  1. 將DAO交給Spring管理

 

<!-- 配置DAO====================== -->

     <bean id="customerDao" class="com.albertyy.ssh.daoImpl.CustomerDaoImpl">

        

     </bean>
  1. 在Service注入DAO

 

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);

     }



}

 

<!-- 配置Service================== -->

     <bean id="customerService" class="com.albertyy.ssh.serviceImpl.CustomerServiceImpl">

         <property name="customerDao" ref="customerDao"></property>

     </bean>

1.2.10第十步:Spring整合Hibernate框架

  1. 建立資料庫和表
Create database ssh1;

Use ssh1;

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;
  1. 編寫實體和對映
  2. SpringHibernate整合
    1. Spring的配置檔案中,引入Hibernate的配置的資訊

 

<!-- Spring整合Hibernate -->

     <!-- 引入Hibernate的配置的資訊=============== -->

     <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

         <!-- 引入hibernate的配置檔案 -->

         <property name="configLocation" value="classpath:hibernate.cfg.xml"/>

     </bean>
  1. SpringHibernate整合後,Spring提供了一個Hibernate的模板類簡化Hibernate開發。
    1. 改寫DAO繼承HibernateDaoSupport


 

/**

 * 客戶管理的DAO層的實現類

 * @author yxy

 *

 */

public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

     @Override

     public void save(Customer customer) {

         System.out.println("DAO中的save方法執行了...");

     }

}

    1. 配置的時候在DAO中直接注入SessionFactory

 

<!-- 配置DAO====================== -->

     <bean id="customerDao" class="com.albertyy.ssh.daoImpl.CustomerDaoImpl">

         <property name="sessionFactory" ref="sessionFactory"/>

</bean>
    1. DAO中使用Hibernate的模板完成儲存操作

 

/**

 * 客戶管理的DAO層的實現類

 * @author yxy

 *

 */

public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {

    @Override

    public void save(Customer customer) {

        System.out.println("DAO中的save方法執行了...");

        this.getHibernateTemplate().save(customer);

    }

}

 

1.2.11第十一步:配置Spring的事務管理

  • 配置事務管理器

 

<!-- 配置事務管理器 -->

     <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">

         <property name="sessionFactory" ref="sessionFactory"/>

     </bean>
  • 開啟註解事務

<!-- 開啟註解事務 -->

     <tx:annotation-driven transaction-manager="transactionManager"/>

  • 在業務層使用註解

 

 

2.SSH整合方式二:將hibernate的配置交給Spring管理(不帶hibernate配置檔案)

2.1複製一個專案

2.2hibernate配置檔案中的內容:

  1. 資料庫連線的配置
  2. Hibernate的相關的屬性的配置
    1. 方言
    2. 顯示SQL
    3. 格式化SQL
    4. 。。。
  3. C3P0連線池
  4. 對映檔案

 

2.3將Hibernate的配置交給Spring

   

<!-- 引入外部屬性檔案=============================== -->
	<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>com/albertyy/ssh/entity/Customer.hbm.xml</value>
			</list>
		</property>
	</bean>

 

3.Hibernate的模板的使用

3.1儲存操作

  • save(Object obj);

3.2修改操作

  • update(Object obj);

3.3刪除操作

  • delete(Object obj);

3.4查詢操作

  • 查詢一個
    1. get(Class c,Serializable id);
    2. load(Class c,Serializable id);
  • 查詢多個
    1. List find(String hql,Object… args);
    2. List findByCriteria(DetachedCriteria dc);
    3. List findByCriteria(DetachedCriteria dc,int firstResult,int maxResults);
    4. List findByNamedQuery(String name,Object… args);
/**
 * 客戶管理的DAO層的實現類
 * @author yxy
 *
 */
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);
	}

	@Override
	public Customer findById(Long cust_id) {
		return this.getHibernateTemplate().get(Customer.class, cust_id);
		//return this.getHibernateTemplate().load(Customer.class, cust_id);
	}

	@Override
	public List<Customer> findAllByHQL() {
		List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer");
		return list;
	}

	@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");
	}
}

4.延遲載入問題的解決

4.1Spring提供了延遲載入的解決方案

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>

 

4.2在SSH整合開發中哪些地方會出現延遲載入

  1. 使用load方法查詢某一個物件的時候(不常用)
  2. 查詢到某個物件以後,顯示其關聯物件。

 

 

 

原始碼下載:

連結: https://pan.baidu.com/s/1ZCtgHCYz7KmhqO0uAODZiQ 提取碼: nrn5 複製這段內容後開啟百度網盤手機App,操作更方便哦