一.SSH框架整合过程回顾
1.导入jar包
2.搭建struts环境
- 创建action,创建struts.xml配置文件,配置action
- 配置struts2的过滤器
3.搭建hibernate环境
- 搭建实体类
- 配置实体类和数据库表映射关系
- 创建hibernate核心配置文件
- 引入映射配置文件
4.搭建spring环境
- 创建spring核心配置文件
- 让spring配置文件在服务器启动时候加载
- 配置监听器(web.xml)
- 指定spring配置文件位置(web.xml)
- 配置监听器(web.xml)
5.struts2和spring整合
- 把action在spring配置(action多实例的)
- 在struts.xml中action标签class属性里面写bean的id值
6.spring和hibernate整合
- 把hibernate核心配置文件中数据库配置,在spring里面配置
- 把hibernate的sessionFactory在spring配置
7.在dao里面使用hibernateTemplate
- 在dao注入hibernateTemplate对象
- 在hibernateTemplate对象中注入sessionFactory
8.配置事务
二.maven整合ssh
- pow.xml
<properties>
<!-- 统一源码的编码方式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 统一各个框架版本 -->
<struts.version>2.5.10</struts.version>
<spring.version>4.3.8.RELEASE</spring.version>
<hibernate.version>5.1.7.Final</hibernate.version>
</properties>
<dependencies>
<!-- Junit依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- Spring 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring web依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring整合ORM框架依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Struts2 核心依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<!-- Struts2和Spring整合依赖 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts.version}</version>
</dependency>
<!-- Hibernate 核心依赖 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- MySQL 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
<!-- C3P0 依赖 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5</version>
</dependency>
<!-- AspectJ依赖 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<!-- SLF4J依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
</dependencies>
<build>
<finalName>maven_ssh</finalName>
<plugins>
<!-- 打包时跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
1.搭建struts2环境
- 创建struts2配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="default" extends="struts-default" namespace="/">
</action>
</package>
</struts>
- 在web.xml中配置struts2核心过滤器
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.搭建spring环境
- 创建spring配置文件
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">
- 在web.xml中配置监听器
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 这里如果bean.xml在包it.playmker下,那么就应该写为:it/playmaker/bean.xml -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 配置Spring的监听器 默认加载WEB-INF/applicationContext.xml-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3.搭建hiberanate环境
- 创建hibernate核心配置文件
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- DTD是约束,可以在核心包里面找 -->
<!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>
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层格式化语句 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮创建表 需要配置之后
update:如果已经有表 更新 如果没有 创建 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 配置数据库方言
在mysql里面实现分页 关键字 limit,只能使用mysql
在oracle数据库 实现分页 rownum
让hibernate框架识别不同数据库的自己特有的语句 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
</session-factory>
</hibernate-configuration>
4.先struts跟spring框架整合
- 整合关键点:action对象创建,交给spring创建
(1)创建action类
CustomerAction.java
public class CustomerAction extends ActionSupport {
}
(2)将action对象配置到spring配置文件中
applicationContext.xml
<!-- 配置action对象 -->
<bean id="customerAction" class="it.playmaker.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"></property>
</bean>
(3)在struts.xml中在action节点中class属性配置为spring工厂中的action对象bean的id
struts.xml
<package name="default" extends="struts-default" namespace="/">
<action name="customerAction_*" class="customerAction" method="{1}">
</action>
</package>
5.spring跟hibernate整合
- 整合关键点:数据源dataSource交给spring,sessionFactory对象创建交给spring创建,事务管理
(1).配置dataSource
applicationContext.xml
<!-- 加载属性文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<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.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
db.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/javaweb
jdbc.username=root
jdbc.password=T471912619
(2).配置sessionFactory
applicationContext.xml
<!-- 配置Hibernate的SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate属性 -->
<property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
</bean>
(3).事务管理
- 配置事务管理器:PlatFormTransactionManager:接口
- jdbc:DataSourceTransactionManager
- Hibernate:HibernateTransactionManager
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- xml管理事务 -->
<tx:advice id="txAdvice">
<tx:attributes>
<!-- 匹配业务类中方法名 -->
<tx:method name="save*"/>
<tx:method name="update*"/>
<tx:method name="delete*"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 配置aop -->
<aop:config>
<!-- 配置切点:具体哪些方法要增强(真正被增强的方法) -->
<aop:pointcut expression="execution(* it.playmaker.service.*.*(..))" id="cut"/>
<!-- 配置切面:将增强逻辑作用到切点(通知+切入点)-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="cut"/>
</aop:config>
<!-- 1.开启注解驱动 2.在service类或者方法上使用注解@Transactional-->
<tx:annotation-driven transaction-manager="transactionManager" />
6.测试
(1).在地址栏输入action请求http://localhost:8080/ssh01/customerAction_findOne.action
- action-service-dao 完成客户查询
(2).具体实现
- 创建客户实体类,映射文件,将映射文件引入hibernate核心配置
Customer.java
public class Customer {
private String custId;
private String custName;
private String address;
public String getCustId() {
return custId;
}
public void setCustId(String custId) {
this.custId = custId;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入Hibernate映射文件约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- class指定POJO类和数据库表之间的对应 -->
<class name="it.playmaker.domain.Customer" table="t_customer" >
<!-- id指定数据库中表的主键,以及主键生成策略 -->
<id name="custId" type="java.lang.String" >
<column name="id" length="32"></column>
<generator class="uuid" />
</id>
<!-- property指定表字段和POJO中的属性的对应 -->
<property name="custName" column="custName" type="java.lang.String">
</property>
<property name="address" column="address" type="java.lang.String">
</property>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<!-- 第三部分:把映射文件放到核心配置文件中 必须的 -->
<mapping resource="it/playmaker/domain/Customer.hbm.xml"/>
- 创建action,service,dao 并且完成注入,并在类添加属性生成set方法
public class CustomerAction extends ActionSupport {
private CustomerService customerService;
private String custId;
public void setCustomerService(CustomerService customerService) {
this.customerService = customerService;
}
public void setCustId(String custId) {
this.custId = custId;
}
public String findOne() throws Exception{
Customer customer =customerService.findOne(custId);
ActionContext.getContext().getValueStack().push(customer);//存入值栈中
return SUCCESS;
}
}
public interface CustomerService {
Customer findOne(String custId);
}
public class CustomerServiceImpl implements CustomerService {
private CustomerDao customerDao;
public void setCustomerDao(CustomerDao customerDao) {
this.customerDao = customerDao;
}
@Override
public Customer findOne(String custId) {
return customerDao.findOne(custId);
}
}
public interface CustomerDao {
Customer findOne(String custId);
}
public class CustomerDaoImpl extends HibernateDaoSupport implements CustomerDao {
public Customer findOne(String custId) {
return this.getHibernateTemplate().get(Customer.class,custId);
}
}
- 在spring配置文件完成注入
applicationContext
<!-- 先注入dao -->
<bean id="customerDao" class="it.playmaker.dao.impl.CustomerDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 再注入service -->
<bean id="customerService" class="it.playmaker.service.impl.CustomerServiceImpl">
<property name="customerDao" ref="customerDao"></property>
</bean>
<!-- 配置action对象 -->
<bean id="customerAction" class="it.playmaker.action.CustomerAction" scope="prototype">
<property name="customerService" ref="customerService"></property>
</bean>
- 在struts.xml中配置action
<package name="default" extends="struts-default" namespace="/">
<action name="customerAction_*" class="customerAction" method="{1}">
<result name="success">/index.jsp</result>
<allowed-methods>findOne</allowed-methods> <!--在struts2高版本不写这行,即使通配符匹配到方法也无法访问,一直报错-->
</action>
</package>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="/struts-tags" prefix="s"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:property value="custName"/>
</body>
</html>
访问http://localhost:8080/maven_ssh/customerAction_findOne.action?custId=1
成功!!!!!!!
三.总结
- 页面提交参数,服务端action接收参数-参
- 调用业务层方法->dao方法->DB-调
- 将返回的数据存入值栈-存
- 配置结果视-转