目录
5.1 在spring配置文件中,引入hibernate配置
5.2 让Dao层类继承HibernateDaoSupport
1. SSH
SSH就是Struts2、Spring、hibernate的简称,是曾经比较流行的企业级web开发框架,现在仍然占有很大的比重。
1.1 Struts2
是一个we层的开发框架
1.2 spring
是EE开发的一站式解决方案开放框架,可以说其是业务层框架
1.3 hibernate
是持久层的开发框架
2 整合
2.1 引入jar文件
antlr-2.7.7.jar
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
c3p0-0.9.2.1.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
dom4j-1.6.1.jar
freemarker-2.3.22.jar
geronimo-jta_1.1_spec-1.1.1.jar
hibernate-c3p0-5.0.7.Final.jar
hibernate-commons-annotations-5.0.1.Final.jar
hibernate-core-5.0.7.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-2.0.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.3.0.Final.jar
log4j-1.2.16.jar
log4j-api-2.2.jar
log4j-core-2.2.jar
mchange-commons-java-0.2.3.4.jar
mysql-connector-java-5.1.7-bin.jar
ognl-3.0.6.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.7.2.jar
spring-aop-4.2.4.RELEASE.jar
spring-aspects-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-expression-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
spring-orm-4.2.4.RELEASE.jar
spring-test-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
spring-web-4.2.4.RELEASE.jar
struts2-core-2.3.24.jar
struts2-spring-plugin-2.3.24.jar
xwork-core-2.3.24.jar
2.1.1 Struts2的jar
在Struts2的解压包中有一个apps的目录,里面有一个struts2-blank.war的工程,将其放到Tomcat下,运行Tomcat,可以解压该工程(或者直接解压提取出来),然后将该工程下的WEB-INF下的lib下的所有的jar引入即可。
Struts2开发基本包
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar
注意:javassist-3.11.0.GA.jar在hibernate中也有一个,二者需要删除一个
Struts2其他比较重要的包
1. Struts2的注解开发包:struts2-convention-plugin-2.3.24.jar
2. Struts2整合ajax的开发包:struts2-json-plugin-2.3.24.jar
3. Struts2整合spring的开发包:struts2-spring-plugin-2.3.24.jar
2.1.2 hibernate5的jar
hibernate开发必须jar
打开hibernate解压文件,在lib下有一个required的目录,其下的jar就是必须包
antlr-2.7.7.jar
dom4j-1.6.1.jar
geronimo-jta_1.1_spec-1.1.1.jar
hibernate-commons-annotations-5.0.1.Final.jar
hibernate-core-5.0.7.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-2.0.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.3.0.Final.jar
mysql驱动
mysql-connector-java-5.1.7-bin.jar
日志记录jar
日志记录的jar,在Struts2中已经存在了,这里引入,struts2就不用引入了,如果Struts2没有引入,这里就需要引入了,但是我们这里需要引入一个日志的接口包slf4j-api-1.6.1.jar和log4j整合的包slf4j-log4j12-1.7.2.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.7.2.jar
log4j-1.2.16.jar
注意:Struts2和hibernate中都引入了javassist,如果两者版本不一致会产生冲突,我们需要删除一个,我们将版本低的删除掉
c3p0连接池
c3p0-0.9.2.1.jar
hibernate整合c3p0jar
hibernate-c3p0-5.0.7.Final.jar
hibernate-commons-annotations-5.0.1.Final.jar
2.1.3 spring的jar
IOC开发
com.springsource.org.apache.commons.logging-1.1.1.jar
spring-beans-4.2.4.RELEASE.jar
spring-context-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-expression-4.2.4.RELEASE.jar
注意:因为前面已经引入了log4j的jar,所以这里不需要引入spring提供的com.springsource.org.apache.log4j-1.2.15.jar了
AOP开发
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
spring-aop-4.2.4.RELEASE.jar
spring-aspects-4.2.4.RELEASE.jar
JDBC模板开发
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
事务管理
spring-tx-4.2.4.RELEASE.jar
整合WEB项目的开发
spring-web-4.2.4.RELEASE.jar
整合单元测试
spring-test-4.2.4.RELEASE.jar
整合hibernate的开发
spring-orm-4.2.4.RELEASE.jar
2.2 引入配置文件
2.2.1 Struts2的配置文件
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>
2.2.2 hibernate的配置文件
核心配置hibernate.cfg.xml
<?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>
<!-- 引入映射 -->
<mapping resource=""/>
</session-factory>
</hibernate-configuration>
映射文件
<?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="com.itheima.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也会引入日志文件,这里不用引入。
2.2.3 spring配置文件
web.xml
在这里配置spring的核心监听器,让项目启动的时候加载spring配置,创建工厂,将工厂放到ServletContext中
<!-- 配置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">
</beans>
日志文件log4j.properties
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c\:mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
# error warn info debug trace
log4j.rootLogger= info, stdout
3 struts2与spring整合
3.1 方式一:action由Struts2创建
3.1.1 创建action类
public class CustomerAction extends ActionSupport implements ModelDriven<Customer>{
// 模型驱动使用的对象
Customer customer = new Customer();
public Customer getModel() {
return customer;
}
/**保存客户
* @return
*/
public String save(){
System.out.println("save...");
return NONE;
}
}
3.1.2 在Struts.xml中配置action
<?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"/>
<!-- 配置Action -->
<package name="ssh" extends="struts-default">
<action name="customer_*" class="com.itcast.ssh.web.action.CustomerAction" method="{1}"></action>
</package>
</struts>
3.1.3 在action中调用service的方法
web层获取业务层的通用写法
/**保存客户
* @return
*/
public String save(){
System.out.println("action save...");
WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerService customerService = (CustomerService) webApplicationContext.getBean("customerService");
customerService.save();
return NONE;
}
使用Struts2的方式获取业务层的方法(Struts2与spring整合)
这里需要使用struts2-spring-plugin-2.3.24.jar插件包
1. 在action中注入service
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
2. 在action中调用service
/**保存客户
* @return
*/
public String save(){
System.out.println("action save...");
customerService.save();
return NONE;
}
注意:
关于struts2-spring-plugin-2.3.24.jar
在其中有一个常量配置
<constant name="struts.objectFactory" value="spring" />
在Struts2的核心包下,有一个default.properties,其中有该常量的配置
# struts.objectFactory = spring
但是,该常量是注释了的。所以插件为什么可以引入service,是因为它打开了该常量配置,因为只有这个常量开启了,下面的配置才会生效,Action才会按照名称自动注入service
struts.objectFactory.spring.autoWire = name
3.2 方式二:action由spring创建
3.2.1 引入插件包
struts2-spring-plugin-2.3.24.jar
3.2.2 spring管理action
<bean id="customerAction" class="com.itcast.ssh.web.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"></property>
</bean>
注意:一定要配置scope="prototype",因为Struts2是多例的。
3.2.3 在Struts.xml中配置action
将class的属性值改成spring配置的action的id的属性值
<!-- 配置Action -->
<package name="ssh" extends="struts-default">
<action name="customer_*" class="customerAction" method="{1}"></action>
</package>
4. 编写Dao层
4.1 类的编写
4.1.1 接口
public interface CustomerDao {
void save();
}
4.1.2 实现类
public class CustomerServiceImpl implements CustomerService {
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
public void save() {
System.out.println("service save...");
customerDao.save();
}
}
4.2 配置文件的引入
4.2.1 实体与表的映射关系配置
customer.hbm.xml
<?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="com.itcast.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>
注意:配置文件和实体类在同一个目录下
4.2.2 引入hibernate核心配置文件
hibernate.cfg.xml
<?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:///spring4_day03</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</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>
<!-- 引入映射 -->
<mapping resource="com/itcast/ssh/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5. spring整合hibernate
5.1 在spring配置文件中,引入hibernate配置
<!-- spring 整合hibernate -->
<!-- 引入hibernate配置信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 引入hibernate配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
5.2 让Dao层类继承HibernateDaoSupport
继承的目的是为了简化开发,因为HibernateDaoSupport类中有一个setSessionFactory方法,当模板为空的时候,就根据sessionFactory创建一个模板对象,所以,我们只需要在dao中注入一个sessionFactory就可以得到模板了。
5.2.1 dao层配置
<bean id="customerDao" class="com.itcast.ssh.dao.impl.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
5.2.2 dao层操作
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
public void save(Customer customer) {
System.out.println("dao save ... ");
this.getHibernateTemplate().save(customer);
}
}
6. spring事务管理
6.1 事务配置
<!-- 配置事务 -->
<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<!-- 事务管理器需要获得连接,获得连接就需要sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务注解扫描 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
6.2 在service类上加事务注解
@Transactional
public class CustomerServiceImpl implements CustomerService