SSH三大框架整合
1、 各个框架知识点分析 --- 整合(并不是真正意义上整合)
1)struts2 学习版本2.3.7
解压目录 apps 案例demo , docs 文档 ,lib jar包, src 框架源代码
最基本jar包 : apps/struts2-blank.war 11个jar
struts2-convention-plugin-2.3.7.jar用于struts使用注解 (不用注解时 一定不要导入 )
struts2-json-plugin-2.3.7.jar 用于struts2整合Ajax (使用 json-lib )
struts2-spring-plugin-2.3.7.jar 用于struts2整合Spring (用于整合Spring)
配置 web.xml Filter作为struts2框架核心控制器入口 、src目录配置struts.xml
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>
2) spring3 学习版本 3.2.0
解压目录 docs 文档规范,lib jar包, schema 约束文件
最基本jar包 :spring-beans.jar spring-core.jar spring-context.jar spring-expression.jar 、common-loggins.jar log4j.jar
web应用中使用spring : spring-web.jar
测试spring和junit整合: spring-test.jar
spring aop编程 : spring-aop.jar spring-aspect.jar aopalliance.jar aspect-weaver.jar
jdbcTemplate : spring-jdbc.jar spring-tx.jar
spring整合其他ORM框架: spring-orm.jar (用于整合Hibernate )
配置 log4j.properties 、web.xml 配置核心监听器 、 src或WEB-INF下创建applicationContext.xml
web.xml
<!-- 配置Spring核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
在Servlet/Filter中获得Spring上下文对象
WebApplicationContext context= WebApplicationContextUtils.getWebApplicationContext(servletContext);
3) hibernate3 学习版本 3.6.10
解压目录 documentation 文档规范, lib jar包, project 源码 , hibernate3.jar 框架核心jar包
最基本jar包:hibernate3.jar 、lib\required\*.jar (6个)、lib\jpa\jpa.jar 、slf4j-log4j12-1.7.2.jar、 log4j.jar 、 lib\optional\c3p0\c3p0.jar、 jdbc驱动
二级缓存 EHCache : backport-util-concurrent.jar、commons-logging.jar 、ehcache-1.5.0.jar
配置 log4j.properties 、src下创建hibernate.cfg.xml (jdbc连接基本参数) 、为domain创建 hbm映射文件
hibernate.cfg.xml
<hibernate-configuration>
<session-factory>
<!-- jdbc四个基本连接参数,方言 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///spring3day3</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">abc</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 使用c3p0连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 控制台打印SQL -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
</session-factory>
</hibernate-configuration>
Product.hbm.xml
<hibernate-mapping>
<class name="domain.Product" table="products" catalog="spring3day3">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<property name="price"></property>
</class>
</hibernate-mapping>
在hibernate.cfg.xml 注册hbm文件 <mapping resource="domain/Product.hbm.xml"/>
*** SessionFactory 只初始化一次,编写HibernateUtils
2、 XML方式整合三大框架 (Struts2整合Spring3,Spring3整合Hibernate3)
1) struts2出现默认就提供对Spring的整合
第一步 到入整合插件包 struts2-spring-plugin-2.3.7.jar
第二步 在struts.xml 配置常量, 将Action对象创建权 交给Spring <constant name="struts.objectFactory" value="spring"></constant>
第一种 struts2 整合 Spring配置 ,将Action 创建权交给Spring
struts.xml
<package name="basic" extends="struts-default" namespace="/">
<!-- 第一种,action标签 class属性,配置伪类 -->
<action name="addProduct" class="productAction" method="add">
<result>/success.jsp</result>
</action>
</package>
applicationContext.xml
<!-- 配置Action -->
<bean id="productAction" class="web.action.ProductAction" scope="prototype">
<property name="productService" ref="productService"></property>
</bean>
********************** 重点重点重点 : struts2管理Action对象是多例的, Spring管理Action ,默认单例的
第二种 自动装配Service ,由struts和spring整合插件 创建Action, 会自动装配Service对象
struts.xml
<action name="addProduct" class="web.action.ProductAction" method="add">
<result>/success.jsp</result>
</action>
applicationContext.xml
<bean id="productService" class="service.ProductService"></bean>
2) spring3整合hibernate 导入jar :spring-orm-3.2.0.RELEASE.jar 需要依赖 spring-jdbc.jar spring-tx.jar
第一种 零障碍整合
配置Spring 加载Hibernate配置文件
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- hibernate配置文件位置 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
使DAO类 继承HibernateDaoSupport ,为DAO注入 SessionFactory
<bean id="productDAO" class="dao.ProductDAO">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
将DAO 注入到Service中
<bean id="productService" class="service.ProductService">
<property name="productDAO" ref="productDAO"></property>
</bean>
将Service注入到Action中
****** DAO中操作Hibernate 通过 HibernateTemplate 进行操作
进行事务管理 ----- 依赖AOP
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 注解驱动事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
在Service方法上 应用 @Transactional 注解
第二种 不需要编写Hibernate配置文件,直接将Hibernate配置参数 写入到Spring的配置文件 (开发中常用)
hibernate配置文件主要有三个部分 (JDBC连接基本参数、Hibernate常用属性、hbm文件映射 ) -------------- 写入spring的配置文件
通过 dataSource 配置,配置jdbc基本连接参数
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- c3p0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
通过hibernateProperties 配置Hibernate基本属性
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
</property>
通过mappingDirectoryLocations配置hbm文件
<property name="mappingDirectoryLocations">
<list>
<value>classpath:domain</value>
</list>
</property>
----------------------------------------------------------------------------------------------------------------------
在SSH整合后,Spring提供HibernateTemplate, 在DAO中,通过HibernateTemplate 间接操作Hibernate API
1) 增加操作 save
2) 修改操作 update
3) 删除操作 delete
4) 根据id查询 get/load
List find(String queryString,Object... values) 查询一个集合对象 (带条件查询) ----- 手动写HQL语句
List findByCriteria(DetachedCriteria criteria) 条件查询 ------ 面向对象方式封装,自动生成HQL
List findByCriteria(DetachedCriteria criteria,int firstResult, int maxResults) ----- 分页查询
List findByNamedQuery(String queryName, Object...values) 将HQL语句命名,配置到配置文件 ,进行查询
List findByExample(Object exampleEntity) 根据范例查询 ,默认等值查询,设置like查询
----------------------------------------------------------------------------------------------------------------------
3、 采用全注解方式三大框架整合
39个jar包 ,在ssh2基础上 导入 struts2-convention-plugin-2.3.7.jar
复制web.xml
web.action 必须含有 action actions struts struts2 才能被struts2 注解插件扫描到
Action的注解配置
@Namespace("/")
@ParentPackage("struts-default")
public class ProductAction extends ActionSupport{
@Action(value="addProduct",results={@Result(name="success",location="/success.jsp")})
public String add(){
System.out.println("添加商品");
return SUCCESS;
}
}
在Action中注入Service
applicationContext.xml
<!-- 自动扫描Service -->
<context:annotation-config />
<context:component-scan base-package="service"></context:component-scan>
在ProductService 使用 @Service
在Service中注入DAO
applicationContext.xml
<context:component-scan base-package="service,dao"></context:component-scan>
在ProductDAO 使用 @Repository
配置PO类
@Entity
@Table(name="products")
public class Product {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private Double price;
applicationContext.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<!-- JDBC数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- Hibernate常规属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.current_session_context_class">thread</prop>
</props>
</property>
<!-- 会自动扫描路径下所有PO类文件 -->
<property name="packagesToScan">
<list>
<value>domain</value>
</list>
</property>
</bean>
将SessionFactory 交给DAO操作, 继承HibernateDaoSupport 不能用注解
<!-- 配置Hibernate模板 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
@Repository
public class ProductDAO {
@Autowired
private HibernateTemplate hibernateTemplate;
对业务层添加事务管理
@Service // 这可以用@Component
@Transactional
public class ProductService {
}