1. 程式人生 > >spring整合hibernate(SSH)

spring整合hibernate(SSH)

重點:

  • 1、配置專案環境;
  • 2、匯入SSH所依賴的jar包;
  • 3、spring整合hibernate ;
  • 4、spring整合base模組;
  • 5、spring模組的開發案例以及biz的介紹
  • 6、web整合spring、struts;

重點分析:

配置專案環境:

1、配置Dynamic Web Moduld (3.1)和jdk 環境(1.8); 1.1、Dynamic Web Moduld的 是2.3版本 ,需要把專案的Dynamic Web Moduld 的版本修改我3.1,專案jdk預設是1.5 版本,1.5版本無法跟支援專案執行,需把 jdk 版本修改 1.8;

步驟:

1、 專案右鍵 --》點選properties --》project facets

2、將Dynamic Web Moduld 後面將 1.5 修改成1.8 ,再將前面的勾去掉–》將Java 的版本1.5 修改成1.8 --》點選Apply

3、將Dynamic Web Moduld 前面的勾給勾上,然後就在Apply旁邊的Further configuration available… 點選進去 ,在content directory裡面填寫 src/main/webapp (注意不要寫錯), 然後點選 Apply and Colse

在這裡插入圖片描述

成功的介面

在這裡插入圖片描述

匯入SSH所依賴的jar包:

  1. pom 1.1 hibernate相關(5.2.12.Final) hibernate-core hibernate-c3p0(資料庫連線池) hibernate-ehcache mysql-connector-java(5.1.44)

1.2 spring相關(5.0.1.RELEASE) spring-context spring-orm spring-web spring-aspects

  注:建立spring的XML檔案時,需要新增beans/aop/tx/context標籤支援

  各依賴說明:
  spring-context
    建立spring上下文

  spring-orm
    org.springframework.orm.hibernate5.LocalSessionFactoryBean
      dataSource:指定資料來源
      hibernateProperties:指定hibernate相關屬性,如:dialect/show_sql/format_sql 
      mappingResources:指定實體對映檔案 
      注1:本章採用將hibernate配置全部交給spring管理,因此專案中不再有hibernate.cfg.xml檔案
    org.springframework.orm.hibernate5.HibernateTemplate
    org.springframework.orm.hibernate5.support.HibernateDaoSupport
  測試一:執行測試類Test1,測試hibernate與spring的整合

  spring-web
    org.springframework.web.context.ContextLoaderListener
      contextConfigLocation:classpath:applicationContext-*.xml
    org.springframework.web.context.support.WebApplicationContextUtils
  測試二:訪問test2.jsp,測試spring與WEB專案的整合

  spring-aspects
    spring的AspectJ依賴,解析事務切點

1.3 struts2相關(2.5.13) struts2-core struts2-spring-plugin struts2與spring整合的外掛 將action配置到spring中,struts的action標籤的class屬性填寫spring中bean的名字或id

1.4 log配置 1.4.1 log4j(1.X版) 不建議使用

1.4.2 log4j2(2.9.1)
      log4j-core
      log4j-api
      log4j-web
      不建議使用

1.4.3 log4j2 + slf4j(使用ehcache開啟hibernate二級快取必須使用第二種方式配置日誌)
      

注1:本章使用第三種方式配置日誌,即log4j2 + slf4j

1.5 other junit(4.12) javax.servlet-api(4.0.0)

1.6 jstl jstl(1.2) standard(1.1.2)

1.7 jsp自定義標籤依賴(必須與tomcat的版本一致) tomcat-jsp-api

  注1:如何解決專案中不支援EL表示式的問題?將web.xml的DTD的版本由2.3升級到3.0即可。因為web2.3是不支援EL表示式的

pom.xml 程式碼分享

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<artifactId>Test_SSH</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>Test_SSH Maven Webapp</name>
	<url>http://maven.apache.org</url>

	<properties>
		<hibernate.version>5.2.12.Final</hibernate.version>
		<mysql.version>5.1.44</mysql.version>
		<spring.version>5.0.1.RELEASE</spring.version>
		<struts2.version>2.5.13</struts2.version>
		<slf4j.version>1.7.7</slf4j.version>
		<log4j.version>2.9.1</log4j.version>
		<disruptor.version>3.2.0</disruptor.version>
		<junit.version>4.12</junit.version>
		<servlet.version>4.0.0</servlet.version>
		<jstl.version>1.2</jstl.version>
		<standard.version>1.1.2</standard.version>
		<tomcat-jsp-api.version>8.0.47</tomcat-jsp-api.version>
	</properties>
	<dependencies>
		<!-- 1、hibernate相關(5.2.12.Final) -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-c3p0</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-ehcache</artifactId>
			<version>${hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		
		<!-- 2、spring相關(5.0.1.RELEASE) -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aspects</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- 3、struts2相關(2.5.13) -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>${struts2.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>${struts2.version}</version>
		</dependency>
		
		<!-- 4、log配置 -->
		<!-- log配置:Log4j2 + Slf4j -->
		<!-- slf4j核心包 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${slf4j.version}</version>
			<scope>runtime</scope>
		</dependency>

		<!--用於與slf4j保持橋接 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>${log4j.version}</version>
		</dependency>

		<!--核心log4j2jar包 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		
		<!--web工程需要包含log4j-web,非web工程不需要 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
			<version>${log4j.version}</version>
			<scope>runtime</scope>
		</dependency>
		<!--需要使用log4j2的AsyncLogger需要包含disruptor -->
		<dependency>
			<groupId>com.lmax</groupId>
			<artifactId>disruptor</artifactId>
			<version>${disruptor.version}</version>
		</dependency>
		
		<!-- 5、other -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${servlet.version}</version>
			<scope>provided</scope>
		</dependency>
		
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>${jstl.version}</version>
		</dependency>
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>${standard.version}</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.tomcat</groupId>
			<artifactId>tomcat-jsp-api</artifactId>
			<version>${tomcat-jsp-api.version}</version>
		</dependency>
		

	</dependencies>
	<build>
		<finalName>Test_SSH</finalName>
		<plugins>
			<!--第一步就是配置maven-compiler-plugin外掛 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.7.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

  1. SSH整合 2.1 匯入ehcache.xml 2.2 匯入log4j2.xml 2.3 整合hibernate 2.3.1 注入資料庫配置檔案 2.3.2 配置c3p0連線池 2.3.3 註冊LocalSessionFactoryBean 2.3.4 spring宣告式事物

     宣告式事務配置
    
    1. 必須先修改spring配置檔案的宣告部分,新增對aop標籤和tx標籤的支援

    2. 配置SessionFactory(spring和hibernate整合時已完成)

    3. 配置事務管理器 HibernateTransactionManager

    4. 配置事務的傳播特性(tx) add edit del load|list 事務傳播特性(PROPAGATION_REQUIRED|readOnly)

    5. 配置自動代理 a) 引用環繞通知txAdvice b) 定義一個切入點 execution(* *…Biz.(…)) a:返回值不限 b:包名不限 c:介面名以Biz結尾 d:方法名及引數不限 c) 自動代理的原理 在spring上下文初始化完成以後,自動代理會逐個檢查spring上下文中JavaBean實現的介面是否滿足自動代理的條件,如果滿足條件,則將此bean和通知結合生成一個代理物件,並以此代理物件替換spring上下文中的bean,之後你訪問的就是代理物件了

      注1:狸貓換太子

    2.3.5 註冊HibernateTemplate 2.3.6 註冊Base模組

  2. 程式程式碼的分層(base模組)

    /base /action /biz /dao /entity /book /action /biz /dao /entity

  3. 整合案例演示

4.1 entity *.hbm.xml

4.2 dao IXxxDAO XxxDAOImpl(繼承HibernateDaoSupport類,方便注入HibernateTemplate) applicationContext-Xxx.xml

	查詢
		this.getHibernateTemplate().execute(

4.3 biz IXxxBiz XxxBizImpl applicationContext-Xxx.xml

4.4 test(junit4)

4.5 action 將action配置到applicationContext-Xxx.xml, 注:必須為多例模式(重要)

struts.xml配置注意事項: 1)

2)struts-Xxx.xml檔案中的action的class屬性型別填寫spring中的id。

  1. web.xml配置

5.1 Spring上下文ApplicationContext.xml的載入 contextConfigLocation classpath:applicationContext.xml

5.2 啟動Web容器時,自動裝配ApplicationContext.xml的配置資訊 org.springframework.web.context.ContextLoaderListener

5.3 中文亂碼過濾器 encodingFilter org.springframework.web.filter.CharacterEncodingFilter true encoding UTF-8 encodingFilter /*

5.4 其他配置 5.4.1 防止記憶體洩露、快取清除監聽器 org.springframework.web.util.IntrospectorCleanupListener

 5.4.2 用於支援3種Bean的作用域:request,session和globalSession
 <listener>
<listener-class>			org.springframework.web.context.request.RequestContextListener
</listener-class>
 </listener>

 5.4.3 把session的關閉延遲到jsp頁面顯示之後,請配在struts2上面
 <filter>
<filter-name>OpenSessionInView</filter-name>
<filter-class>		org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
</filter-class>
 </filter>
 <filter-mapping>
<filter-name>OpenSessionInView</filter-name>
<url-pattern>/*</url-pattern>
 </filter-mapping>

5.5 Struts2核心過濾器