技术分析之SSH框架的整合
技术分析之SSH框架开发的基本回顾
1.1.1 SSH框架的整合方式一:零障碍整合(带有Hibernate配置文件)
1.1.1.1 创建web项目,引入相关jar包.
【Struts2】
D:struts2struts-2.3.24appsstruts2-blankWEB-INFlib*.jar
Struts2需要了解的jar包:
struts2-convention-plugin-2.3.24.jar ---Struts2注解的开发包.
struts2-json-plugin-2.3.24.jar ---Struts2整合AJAX返回JSON数据.
struts2-spring-plugin-2.3.24.jar ---Struts2整合Spring的插件包.
【Hibernate】
D:hibernate-release-5.0.7.Finallib equired*.jar
1.1.1.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
【Hibernate】
核心配置:hibernate.cfg.xml
映射文件:
【Spring】
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>
applicationContext.xml
log4j.propertiess
1.1.1.2 引入相关的页面并进行修改:
1.1.1.3 创建包结构和相关的类:
1.1.1.1 Struts2和Spring的整合:方式一:Action类由Struts2自己创建
【编写Action中的save方法】
/**
* 保存客户的执行的方法:save
*/
public String save(){
System.out.println("Action中的save方法执行了...");
return NONE;
}
【配置Action类】
<package name="ssh" extends="struts-default" namespace="/">
<action name="customer_*" class="cn.itcast.ssh.web.action.CustomerAction" method="{1}">
</action>
</package>
【在Action中调用业务层的类】
配置Service:
<!-- 配置Service -->
<bean id="customerService" class="cn.itcast.ssh.service.impl.CustomerServiceImpl">
</bean>
在Action中调用
// 传统方式的写法
WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerService customerService = (CustomerService) webApplicationContext.getBean("customerService");
***** 这种写法很麻烦的,因为需要在每个Action中的每个方法上获取工厂,通过工厂获得类.
为了简化这个代码引入一个插件的包:
struts2-spring-plugin-2.3.24.jar
在这个插件中开启一个Struts2常量
* <constant name="struts.objectFactory" value="spring" />
* 默认的情况下struts2将这个常量关闭的,现在引入插件以后,将常量开启了,引发下面的一些常量生效.
struts.objectFactory.spring.autoWire = name
那么就可以在Action中提供想注入的属性了:
public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
// 模型驱动使用的对象
private Customer customer = new Customer();
@Override
public Customer getModel() {
return customer;
}
// 注入业务层的类:
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
/**
* 保存客户的执行的方法:save
*/
public String save() {
System.out.println("Action中的save方法执行了...");
// 传统方式的写法
/*WebApplicationContext webApplicationContext = WebApplicationContextUtils
.getWebApplicationContext(ServletActionContext.getServletContext());
CustomerService customerService = (CustomerService) webApplicationContext.getBean("customerService");*/
// 自动注入
customerService.save(customer);
return NONE;
}
}
【在Service中编写save方法】
public class CustomerServiceImpl implements CustomerService {
@Override
public void save(Customer customer) {
System.out.println("Service中的save方法执行了...");
}
}
1.1.1.1 Struts2和Spring的整合方式二:Action类由Spring创建.(推荐)
【引入插件包】
struts2-spring-plugin-2.3.24.jar
【Action交给Spring管理】
将Action配置到Spring中.
<!-- 配置Action -->
<bean id="customerAction" class="cn.itcast.ssh.web.action.CustomerAction" scope="prototype">
<!—必须手动注入属性-->
<property name="customerService" ref="customerService"/>
</bean>
Action的配置:
<package name="ssh" extends="struts-default" namespace="/">
<action name="customer_*" class="customerAction" method="{1}">
</action>
</package>
1.1.1.2 在业务层调用DAO
【将DAO配置到Spring中】
<!-- 配置DAO -->
<bean id="customerDao" class="cn.itcast.ssh.dao.impl.CustomerDaoImpl">
</bean>
【在业务层注入Dao】
public class CustomerServiceImpl implements CustomerService {
// 注入Dao
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
@Override
public void save(Customer customer) {
System.out.println("Service中的save方法执行了...");
customerDao.save(customer);
}
}
<!-- 配置Service -->
<bean id="customerService" class="cn.itcast.ssh.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"/>
</bean>
1.1.1.3 Spring整合Hibernate:
【创建映射文件】
<hibernate-mapping>
<class name="cn.itcast.ssh.domain.Customer" table="cst_customer">
<id name="cust_id">
<generator class="native"/>
</id>
<property name="cust_name"/>
<property name="cust_user_id"/>
<property name="cust_create_id"/>
<property name="cust_source"/>
<property name="cust_industry"/>
<property name="cust_level"/>
<property name="cust_linkman"/>
<property name="cust_phone"/>
<property name="cust_mobile"/>
</class>
</hibernate-mapping>
【加载到核心配置文件】
<!-- 加载映射文件 -->
<mapping resource="cn/itcast/ssh/domain/Customer.hbm.xml"/>
【在Spring的配置文件中完成如下配置】
<!-- 配置Hibernate中的sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="configLocations" value="classpath:hibernate.cfg.xml"/>
</bean>
【改写DAO】
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
@Override
public void save(Customer customer) {
System.out.println("DAO中的save方法执行了...");
}
}
<!-- 配置DAO -->
<bean id="customerDao" class="cn.itcast.ssh.dao.impl.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
【调用模板中的方法】
@Override
public void save(Customer customer) {
System.out.println("DAO中的save方法执行了...");
// 保存:
this.getHibernateTemplate().save(customer);
}
1.1.1.4 配置Spring的事务管理:
【配置事务管理器】
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
【注解事务管理的开启】
<!-- 开启事务管理的注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
【在业务层添加一个注解】
1.1.1 SSH框架的整合方式二:不带Hibernate的配置文件
1.1.1.1 复制一个SSH1的项目.
1.1.1.2 查看Hibernate的配置文件:
Hibernate的配置文件包含如下内容:
连接数据库必要的参数:
Hibernate的属性:
连接池的配置:
映射文件的引入:
1.1.1.3 替换数据库连接参数和连接池的配置:
创建jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///ssh1
jdbc.username=root
jdbc.password=123
在Spring中引入外部属性文件
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
配置连接池:
<!-- 配置c3p0连接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driverClass}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
1.1.1.4 配置Hibernate的其他属性及映射:
<!-- 配置Hibernate中的sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate的相关属性 -->
<property name="hibernateProperties">
<props>
<!-- 配置Hibernate的方言 -->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<!-- 显示SQL -->
<prop key="hibernate.show_sql">true</prop>
<!-- 格式化SQL -->
<prop key="hibernate.format_sql">true</prop>
<!-- 映射到DDL的自动创建 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 配置引入映射文件 -->
<property name="mappingResources">
<list>
<value>cn/itcast/ssh/domain/Customer.hbm.xml</value>
</list>
</property>
</bean>
1.1.2 HibernateTemplate的使用:
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
@Override
public void save(Customer customer) {
System.out.println("DAO中的save方法执行了...");
// 保存:
this.getHibernateTemplate().save(customer);
}
@Override
public void update(Customer customer) {
this.getHibernateTemplate().update(customer);
}
@Override
public void delete(Customer customer) {
this.getHibernateTemplate().delete(customer);
}
@Override
public Customer findById(Long id) {
return this.getHibernateTemplate().load(Customer.class, id);
}
@Override
public List<Customer> findAllByHQL() {
List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer");
return list;
}
public List<Customer> findAllByQBC(){
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class);
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(detachedCriteria);
return list;
}
}
1.1.3 延迟加载的问题的解决:OpenSessionInViewFilter
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>