一.SSH三大框架整合知識點
1.全部知識點:
- Spring、Struts2 以及 Hibernate的整合思想。
- Spring、Struts2 以及 Hibernate的各個jar包。
- Spring、Struts2 整合的具體步驟。
- Spring、Hibernate 整合的具體步驟。
- 測試代碼
- 總結
2.整合環境:
- win10 64的電腦
- eclipseLuna Service Release 1 (4.4.1)
- Spring4.2.4
- Hibernate5.0.1
- Struts2.3.24
二.Spring、Struts2 以及 Hibernate的整合思想
1.web應用的三層:
- web層:Struts2,action相當于Servlet
- service層:Spring,IOC與AOP思想,把對象的創建交給Spring經行管理
- dao層:hibernate,對數據庫的CRUD操作
2.Struts2與Spring的整合
- 將Struts2的action的創建交個spring經行管理,要注意的是action是多實例的,即每次請求都會產生一個Action的對象(原因是Action中包含數據,如果是單實例的話,數據為多個action共享,操作結果會不一樣)。
- spring與Struts2的整合jar包
3.Hibernate與Spring的整合
- Hibernate中的核心類是SessionFactory交給Spring進行管理
- Hibernate的核心文件中數據庫信息的配置交給Spring進行處理
- 注意導入Spring整合DAO層的ORM包
三.Spring、Struts2 以及 Hibernate的各個jar包
1.組建版本
- Spring4.2.4
- Hibernate5.0.1
- Struts2.3.24
2.Spring4.2.4
aopalliance.jar
commons-logging-1.2.jar:使用這個日志包來支持Log4J和JDK 1.4+的日志記錄
spring-aop-4.2.4.RELEASE.jar
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar:spring的核心jar包
spring-expression-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
spring-orm-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
spring-web-4.2.4.RELEASE.jar
下載連接: https://pan.baidu.com/s/11MHuwmHeoXB-Ms1tacdazA 密碼: 61li
3.Hibernate5.0.1
antlr-2.7.7.jar:hibernate利用它實現HQL到SQL的轉換
aspectjweaver.jar:支持AOP的包
c3p0-0.9.2.1.jar:數據池
classmate-1.3.1.jar
dom4j-1.6.1.jar:對dom4j的封裝,解析xml文件的
druid-1.0.13.jar
hibernate-commons-annotations-5.0.1.Final.jar:支持注解的包
hibernate-core-5.1.0.Final.jar:hibernate的核心jar包
hibernate-jpa-2.1-api-1.0.0.Final.jar:對JPA(Java持久化API)規范的支持
jboss-logging-3.3.0.Final.jar
jboss-transaction-api_1.1_spec-1.0.1.Final.jar
mchange-commons-java-0.2.3.4.jar
ojdbc6_g.jar
ojdbc6.jar
slf4j-api-1.7.21.jar
下載連接: https://pan.baidu.com/s/1fRf9QmxShQJlmeW7D57S9A 密碼: 0v3l
4.Struts2.3.24
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.1.jar:文件上傳的包
commons-io-2.2.jar:是處理異常的
commons-lang3-3.2.jar:commons項目中的lang包
freemarker-2.3.22.jar:支持freemarker
javassist-3.11.0.GA.jar:一個開源的分析、編輯和創建Java字節碼的類庫
json-lib-2.3-jdk15.jar
ognl-3.0.6.jar:支持ognl語言
struts2-config-browser-plugin-2.3.24.1.jar
struts2-convention-plugin-2.3.24.1.jar
struts2-core-2.3.24.1.jar:struts2的核心jar包
struts2-dojo-plugin-2.3.24.1.jar
struts2-json-plugin-2.3.24.1.jar
struts2-spring-plugin-2.3.24.1.jar:struts2與spring集成時使用的
tools.jar
xwork-core-2.3.24.1.jar:xwork的核心jar包,struts2在其基礎上構建
下載連接: https://pan.baidu.com/s/1WO7WUiVwKOweIPV55E6zAw 密碼: 4mmr
5.mysql驅動包
mysql-connector-java-5.1.44-bin.jar
6.jar包圖(注意最下面是xwork-core-2.3.24.1.jar包,都放在lib下)
7.項目結構圖
項目大體可以分為三層,視圖層,service層,DAO層。注意我的配置文件放在config中,編譯后都在class路徑下,跟放在src下一樣的。
四.Spring、Struts2 整合的具體步驟
1.主要步驟:
- 首先導入jar包。
- 創建相應的Action。
- 配置struts.xml配置文件,位置在src下面(注意我的放在config下)。
- 在web.xml中配置struts2的過濾器。
- 把Struts2的action交給Spring進行管理
- 配置Spring的監聽器
2.相應的代碼如下:
導入包:省略
創建的Action
public class RegisterAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String name;
private int age;
private StudentService studentService;
public RegisterAction() {
super();
}
public RegisterAction(String name, int age) {
super();
this.name = name;
this.age = age;
}
//注入Service,我們需要保留set方法
public void setStudentService(StudentService studentService) {
this.studentService = studentService;
}
//從jsp中獲取屬性值
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String execute() {
System.out.println(studentService);
System.out.println(name);
System.out.println(age);
studentService.add(new Student(name,age));
return SUCCESS;
}
}
struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 關閉動態方法調用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- 配置為開發模式 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default" >
<!--下面的全限定類名可以改為RegisterAction,當我們在Spring中注冊當前Action類的bean-->
<action name="register" class="registerAction">
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
web.xml配置文件(注意:spring相關的配置都在下面,下文不再重復貼代碼)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>ssh</display-name>
<!-- 配置Spring的監聽器,用于初始化ApplicationContext對象 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 自定義Spring主配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
spring相關的配置文件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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 注冊c3p0數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!--處理中文亂碼問題-->
<property name="jdbcUrl" value="jdbc:mysql:///test?useUnicode=true&characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="8246"/>
</bean>
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入數據池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定hibernate核心配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
<!-- 配置聲明式的事務管理(采用基于注解的方式) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 注冊studentDao -->
<bean id="studentDao" class="daoImpl.StudentDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 注冊studentService -->
<bean id="studentService" class="serviceImpl.StudentServiceImpl">
<property name="studentDao" ref="studentDao"/>
</bean>
<!-- 將Action交由Spring來管理,設置為多例的,即設置scope,因為每個請求對應一個Action-->
<bean id="registerAction" class="action.RegisterAction" scope="prototype">
<property name="studentService" ref="studentService"/>
</bean>
</beans>
其中把Struts2的action交給Spring進行管理部分為:
<!-- 將Action交由Spring來管理,設置為多例,即設置scope,因為每個請求對應一個Action-->
<bean id="registerAction" class="action.RegisterAction" scope="prototype">
<property name="studentService" ref="studentService"/>
</bean>
配置Spring的監聽器,見上文web.xml配置文件中。在web.xml中我們做的事情有:
- 我們需要在web.xml中添加Struts2的核心過濾器。
- 設置一個監聽器,監聽當web容器創建的時候,即創建我們的Spring容器,這樣我們不再需要自己加載Spring的主配置文件。
- 設置web容器全局參數,自定義Spring主配置文件的位置和命名。
五.Spring、Hibernate 整合的具體步驟
1.主要步驟:
- 首先導入jar包。
- 創建相應的實體類。
- 創建實體類的hibernate映射文件Student.hbm.xml。
- 創建hibernate的核心配置文件hibernate.cfg.xml。
- 把Hibernate核心配置文件中的數據庫配置部分放到Spring中。
- 配置Spring的數據池, SessionFactory,事務等。
2.相應的代碼如下:
導入包:省略。
創建相應的實體類。
public class Student {
private int id;
private String name;
private int age;
public Student(String name , int age){
this.name = name ;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
創建實體類的hibernate映射文件Student.hbm.xml。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="domain.Student" table="student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="age"/>
</class>
</hibernate-mapping>
創建hibernate的核心配置文件hibernate.cfg.xml。
<!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>
<!-- 數據庫信息(連接信息寫到spring的配置文件中) -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 可以將向數據庫發送的SQL語句顯示出來 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL語句 -->
<property name="hibernate.format_sql">true</property>
<!-- 自動創建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 導入映射配置 -->
<mapping resource="domain/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
把Hibernate核心配置文件中的數據庫配置部分放到Spring中,具體的全部代碼見上文的applicationContext.xml,注意數據庫部分在Spring中配置之后就可以了,不用再在Hibernate中配置了。
配置Spring的數據池, SessionFactory,事務等。
c3p0數據池配置:
<!-- 注冊c3p0數據源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<!--處理中文亂碼問題-->
<property name="jdbcUrl" value="jdbc:mysql:///test?useUnicode=true&characterEncoding=utf8"/>
<property name="user" value="root"/>
<property name="password" value="8246"/>
</bean>
SessionFactory要是交給Spring來管理如下:
<!-- 配置SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入數據池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 指定hibernate核心配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
事務的配置,博主采用的是基于注解的方式
<!-- 配置聲明式的事務管理(采用基于注解的方式) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
其次則為dao與service的bean的注冊,具體見上文的applicationContext.xml
六.測試代碼
1.準備工作:
action:代碼見上文
dao類:
public interface StudentDao {
void insert(Student student);
void delete(Student student);
void update(Student student);
List<Student> selectAllStudents();
boolean selectStudentByIdAndName(String name,int age);
}
dao實現類:
//DAO的實現類,里面注入了SessionFactory對象,利用這個我們可以獲取session
@Transactional
public class StudentDaoImpl implements StudentDao{
//這里的sessionFactory由Spring進行注入
private SessionFactory sessionFactory;
//所以這里需要setter方法,這里的getter方法順帶添上,如果以后需要獲取sessionFactory的話可以調用
public SessionFactory getSessionFactory() {
return sessionFactory;
}
//依賴注入,需要setter方法
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
//CRUD操作
@Override
public void insert(Student student) {
sessionFactory.getCurrentSession().save(student);
}
@Override
public void delete(Student student) {
sessionFactory.getCurrentSession().delete(student);
}
@Override
public void update(Student student) {
sessionFactory.getCurrentSession().update(student);
}
@Override
public List<Student> selectAllStudents() {
String hql = "from Student";
return sessionFactory.getCurrentSession().createQuery(hql).list();
}
//通過name和age來判別學生是否存在
@Override
public boolean selectStudentByIdAndName(String name, int age) {
String hql = "from Student where name=? and age=?";
boolean flag = false;
if(sessionFactory.getCurrentSession().createQuery(hql).setString(0, name).setInteger(1, age).uniqueResult()!=null) {
flag = true;
}
return flag;
}
}
domain包中的實體類與配置文件見上文。
service類:
//service接口
public interface StudentService {
void add(Student student);
void remove(Student student);
void modify(Student student);
List<Student> findAllStudents();
boolean findByNameAndAge(String name,int age);
}
service實現類:
//service實現類
public class StudentServiceImpl implements StudentService {
//這里的Dao對象是由Spring注入,下面要有setter方法
private StudentDao studentDao;
public StudentDao getStudentDao() {
return studentDao;
}
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
//業務實現
@Override
public void add(Student student) {
studentDao.insert(student);
}
@Override
public void remove(Student student) {
studentDao.delete(student);
}
@Override
public void modify(Student student) {
studentDao.update(student);
}
@Override
public List<Student> findAllStudents() {
return studentDao.selectAllStudents();
}
@Override
public boolean findByNameAndAge(String name, int age) {
return studentDao.selectStudentByIdAndName(name, age);
}
}
index.jsp中
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>register</title>
</head>
<body>
<form action="register" method="post">
姓名<input type="text" name="name"><br>
年齡<input type="text" name="age"><br>
<input type="submit" value="注冊">
</form>
</body>
</html>
數據庫:
console:
七.總結
1. 導入jar包
2. 搭建struts2環境
- 2.1 創建Action,創建struts.xml配置文件
- 2.2 在web.xml中配置struts2的過濾器
3. 搭建Hibernate環境
3.1 創建實體類
3.2 配置實體類和數據庫表的映射關系
3.3 創建hibernate核心配置文件,并引入映射配置文件
4. 搭建Spring環境
4.1 創建Spring的核心配置文件
4.2 讓spring配置文件在服務器啟動的時候加載,其中需要配置監聽器和指定Spring配置文件的路徑
5. struts2和spirng整合
5.1 把action在spring配置(action多實例的)
5.2 在struts.xml中action標簽class屬性里面寫bean的id值
6. spring和hibernate整合
6.1 把hibernate核心配置文件中數據庫的配置放到spring里面配置
6.2 把hibernate的sessionFactory在Spring中配置
7. 在dao中使用HibernateTemplate的對象
7.1 在dao中注入hibernateTemplate對象
7.2 在hibernate對象中注入sessionFactory
8. 配置事務
java學習資料分享:關注公眾號[Swen學java]即可免費領取詳情見java學習資源匯總