• S2SH三大框架整合(配置及思想)


      花了一下午,终于将struts2.18+hibernate3.5.6+spring2.5.5进行整合,完成功能:在Oracle数据库的TCourse表中插入一条数据。

      Ⅰ,整合流程:web启动————》spring与struts2启动————》hibernate启动

      一,web.xml文件中配置spring与struts2;

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>    
    
    <!--spring容器加载 -->
    <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--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> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

    说明:
      1,spring容器加载:

      spring容器是以监听器的形式整合到web服务器中,伴随服务器的启动,容器也启动并创建相应的bean,其中:单例的bean会被创建(如:CourseDaoImpl,CourseServiceImpl等),多例的不会创建(如:struts2的action——CourseAction).

        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>

      这段代码表示加载spring的配置文件。

      2,struts2加载:

      struts2的加载是通过过滤器实现的,过滤器原理,没啥好说的。

      

      二,struts2与spring的集合:

      1,引入一个struts2提供的包:struts2-spring-plugin-2.1.8.1.jar。

      2,原理: 如果包解压开会看见一个 “struts-plugin.xml”的文件,如下

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
        
    <struts>
        <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
        
        <!--  Make the Spring object factory the automatic default -->
        <constant name="struts.objectFactory" value="spring" />
    
        <constant name="struts.class.reloading.watchList" value="" />
        <constant name="struts.class.reloading.acceptClasses" value="" />
        <constant name="struts.class.reloading.reloadConfig" value="false" />
    
        <package name="spring-default">
            <interceptors>
                <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
                <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
            </interceptors>
        </package>    
    </struts>

    说明:只需解释两行关键代码:   

    <!--    创建一个对象工厂,名字为spring(其class类型可能是spring的工厂的实现,或者将spring注入其中)-->

    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
     <!--  当需要对象的时候,从上面名为spring的工厂中去找-->
     <constant name="struts.objectFactory" value="spring" />

       三,spring与hibernate的整合:通过spring配置文件---->得到hibernate的SessionFactory---->得到HibernateTemplate

      1,spring配置文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/aop 
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
               http://www.springframework.org/schema/context
                   http://www.springframework.org/schema/context/spring-context-2.5.xsd
                   http://www.springframework.org/schema/tx 
                   http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
                   
        <!--dataSource  -->
        <bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="***}" />
            <property name="url" value="***" />
            <property name="username" value="***" />
            <property name="password" value="***" />
        </bean>
        
        <!--sessionFactory(猜想:spring在初始化时候将hibernate的session工厂注入,因为spring的类并非继承hibernate的)  -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
            <property name="dataSource" ref="dataSource" />
        <!--关键代码:加载hibernate配置文件-->
    <property name="configLocations"><value>classpath:hibernate.cfg.xml</value></property> </bean> <!--hibernateTemplate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- ======hibernate配置完毕,得到sessionFactory====分割线======= --> <bean id="courseDao" class="org.ssh.dao.impl.CourseDaoImpl"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> <bean id="courseService" class="org.ssh.service.impl.CourseServiceImpl"> <property name="courseDao" ref="courseDao"></property> </bean> <bean id="courseAction" class="org.ssh.action.CourseAction" scope="prototype"> <property name="courseService" ref="courseService"></property> </bean> </beans>

      说明:

      1,1  dataSoure对象----》取得数据库连接;

        dataSoure对象的类型BasicDataSource是Java.sql.DataSource接口的实现,实现此接口就可以得到一个数据库连接。

      1,2 sessionFactory对象----》取得hibernate的sessionFactory;

         类型为:org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean  表示支持annotation,如果没有annotation可以用:

    org.springframework.orm.hibernate3.LocalSessionFactoryBean

      即:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

      1,3 <property name="configLocations"><value>classpath:hibernate.cfg.xml</value></property>---->加载hibernate的配置文件

    四,项目文件结构

    Ⅱ,常见问题

      1,java.lang.NoClassDefFoundError: javax/persistence/EntityListeners

      在使用Hibernate3的时候,发现程序编译好了,在运行时总是抛出java.lang.NoClassDefFoundError: javax/persistence/EntityListeners异常,经查找是因为缺少ejb3-persistence.jar包。
    解决方法:类库中加入ejb3-persistence.jar。

    出处:http://javapub.iteye.com/blog/869380

      2,Exception in thread "main" java.lang.NoClassDefFoundError: javax/persistence/Cacheable

      少了包

    解决方案:加入hibernate-jpa-2.0-api-1.0.1.Final.jar

    出处http://javapub.iteye.com/blog/869380

      3,class org.hibernate.cfg.ExtendedMappings has interface org.hibernate.cfg.Mappings as super class

      hibernate3.5中的hibernate3.0包,已经包涵了hibernate-annotations,hibernate-commons-annotations.jar,commons-collections 这三个包,

    解决方法:要去掉commons-collections 一个包或者hibernate-annotations,hibernate-commons-annotations.jar两个包。

    附件:所需包

    http://download.csdn.net/detail/shall_we_talk/6245523

  • 相关阅读:
    持续集成(Continuous Integration),
    python的几个有趣点
    C++语言发展历史 & 基础知识
    [C++] Windows下的socket编程(这是一个简单的TCP/IP例子)
    office app 代码简析之 task pane app
    佳言玩具
    数据的图形可视化[R语言结果GML引发出来的调查]
    收藏的一系列教程帖子,很适合有一定基础,想要进阶的同学
    各种排序算法总结
    三层架构+存储过程实现分页
  • 原文地址:https://www.cnblogs.com/cfan1874/p/3313351.html
Copyright © 2020-2023  润新知