• 详解SSH 框架中对象调用流程


    摘要:SSH=Struts+Spring+Hibernate

    SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。

    集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。

    SSH框架的系统是基于MVC的。Struts 是一个很好的MVC框架,主要技术是Servlet和Jsp。Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明。基于Struts开发可以简化开发难度,提高开发效率。

    Spring 提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦。

    Hibernate 是用来持久化数据的,提供了完全面向对象的数据库操作。Hibernate对JDBC进行了非常轻量级的封装,它使得与关系型数据库打交道变得非常轻松。

    在Struts+Spring+Hibernate系统中,对象之间的调用流程如下:

     Struts——>Spring——>Hibernate

     JSP——>Action——>Service——>DAO——>Hibernate

    比如:

    1.Spring的配置文件bean.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans
            xmlns="http://www.springframework.org/schema/beans"
            xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"
            xmlns:tx="http://www.springframework.org/schema/tx">
    
    
        <bean id="dataSource"
              class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
            <property name="jdbcUrl"
                      value="jdbc:mysql://localhost:3306/samblog?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true">
            </property>
            <property name="user" value="root"></property>
            <property name="password" value="123456"></property>
            <property name="driverClass" value="org.gjt.mm.mysql.Driver"/>
        </bean>
        <bean id="sessionFactory"
              class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource">
                <ref bean="dataSource"/>
            </property>
            <property name="hibernateProperties">
                <value>
                    hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
                    hibernate.hbm2ddl.auto=update
                    hibernate.show_sql=false
                    hibernate.format_sql=false
                </value>
            </property>
            <property name="mappingResources">
                <list>
                    <value>site/sambloger/domain/Users.hbm.xml</value>
                    <value>site/sambloger/domain/Blog.hbm.xml</value>
                    <value>site/sambloger/domain/Category.hbm.xml</value>
                    <value>site/sambloger/domain/Comment.hbm.xml</value>
                </list>
            </property>
        </bean>
    
        <bean id="transactionManager"
              class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
        <!-- 配置Blog  spring进行管理  服务层直接调用实现与数据库的CRUD-->
        <bean id="blogDao" class="site.sambloger.dao.impl.BlogDAOImpl">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <bean id="blogService" class="site.sambloger.service.impl.BlogServiceImpl" scope="prototype">
            <property name="blogDao" ref="blogDao"/>
        </bean>
        <bean id="blogAction" class="site.sambloger.action.BlogAction">
            <property name="blogService" ref="blogService"/>
            <property name="commentService" ref="commentService"/>
        </bean>
    
        <!-- 配置Comment -->
        <bean id="commentDao" class="site.sambloger.dao.impl.CommentDAOImpl">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        <bean id="commentService" class="site.sambloger.service.impl.CommentServiceImpl" scope="prototype">
            <property name="commentDao" ref="commentDao"/>
        </bean>
        <bean id="commentAction" class="site.sambloger.action.CommentAction">
            <property name="commentService" ref="commentService"/>
            <property name="blogService" ref="blogService"/>
        </bean>
    
        <!-- 配置Users -->
        <bean id="usersDao" class="site.sambloger.dao.impl.UsersDAOImpl">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
        <bean id="usersService" class="site.sambloger.service.impl.UsersServiceImpl" scope="prototype">
            <property name="usersDao" ref="usersDao"/>
        </bean>
        <bean id="usersAction" class="site.sambloger.action.UsersAction">
            <property name="userService" ref="usersService"></property>
        </bean>
    </beans>

    2.Struts的配置文件 struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
        <package name="samblog" extends="struts-default" namespace="/">
                 <action name="init" class="blogAction" method="init">
                        <result name="success">/bloglist.jsp</result>
                </action>
                <action name="getBlog" class="blogAction" method="getBlog">
                        <result name="success">/displayBlog.jsp</result>
                </action> 
                <action name="getAllNote" class="blogAction" method="getAllNote">
                    <result name="success">/notelist.jsp</result>
                </action>
                <action name="addComment" class="commentAction" method="addComment">
                    <result name="success"  type="redirect">/getBlog</result>
                </action>
        </package>
    </struts>   

    3.Hibernate其中的一个配置文件:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 
        Mapping file autogenerated by MyEclipse Persistence Tools-->
    <hibernate-mapping>
        <class name="site.sambloger.domain.Blog" table="blog">
            <!--id标签表示映射到数据库中是作为主键 其他property表示普通键-->
            <id name="id" type="java.lang.Integer">
                <column name="id" />
                <generator class="increment" />
            </id>
    <!--该标签加N方 会有一个字段叫category_id作为外键参照1(Category)的主键字段 并且用来存储这个主键的信息-->
            <many-to-one name="category" class="site.sambloger.domain.Category"  lazy="false" cascade="all">
                <column name="category_id" not-null="true" />
            </many-to-one>
    
            <property name="title" type="java.lang.String">
                <column name="title" length="400" not-null="true" />
            </property>
    
            <property name="content" type="java.lang.String">
                <column name="content" length="4000" not-null="true" />
            </property>
    
            <property name="createdTime" type="java.util.Date">
                <column name="created_time" length="10" not-null="true" />
            </property>
    <!--在一对多的关联中,在一的一方(Blog)设置inverse=”true”让多的一方来维护关联关系更有助于优化,因为可以减少执行update语句-->
            <set name="comments" inverse="true">
                <key>
                    <column name="blog_id" not-null="true" />
                </key>
                <one-to-many class="site.sambloger.domain.Comment" />
            </set>
        </class>
    </hibernate-mapping>

    Spring框架的作用和好处:

    Spring框架提供了一个容器,该容器可以管理应用程序的组件,还提供了IoC和AoP机制,实现组件之间解耦,提高程序结构的灵活性,增强系统的可维护和可扩展性。

    在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。利用AoP机制实现事务管理、以及共通功能的切入等。

    功能是整合,好处是解耦。

    Hibernate中操作并发处理(乐观锁和悲观锁)

    Hibernate框架可以使用锁的机制来解决操作并发。

    a.悲观锁

    在数据查询出来时,就给数据加一个锁,锁定。这样其他用户再执行删、改操作时不允许。当占用着事务结束,锁会自动解除。

    Hibernate采用的是数据库锁机制实现悲观锁控制。

    缺点:将并发用户操作同步开,一个一个处理。当一个用户处理时间比较长时,效率会比较低。

    b.乐观锁

    允许同时更新提交,但是最快的会成功,慢的失败。

    在记录中追加一个字段值,用该字段值当做版本。当最先提交者提交后,会自动将版本字段值提升,这样其他用户提交,会发现版本低于数据库记录目前版本,因此抛出异常提示失败。

    特点:允许用户同时处理,但只能有一个成功,其他失败,以异常方式提示。

    SSH工作流程

    a.启动服务器,加载工程以及web.xml.

    (实例化Lisener,Filter等组件,将Spring容器和Struts2控制创建)

    b.客户端发送请求,所有请求进入Struts2控制器。控制器根据请求类型不同,分别处理。

    (action请求,*.action会进入struts.xml寻找<action>配置.

    其他请求,*.jsp会直接调用请求资源,生成响应信息)

    c.Struts2控制器根据<action>配置调用一个Action对象处理。

    整合方法一:将Action交给Spring容器

    (Action对象由struts2-spring-plugin.jar插件提供的

    StrutsSpringObjectFactory负责去Spring容器获取)

    整合方法二:将Action置于Spring容器之外

    (Action对象由struts2-spring-plugin.jar插件提供的

    StrutsSpringObjectFactory负责创建,然后到Spring容器中寻找与Action属性匹配的Bean对象,给Action对象注入。(默认采用名称匹配规则)

    d.Struts2控制器执行defaultStack拦截器、Action对象、Result等组件处理.

    e.执行Action的execute业务方法时,如果使用Service或DAO采用Spring的IoC机制调用。

    f.执行Result生成响应信息,执行后续拦截器处理

    g.将响应信息输出。

    本文分享自华为云社区《SSH 组合框架模式小知识分享》,原文作者:Jack20 。

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    Redis面试题
    redis基本操作
    pwd命令和cd命令
    ls命令详解
    Python时间操作所相关
    Nginx
    网络相关知识
    LeetCode 刷题记录(6-10题)
    绕过校园网Web认证
    Java相关知识
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/14428875.html
Copyright © 2020-2023  润新知