zoukankan      html  css  js  c++  java
  • SSH整合

    前言

    所谓的SSH,就是表现层使用Struts2,业务逻辑层使用Spring,数据访问层使用Hibernate,好了,废话不多说,开打开打,哦,不,是开讲开讲。

    前提,需要你熟悉Struts2,Spring,Hibernate的基本使用。

    步骤,第一步,添加繁琐的Jar包们,第二步:Spring整合Hibernate。第三步:Struts2整合Spring。

    -------------------------------------------------不知道起啥名分割线--------------------------------------------------------------------------------

    我在这四个文件中寻找jar包。

    ① 导入Struts jar包,struts-2.3.15.3appsstruts2-blankWEB-INFlib下的jar包

     

    上面落了一个Struts整和Spring的关键jar包:struts2-spring-plugin-2.3.15.3.jar,上面未列出。(共14个包)

    ②导入Spring jar包,一个是核心包:spring-framework-3.2.0.RELEASElibs

    另一个是依赖包:

       

    其中,spring-orm.jar就是Spring整合Hibernate的关建包。(共13个包)

    注意:若单独引用Spring,还需引入一个依赖包:com.springsource.org.apache.commons.logging-1.1.1.jar,但是由于前面Struts2引入了commons-logging-1.1.3.jar包,所以不需要再次引用。其实,它们是一样的代码,只是Spring将其改了名字,自己可以查看代码就会发现了。

    ③导入Hibernate Jar包

    ehcache.jar包是Hibernate的二级缓存包,其依赖backport-util-concurrent.jar,和commons-logging.jar包。(共10个包)

    Hibernate中也有一个javassist-3.12.0.GA.jar包,Struts2中已经引用了javassist-3.11.0.GA.jar,所有我替换成了12版本。上面未列出。

    ④当然,最后还有一个jar包,那就是mysql-connector-java-5.0.8-bin.jar

    到此为止,共添加了38个包,包不再改动。

    ----------------------------------------情景设置分割线--------------------------------------------------------------------------------------------------

    业务:用户添加

    实体类:User(两个字段:name和age)

    ------------------------------[Spring+Hibernate]分割线-----------------------------------------------------------------------------------------------

    Spring开始整合Hibernate,众所周知,这两个框架都有自己的配置文件,分别是:Spring的applicationContext.xml(名字任意),Hibernate的配置文件与映射文件hibernate.cfg.xml与【实体类】.hbm.xml文件。整合的结果就是Hibernate的配置文件消失(当然它的配置信息跑到了Spring的配置文件中去了)。

    程序代码:

    //DAL层的用户接口
    public interface UserDao {
        boolean insert(User user);
    }
    //DAL层的用户接口的具体实现
    public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
        @Override
        public boolean insert(User user) {
            HibernateTemplate s=this.getHibernateTemplate();
            s.save(user);
            return true;
        }
    }

    applicationContext.xml文件配置:(User.hbm.xml不多说,没区别)

        <!-- 使用C3P0得到数据源-->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
            <property name="user" value="root"></property>
            <property name="password" value="123456"></property>
        </bean>
        <!-- 使用FactoryBean创建Spring得到 SessionFactory -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
              <!-- 把hibernate.cfg.xml文件中的配置信息注入进来,从而可以删掉配置文件 -->
              <property name="dataSource" ref="dataSource"></property>
              <property name="hibernateProperties">
                      <props>
                          <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                          <prop key="javax.persistence.validation.mode">none</prop>
                          <prop key="hibernate.show_sql">true</prop>
                          <prop key="hibernate.format_sql">true</prop>
                          <prop key="hibernate.hbm2ddl.auto">update</prop>
                          <prop key="hibernate.current_session_context_class">thread</prop>
                      </props>
              </property>
              <property name="mappingLocations" value="classpath:king/domain/User.hbm.xml"></property>
        </bean>
        <!-- 目的:创建DAO -->
        <bean id="userDao" class="king.dao.impl.UserDaoImpl">
              <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <!-- Spring的事务管理之Hibernate,需要注入SessionFactory -->
        <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <!-- 通知 -->
        <tx:advice id="adviceId" transaction-manager="txManager">
             <tx:attributes>
                 <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
             </tx:attributes>
        </tx:advice>
        <aop:config>
            <aop:advisor advice-ref="adviceId" pointcut="execution(* king.dao.impl.*.*(..))"/>
        </aop:config>

    测试代码:

        @Test
        public void test1(){
            ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao user=app.getBean(UserDao.class);
            User u=new User();
            u.setAge(1);
            u.setName("King");
            user.insert(u);
            app.close();
        }

    这样就实现了Spring与Hibernate的整合,去掉了hibernate.cfg.xml文件,由原来直接操作SessionFactory,Session到现在我们操作Spring提供的类来操作。

    解读:

    • 1

    之前我们使用Spring的JdbcTemplate时,需要DAL层对象继承JdbcDaoSupport,而我们整合了Hibernate,就需要DAO对象继承HibernateDaoSupport。而我们继承这个类是为了得到HibernateTemplate对象,来操作数据库,HibernateTemplate使用起来和Session类似,其底层就是采用Session。而数据源等等各种配置肯定在我们得到HibernateTemplate对象之前啦,所以这时肯定就需要注入【原来写在hibernate.cfg.xml中的配置信息】。说到HibernateDaoSupport的注入,要么注入SessionFactory,要么注入HibernateTemplate。这里我们注入SessionFactory。可以在上面的配置文件中看出。

    • 2  

    说一下applicationContext.xml文件,我们要得到UserDaoImpl对象,需要往里面注入SessionFactory。我们要得到SessionFactory,需要往里面注入DataSource与各种配置信息。这里的数据源(连接池)我们采用C3P0。

    说一下UserDaoImpl对象的生成,我们得到的肯定是代理对象,因为下面已经加上了<aop:config></aop:config>标签,所以是全自动方式的代理对象,是基于接口的JDK代理对象方式生成,当然也可以设置为CGlib生成代理对象,需要添加额外配置<proxy-target-class="true">

    • 4

    这里的代理对象的通知就是事务。通过txManager来对目标方法的前后添加【开启事务】【提交事务/回滚事务等等操作】,然后返回代理对象。这时,我们所有的操作都是在事务之中,只要发生异常,事务就会回滚。这里是声明式事务。

    • 5

    说一下我们加的几个包的作用。

    Spring-orm.jar  它就是Spring整合Hibernate的关键,它依赖spring-jdbc.jar包,因为它会用到其中的LobHandler类。

    Spring-web.jar  它是让Tomcat容器加载Spring配置文件的关键。因为我们需要容器为我们加载配置文件,创建代理对象。

    slf4j-api.jar       SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层,它允许你在后台使用任意一个日志类库。如果是在编写供内外部都可以使用的API或者通用类库,那么你真不会希望使用你类库的客户端必须使用你选择的日志类库。所以我们若要使用log4j,则还需引入slf4j-log4j.jar包。

    ----------------------------------------[Struts2+Spring]整合分割线-------------------------------------------------------------------

    struts.xml:

    <struts>
        <constant name="struts.devMode" value="true"/>
        <package name="User" namespace="/User" extends="struts-default">
             <!-- action的实例由struts来创建 -->
             <action name="AddUser" class="king.action.UserAction" method="addUser">
                     <result name="success" type="redirect">/success.html</result>
             </action>
        </package>
    </struts>

    web.xml:

      <!-- 这两处配置是Spring为了整合Web,这是因为原来手动加载.xml文件,现在需要Tomcat启动加载.xml文件,
           所以需要Spring整合Web,让Tomcat加载配置文件,来实现注入,生成代理等等各种功能。spring-web.jar包在起作用。 -->    
      <!-- 很多Spring的jar包依赖commons-logging.jar包 
           Commons-logging.jar的目的是为“所有的Java日志实现”提供一个统一的接口。   -->                     
      <!-- 配置spring配置文件的位置 -->
      <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
      </context-param>
      <!-- 如果只配置spring的监听,则会加载默认的位置:[WEB-INF/applicationContext.xml]切记切记 
           作用:启动Web容器时,自动装配ApplicationContext的配置信息。   -->
      <listener>
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    <!-- struts的过滤器 --> <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>

    UserAction类:

    /**
     * ActionSupport出自xwork-core.jar
     * 
     * 疑问:userDao是谁注入的?
     * 答案:struts2-spring-plugin.jar中的struts-plugin.xml,设置默认的对象工厂为Spring,由Spring进行注入。
     * 
     * @author King
     *
     */
    public class UserAction extends ActionSupport implements ModelDriven<User> {
        private static final long serialVersionUID = 1885943501464870512L;
        private User user=new User();
        @Override
        public User getModel() {
            return user;
        }
        private UserDao userDao;
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
        public String addUser(){
            boolean isOk=userDao.insert(user);
            if(isOk){
                return "success";
            }else{
                return "fail";
            }
        }
    }

    这样我们就实现了Struts2+Spring的整合,关键之处在于web.xml的配置和struts2-spring-plugin.jar中的struts-plugin.xml,两个配置文件。

    解读:

    • 1

    Struts2有一系列的配置文件按照一定顺序加载 1 :default.propertities  2:struts-default.xml  3:struts-plugin.xml  4 :struts.xml。

    而我们引入了struts2-spring-plugin.jar中,其中有struts-plugin.xml,里面设置了对象工厂由Spring来创建。所以明明这里的UserAction是Struts2创建的,但是UserDao对象是由Spring注入的,注意:<bean id="userDao"></bean>与代码中    private UserDao userDao;   名字要相同,这样Spring才能注入,否则会出现空指针异常。

    • 2

    之前我们测试类中是手动加载applicationContext.xml文件,得到其中的bean,而整合了Struts2,我们发现没有这个过程了,而Spring照样正常工作,这是为啥呢?

    这就是上面我们配置监听类<listener-class>ContextLoaderListener</listener-class>的作用:加载applicationContext.xml文件,所以我们没有手动加载配置文件而Spring正常工作的原因。你可以看,这个类所属的包就是spring-web.jar,所以这个包也是整合它们的关键。

    好了,到现在为止,SSH三大框架整合完毕。

  • 相关阅读:
    SEVERE: One or more listeners failed to start.
    springboot junit单元测试报错
    mybatis 日期查询datetime
    设计模式详解之程序设计六大原则
    非maven项目 idea project structure
    jdbcType DATE和TIMESTAMP区别
    mysql 保存23:59:59 自动加一秒
    1、在linux服务器centos虚拟机搭建nginx网站
    QRCode 生成二维码
    CSS3的calc()使用
  • 原文地址:https://www.cnblogs.com/kingofkai/p/6052190.html
Copyright © 2011-2022 走看看