SSH整合(续)
一、spring整合hibernate:有hibernate.cfg.xml
前提:导入jar包,在前面已经介绍了jar包的整合,我们只需要将整合的所有jar包导进去即可。
1.创建实体表:
1 CREATE TABLE `ssh1_user` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `name` varchar(255) DEFAULT NULL, 4 `age` int(11) DEFAULT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8
2.创建PO(持久化类)User
1 public class User { 2 private Integer id; 3 private String name; 4 private Integer age; 5 6 public Integer getId() { 7 return id; 8 } 9 public void setId(Integer id) { 10 this.id = id; 11 } 12 public String getName() { 13 return name; 14 } 15 public void setName(String name) { 16 this.name = name; 17 } 18 public Integer getAge() { 19 return age; 20 } 21 public void setAge(Integer age) { 22 this.age = age; 23 } 24 @Override 25 public String toString() { 26 return "User [id=" + id + ", name=" + name + ", age=" + age + "]"; 27 } 28 29 }
3.创建PO对应的ORM映射文件:User.hbm.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC 3 "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 5 6 <!-- ORM映射文件,用来联系持久化类和表的关系 --> 7 <hibernate-mapping package="cn.itcast.ssh1.domain"> 8 <class name="User" table="ssh_user"> 9 <!-- 不写column就默认与name值一样,也就是默认和JavaBean属性一样 --> 10 <id name="id" column="id"> 11 <!-- 主键生成策略 --> 12 <generator class="native"></generator> 13 </id> 14 <property name="name" column="name"></property> 15 <property name="age" column="age"></property> 16 </class> 17 </hibernate-mapping>
4.dao层:spring提供 HibernateTemplate 用于操作PO对象,类似Hibernate Session对象。所以我们提供成员属性和set方法让spring来注入
1 public class UserDaoImpl implements UserDao { 2 //spring提供 HibernateTemplate 用于操作PO对象,类似Hibernate Session对象。 3 private HibernateTemplate hibernateTemplate; 4 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { 5 this.hibernateTemplate = hibernateTemplate; 6 } 7 8 public void save(User user) { 9 hibernateTemplate.save(user); 10 } 11 12 }
5.service层:依赖于持久层所以给出成员属性,让spring注入
1 public class UserServiceImpl implements UserService { 2 //用spring去注入 3 private UserDao userDao; 4 public void setUserDao(UserDao userDao) { 5 this.userDao = userDao; 6 } 7 8 public void register(User user) { 9 userDao.save(user); 10 System.out.println("注册成功"); 11 12 } 13 14 }
6.hibernate.cfg.xml配置文件:在hibernate中怎么写这里还怎么写!关联上ORM映射文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 <session-factory> 8 <!-- 配置基本四项 --> 9 <property name="hibernate.connection.driver_class"> 10 com.mysql.jdbc.Driver 11 </property> 12 <property name="hibernate.connection.url"> 13 jdbc:mysql://localhost:3306/spring 14 </property> 15 <property name="hibernate.connection.username">root</property> 16 <property name="hibernate.connection.password">123</property> 17 18 <!-- 配置关于控制台打印sql语句的配置 --> 19 <property name="hibernate.show_sql">true</property> 20 <property name="hibernate.format_sql">true</property> 21 22 <!--表的生成策略,一般开发中不会用 因为表是在前面先设计的--> 23 <property name="hbm2ddl.auto">update</property> 24 <!-- 绑定当前线程,一般也不用因为事务已经交给spring来控制了 --> 25 <property name="current_session_context_class">thread</property> 26 <!--设置数据库方言,因为数据库之间还是有差异,最好设置一下方言 --> 27 <property name="hibernate.dialect"> 28 org.hibernate.dialect.MySQL5Dialect 29 </property> 30 31 <!-- 配置ORM映射文件 --> 32 <mapping resource="cn/itcast/ssh1/domain/User.hbm.xml" /> 33 </session-factory> 34 </hibernate-configuration>
7.spring配置文件applicationContext.xml:这里我们把dao层的HibernateTemplate配置上去
因为这个HibernateTemplate功能和session很像所以它也需要依赖SessionFactory
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx.xsd"> 15 <!-- 1、userService的创建 --> 16 <bean id="userService" class="cn.itcast.ssh1.service.UserServiceImpl"> 17 <!-- set方式注入 --> 18 <property name="userDao" ref="userDao"></property> 19 </bean> 20 <!-- 2、创建userDao的实例 --> 21 <bean id="userDao" class="cn.itcast.ssh1.dao.UserDaoImpl"> 22 <!-- set方式注入 --> 23 <property name="hibernateTemplate" ref="hibernateTemplate"></property> 24 </bean> 25 26 <!-- 3、创建HibernateTemplate --> 27 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 28 <!-- 因为这个HibernateTemplate功能和session很像所以它也需要依赖SessionFactory --> 29 <property name="sessionFactory" ref="sessionFactory"></property> 30 31 </bean> 32 33 <!-- 4、sessionFactory 加载hibenrate.cfg.xml 获得SessionFactory 34 LocalSessionFactoryBean属性中注入文件位置* configLocation确定配置文件位置 35 configLocation:配置一个配置文件的位置 36 configLocations:配置多个配置文件的位置 37 --> 38 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 39 <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> 40 </bean> 41 42 <!-- 5、配置事务管理器 这个是关于Hibernate的事务管理器所以我们需要将SessionFactory传给它,里面包含着基本四项 --> 43 <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 44 <property name="sessionFactory" ref="sessionFactory"></property> 45 </bean> 46 47 <!-- 6、我将AOP编程融入进来把事务配置和通知放一起 配置事务详情 ,事务详情依赖着事务管理器--> 48 <tx:advice id="txAdvice" transaction-manager="txManager"> 49 <tx:attributes> 50 <!-- 配置要添加事务的方法,还有就是隔离级别 和 传播行为,这两个是默认值 isolation="DEFAULT" propagation="REQUIRED"--> 51 <tx:method name="register"/> 52 </tx:attributes> 53 </tx:advice> 54 55 <!-- 7、AOP编程 将事务和切入点融合在一起--> 56 <aop:config > 57 <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.ssh1.service.UserServiceImpl.register(..))"/> 58 </aop:config> 59 </beans>
8.测试:
1 //我们把之前的JUnit整合再来一遍 2 @RunWith(value=SpringJUnit4ClassRunner.class) 3 @ContextConfiguration(locations="classpath:applicationContext.xml") 4 public class Test01 { 5 //自动注入 6 @Autowired 7 private UserService userService; 8 @Test 9 public void fun01(){ 10 User user = new User(); 11 user.setName("迪丽热巴"); 12 user.setAge(26); 13 userService.register(user); 14 15 16 } 17 }
需要注意的是在spring中要进行AOP的动态加入事务,在hibernate中的事务配置交给了spring,所以必须配置事务不然会发现程序是正确的数据库中没有值这是因为HibernateTemplate进行操作后没有提交事务导致的
二、spring整合hibernate:没有hibernate.cfg.xml
删除hibernate.cfg.xml文件,但需要保存文件内容,将其配置spring中,将hibernate中所有的配置都可以在spring中配置
1.修改后spring中的配置如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:tx="http://www.springframework.org/schema/tx" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/context 10 http://www.springframework.org/schema/context/spring-context.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx.xsd"> 15 <!-- 数据源的创建 --> 16 <context:property-placeholder location="classpath:JdbcInfo.properties"/> 17 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 18 <property name="driverClass" value="${Driver}"></property> 19 <property name="jdbcUrl" value="${Url}"></property> 20 <property name="user" value="${User}"></property> 21 <property name="password" value="${Password}"></property> 22 </bean> 23 24 <!-- 1.3配置 LocalSessionFactoryBean,获得SessionFactory 25 需要数据源来替换hibernate中的基本四项1)dataSource 数据源 26 2)hibernateProperties hibernate其他配置项hibernateProperties向这个类型为properties的属性注入hibernate各个配置 27 3) 导入映射文件 28 mappingLocations ,确定映射文件位置,需要“classpath:” ,支持通配符 【】 29 mappingResources ,加载执行映射文件,从src下开始 。不支持通配符* 30 mappingDirectoryLocations ,加载指定目录下的,所有配置文件 31 mappingJarLocations , 从jar包中获得映射文件 32 --> 33 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 34 <property name="dataSource" ref="dataSource"></property> 35 <property name="hibernateProperties"> 36 <props> 37 <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 38 <prop key="hibernate.show_sql">true</prop> 39 <prop key="hibernate.format_sql">true</prop> 40 <prop key="hbm2ddl.auto">update</prop> 41 <prop key="current_session_context_class">thread</prop> 42 </props> 43 </property> 44 <property name="mappingLocations" value="classpath:cn/itcast/ssh2/domain/*.hbm.xml"></property> 45 </bean> 46 47 48 <!-- 1、userService的创建 --> 49 <bean id="userService" class="cn.itcast.ssh2.service.UserServiceImpl"> 50 <!-- set方式注入 --> 51 <property name="userDao" ref="userDao"></property> 52 </bean> 53 <!-- 2、创建userDao的实例 我们在userDao中继承了HibernateDaoSupport所以我们只需要注入SessionFactory,和JdbcDaoSupport相似--> 54 <bean id="userDao" class="cn.itcast.ssh2.dao.UserDaoImpl"> 55 <property name="sessionFactory" ref="sessionFactory"></property> 56 </bean> 57 58 59 60 61 <!-- 5、配置事务管理器 这个是关于Hibernate的事务管理器所以我们需要将SessionFactory传给它,里面包含着基本四项 --> 62 <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 63 <property name="sessionFactory" ref="sessionFactory"></property> 64 </bean> 65 66 <!-- 6、我将AOP编程融入进来把事务配置和通知放一起 配置事务详情 ,事务详情依赖着事务管理器--> 67 <tx:advice id="txAdvice" transaction-manager="txManager"> 68 <tx:attributes> 69 <!-- 配置要添加事务的方法,还有就是隔离级别 和 传播行为,这两个是默认值 isolation="DEFAULT" propagation="REQUIRED"--> 70 <tx:method name="register"/> 71 </tx:attributes> 72 </tx:advice> 73 74 <!-- 7、AOP编程 将事务和切入点融合在一起--> 75 <aop:config > 76 <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.ssh2.service.UserServiceImpl.register(..))"/> 77 </aop:config> 78 </beans>
2.修改dao层去掉HibernateTemplate使用继承HibernateDaoSupport因为里面含有创建HibernateTemplate的方法,我们需要向里面注入SessionFactory
1 public class UserDaoImpl extends HibernateDaoSupport implements UserDao { 2 3 public void save(User user) { 4 this.getHibernateTemplate().save(user); 5 } 6 7 }
3.修改完成后就可以测试了测试代码和上面一样就不再写了!
三、struts整合spring:在spring中配置action的实例
前提:整合所有jar包,导入进去就行!,然后案例还是基于上面的!其他代码不变,配置struts核心控制器:过滤器到web.xml,把spring提供的监听配置到web.xml让其可以在启动服务器就加载spring配置文件
1.Action动作类的代码:
1 public class UserAction extends ActionSupport implements ModelDriven<User> { 2 3 private User user =new User();//模型驱动需要我们自己提供实例 4 private UserService userService;//利用spring来注入 5 6 public User getModel() { 7 8 return user; 9 } 10 11 /**************register**************/ 12 public String register() throws Exception { 13 System.out.println(user); 14 userService.register(user); 15 16 return SUCCESS; 17 } 18 19 public void setUserService(UserService userService) { 20 this.userService = userService; 21 } 22 23 }
2.struts配置文件代码:可以看到动作类标签里面的class的值是和spring中配置动作类的id名一样,而不是以前的全类名了,当然写全类名写了也没错但是没有体现整合的这个概念
<?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> <!-- 开发者模式 --> <constant name="struts.devMode" value="true"></constant> <package name="p1" extends="struts-default" namespace="/ssh"> <!-- 使用的是通配符*,{1}表示的内容和*是一样的1表示的是第几个* 这里的class可以写成spring中配置动作类的id名,因为可以整合到一起但是推荐的还是day03_5spring_ssh4的写法 --> <action name="UserAction_*" class="userAction" method="{1}"> <result>/message.jsp</result> </action> </package> </struts>
3.spring的配置文件的代码:我们只需要在上面的spring配置文件的基础上加入
1 <!-- 创建动作类的实例,将userService注入进去 --> 2 <bean id="userAction" class="cn.itcast.ssh3.action.UserAction"> 3 <property name="userService" ref="userService"></property> 4 </bean>
4.编写一个简单的jsp注册页面:注意这里使用的是struts2的标签注意要导入标签
<s:form action="UserAction_register" namespace="/ssh"> <s:textfield label="用户名" value="欧阳娜娜" requiredLabel="true" name="name" /> <s:textfield label="年龄" value="20" requiredLabel="true" name="age"/> <s:submit value="提交"/> </s:form>
5.web的配置文件:web.xml,配置spring的监听器时默认回去在WEB-INF下去找配置文件所以我们还要指定文件的位置
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <!-- 确定spring配置文件的位置 classpath:表示在类路径下,当web.xml运行时spring的配置文件就会被加载 ,这样就会为每个类创建实例--> 8 <context-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>classpath:applicationContext.xml</param-value> 11 </context-param> 12 13 <!-- 配置spring的监听器 --> 14 <listener> 15 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 16 </listener> 17 18 19 20 <!-- 配置struts核心控制器 --> 21 <filter> 22 <filter-name>struts2</filter-name> 23 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 24 </filter> 25 26 27 <filter-mapping> 28 <filter-name>struts2</filter-name> 29 <url-pattern>/*</url-pattern> 30 </filter-mapping> 31 <welcome-file-list> 32 <welcome-file>index.jsp</welcome-file> 33 </welcome-file-list> 34 </web-app>
6.启动服务器访问页面进行注册!
四、struts整合spring:在spring中不配置配置action的实例(不配置实例的话Action类中的UserService会被自动注入,但是前提是导入了插件jar包,而且Action中的setter方法名称和spring中配置id名userService的名称要一致才可以,struts.xml中动作标签class属性的名称恢复成正常的全限定类名)
前提导入jar包:struts2-spring-plugin-2.3.24.jar
1.struts.xml中动作标签的class值修改为以前的全限定类名 struts <action class="全限定类名">
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE struts PUBLIC 3 "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 4 "http://struts.apache.org/dtds/struts-2.3.dtd"> 5 6 <struts> 7 <!-- 开发者模式 --> 8 <constant name="struts.devMode" value="true"></constant> 9 10 <package name="p1" extends="struts-default" namespace="/ssh"> 11 <!-- 使用的是通配符*,{1}表示的内容和*是一样的1表示的是第几个* 12 class这个属性要是和spring整合之后就可以有两种写法 当在spring中配置了动作类的实例时就如下就可以写成和spring 中配置的id名一样 13 如果不再spring中创建动作类的实例的话,这样就要些全限定类名,确保有struts2-spring-plugin-2.3.24.jar这个包因为里面有一个配置 14 当动作类中的setUserService(注意是去掉set和第一个字母小写后) 和 spring中的这个实例的id名一样就可以自动注入UserService 15 --> 16 <action name="UserAction_*" class="cn.itcast.ssh3.action.UserAction" method="{1}"> 17 <result>/message.jsp</result> 18 </action> 19 </package> 20 </struts>
2.要求:Action类中,必须提供service名称与 spring配置文件一致。(如果名称一样,将自动注入)
分析:
1. struts 配置文件
default.properties ,常量配置文件
struts-default.xml ,默认核心配置文件
struts-plugins.xml ,插件配置文件
struts.xml,自定义核心配置文件
常量的使用,后面配置项,将覆盖前面的。
2.default.properties ,此配置文件中确定 按照【名称】自动注入
/org/apache/struts2/default.properties
3. struts-plugins.xml ,struts整合spring
struts的action将由spring创建
总结:之后action有spring创建,并按照名称自动注入