【Java编程】SSH:Struts、Spring、Hibernate

news2024/11/14 18:40:41

SSH:Struts、Spring、Hibernate

SSH 框架指的是 Struts、Spring 和 Hibernate 三者的集成。集成 SSH 框架的系统从职责上分为表示层、业务逻辑层、数据持久层和域模块层。Struts 属于 MVC 框架的一种,提供了对 MVC 系统底层的支持,负责 MVC 的分离,在 Struts 框架的模型部分,控制业务跳转,利用 Hibernate 框架对持久层提供支持,Spring 则管理 Struts 和 Hibernate。

1.Struts

Struts 是一个基于 Sun J2EE 平台的 MVC 框架,主要是采用 Servlet 和 JSP 技术来实现的。由于 Struts 能充分满足应用开发的需求,简单易用,敏捷迅速,在过去颇受关注。Struts 把 Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套 MVC 模式,极大的节省了时间,所以说 Struts 是一个非常不错的应用框架。

官方地址:http://struts.apache.org

Struts2 在 Struts1 和 WebWork 的技术基础上进行了合并的全新的 Struts2 框架。其全新的 Struts2 的体系结构与 Struts1 的体系结构差别巨大。Struts2 以 WebWork 为核心,WebWork 的核心是 XWork。其优点如下:

  • 实现了 MVC 模式,层次结构清晰,使程序员只需关注业务逻辑的实现。
  • Struts2 提供丰富的拦截器实现。
  • 强大的表达式语言(OGNL,the Object Graph Navigation Language)。
  • 丰富的标签库,大大提高了开发的效率。
  • 通过配置文件,就可以掌握整个系统各个部分之间的关系。
  • 异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。
  • Struts2 的可扩展性高。
  • 面向切面编程的思想在 Struts2 中也有了很好的体现,最重要的体现就是拦截器的使用。

另外,Struts2 相对比于 SpringMVC,Struts2 对于 Controller 最大的改造有两点:

  • 在 Controller 中彻底杜绝引入 HttpServletRequest 或者 HttpServletResponse 这样的原生 Servlet 对象。
  • 将请求参数和响应数据都从响应方法中剥离到了 Controller 中的属性变量。

这两大改造被看作是框架的神来之笔。因为通过这一改造,整个 Controller 类彻底与 Web 容器解耦,可以方便地进行单元测试。

Suruts2 的工作原理可以用下面这张图来描述,下面我们分步骤介绍一下每一步的核心内容,需要说明的是,Struts2 在 2.1.3 版本之后,FilterDispatcher 核心控制器变成了 StrutsPrepareAndExecuteFilter。

在这里插入图片描述
这张图上分了好多块,彼此之间相互联系,先浏览一下各块的名字,再留心一下运行图最下面的图例,分为四种颜色。

  • 橙色:Servlet Filters,过滤器链,所有的请求都要经过 Filter 链的处理。
  • 浅蓝色:Struts Core,Struts2 的核心部分,Struts2 中已经做好的功能,在实际开发中不需要动它们。
  • 浅绿色:Interceptors,Struts2 的拦截器。Struts2 提供了很多默认的拦截器,可以完成日常开发的绝大部分工作;当然,也可以自定义拦截器,用来实现具体业务需要的功能。
  • 浅黄色:User Created,由开发人员创建的,包括 Struts.xml、Action、Template,是每个使用 Struts2 来进行开发的人员都必须会的。

架构图上有好多东西,接下来逐个击破。首先看看它们各自是做什么的,跟着图上的箭头一个一个来看:

  • FilterDispatcher 是整个 Struts2 的调度中心,根据 ActionMapper 的结果来决定是否处理请求,如果 ActionMapper 指出该 URL 应该被 Struts2 处理,那么它将会执行 Action 处理,并停止过滤器链上还没有执行的过滤器。
  • ActionMapper 提供了 HTTP 请求与 Action 执行之间的映射,简单点说,ActionMapper 会判断这个请求是否应该被 Struts2 处理,如果需 Struts2 处理,ActionMapper 会返回一个对象来描述请求对应的 ActionInvocation 的信息。
  • ActionProxy 是一个特别的中间层,位于 Action 和 xwork 之间,使得我们在将来有机会引入更多的实现方式,比如通过 WebService 来实现等。
  • ConfigurationManager 是 xwork 配置的管理中心,通俗的讲,可以把它看做 struts.xml 这个配置文件在内存中的对应。
  • struts.xml 是 Stuts2 的应用配置文件,负责诸如 URL 与 Action 之间映射的配置、以及执行后页面跳转的 Result 配置等。
  • ActionInvocation:真正调用并执行 Action,它拥有一个 Action 实例和这个 Action 所依赖的拦截器实例。ActionInvocation 会执行这些拦截器、Action 以及相应的 Result。
  • Interceptor:拦截器是一些无状态的类,拦截器可以自动拦截 Action,它们给开发者提供了在 Action 运行之前或 Result 运行之后来执行一些功能代码的机会。类似于我们熟悉的 javax.servlet.Filter。
  • Action:动作类是 Struts2 中的动作执行单元。用来处理用户请求,并封装业务所需要的数据。
  • Result:Result 就是不同视图类型的抽象封装模型,不同的视图类型会对应不同的 Result 实现,Struts2 中支持多种视图类型,比如 JSP,FreeMarker 等。
  • Templates:各种视图类型的页面模板,比如 JSP 就是一种模板页面技术。
  • Tag Subsystem:Struts2 的标签库,它抽象了三种不同的视图技术 JSP、Velocity、FreeMarker,可以在不同的视图技术中,几乎没有差别的使用这些标签。

一个请求在 Struts2 框架中的处理大概分为以下几个步骤:

  1. 户端初始化一个指向 Servlet 容器(例如 Tomcat)的请求。
  2. 这个请求经过一系列的过滤器(Filter),这些过滤器中有一个叫做 ActionContextCleanUp 的可选过滤器,这个过滤器对于 Struts2 和其他框架的集成很有帮助,例如:SiteMesh Plugin。
  3. 接着 FilterDispatcher 被调用,FilterDispatcher 询问 ActionMapper 来决定这个请求是否需要调用某个 Action,FilterDispatcher 是控制器的核心,就是 MVC 中控制层的核心。
  4. 如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 会把请求的处理交给 ActionProxy。
  5. ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调用的 Action 类。
  6. ActionProxy 创建一个 ActionInvocation 的实例。
  7. ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程前后,会涉及到相关拦截器(Intercepter)的调用。
  8. 一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对应的返回结果。返回结果通常是一个需要被表示的 JSP 或者 FreeMarker 的模板。
  9. 将处理结果返回给客户端。

2.Spring

Spring 是一个解决了许多在 J2EE 开发中常见的问题的强大框架。 Spring 提供了管理业务对象的一致方法,并且鼓励注入对接口编程而不是对类编程的良好习惯。Spring 的架构基础是基于使用 JavaBean 属性的 Inversion of Control 容器。然而,这仅仅是完整图景中的一部分。

Spring 在使用 IOC 容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring 提供了唯一的数据访问抽象,包括简单和有效率的 JDBC 框架,极大的改进了效率并且减少了可能的错误。Spring 的数据访问架构还集成了 Hibernate 和其他 O/R mapping 解决方案。Spring 还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如 JTA(Java Transaction API,Java 事务 API) 或者 JDBC 事务提供一个一致的编程模型。

Spring 提供了一个用标准 Java 语言编写的 AOP 框架,它给 POJOs 提供了声明式的事务管理和其他企业事务(如果你需要,还能实现你自己的 aspects)。这个框架足够强大,使得应用程序能够抛开 EJB 的复杂性,同时享受着和传统 EJB 相关的关键服务。Spring 还提供了可以和 IOC 容器集成的强大而灵活的 MVC Web 框架。

官方地址:http://www.springsource.org

后续会针对 Spring 详细讲解。

3.Hibernate

Hibernate 是一个开源的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序实用,也可以在 Servlet/JSP 的 Web 应用中使用,最具意义的是,Hibernate 可以在应用 EJB 的 J2EE 架构中取代 CMP,完成数据持久化的重任。

官方地址:http://www.hibernate.org

为什么需要 Hibernate 呢?主要原因如下:

  • 使用 JDBC 操作数据库时,SQL 语句都被编写在代码里面(硬编码),需要调整就得修改源码,灵活性差。每写一条操作都要创建一个 connection,这玩意儿十分消耗资源。对查询结果的解析、对参数的设置等,都与 SQL 语句有关,牵一发而动全身,耦合度极高。
  • Hibernate 是一个 ORM(Object Relational Mapping,对象关系映射) 框架,所谓 ORM,即通过使用描述对象和数据库之间关系的元数据,将面向对象语言程序中的对象持久化到关系数据库中。说人话就是,通过一些简单配置,把 Java 类(一般是普通的 Bean)跟数据库表对应起来,这样就可以通过操作类来操作数据库。
  • Hibernate 比较自动化,只要写个方法名就可以自动生成 SQL 语句,用起来贼拉方便。这里插一句,SSM 中的 MyBatis 跟 Hibernate 是对应的,两者最大的差别就是 MyBatis 并非自动生成 SQL,而是根据需要自行编写。一般来讲,手动挡比自动挡要省油,所以国内的许多公司对 MyBatis 情有独钟。(国外的开发者们似乎更喜欢 Hibernate)

在这里插入图片描述
Hibernate 框架执行过程:

  1. 通过 Configuration().configure() 读取并解析 hibernate.cfg.xml 配置文件。
  2. 由 hibernate.cfg.xml 中的 xxx.hbm.xml 读取并解析映射信息。
  3. 通过 config.buildSessionFactory():创建 SessionFactory。
  4. sessionFactory.openSession():打开 Session。
  5. session.beginTransaction():创建事务 Transaction。
  6. persistent operate:持久化操作。
  7. session.getTransaction().commit():提交事务。
  8. 关闭 Session。
  9. 关闭 SessionFactory。

4.整体架构

在这里插入图片描述

  • Struts 负责 Web 层。
  • ActionFormBean 接收网页中表单提交的数据,然后通过 Action 进行处理,再 Forward 到对应的网页,在 Struts-config.xml 中定义了 < < <action-mapping > > >,ActionServlet 会加戴进来。
  • Spring 负责业务层管理,即 Service;
  • Service 为 Action 提供统一的调用接口,封装持久层的 DAO,并集成 Hibernate,Spring 可对 JavaBean 和事物进行统一管理。
  • Hibernate 负责持久层,完成数据库的 CRUD 操作:
  • Hibernate 有一组 hbm.xml 文件和 PO,是与数据库中的表相对应的,然后定义 DAO,这些是与数据库打交道的类。

在这里插入图片描述

  • Struts:用来控制的,核心控制器是 Controller。
  • Spring:对 Struts 和 Hibernate 进行管理、整合的。
  • Hiernate:操控数据库。
  • Struts 标签库:Struts2 默认的表达式语言是 OGNL(Object-Graph Navigation Language),通过它可以存取对象的任意属性、调用对象的方法、遍历整个对象的结构图、实现字段类型转换等功能。
  • JSP:HTML 文件中插入 Java 程序段和 JSP 标记。
  • web.xml:Struts2 核心过滤器和监听器。
  • struts.xml:管理应用中的 Action 映射,及 Action 处理结果和物理资源之间的映射。
  • applicationContext.xml:整合了 Struts 和 Hibernate。
  • *.hbm.xml:O/R Mapping(Object Relational Mapping)映射文件,实体和表的映射关系通过 XML 来描述的文件。在项目启动的时候加载到内存中。
  • PO:Persistent Object,持久化对象。
  • 整体的调用关系:JSP → Action → Service → DAO → PO → 数据库,也即 Struts → Spring → Hibernate。

在这里插入图片描述
系统的基本业务流程是: 在表示层中,首先通过 JSP 页面实现交互界面,负责接收请求(Request)和传送响应(Response),然后 Struts 根据配置文件(struts-config.xml)将 ActionServlet 接收到的 Request 委派给相应的 Action 处理。在业务层中,管理服务组件的Spring IOC 容器负责向 Action 提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于 Hibernate 的对象化映射和数据库交互,处理 DAO 组件请求的数据,并返回处理结果。

SSH 框架优点

  • Spring 管理对象的实例化,把对象的创建和获取放到外部,更加的灵活方便。
  • Hibernate 避免了 JDBC 连接数据库的冗余繁杂。
  • 各层分工明细,实现了各层之间的解耦,代码更加灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98879.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车ECU通信相关验证项有哪些?

已剪辑自: https://mp.weixin.qq.com/s/-fIAXkS37r6jvnuA7yIQDA 汽车电子的高速发展决定了基础软件所面临的要求将会更加严格&#xff0c;其要求会覆盖软件的安全性、稳定性、可扩展性等方方面面。为了提高软件质量&#xff0c;降低软件应用风险&#xff0c;构建高安全、高可靠…

什么是网站安全?如何查询网站在百度是否安全?

什么是网站安全&#xff1f; 百度词条的定义为网站安全是指出于防止网站受到黑客入侵者对其网站进行挂马&#xff0c;篡改网站源代码&#xff0c;被窃取数据等行为而做出一系列的安全防御工作&#xff0c;在我的理解中&#xff0c;网站安全就是当有人攻击你的网站时&#x…

Java+SSM社团管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;JSP、jQuery 、H-ui 数据库&#xff1a;MySQL 系统功能 本社团管理系统是根据大学社团管理的实际应用而开发的&#xff0c;采用JSP技术&#xff0c;Java编程语言&am…

python调用halcon程序/.hdev文件/直接调用halcon引擎

一、前言 python有两种调用halcon的方法 1、安装halcon的python库&#xff0c;pip install mvtec-halcon20111 然后python代码中主要调用方式为&#xff1a;通过ha来调用halcon中的各种算子&#xff0c;本人不是很喜欢这种方式&#xff0c;后面主要介绍第2种方法。 import …

java计算机毕业设计springboot+vue校园出入管理系统

项目介绍 本论文主要论述了如何使用JAVA语言开发一个校园出入管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园出入管理系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系…

可能你看到的大部分教材里讲的指针和指针变量是一个概念,但是真的是这样吗?看完我这篇文章肯定会颠覆你的认知哦?

指针vs指针变量一、指针和指针变量的含义1、变量的“左值”和“右值”2、什么是指针&#xff1f;3、什么是指针变量&#xff1f;二、如何看待“指针就是指针变量”这种说法三、为什么要存在指针&#xff1f;四、对指针进行解引用操作的本质一、指针和指针变量的含义 1、变量的…

2022云南省职业院校技能大赛(高职组) Web技术(网站设计与开发)赛项规程

2022云南省职业院校技能大赛&#xff08;高职组&#xff09; Web技术&#xff08;网站设计与开发&#xff09;赛项规程 一、赛项名称 赛项名称&#xff1a;Web技术&#xff08;网站设计与开发&#xff09; 赛项组别&#xff1a;高职组 二、竞赛内容 Web技术&#xff08;网站设计…

SA-UNet:用于视网膜血管分割的空间注意力UNet

摘要 在本文中提出了一种名为空间注意力UNet&#xff08;SA-UNet&#xff09;的轻量级网络&#xff0c;它不需要大量的带注释的训练样本&#xff0c;可以以数据增强的方式来更有效的使用可用的带注释的样本。SA-UNet引入一种空间注意模块&#xff0c;这个模块沿着空间维度推断…

[激光原理与应用-61]:激光器 - 种子源 - 1064nm皮秒种子源参数解读

目录 第1章 种子源介绍 1.1 简介 1.2 种子源特点 1.3 皮秒种子源应用 第2章 《瀚盈激光》种子源性能指标解读 2.1 波长&#xff1a;1064nm 》红外 2.2 光谱宽度&#xff08;频率宽度、带宽&#xff09; 2.3 线宽 2.4 脉冲宽度 2.5 重复频率 周期T 2.6 输出功率 2.…

【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla

2022年卡塔尔世界杯即将谢幕 纵观2022年的卡塔尔世界杯的赛程&#xff0c;还是很多波澜的&#xff0c;很多强队都被草草的淘汰掉&#xff0c;特别是我之前较为看好的德国队、西班牙、葡萄牙等队伍草草的出局。让我的心不禁的一紧&#xff0c;到底花落谁家呢&#xff1f;我后面…

渲染组的使用

渲染组件目录概述需求&#xff1a;设计思路实现思路分析参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for har…

Python OS库详解(一)——OS库简介与路径操作

今天继续给大家介绍Python相关知识&#xff0c;本文主要内容是Python OS库详解&#xff08;一&#xff09;——OS库简介与路径操作。 一、Python OS库简介 Python os库是Python的标准库&#xff0c;提供通用的Python程序和操作系统交互的功能函数。os库包含几百个Python函数&…

《数据结构、算法与应用C++语言描述》线性表-链表描述

_11 《数据结构、算法与应用C语言描述》线性表-链表描述 11表示第11篇博文&#xff0c;6表示在 数据结构算法与应用C语言描述 书中所在章节。 本文包含了《数据结构、算法与应用C语言描述》第六章主要练习题答案&#xff0c;给出了线性表链表描述完整测试代码。 6.1 线性表数…

【C语言】编译链接 _Linux下操作 _#define详解 [进阶篇 _复习总结]

1.翻译环境和执行环境 1.1翻译环境 翻译环境又可以分为编译和链接&#xff0c;形成的可执行程序test.exe通过执行环境显示运行结果。 把源代码转换为可执行的机器指令(二进制指令)&#xff0c;由编译器完成。 每个源文件经过编译器生成目标文件(windows下命名为xxx.obj&…

【C++初阶】string类各部分的使用介绍

文章目录1.为什么学string类&#xff1f;2. 标准库中的string类string类的介绍string类常用的接口说明a.常见的构造b.string类对象的常用容量操作c.string类对象的访问及遍历操作d.string类对象的修改操作1.为什么学string类&#xff1f; C语言中&#xff0c;字符串是以’\0’…

计算机毕设Python+Vue休闲网络宾馆管理(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【图像分割】基于matlab Kmean聚类分水岭、oust、粒子群算法优化脂肪肝图像分割【含Matlab源码 2277期】

⛄一、粒子群算法自适应多阈值图像分割简介 FCM聚类算法是一种局部搜索算法,对初始值较为敏感,容易陷入局部极小值而不能得到全局最优解。PSO算法是一种基于群体的具有全局寻优能力的优化方法。本文将FCM聚类算法和PSO算法结合起来,将FCM聚类算法的聚类准则函数作为PSO算法中的…

MySQL简介与安装

文章目录MySQL简介与安装一、数据库相关概念二、MySQL数据库1. 版本2. 下载3. 安装1). 双击官方下载的安装包文件2). 根据安装提示进行安装3). 配置MySQL环境4. 启动停止5. 客户端连接6. 数据模型MySQL简介与安装 本文主要介绍数据库的相关概念、以及在Windows下安装MySQL 8.0…

matplotlib绘图详解

文章目录matplotlib绘图详解一、 基础准备1、 matplotlib简介2、 环境准备2.1 安装2.2 参考文档3、 图表结构4、 常用图表二、绘图步骤1、 常用图表1.1 散点图1.2 柱状图1.3 饼图1.4 折线图2、 多图绘制2.1 subplot2.2 subplots3、 绘图配置3.1常用配置3.1.1 网格线3.1.2 标题和…

【问答篇】Java 基础篇 面试题(二)

每天进步一点~ 01、问&#xff1a;PreparedStatement与Statement的区别&#xff1f; 答&#xff1a; PreparedStatement是预编译语句执行者&#xff0c;数据库对sql语句进行预编译&#xff1b;Statement是执行时对sql语句进行编译 Statement存在sql注入的问题&#xff0c;Prep…