SSH三大框架整合

标签: SSH

1. 回顾SSH框架知识点

1.1 Hibernate框架

1. hibernate核心配置文件

(1)orm思想

对象映射关系

(2)数据库信息

(3)hibernate信息

(4)映射配置

(5)hibernate核心配置文件

- 如果单纯使用hibernate框架,核心配置文件名称hibernate.cfg.xml和位置src下面是固定的

- hibernate和spring整合时候,hibernate核心配置文件名称和位置没有固定要求

2. hibernate映射配置文件

(1)实体类和数据库表映射关系-使用orm思想

3. hibernate操作的步骤

(1)在spring框架对hibernate框架进行封装,使用hibernateTemplate

1.2 Struts2框架

1. Action操作

(1)action创建三种方式

  • 普通类
  • 实现接口
  • 继承ActionSupport

(2)配置action访问路径

- 创建struts.xml配置文件,这个文件名称和位置固定src下面的

(3)配置访问action的多个方法

- 使用通配符方式配置

(4)在action获取表单提交数据

- 获取request对象(使用ServletActionContext类获取)

- 属性封装

- 模型驱动(重点)

- 表达式封装

(5)在action操作域对象

- 使用ServletActionContext获取域对象

(6)配置struts2的过滤器

2. 值栈

(1)向值栈中放数据

- set方法

- push方法

- 定义变量,生成get方法

(2)从值栈中获取数据

- 在jsp中使用struts2标签+ognl获取

- <s:property>

- <s:iterator>

3. 拦截器

(1)aop和责任链模式

(2)自定义拦截器

- 继承MethodFilterInterceptor

- 重写类里面的方法

- 配置拦截器和action关联

1.3 Spring框架

1. Spring核心配置文件

(1)名称和位置没有固定要求

(2)在spring核心配置文件中引入schema约束

2. 创建对象

(1)xml配置方式:<bean id="" class="" scope=""/>

(2)注解方式: 四个注解

3. 注入属性(对象类型属性)

(1)xml配置方式

(2)注解方式:两个注解

- autowired

- resource

4. 使用ServletContext对象和监听器实现

(1)在服务器启动时候,加载spring配置文件,创建对象

(2)配置spring的监听器

5. jdbcTemplate

6. spring事务配置

(1)xml方式

(2)注解方式

2. SSH框架整合思想

2.1 三大框架应用在JAVAEE三层结构

2.2 Struts2框架和Spring框架整合

(1)struts2的action在spring配置

2.3 Spring框架和Hibernate框架整合

(1)hibernate的sessionFactory交给spring配置

(2)把hibernate数据库配置交给spring管理

3. SSH整合

3.1 导包

1. hibernate

(1)hibernate/lib/required

(2)hibernate/lib/jpa (java持久化规范)

(3)数据库驱动包

2. struts2

(1)struts-blank.war/ WEB-INF/lib/* (注意avassist这个包与hibernate重复,删除较低的那个版本)

(2)struts2整合spring插件包(这个包一旦导入,那么struts2在启动时就会寻找spring容器,找不到会跑出异常)

3. spring

(1)基本包 4+2 core|beans|context|expressio|logging|log4j

(2)整合web web包 spring-web

(3)整合aop 4个 sprig-aop|spring-aspect|aop联盟|aopweaving

(4)整合hibernate和事务 4个 spring-jdbc|spring-tx|c3p0|spring-orm

(5)整合Junit4测试 test包 spring-test

4. 导入标签库

3.2 单独配置Spring容器

1. 创建配置文件,并导入约束(4个)

beans|context|aop|tx

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.springframework.org/schema/beans" 
		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-4.2.xsd 
							http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd 
							http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd 
							http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">
</beans>

2. 配置spring随项目启动 

  <!-- 让spring随 web启动而创建的监听器 -->
  <listener>
  	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <!-- 配置spring配置文件位置参数  -->
  <context-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:applicationContext.xml</param-value>
  </context-param>

3.3 单独配置struts2

1. 配置struts2主配置文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
	<package name="shop" namespace="/" extends="struts-defalut">
		<action name="UserAction_*" class="com.yyh.ssh.web.action.UserAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

2. 配置struts2核心过滤器

<!-- 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>

3.4 struts2和spring整合

1. 导包(struts2与spring整合包 已经导入)

2. 配置常量

<!-- 
		struts.objectFactory = spring  // 将action的创建爱你交给spring容器
		struts.objectFactory.spring.autoWire = name  // spring负责装配Action依赖属性
	 -->
	<constant name="struts.objectFactory" value="spring"></constant>

3. 整合方案一:Struts2自己创建action,spring负责组装依赖属性(不推荐)

<!-- 整合方案一:在class属性上仍然配置action的完整类名
				struts2仍然创建action,由spring负责组装struts2的依赖属性
		 -->
		<action name="UserAction_*" class="com.yyh.ssh.web.action.UserAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>

4. 整合方案二:spring负责创建action以及组装

<!-- 整合方案二:class属性上填写spring中action对象的BeanName
		 		完全由spring管理action生命周期,包括Actoin的创建
		 		注意:需要手动组装依赖属性
		  -->
		<action name="UserAction_*" class="userAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
<!-- action -->
	<!-- 注意:Action对象作用范围一定是多例的,这样才符合struts2架构 -->
	<bean id="userAction" class="com.yyh.ssh.web.action.UserAction" scope="prototype">
		<property name="userService" ref="userService"></property>
	</bean> 

3.5 单独配置Hibernate

1. 导入实体类和orm元数据

2. 配置主配置文件

3.6 Spring整合hibernate

1. 整合原理

将sessionFactory对象交给spring容器管理

2. 在spring中配置sessionFactory

(1)配置方案一:

<!-- 将SessionFactory配置到spring容器中 -->
	<!-- 加载配置方案1: 仍然使用hibernate.cfg.xml配置信息 -->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>

(2)配置方案二:

<!-- 加载配置方案2: 在spring配置中放值hibernate配置信息 -->
	<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<property name="hibernateProperties">
			<props>
				<!-- 必选配置  -->
				<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
				<prop key="hibernate.connection.url">jdbc:mysql:///ssh</prop>
				<prop key="hibernate.connection.username">root</prop>
				<prop key="hibernate.connection.password">123456</prop>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				
				<!-- 可选配置 -->
				<prop key="hibernate.show_sql"><true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2dd1.auto">update</prop>
			</props>
		</property>
		<!-- 引入orm元数据 ,指定orm元数据所在的宝路径,spring会自动读取包中的所有配置 -->
		<property name="mappingDirectoryLocations" value="classpath:com/yyh/ssh/pojo"></property>
	</bean>

3.7 Spring整合c3p0连接池

1. 创建db.properties

jdbc.jdbcUrl=jdbc:mysql:///ssh
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=123456

2. 引入连接池到spring中

<!-- 读取db.properties文件 -->
	<context:property-placeholder location="classpath:db.properties"/>
	<!-- 配置 c3p0 连接池  -->
	<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>

3. 将连接池注入到sessionFactory

bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
		<!-- 将连接池注入到sessionFactory,hibernate会通过连接池获得连接 -->
		<property name="dataSource" ref="dataSource"></property>

3.8 Spring整合hibernate环境操作数据库

1. Dao类创建继承HibernteDaoSupport

public class UserDaoImpl extends HibernateDaoSupport implements Userdao

2. hibernate模板的操作

(1)execute

@Override
	public User gerByUserCode(String code) {
        // hql
		return getHibernateTemplate().execute(new HibernateCallback<User>() {
			@Override
			public User doInHibernate(Session session) throws HibernateException {
				String hql = "from User where username = ?";
				Query query = session.createQuery("hql");
				query.setParameter(0, code);
				User user = (User) query.uniqueResult();
				return user;
			}
		});

(2). findByCriterla

// Criteria
		DetachedCriteria dc = DetachedCriteria.forClass(User.class);
		dc.add(Restrictions.eq("username", code));
		
		List<User> list = (List<User>) getHibernateTemplate().findByCriteria(dc);
		
		if (list != null && list.size() > 0) {
			return list.get(0);
		} else {
			return null;
		}

3. spring中配置sessionFactory

<!-- dao -->
	<bean name="userDao" class="com.yyh.dao.impl.UserDaoImpl">
		<!-- 注入sessionFactory -->
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

3.9 Spring的aop事务

1. 配置核心事务管理器

<!-- 核心事务管理器 -->
	<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManage">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

2. xml配置aop事务

(1 )配置通知

<!-- 配置通知 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
			<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
			<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
		</tx:attributes>
	</tx:advice>

(2)配置织入

<!-- 配置将通知织入对象 -->
	<aop:config>
		<!-- 配置切点  -->
		<aop:pointcut expression="* execution(com.yyh.ssh.service.impl.*ServiceImpl.*(..))"  id="txPC"/>
		<!-- 配置切面 -->
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPC"/>
	</aop:config>

3. 注解配置aop事务

(1)开启注解事务

<!-- 开启注解事务 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>

(2)Service类中使用注解

@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=true)
@Override
	@Transactional(isolation=Isolation.REPEATABLE_READ,propagation=Propagation.REQUIRED,readOnly=false)
	public User getUserByCodePassword(User user) {
		// TODO Auto-generated method stub
		return null;
	}

3.10 扩大session的作用范围

为了避免使用懒加载时出现no-session问题需要扩大session的作用范围

1. 配置filter

<!-- 扩大session作用范围
  	注意:openSessionInView一定要在struts的filter之前调用
   -->
  <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>

 

 

版权声明:本文为qq_37581282原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37581282/article/details/81301483