• SSH整合总结(OA项目)


    代码规范

    环境搭建

    Struts2
    jar包
    struts.xml, web.xml

    Hibernate
    jar包:核心包, 必须包, jpa, c3p0, jdbc
    hibernate.cfg.xml, *.hbm.xml


    Spring
    jar包
    appicationContext.xml/beans.xml

    Spring与Struts2整合
    1,在web.xml中配置Spring的监听器
    2,加一个jar包以及整合web项目jar

    Hibernate与Spring整合
    1,管理SessionFactory实例(只需要一个)
    2,声明式事务管理

    3,加入整合jar包

    --------------------

    struts与spring整合前 首先单独测试struts

    struts.xml

     1 <struts>
     2     <constant name="struts.enable.DynamicMethodInvocation" value="true" />
     3     <!-- 配置为开发模式,修改配置文件时,立即生效,无需重新部署项目重启服务器 -->
     4     <constant name="struts.devMode" value="true" />
     5     <!-- 配置url的后缀名必须为.action 如果不配置 则url书写时可有可无  struts.action.extension=action,,-->
     6     <constant name="struts.action.extension" value="action"></constant>
     7     <!-- 配置为simple 自己控制样式 -->
     8     <constant name="struts.ui.theme" value="simple"></constant>
     9     
    10     <package name="default" namespace="/" extends="struts-default">
    11         <!-- struts未与spring整合  class属性的值写的是类的全路径-->
    12         <action name="test_*" class="org.action.T" method="{1}">
    13             <result name="success">/test.jsp</result>
    14         </action>
    15     </package>
    16 </struts>

    web.xml

     1   <!--struts2核心过滤器-->
     2   <filter>
     3      <filter-name>struts2</filter-name>
     4      <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>      
     5      <init-param>
     6           <param-name>actionPackages</param-name>
     7           <param-value>com.mycompany.myapp.actions</param-value>
     8      </init-param>    
     9   </filter>
    10   
    11   <filter-mapping>
    12       <filter-name>struts2</filter-name>
    13        <url-pattern>/*</url-pattern>
    14   </filter-mapping>

    action

    测试:http://localhost:8888/ItcastOA/test.action

     

    接下来测试spring

    在spring核心配置文件中开启自动扫描与装配bean对象

    action中添加注解

    执行测试

    接下来测试spring与struts能否整合成功

    1,在web.xml中配置Spring的监听器
    2,加一个struts和spring整合jar包以及整合web项目的jar

    struts中修改

     测试http://localhost:8888/ItcastOA2/test.action

    hibernate与spring整合测试

    1,管理SessionFactory实例(只需要一个)
    2,声明式事务管理

    3,加入整合jar包

    首先测试sessionfactory是否配置成功,能够正常得到(如果sessionFactory配置有问题,那么就得不到)

    spirng核心配置文件:

     1 <!-- 引入外部的properties文件 -->
     2     <context:property-placeholder location="classpath:jdbc.properties"/>
     3 
     4     <!-- 配置sessionFactory -->
     5     <bean id="sessionFactory"
     6         class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
     7         <property name="configLocations" value="classpath:hibernate.cfg.xml"></property>
     8         <!-- 配置c3p0链接池 因为该datasource只有该工厂使用  所以可以配置一个内部bean-->
     9         <property name="dataSource">
    10             <!-- 内部使用的bean 不需要id属性 -->
    11             <bean class="com.mchange.v2.c3p0.ComboPooledDataSource">
    12                 <!-- 必要属性 引入外部的properties文件 使用其中配置的值-->
    13                 <property name="jdbcUrl" value="${jdbcUrl}"></property>
    14                 <property name="driverClass" value="${driverClass}"></property>
    15                 <property name="user" value="${user}"></property>
    16                 <property name="password" value="${password}"></property>
    17                 <!-- 其他属性配置 -->
    18                 <!-- 初始化时获取3个链接 取值应在minPoolSize和maxPoolSize之间  default=3 -->
    19                 <property name="initialPoolSize" value="3"></property>
    20                 <!-- 连接池中保留的最小链接数  default=3-->
    21                 <property name="minPoolSize" value="3"></property>
    22                 <!-- 连接池中保留的最大链接数 default=15-->
    23                 <property name="maxPoolSize" value="5"></property>
    24                 <!-- 当连接池中的连接耗尽的时候 c3p0一次同时获取的连接数  default=3-->
    25                 <property name="acquireIncrement" value="3"></property>
    26                 <!-- 控制数据源内加载的PreparedStatement数量。如果maxStatement与maxStetementsPerConnection均为0,则缓存关闭。default=0 -->
    27                 <property name="maxStatements" value="8"></property>
    28                 <!-- maxStatemPerConnection定义了连接池内单个链接所拥有的最大缓存statements数。default=0 -->
    29                 <property name="maxStatementsPerConnection" value="5"></property>
    30                 <!-- 最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。default=0 -->
    31                 <property name="maxIdleTime" value="1800"></property>
    32             </bean>
    33         </property>
    34     </bean>

     测试sessionfactory

     接下来测试事务管理

    在spring核心配置文件中添加

    1     <!-- 配置事务管理 采用注解的方式-->
    2     <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    3         <property name="sessionFactory" ref="sessionFactory"></property>
    4     </bean>
    5     <!-- 注解驱动 -->
    6     <tx:annotation-driven transaction-manager="transactionManager"/>

    创建一个简单的user实体类以及对应的映射文件

    创建一个类SaveTwoUser

     1 package test;
     2 import javax.annotation.Resource;
     3 import org.hibernate.Session;
     4 import org.hibernate.SessionFactory;
     5 import org.model.User;
     6 import org.springframework.stereotype.Service;
     7 import org.springframework.transaction.annotation.Transactional;
     8 //如果想注入容器中的对象sessionFactory 当前的类必须在容器中 spring不能给 不在容器中的对象注入属性
     9 //(例如配置方式中 先配置action 然后配置service action中才能注入配置的service 因为他们在一个容器中  spring配置文件中管理生成的对象都是在容器中的)
    10 //所以声明一个bean对象在容器中 名字默认为对象的名称SaveTwoUser
    11 //@Service("saveTwoUser")效果和@Service一样 注意类名的第一个字母是小写的
    12 @Service
    13 public class SaveTwoUser {
    14     //sessionFactory已经配置好了  在容器中  使用时 采使用注解的方式进行注入 则不用在配置set方法了  如果采用配置的方式
    15     //那么这里声明sessionFactory之后 创建set方法  在配置文件中进行注入<property name="sessionFactory" ref=""></property>
    16     //注入bean资源使用@Resource 先按照"sessionFactory"去spring配置文件中去找  找不到 再按照类型去找
    17     @Resource
    18     private SessionFactory sessionFactory;
    19     //private ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
    20     
    21     //加注解  开启事务
    22     @Transactional
    23     public void save(){
    24         //这里只能使用getCurrentSession而不能使用opensession,opensession得到的是一个新的session 没有事务
    25         //而getCurrentSession得到的是外边已经管理好事务的session 使用框架操作底层数据时 使用的session也是与本地线程绑定的currentSession
    26         if(sessionFactory!=null){
    27             Session session=sessionFactory.getCurrentSession();
    28             if(session!=null){
    29                 session.save(new User());
    30                 int i=10/0;//这里会出现异常  观察是否保存的有对象 正产情况下 事务回滚 不保存任何对象
    31                 session.save(new User());
    32             }
    33         }else{
    34             System.out.println("sessionfactory为空。。。。");
    35         }
    36     }
    37 }

     测试

     

     查看数据库

    然后把异常注释  再次执行

     

    查看数据库

    可以看到正确插入了(为什么不从1开始  因为第一插入了一条数据  但是由于事务回滚  插入的记录又被删除了 所以第一条记录是被占用过的 但再次插入的时候  是从第二条开始的)

    最后进行一次最终的测试(struts,hibernate,spring整体整合)

    测试:http://localhost:8888/ItcastOA2/test.action

     

    以上就完成了三大框架的整合



  • 相关阅读:
    文件管理后章
    文件管理前章
    文本处理三剑客
    匿名函数以及应用、三元表达式
    认识docker以及常用操作
    字符编码
    赋值与深浅拷贝
    Python基本运算符
    LVM配置
    Linux磁盘管理
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/7188541.html
Copyright © 2020-2023  润新知