Java - 框架之 SSH 整合
十四. ssh 整合1 - 包
1. Struts jar 包
- Struts-2.xx\apps\stutrs2-blank\WEB-INF\lib
2. Hibernate jar 包
- hibernate-release-5.0.7.Final\lib\required
- mysql 驱动包
- 日志记录
3. Spring jar 包
十五. ssh 整合 - 配置文件
1. Struts 配置文件
- web.xml
- struts.xml
2. Hibernate 配置文件
- hibernate.cfg.xml
- 映射文件
3. Spring 配置文件
- web.xml
- applicationContext.xml
- 日志记录
十六. ssh 整合2 - Spring 和 Struts2 的整合方式一: Action 由 Struts2 创建
1. 导入 struts2-spring-plugin-2.3.33.jar 整合包
2. applicationContext.xml 文件中配置 Service (applicationContext.xml)
<!-- 配置 Serveice -->
<bean id="customerService" class="com.q.ssh.service.impl.CustomerServiceImpl"></bean>
3. 配置Action (struts.xml)
<!-- 配置Action -->
<package name="ssh1" namespace="/" extends="struts-default">
<action name="customer_*" class="com.q.ssh.web.action.CustomerAction" method="{1}" />
</package>
4. CustomerAction.java 文件中
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.q.ssh.domain.Customer;
import com.q.ssh.service.CustomerService; public class CustomerAction extends ActionSupport implements ModelDriven<Customer> {
// 模型驱动使用对象
private Customer customer; @Override
public Customer getModel() {
return customer;
} // 注入 CustomerService
private CustomerService customerService;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
} // 保存客户 :save
public String save(){
System.out.println("save>>>");
customerService.save(customer); // 这里就可以直接调用 save 方法。
return NONE;
} }
十七. ssh 整合2 - Spring 和 Struts2 的整合方式二: Action 由 Spring 创建
注意:
- 需要配置 Action 为多例。
- 需要手动注入 Service。
1. 导入 struts2-spring-plugin-2.3.33.jar 整合包
2. 将 Action 交给 Spring (applicationContext.xml)
<!-- 配置 Serveice (注:需要将 Action 设置为多例: scope="prototype" ) -->
<bean id="customerService" class="com.q.ssh.service.impl.CustomerServiceImpl" scope="prototype"></bean> <!-- 配置 Action (将 Action 交给 Spring 管理)-->
<bean id="customerAction" class="com.q.ssh.web.action.CustomerAction">
<!-- 需要手动注入 Service -->
<property name="customerService" ref="customerService" />
</bean>
3. 配置 Action (Struts.xml)
<!-- 配置Action -->
<package name="ssh1" namespace="/" extends="struts-default">
<!-- 这里的 class属性要和 上面的 id 相同 -->
<action name="customer_*" class="customerAction" method="{1}" />
</package>
十八. ssh 整合3 - Service 调用 DAO
1. 将DAO交给 Spring 管理
<!-- 配置DAO -->
<bean id="customerDao" class="com.q.ssh.dao.impl.CustomerDaoImpl"> </bean>
2. 业务层注入DAO (CustomerServiceImpl.java)
import com.q.ssh.dao.CustomerDao;
import com.q.ssh.domain.Customer;
import com.q.ssh.service.CustomerService; 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);
}
}
3. 在Service配置中注入 (applicationContext.xml)
<!-- 配置 Serveice -->
<bean id="customerService" class="com.q.ssh.service.impl.CustomerServiceImpl" scope="prototype">
// 将customerDao注入 :
<property name="customerDao" ref="customerDao" />
</bean>
十九. ssh 整合3 - Spring 整合 Hibernate 框架
1. 创建数据库
2. 在 Spring 的配置文件中,引入 Hibernate 的配置信息
<!-- Spring整合Hibernate -->
<!-- 引入 Hibernate 的配置信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 引入Hibernate的配置文件 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
3. 修改 CustomerDaoImpl.java 的类 继承 HibernateDaoSupport
import com.q.ssh.dao.CustomerDao;
import com.q.ssh.domain.Customer;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { @Override
public void save(Customer customer) {
System.out.println("DAO 中的 save...");
}
}
4. 配置DAO 中导入
<!-- 配置DAO -->
<bean id="customerDao" class="com.q.ssh.dao.impl.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
5. 在DAO中 Hibernate 的模板完成保存操作
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { @Override
public void save(Customer customer) {
System.out.println("DAO 中的 save...");
// 调用 Save 方法。
this.getHibernateTemplate().save(customer);
}
}
6. 配置 Spring 的事务管理
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
7. 开启注解事务
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
8. 在业务层使用注解
@Transactional
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);
}
}
二十. ssh 整合3 - Spring 整合 Hibernate 框架 (不带 Hibernate 配置文件)
1. 将 Hibernate 文件 使用Spring 整合到 applicationContext 文件中
<!-- 引入外部属性文件 -->
<content: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> <!-- Spring整合Hibernate -->
<!-- 引入 Hibernate 的配置信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 引入Hibernate的配置文件 -->
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource" /> <!-- 配置Hibernate相关属性 -->
<property name="hibernateProperties">
<props>
<!-- 方言 -->
<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>
<!-- update:如果数据库有没表,自动帮你创表 -->
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property> <!-- 设置映射文件 -->
<property name="mappingResources">
<list>
<value>com/q/ssh/domain/Customer.hbm.xml</value>
</list>
</property>
</bean>
二十一. ssh 整合3 - Hibernate 模板使用
# 增删改查操作
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao { // 增
@Override
public void save(Customer customer) {
System.out.println("DAO 中的 save...");
// 将数据保存到数据库
System.out.println(customer);
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(Integer id) {
return this.getHibernateTemplate().get(Customer.class, id);
} //查 (多个)
@Override
public List<Customer> findAllByHQL() {
// List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from");
// return list;
return null;
} //查 (多个)
@Override
public List<Customer> findAllByQBC() {
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
return list;
}
}
二十二. ssh 整合 - 延迟加载问题解决
# 由于 session 的开启和关闭都在 Service 层,一旦 Action 层调用已经关闭的 session 就会报错,
# 解决:将 session 的开启和关闭放在 Action 层。
<!-- web.xml 解决延迟加载的过滤器 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter> <filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
二十三. ssh 整合 - web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"> <!-- 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> <!-- 解决延迟加载的过滤器 -->
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
</filter> <filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping> <!-- Struts 核心过滤器 -->
<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> </web-app>
最新文章
- 体育游戏中的Player类
- UINavigationController导航条是否挡住下面的内容
- PHP导出CSV UTF-8转GBK不乱码的解决办法
- TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择 和 char varchar varchar2 的区别
- win8下hosts保存文档失败,提示:请检查文件是否被另一个应用程序打开
- 剑指Offer30 从1到n整数出现1的个数
- “尝试加载 Oracle 客户端库时引发 BadImageFormatException”的解决方案
- 对比AppScan Source和Fortify扫描AltoroJ的结果
- Linux 新手常用命令
- BZOJ1264: [AHOI2006]基因匹配Match
- Python【第四篇】函数、内置函数、递归、装饰器、生成器和迭代器
- 【剑指offer】数组中只出现一次的数字
- HDFS集群数据不均衡处理
- Java 调用 groovy 脚本文件,groovy 访问 MongoDB
- 总结一下前端面试题之Html和CSS
- 使用 Start 屏幕查找 Windows 更新
- iometer测试磁盘IO性能
- OC中对象的description方法
- Python3 Tkinter-Scrollbar
- AOE网络——求关键路径
热门文章
- [转帖]GNU, Free Software and Open Source 自由软件与开源软件
- [转帖]华为一枝独秀!Q3国内智能手机出货量公布:Ov、小米、iPhone侧目
- python 安装pytorch 及 安装失败解决办法
- 在laravel框架中使用模板继承来进行更方便的布局
- flask框架(六)——闪现(get_flashed_message)、请求扩展、中间件(了解)
- c语言中typeof关键字
- PB数据窗口只存储过程数据源创建
- caffe层解读-softmax_loss
- python之(TensorFlow)深度学习
- Ubuntu18.04防火墙相关