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表达式的
2. SSH2集成
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,之后你访问的就是代理对象了
2.3.5 注册HibernateTemplate
2.3.6 注册Base模块
3. 程序代码的分层(base模块)
/base
/action
/biz
/dao
/entity
/book
/action
/biz
/dao
/entity
4. 整合案例演示
4.1 entity
*.hbm.xml
4.2 dao
IXxxDAO
XxxDAOImpl(继承HibernateDaoSupport类,方便注入HibernateTemplate)
applicationContext-Xxx.xml
4.3 biz
IXxxBiz
XxxBizImpl
applicationContext-Xxx.xml
4.4 test(junit4)
4.5 action
将action配置到applicationContext-Xxx.xml,
注:必须为多例模式(重要)
struts.xml配置注意事项:
1)
<!-- 将action创建交由spring容器来管理 -->
<constant name="struts.objectFactory" value="spring"></constant>
2)struts-Xxx.xml文件中的action的class属性类型填写spring中的id。
5. web.xml配置
5.1 Spring上下文ApplicationContext.xml的加载
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
5.2 启动Web容器时,自动装配ApplicationContext.xml的配置信息
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
5.3 中文乱码过滤器
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.4 其他配置
5.4.1 防止内存泄露、缓存清除监听器
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
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核心过滤器
6.全部步骤:
1.创建BaseDao抽象类,继承HibernateDaoSupport
2.创建BaseBiz抽象类
3.创建BaseAction抽象类,实现ServletRequestAware和ResponseAware 接口
3.1 重写req和resp方法(方法主体暂不处理)
4.spring和hibernate集成配置文档中配置分包分模块
<bean id="baseDao" class="BaseDao完整路径" abstract="true">
//注入注册的hibernateTemplate
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
<bean id="baseBiz" class="BaseBiz完整路径" abstract="true"></bean>
<bean id="baseAction" class="BaseAction完整路径" abstract="true"></bean>
5.创建数据库表实体类及映射文件
6.创建实体类Dao类的接口
6.1定义增删改查方法
7.创建实体类Dao接口的实现类,继承BaseDao
8.创建Biz接口类(跨Dao类调用Dao类方法)
9.创建Biz接口实现类继承BaseBiz
//DI:依赖注入,将Dao层注入到Biz层
定义私有的Dao接口对象,并设置get,set方法
利用Dao接口对象调用相应方法。
10.创建实体类相关的ApplicationContext配置文件
<!-- 注册BookDao -->
<bean id="booDao"
class="BookDaoImpl完整路径"
parent="baseDao">
</bean>
<!-- 注册BookBiz -->
<bean id="bookBiz"
class="BookBizImpl完整路径"
parent="baseBiz">
<property name="bookDao" ref="booDao"/>
</bean>
<!-- 注册BookAction -->
11.创建spring主配置文件,并引入集成配置文件和实体类配置文件(注意顺序)
<import resource="集成配置文件名"/>
<import resource="实体类配置文件名"/>
12.创建测试类
定义私有Biz对象
定义私有实体类对象
setUp方法中获取主配置文档的ApplicationContext对象
利用上下文对象的getBean方法获得Biz的Bean
实例化实体类
public void setUp() throws Exception {
ApplicationContext ac =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
bookBiz=(IBookBiz) ac.getBean("bookBiz");
book=new Book();
}
public class BookDaoImpl extends BaseDao implements IBookDao {
@Override
public void addBook(Book book) {
this.getHibernateTemplate().save(book);
}
@Override
public void editBook(Book book) {
Book b = this.getHibernateTemplate().get(Book.class, book.getId());
if(null!=b) {
b.setBookName(book.getBookName());
b.setPrice(book.getPrice());
b.setBookType(book.getBookType());
this.getHibernateTemplate().update(b);
}
}
@Override
public void delBook(Book book) {
Book b = this.getHibernateTemplate().get(Book.class, book.getId());
if(null!=b) {
this.getHibernateTemplate().delete(b);
}
}
@Override
public Book get(Book book) {
return this.getHibernateTemplate().get(Book.class, book.getId());
}
@Override
public List<Book> queryBookPage(Book book, PageBean pageBean) {
return this.getHibernateTemplate().execute(new HibernateCallback<List<Book>>() {
@Override
public List<Book> doInHibernate(Session session) throws HibernateException {
String hql="from Book";
Query<Book> query = session.createQuery(hql,Book.class);
query.setFirstResult(pageBean.getStartIndex());
query.setMaxResults(pageBean.getRows());
return query.list();
}
});
}
}