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. }

PO持久化类

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>

hibernate.cfg.xml

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>

applicatiopnContext.xml

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. }

需要注意的是在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. <!-- 1、userService的创建 -->
  48. <bean id="userService" class="cn.itcast.ssh2.service.UserServiceImpl">
  49. <!-- set方式注入 -->
  50. <property name="userDao" ref="userDao"></property>
  51. </bean>
  52. <!-- 2、创建userDao的实例 我们在userDao中继承了HibernateDaoSupport所以我们只需要注入SessionFactory,和JdbcDaoSupport相似-->
  53. <bean id="userDao" class="cn.itcast.ssh2.dao.UserDaoImpl">
  54. <property name="sessionFactory" ref="sessionFactory"></property>
  55. </bean>
  56.  
  57. <!-- 5、配置事务管理器 这个是关于Hibernate的事务管理器所以我们需要将SessionFactory传给它,里面包含着基本四项 -->
  58. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  59. <property name="sessionFactory" ref="sessionFactory"></property>
  60. </bean>
  61.  
  62. <!-- 6、我将AOP编程融入进来把事务配置和通知放一起 配置事务详情 ,事务详情依赖着事务管理器-->
  63. <tx:advice id="txAdvice" transaction-manager="txManager">
  64. <tx:attributes>
  65. <!-- 配置要添加事务的方法,还有就是隔离级别 和 传播行为,这两个是默认值 isolation="DEFAULT" propagation="REQUIRED"-->
  66. <tx:method name="register"/>
  67. </tx:attributes>
  68. </tx:advice>
  69.  
  70. <!-- 7、AOP编程 将事务和切入点融合在一起-->
  71. <aop:config >
  72. <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itcast.ssh2.service.UserServiceImpl.register(..))"/>
  73. </aop:config>
  74. </beans>

spring的配置文件

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名一样,而不是以前的全类名了,当然写全类名写了也没错但是没有体现整合的这个概念

  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表示的是第几个* 这里的class可以写成spring中配置动作类的id名,因为可以整合到一起但是推荐的还是day03_5spring_ssh4的写法 -->
  12. <action name="UserAction_*" class="userAction" method="{1}">
  13. <result>/message.jsp</result>
  14. </action>
  15. </package>
  16. </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的标签注意要导入标签

  1. <s:form action="UserAction_register" namespace="/ssh">
  2. <s:textfield label="用户名" value="欧阳娜娜" requiredLabel="true" name="name" />
  3. <s:textfield label="年龄" value="20" requiredLabel="true" name="age"/>
  4. <s:submit value="提交"/>
  5. </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. <!-- 配置struts核心控制器 -->
  19. <filter>
  20. <filter-name>struts2</filter-name>
  21. <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  22. </filter>
  23.  
  24. <filter-mapping>
  25. <filter-name>struts2</filter-name>
  26. <url-pattern>/*</url-pattern>
  27. </filter-mapping>
  28. <welcome-file-list>
  29. <welcome-file>index.jsp</welcome-file>
  30. </welcome-file-list>
  31. </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创建,并按照名称自动注入

day03_2spring3的更多相关文章

随机推荐

  1. vue element 表头添加斜线

    <template> <div class="app-container"> <el-table :data="tableData3&quo ...

  2. C#的多线程简洁笔记

    New Thread(()=>{}).Start(); //匿名线程 Thread Ntd = new Thread(T1); Ntd.IsBackground = true; //后台线程 N ...

  3. Objective-C编程 — 类和继承

    讲述面向对象中的一个重要概念——继承,使用继承 可以方便地在已有类的基础上进行扩展,定义一个具有父 类全部功能的新类. 父类和子类 我们在定义一个新类的时候,经常会遇到要定义的新类是某个类的扩展或者是 ...

  4. 教你一种简单方法给word和PDF格式的文件使用电子签名

      前言  虽然还处在非常时期,但很多公司已陆陆续续复工或准备复工.   上周,人事妹纸给了我们一份,企业员工健康情况申报表.具体如下 现在问题来了,需要本人签名,电脑打上去的不算,需要手写. 此时, ...

  5. 在香蕉派的树莓派系统上配置 Syncthing 自启动

    在香蕉派的树莓派系统上配置 Syncthing 自启动 —— 魏刘宏 2020 年 1 月 19 日 首先做个名词解释,” 香蕉派” 是国内一款山寨树莓派的硬件产品,” 树莓派系统” 指的是”rasp ...

  6. 爬取漫画DB上的《浪客行》

    漫画链接:https://www.manhuadb.com/manhua/324 建议:早上爬,速度较快. 天下无双宫本武藏 代码 # https://www.manhuadb.com/manhua/ ...

  7. C语言程序设计(实验一)

    实验项目:1.3.2,1.3.3,1.3.4,2.3.1,2.3.2 姓名:邹琼   实验地点:家 实验时间:2020年2月28日 一.实验目的与要求 1.实验目的 掌握DEVC++的安装方法,并实现 ...

  8. [大数据技术]datax的安装以及使用

    1.datax简述 DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.Ta ...

  9. Java安全笔记

    前言 后端接口开发中,涉及到用户私密信息(用户名.密码)等,我们不能传输明文,必须使用加密方式传输.这次政府项目中,安全测试组提出了明文传输漏洞,抽空研究了下Java加解密相关知识,记录下. 散列函数 ...

  10. 洛谷P1936 水晶灯火灵 P1775 古代人的难题_NOI导刊2010提高(02)【重题请做P1936】

    首先我要说明,此题(古代人的难题)与水晶灯火灵是一模一样的! 古代人的难题 (File IO): input:puzzle.in output:puzzle.out 时间限制: 1000 ms  空间 ...