摘要: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 。

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

详解SSH 框架中对象调用流程的更多相关文章

  1. 详解SSH框架的原理和优点

    Struts的原理和优点.        Struts工作原理  MVC即Model-View-Controller的缩写,是一种常用的设计模式.MVC 减弱了业务逻辑接口和数据接口之间的耦合,以及让 ...

  2. 详解工作流框架Activiti的服务架构和组件

    摘要:通过这篇文章,可以对工作流有一个基本的认识,为后续工作流框架Activiti的学习打下坚实的基础. 本文分享自华为云社区<BPMN工作流的基本概念!详解工作流框架Activiti的服务架构 ...

  3. 在SSH框架中使用Spring的好处(转)

    以下是我总结下今天笔试中SSh中的总结: 在SSH框架中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不 ...

  4. 详解Executor框架

    在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源.同时,为每一个任务创建一个新线程来执行 ...

  5. 详解jquery插件中(function ( $, window, document, undefined )的作用。

    1.(function(window,undefined){})(window); Q:(function(window,undefined){})(window);中为什么要将window和unde ...

  6. 详解WebService开发中四个常见问题(1)

    详解WebService开发中四个常见问题(1)   WebService开发中经常会碰到诸如WebService与方法重载.循环引用.数据被穿该等等问题.本文会给大家一些很好的解决方法. AD:WO ...

  7. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  8. SSH框架中配置log4j的方法

    SSH框架中使用log4j的方便之处 1. 动态的改变记录级别和策略,即修改log4j.properties,不需要重启Web应用,这需要在web.xml中设置一下.2. 把log文件定在 /WEB- ...

  9. 详解 Go 语言中的 time.Duration 类型

    swardsman详解 Go 语言中的 time.Duration 类型swardsman · 2018-03-17 23:10:54 · 5448 次点击 · 预计阅读时间 5 分钟 · 31分钟之 ...

随机推荐

  1. docker版mysql的使用和配置(1)——docker的基本操作

    最近实在是忙成狗,其他的内容等稍微闲一点了一起更新. 这篇主要是讲docker版的mysql的使用和配置信息.因为实习公司需要搞一个docker做测试环境用,还需要包括基本的依赖.最重要的是,因为这个 ...

  2. 基础知识——TCP协议

    七层网络模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层. 五层网络模型: 1. 应用层:确定进程之间通信的性质以满足用户需求.(各种传输协议) 2. 运输层:负责主机间不同进程的通信 ...

  3. CVE-2018-4407(IOS缓冲区溢出漏洞)exp

    CVE-2018-4407为ios缓冲区溢出漏洞 exp: import scapyfrom scapy.all import * send(IP(dst="同一局域网内目标Ip" ...

  4. 【从零开始撸一个App】RecyclerView的使用

    目标 前段时间打造了一款简单易用功能全面的图片上传组件,现在就来将上传的图片以图片集的形式展现到App上.出于用户体验考虑,加载新图片采用[无限]滚动模式,Android平台上我们优选Recycler ...

  5. Commons Collections1分析

    0x01.基础知识铺垫 接下来这个过程将涉及到几个接口和类 1.LazyMap 我们通过下⾯这⾏代码对innerMap进⾏修饰,传出的outerMap即是修饰后的Map: Map outerMap = ...

  6. 提升NginxTLS/SSL HTTPS 性能的7条优化建议

    自2018年7月起,谷歌浏览器开始将" HTTP"网站标记为"不安全".在过去的几年中,互联网已经迅速过渡到HTTPS,Chrome浏览器的流量超过70%,并且 ...

  7. AcWing 250 磁力快(分块)

    题目传送门 在一片广袤无垠的原野上,散落着N块磁石. 每个磁石的性质可以用一个五元组(x,y,m,p,r)描述,其中x,y表示其坐标,m是磁石的质量,p是磁力,r是吸引半径. 若磁石A与磁石B的距离不 ...

  8. 2019牛客暑期多校训练营(第七场)H.Pair(数位dp)

    题意:给你三个数A,B,C 现在要你找到满足  A and B >C 或者 A 异或 B < C 的对数. 思路:我们可以走对立面 把既满足 A and B <= C 也满足 A 异 ...

  9. C++快读

    写在前面: 一个小专题 完全非原创,不知道原来是谁提出的 诈尸 http://thepingaslord.deviantart.com/art/The-Evening-Prior-312446336 ...

  10. Codeforces Round #479 (Div. 3) C. Less or Equal (排序,贪心)

    题意:有一个长度为\(n\)的序列,要求在\([1,10^9]\)中找一个\(x\),使得序列中恰好\(k\)个数满足\(\le x\).如果找不到\(x\),输出\(-1\). 题解:先对这个序列排 ...