1、Spring整合Hibernatejava
1.若是一個DAO 類繼承了HibernateDaoSupport,只須要在spring配置文件中注入SessionFactory就能夠了;若是一個DAO類沒有繼承HibernateDaoSupport,須要有一個HibernateTemplate的屬性,而且在配置文件中進行注入。注意,以前使用的是JdbcDaoSupport和JdbcTemplate,傳遞的是DataSource,如今使用的是HibernateDaoSupport和HibernateTemplate,傳遞的是SessionFactory。mysql
2.整合Spring整合Hibernate示例。git
(1)hibernate.cfg.xml配置文件程序員
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 <hibernate-configuration> 6 <session-factory> 7 <property name="connection.driver_class"> 8 com.mysql.jdbc.Driver 9 </property> 10 <property name="connection.username">root</property> 11 <property name="connection.password">5a6f38</property> 12 <property name="connection.url"> 13 jdbc:mysql://localhost:3306/test 14 </property> 15 <property name="show_sql">true</property> 16 <property name="hbm2ddl.auto">update</property> 17 <property name="dialect"> 18 org.hibernate.dialect.MySQLDialect 19 </property> 20 <property name="javax.persistence.validation.mode">none</property> 21 <mapping resource="com/kdyzm/spring/hibernate/xml/Course.hbm.xml" /> 22 </session-factory> 23 </hibernate-configuration>
(2)幾個類github
1 package com.kdyzm.spring.hibernate.xml; 2 3 import java.io.Serializable; 4 5 /* 6 * 課程類 7 */ 8 public class Course implements Serializable{ 9 private static final long serialVersionUID = 3765276226357461359L; 10 private Long cid; 11 private String cname; 12 13 public Course() { 14 } 15 @Override 16 public String toString() { 17 return "Course [cid=" + cid + ", cname=" + cname + "]"; 18 } 19 public Long getCid() { 20 return cid; 21 } 22 public void setCid(Long cid) { 23 this.cid = cid; 24 } 25 public String getCname() { 26 return cname; 27 } 28 public void setCname(String cname) { 29 this.cname = cname; 30 } 31 }
1 package com.kdyzm.spring.hibernate.xml; 2 3 public interface CourseDao { 4 public Course getCourse(Long cid); 5 public Course updateCourse(Course course); 6 public Course deleteCourse(Course course); 7 public Course addCourse(Course course); 8 }
一個很是重要的類:com.kdyzm.spring.hibernate.xml.CourseDaoImplweb
1 package com.kdyzm.spring.hibernate.xml; 2 3 import org.springframework.orm.hibernate3.HibernateTemplate; 4 5 public class CourseDaoImpl implements CourseDao{ 6 //這裏使用HibernateTemplate,而不是使用JdbcTemplate 7 private HibernateTemplate hibernateTemplate; 8 public HibernateTemplate getHibernateTemplate() { 9 return hibernateTemplate; 10 } 11 12 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { 13 this.hibernateTemplate = hibernateTemplate; 14 } 15 16 @Override 17 public Course getCourse(Long cid) { 18 return (Course) this.getHibernateTemplate().get(Course.class, cid); 19 } 20 21 @Override 22 public Course updateCourse(Course course) { 23 this.getHibernateTemplate().update(course); 24 return course; 25 } 26 27 @Override 28 public Course deleteCourse(Course course) { 29 this.getHibernateTemplate().delete(course); 30 return course; 31 } 32 33 @Override 34 public Course addCourse(Course course) { 35 this.getHibernateTemplate().saveOrUpdate(course); 36 return course; 37 } 38 39 }
這裏使用HibernateTemplate做爲成員變量,也能夠繼承HibernateDaoSupport類,效果是相同的。spring
1 package com.kdyzm.spring.hibernate.xml; 2 3 public interface CourseService { 4 public Course getCourse(Long cid); 5 public Course updateCourse(Course course); 6 public Course deleteCourse(Course course); 7 public Course addCourse(Course course); 8 }
1 package com.kdyzm.spring.hibernate.xml; 2 3 public class CourseServiceImpl implements CourseService{ 4 private CourseDao courseDao; 5 6 public CourseDao getCourseDao() { 7 return courseDao; 8 } 9 10 public void setCourseDao(CourseDao courseDao) { 11 this.courseDao = courseDao; 12 } 13 14 @Override 15 public Course getCourse(Long cid) { 16 return courseDao.getCourse(cid); 17 } 18 19 @Override 20 public Course updateCourse(Course course) { 21 return courseDao.updateCourse(course); 22 } 23 24 @Override 25 public Course deleteCourse(Course course) { 26 return courseDao.deleteCourse(course); 27 } 28 29 @Override 30 public Course addCourse(Course course) { 31 return courseDao.addCourse(course); 32 } 33 34 }
最後:測試代碼sql
1 ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/hibernate/xml/applicationContext.xml"); 2 CourseService courseService=(CourseService) context.getBean("courseService"); 3 Course course = new Course(); 4 // course.setCid(11L); 5 course.setCname("趙日天"); 6 courseService.addCourse(course); 7 course =new Course(); 8 course.setCname("王大錘"); 9 //經過/0的異常測試事務回滾! 10 // int a=1/0; 11 courseService.addCourse(course);
運行結果:數據庫
(3)com/kdyzm/spring/hibernate/xml/applicationContext.xml配置文件express
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:tx="http://www.springframework.org/schema/tx" 7 8 xsi:schemaLocation=" 9 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 10 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 12 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 13 "> 14 <!-- 將hibernate.cfg.xml配置文件導入進來 --> 15 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 16 <property name="configLocation"> 17 <value>classpath:hibernate.cfg.xml</value> 18 </property> 19 </bean> 20 21 <!-- 程序員作的事情 --> 22 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 23 <property name="sessionFactory" ref="sessionFactory"></property> 24 </bean> 25 <bean id="courseDao" class="com.kdyzm.spring.hibernate.xml.CourseDaoImpl"> 26 <property name="hibernateTemplate" ref="hibernateTemplate"></property> 27 </bean> 28 29 <bean id="courseService" class="com.kdyzm.spring.hibernate.xml.CourseServiceImpl"> 30 <property name="courseDao"> 31 <ref bean="courseDao"/> 32 </property> 33 </bean> 34 35 <!-- Spring容器作的事情 --> 36 <!-- 定義事務管理器 --> 37 <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 38 <property name="sessionFactory" ref="sessionFactory"></property> 39 </bean> 40 <!-- 哪些通知須要開啓事務模板 --> 41 <tx:advice id="advice" transaction-manager="hibernateTransactionManager"> 42 <tx:attributes> 43 <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/> 44 </tx:attributes> 45 </tx:advice> 46 <!-- 配置切面表達式和通知 --> 47 <aop:config> 48 <aop:pointcut expression="execution(* com.kdyzm.spring.hibernate.xml.*ServiceImpl.*(..))" id="perform"/> 49 <aop:advisor advice-ref="advice" pointcut-ref="perform"/> 50 </aop:config> 51 </beans>
3.總結和分析
(1)和使用JDBC的流程基本上是相同的,須要在配置文件中注入SessionFactory對象,注入HibernateTemplate對象。
(2)以上的程序事務回滾沒有實現!!!!緣由不明
2、Spring整合Hibernate,使用註解的形式。
1.在配置文件中使用spring的自動掃描機制。
<context:component-scan base-package="com.kdyzm.spring.hibernate.xml"></context:component-scan>
2.在配置文件中引入註解解析器(須要指定事務管理器)
<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
3.在service層經過@Transaction進行註解。
3、Struts2自定義結果集
1.struts-default.xml文件中定義了一些結果集類型。
1 <result-types> 2 <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> 3 <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> 4 <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> 5 <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> 6 <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> 7 <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/> 8 <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> 9 <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> 10 <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> 11 <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> 12 <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" /> 13 </result-types>
2.咱們能夠經過實現Result接口或者繼承StrutsResultSupport類本身定義結果集類型
* 若是咱們不須要跳轉頁面(使用了Ajax),則實現Result接口
* 若是咱們須要在業務邏輯處理完畢以後進行頁面的跳轉(重定向或者轉發),則繼承StrutsResultSupport類。
3.自定義結果集小案例
(1)自定義結果集類型com.kdyzm.struts2.myresult.MyResult.java,這裏繼承了StrutsResultSupport類,這裏的代碼模仿了DispatcherResult類中的寫法。
自定義結果集類型中的核心寫法已經重點標註。
1 package com.kdyzm.struts2.myresult; 2 3 import javax.servlet.RequestDispatcher; 4 import javax.servlet.http.HttpServletRequest; 5 import javax.servlet.http.HttpServletResponse; 6 7 import org.apache.struts2.ServletActionContext; 8 import org.apache.struts2.dispatcher.StrutsResultSupport; 9 10 import com.opensymphony.xwork2.ActionInvocation; 11 12 public class MyResult extends StrutsResultSupport{ 13 private static final long serialVersionUID = 8851051594485015779L; 14 15 @Override 16 protected void doExecute(String finalLocation, ActionInvocation invocation) 17 throws Exception { 18 System.out.println("執行了自定義的 結果集類型!"); 19 HttpServletRequest request=ServletActionContext.getRequest(); 20 HttpServletResponse response = ServletActionContext.getResponse(); 21 RequestDispatcher requestDispatcher = request.getRequestDispatcher(finalLocation); 22 requestDispatcher.forward(request, response); 23 } 24 }
(2)測試Action:com.kdyzm.struts2.myresult.MyResultAction.java
1 package com.kdyzm.struts2.myresult; 2 3 import com.opensymphony.xwork2.ActionSupport; 4 5 public class MyResultAction extends ActionSupport { 6 private static final long serialVersionUID = -6710770364035530645L; 7 8 @Override 9 public String execute() throws Exception { 10 return super.execute(); 11 } 12 13 public String add() throws Exception{ 14 return "myresult"; 15 } 16 }
(3)局部配置文件com.kdyzm.strus2.myresult.myResult_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> <package name="myResult" namespace="/myResultNamespace" extends="struts-default"> <!-- 自定義結果集類型 --> <result-types> <result-type name="myResult" class="com.kdyzm.struts2.myresult.MyResult"></result-type> </result-types> <action method="add" name="myResultAction" class="com.kdyzm.struts2.myresult.MyResultAction"> <result name="myresult" type="myResult"> <param name="location"> /main/index.jsp </param> </result> </action> </package> </struts>
(4)classpath:struts.xml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 <!-- namespace必定要加上/,不然通常會報錯! --> 6 <struts> 7 <package name="kdyzm" extends="struts-default" namespace="/kdyzm_namespace"> 8 <action name="helloAction" class="com.kdyzm.struts2.test.HelloWorldAction" method="execute"> 9 <result name="kdyzm_result"> 10 /main/index.jsp 11 </result> 12 </action> 13 </package> 14 <include file="com/kdyzm/struts2/myresult/myResult_struts.xml"></include></struts>
(5)測試Jsp
<a href="${pageContext.servletContext.contextPath}/myResultNamespace/myResultAction.action"> 測試自定義結果集 </a>
(6)跳轉到/main/index.jsp,顯示出
4、SSH整合
1.整合的第一步:導入jar包,在/WEB-INF/lib文件夾下,按照功能劃分爲幾個文件夾,分別存放不一樣類型的jar包。
* common:存放公共包
* db:存放數據庫驅動包
* hibernate:存放hiberante相關包
* junit:存放單元測試相關包
* spring:存放spring相關包
* struts2:存放struts2相關包
儘量的將jar包關聯上源代碼,便於代碼追蹤和書寫。
2.建立三個項目資源文件夾和對應的包
(1)src:存放源代碼
* dao
* dao.impl
* service:
* service.impl
* struts.action
* domain
(2) config:存放配置文件
* hibernate
* hibernate.cfg.xml
* spring
* applicationContext-db.xml
* applicationContext-person.xml
* applicationContext.xml
* struts2
struts-user.xml
struts.xml
(3)test:單元測試
3.SSH整合的jar包、關鍵類文件和配置文件
(1)Spring和Hibernate的整合過程見前面的筆記。
(2)關鍵的就是Spring和Struts2的整合
(3)Spring和Struts2整合須要一個關鍵的jar包:struts-spring-plugin-x.x.x.jar,該jar包能夠在struts2項目中的lib文件夾中找到。
(4)在struts-spring-plugin.x.x.x.jar包中有一個很是重要的配置文件:struts-plugin.xml配置文件,該配置文件中的配置會覆蓋掉struts-default.xml中的配置。
(5)須要在struts.xml配置文件中進行以下配置:
<constant name="struts.objectFactory" value="spring"></constant>
進行這樣的配置以前必須導入struts-spring-plugin.x.x.x.jar包。
可以這樣配置的依據是該jar包中的struts-plugin.xml配置文件中的配置:
<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
(6)怎樣將Spring容器的初始化和Web服務器綁定在一塊兒,使得服務器啓動以後Spring容器就已經初始化成功。
解決方案就是在web.xml配置文件中添加一項監聽器的配置。
1 <listener> 2 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 3 </listener> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:spring/applicationContext.xml</param-value> 7 </context-param>
其中param-name標籤中的內容contextConfigLocation是固定字符串,不能更改。contextConfigLocation字符串的出處:
(7)applicationContext.xml配置文件默認位置爲:/WEB-INF/applicationContext.xml,經過XmlWebApplicationContext.xml配置文件就能夠看出來。
因此,若是applicationContext.xml在/WEB-INF目錄下的話,就不須要再配置
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/applicationContext.xml</param-value> </context-param>
了。
5、整合模板代碼