spring+hibernate+struts2; spring +mybaits+struts2框架分析和搭建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lj_dreamone/article/details/52440760

一:spring+hibernate +struts框架理解
1. 框架简介:首先,我们要明确的是,ssh并不是一个单独的框架,而是由三个框架的一种集成,用于构建灵活多变,易于拓展的B/S web应用程序。
SSH从分工职责上面可以分成四层:表示层,业务逻辑层,数据持久层和模型(实体)。
struts2作为应用程序的整体基础架构,负责MVC的分离工作,控制业务跳转,hibernate负责对持久层进行支持,Spring作为一个轻量级的Ioc容器,主要负责两方面的工作。一方面负责查找,定位,创建,和管理对象以及 对象关系之间的依赖关系。另一方面,spring可以给hibernate和struts提供很好的支持。
ssh应用程序基本工作流程:
1.在表示层中,通过jsp页面实现页面之间的交互,通过发送请求(request)和接受响应(response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。
2.在业务层中,管理呜呜组件的spring Ioc容器负责向Action提供业务模型组件和该组件的协同对象数据处理组件完成业务逻辑,并提供事物处理,
3.在持久层中,则依赖hibernate的对对象化映射(orm)和数据库交互,处理dao组件请求的数据,并返回处理结果。
优点:实现试图,控制器,模型的彻底分离,而且还实现了业务逻辑层和数据持久层的分离,这样前端进行修改,后端只需要进行很小的改变即可,并且数据库的改变也不会对前端产生影响,提高了系统的可复用性,而且降低了各层之间的耦合性,更适合进行团队开发。
spring是一个轻量级的Ioc和Aop的轻量级框架,特性:Ioc容器,轻量,面向切面,面向接口,促进其他框架。Spring的以上特性使得开发人员使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
struts 采用java Servlert/jsp技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品
struts工作流程:
当web容器收到请求(httpServletRequest),它将请求传递给一个标准的过滤链, 流程过滤器(ActionContextCleanUp)然后经过Other filters(SiteMesh ,etc),
调用核心控制器FilterDispatcher,然后它调用ActionMapper确定请求哪个action,ActionMapper返回一个收集Action详细信息的ActionMaping对象。
接下来FilterDispatcher将控制权委派给ActionProxy,ActionProxy调用配置管理器(ConfigurationManager) 从配置文件中读取配置信息(struts.xml),然后创建ActionInvocation对象,ActionInvocation在调用Action之前会依次的调用所用配置拦截器(Interceptor N) 一旦执行结果返回结果字符串ActionInvocation负责查找结果字符串对应的(Result)然后执行这个Result Result会调用一些模版(JSP)

来呈现页面,之后拦截器(Interceptor N)会在被执行(顺序和Action执行之前相反)最后响应(HttpServletResponse)被返回在web.xml中配置的那些过滤器和(核心控制器)(FilterDispatcher)。
Struts 是MVC的一种实现,它将 Servlet和 JSP 标记(属于 J2EE 规范)用作实现的一部分。Struts继承了MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展,减弱了业务逻辑接口和数据接口之间的耦合,以及让视图层更富于变化

另外, struts具有页面导航功能,使系统的脉络更加清晰。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。
hibernate:Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任
hibernate核心接口:
session , sessionFactory, Configuration, Transaction ,Query
Criteria
Hibernate执行流程
这里写图片描述
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。

2、Hibernate是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作,将软件开发人员从大量相同的数据持久层相关编程工作中解放出来,使开发更对象化了。

3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。

4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。
框架搭建:
环境:Win7(64) + eclipse(64)+ tomcat7(64)+ jdk7(64)环境配置
1.下载Jar包,在官网下载hibernate,sturts,spring对应版本jar包
2.创建web项目ssh
3.将对应jar包放入WebContent/WEB-INT/lib目录下
4.配置hibernater.cfg.xml

 <hibernate-configuration>
 <session-factory name="">
  <!-- 放入连接数据库jar包 
                                   连接驱动
                           连接字符串
                           账户 
                           密碼 
                           展示sql語句 
                           数据库方言                             
                           自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。                                             
          -->
  <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
  <property name="hibernate.connection.password">ssh</property>
  <property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
  <property name="hibernate.connection.username">ssh</property>
  <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
  <property name="hibernate.show_sql">true</property>
  <property name="hibernate.hbm2ddl.auto">update</property>
  <property name="hibernate.format">true</property>

  <!-- 加载POJO类或者.xml映射 -->
  <mapping class="com.jialin.entity.User"/>
 </session-factory>
</hibernate-configuration>

5.配置applicationContext.xml

<!-- 启用spring注解支持 -->
<context:annotation-config />

如果要把数据源之类的东西配置在spring配置文件里面
    <!--配数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
        <property name="username" value="ssh" />
        <property name="password" value="ssh" />
    </bean>
    定义sessionFactory
        <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="default_schema">ssh</prop>

            </props>
        </property>
    <!-- 如果使用配置文件 -->
    <!-- <property name="mappingLocations"> <list> <value>classpath:com/jialin/entity/User.hbm.xml</value> 
        </list> </property> -->
        <property name="annotatedClasses">
            <list>
                <value>com.jialin.entity.User</value>
            </list>
        </property>

    </bean>

配置事物管理器

<!-- 配置事务管理器 -->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!-- 事务的传播特性 -->
    <tx:advice id="txadvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="modify*" propagation="REQUIRED" />

             <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->
            <tx:method name="*" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>
<!-- 那些类那些方法使用事务 -->
    <aop:config>
      <!-- 只对业务逻辑层实施事务 -->
        <aop:pointcut id="allManagerMethod"
            expression="execution(* com.jialin.service.*.*(..))" />
        <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txadvice" />
    </aop:config>

6.配置struts.xml

<!-- 将Action的创建交给spring来管理 -->  
    <constant name="struts.objectFactory" value="spring" />  

    <!-- 更改struts2请求Action的后缀名,默认为action。若想去掉后缀,设为","即可 -->
    <constant name="struts.action.extension" value=","></constant>

引用其他struts文件

<!-- 包含的配置文件 -->
    <include file="/config/struts-user.xml"></include>
<package name="abstract_struts" abstract="true" extends="struts-default"
        namespace="/">
        <interceptors>
            <interceptor name="checkLogin" class="checkLoginInterceptor" />
            <interceptor-stack name="myInterceptor">
                <interceptor-ref name="checkLogin" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>

        <!-- <default-interceptor-ref name="myInterceptor" /> -->

        <global-results>
            <result name="checkLoginFail">/login.jsp</result>
        </global-results>
    </package>
<!-- 与spring集成的写法,action等交予spring管理 -->
    <package name="loginAction" namespace="/" extends="abstract_struts">

        <action name="login" class="loginAction">
            <result name="success" type="redirect">userMain</result>
            <result name="fail">/fail.jsp</result>
        </action>

        <!-- 该action只负责跳转,用struts提供的ActionSupport -->
        <action name="userMain" class="userMainAction">
            <result name="success">/userMain.jsp</result>
            <interceptor-ref name="myInterceptor" />
        </action>
    </package>

    <package name="userActions" namespace="/user" extends="abstract_struts">
        <action name="*_*" class="userAction" method="{1}">
            <result name="success" type="redirect">/{2}.jsp</result>
            <result name="fail">/fail.jsp</result>
            <interceptor-ref name="myInterceptor" />
        </action>
    </package>

猜你喜欢

转载自blog.csdn.net/lj_dreamone/article/details/52440760