SAPUI5基础知识16 - 深入理解MVC架构

news2024/12/24 8:17:20

1. 背景

经过一系列的练习,相信大家对于SAPUI5的应用程序已经有了直观的认识,我们在练习中介绍了视图、控制器、模型的概念和用法。在本篇博客中,让我们回顾总结下这些知识点,更深入地理解SAPUI5的MVC架构。

首先,让我们看下SAPUI5的整体架构。
在这里插入图片描述

  • Device层:展示了SAPUI5应用程序的运行设备,SAPUI5应用程序可以在任何设备(手机、平板电脑或台式电脑)的浏览器中运行。

  • Client/Browser层:展示了SAPUI5的MVC架构,通过“模型-视图-控制器(Model - View - Controller, MVC)”概念将信息的表示与用户交互分离开来。

  • Resource Hander/Gateway Server层:展示了资源的加载方式,以及应用数据的访问方式。SAPUI5库是从Server加载的,在访问应用程序业务数据,是通过SAP网关(Gateway)或SAP Cloud平台使用OData模型。

接下来,让我们更详细地介绍下Client/Browser层。

2. MVC

2.1 交互关系

MVC(Model-View-Controller)架构是一种设计模式,用于分离应用程序的不同部分,以提高代码的可维护性和可扩展性。MVC 模式将应用程序分为三部分:模型(Model)、视图(View)和控制器(Controller)。

在这里插入图片描述

  • 模型Model:负责保存应用数据,以及提供读取、设置和更新数据的一系列方法
  • 视图View:负责定义和渲染UI
  • 控制器Controller:通过修改视图和模型来响应视图事件和用户交互,控制器将视图逻辑与模型逻辑分离

控制器与模型和视图的关系:

  • 控制器可以直接修改模型中的数据,它可以通过注册函数的方式,监测模型的变化;
  • 控制器可以直接修改视图以及视图上面的元素,通过事件处理程序(event handler),控制器可以响应视图上面的事件。

模型和视图的关系:

  • 模型上保存的数据,可以通过"数据绑定"的方式关联到视图上,视图可以读取或编辑模型上的数据(通过数据的实时绑定,不需要将模型上的数据复制到视图上)

2.2 构建要素

让我们拆解一下一个SAPUI5的应用程序,然后分析其构建的元素。
在这里插入图片描述
通过上面的拆解图,可以看到:

  • 视图,是由最基本的SAPUI5控件构成(例如如表,按钮,输入框,复选框);
  • 每一个视图,都会有一个对应的控制器,用于负责UI相关的业务逻辑;
  • 模型是负责数据的操作,包括客户端和服务器端的数据;
  • 而组件,是用于应用程序的描述和封装,使得应用程序可以运行在不同的组件容器中。

2.1 模型(Model)

模型代表应用程序的数据和业务逻辑,它负责数据的获取、存储和处理。

在SAPUI5中,负责数据模型绑定的API是sap.ui.model。它可以处理JSON、XML 或 OData等格式的数据。模型支持的绑定模式有单向双向一次性,绑定模式可以由应用程序指定或更改。

通常情况下,我们在JavaScript文件中,会首先加载模型文件中的数据,然后通过视图对象提供的setModel()方法,将模型数据绑定到视图对象上。在视图上,可以通过绑定表达式{...},例如,{/recipient/name}, {i18n>helloMessage}获取模型上面的数据。

2.1.1 JSONModel(JSON模型)

SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定控件数据到JSON对象的机制,使得当JSON数据改变时,UI控件也会自动更新。

代码示例:

// 创建一个JSON Model实例
var oModel = new sap.ui.model.json.JSONModel();

// 设置JSON数据到模型中
var oData = {
    "employees": [
        { "firstName": "John", "lastName": "Doe" },
        { "firstName": "Anna", "lastName": "Smith" },
        { "firstName": "Peter", "lastName": "Jones" }
    ]
};
oModel.setData(oData);

// 将模型绑定到视图
this.getView().setModel(oModel);

在视图文件中,使用以下方式绑定数据到控件:

<List items="{/employees}">
    <items>
        <ObjectListItem title="{firstName}" intro="{lastName}" />
    </items>
</List>

在上述示例中,我们首先创建了一个JSON Model实例,然后设置了一些JSON数据到模型中。然后,我们将模型绑定到视图。在视图中,我们使用绑定语法将数据绑定到一个列表控件。当JSON数据改变时,列表控件会自动更新。

当然JSON模型中的数据,是可以存储在单独的JSON文件中的,当需要处理模型数据时,可以从JSON文件中加载,如下例:

var oModel = new sap.ui.model.json.JSONModel();
oModel.loadData("mydata.json");
sap.ui.getCore().setModel(oModel);

2.1.2 ResourceModel资源模型

ResourceModel资源模型用于处理i18n资源束,用于实现应用程序的国际化。

代码示例:

var oModel = new sap.ui.model.resource.ResourceModel({
  bundleName: "myapp.i18n.i18n"
});
sap.ui.getCore().setModel(oModel, "i18n");

2.1.3 XMLModel

XMLModel是一个客户端模型,用于处理XML格式的数据。它可以用于存储和处理来自服务器的XML数据。

代码示例:

var oModel = new sap.ui.model.xml.XMLModel();
oModel.loadData("mydata.xml");
sap.ui.getCore().setModel(oModel);

2.1.4 ODataModel

ODataModel是一个服务器模型,用于处理OData服务。它可以用于与OData服务进行交互。

代码示例:

var oModel = new sap.ui.model.odata.v2.ODataModel("/my/service/url/");
sap.ui.getCore().setModel(oModel);

2.2 视图(View)

在SAPUI5中,视图/View是一个用于定义用户界面的组件。负责展示数据并接收用户的输入。视图通常与一个或多个控制器关联,控制器负责处理用户的操作并更新模型的数据。

视图可以包含各种UI元素,如按钮、表格、图表等。

SAPUI5 支持多种视图类型(XML、HTML、JavaScript)。在使用 UI5 时,官方建议使用 XML视图,因为这样的代码可读性高,并会迫使我们将视图逻辑与控制器逻辑分开。

在这里插入图片描述

在创建视图文件时,要注意:

  • 视图名称大写 (例如, App.view.xml
  • 所有视图都存储在view文件夹中
  • XML视图的名称总是以*.view.xml结尾
  • 默认的XML命名空间是sap.m
  • 其他XML命名空间使用SAP命名空间的最后一部分作为别名(例如,sap.ui.core.mvc的别名为mvc

以下是一个使用XML定义的视图的示例:

<mvc:View controllerName="sap.ui.demo.walkthrough.controller.App" xmlns:mvc="sap.ui.core.mvc" displayBlock="true" xmlns="sap.m">
    <App id="app">
        <pages>
            <Page title="{i18n>title}">
                <content>
                    <Button text="{i18n>showHelloButtonText}" press="onShowHello" id="helloButton" />
                </content>
            </Page>
        </pages>
    </App>
</mvc:View>

在这个示例中,视图包含一个App组件,App组件包含一个Page组件,Page组件包含一个Button组件。Button组件的文本和按下事件由控制器处理。

2.3 控制器(Controller)

在SAPUI5中,控制器负责处理用户交互,处理业务逻辑,以及更新模型视图

控制器是一个JavaScript文件,它包含了一个特定视图的事件处理函数业务逻辑

  • 每个视图都有一个与之关联的控制器。
  • 控制器可以访问其关联的视图,以及视图中的控件。
  • 控制器还可以访问模型,以便获取和修改数据。

在SAPUI5中,控制器的创建和使用通常遵循以下步骤:

  1. webapp/controller目录下创建一个新的JavaScript文件,例如MyController.js。
  2. 在新的JavaScript文件中,定义一个新的SAPUI5控制器,这个控制器应该继承自sap.ui.core.mvc.Controller并作为返回对象,返回的控制器对象包含了控制器逻辑的实现。
  3. 在控制器中,定义事件处理函数和业务逻辑。这些函数可以通过this.getView()访问关联的视图,以及视图中的控件。
  4. 在视图中,使用controllerName属性指定关联的控制器。

在创建控制器文件时,要注意:

  • 控制器名称大写 (例如,App.controller.js)
  • 控制器与相关视图的名称相同(如果存在1:1关系)
  • 事件处理程序以on为前缀
  • 控制器名称总是以*.controller.js结尾

以下是一个简单的SAPUI5控制器的示例:

sap.ui.define([
   "sap/ui/core/mvc/Controller"
], function (Controller) {
   "use strict";
   return Controller.extend("my.namespace.MyController", {
      onInit: function () {
         // 在控制器初始化时执行的代码
      },
      onButtonPress: function () {
         // 处理按钮按下事件的代码
         var oView = this.getView();
         var oButton = oView.byId("myButton");
         oButton.setText("Pressed");
      }
   });
});

在这个示例中,MyController控制器定义了两个函数:onInitonButtonPressonInit函数在控制器初始化时被调用,onButtonPress函数用于处理按钮按下事件。

控制器的_hook方法是由框架定义的,并在视图和应用程序的特定状态下调用。

  • onInit(): 只调用一次,当视图被实例化时,所有控件已经被创建。我们可以在这里修改视图,获取UI元素的引用,注册事件处理程序或初始化控制器和子组件。
  • onExit(): 在视图及其控制器被销毁之前调用,用于释放资源和完成操作(或保存草稿)。
  • onAfterRendering(): 只在视图渲染后调用一次,我们可以执行后渲染操作。
  • onBeforeRendering(): 每当视图由于UI更改而重新渲染时调用,在第一次初始化步骤期间不会被调用。
    在这里插入图片描述

2.4 启动应用程序

在MVC框架下,一个SAPUI5应用的启动过程如下:
在这里插入图片描述

当用户启动SAPUI5应用程序后:

  1. SAPUI5框架首先会加载相关所需的资源
  2. 然后,组件容器加应用程序的组件
  3. 当组件就绪后,会加载此应用程序的描述符文件,也即manifest.json
  4. 根据manifest.json中的描述,组件会创建相关的模型对象,例如资源模型i18n
  5. 然后,组件文件Component.js中的init()函数会被触发。在init()函数中,通常会完成模型的实例化,并完成数据绑定setModel()。模型一般会直接绑定在组件上的,因为嵌套的控件会自动地继承父控件的承模型,因此模型的数据在视图上也是可用的。
  6. 需要注意,在触发组件文件Component.js中的init()函数时,其会先调用其父类sap/ui/core/UIComponentinit()函数,以完成Router的创建,以及定义在manifest.jsonrootView(也即应用程序的根视图)的创建
  7. 根视图会根据其内部的声明,创建根组件
  8. 与此同时,组件文件中的init()函数会初始化Router
  9. Router就绪后,会去创建其它必要的视图
  10. 在视图内部,会加载对应的控制器文件
  11. 在加载过程中,控制器内的init()函数也会被相应地触发
  12. Router会将视图放置于根控件上,此时,在视图上,模型数据都是可用的
  13. 接下来,会对绑定数据至视图进行评估
  14. 没有问题的话,会完成数据绑定,也即将模型上面的数据真正绑定在视图上

以上就是整个MVC架构下的程序加载过程。

3. 小结

本文对于SAPUI5的MVC框架进行了回顾和总结,通过本篇文章,将进一步加深前序博客中知识点的理解和认知。

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

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

相关文章

Jvm基础(一)

目录 JVM是什么运行时数据区域线程私有1.程序计数器2.虚拟机栈3.本地方法栈 线程共享1.方法区2.堆 二、对象创建1.给对象分配空间(1)指针碰撞(2)空闲列表 2.对象的内存布局对象的组成Mark Word类型指针实例数据&#xff1a;对齐填充 对象的访问定位句柄法 三、垃圾收集器和内存…

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook&#xff0c;用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应&#xff0c;useState 让函数组件也能拥有…

【第10章】Spring Cloud之Nacos动态配置

文章目录 前言一、上下文1. 新增配置2. 启动类3. 效果 二、注解 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)1. 获取配置2. 测试2.1 未配置2.2 配置值2.3 修改值 总结 前言 这一章我们通过两个案例来学习Nacos动态配置&#xff0c;通过在控制台修改服务端配置文件值&#xff0c;…

linux环境交叉编译openssl库,以使Qt支持https

一.前言 Qt若需要支持https&#xff0c;则需要openssl的支撑,并且要注意&#xff0c;Qt不同版本会指定对应的openssl版本库&#xff0c;比方我用的Qt5.15.10他要求用的openssl版本是1.1.1&#xff0c;你就不能用其他版本&#xff0c;不然基本就是失败报错。 如何查看Qt对应ope…

TK秘籍:深度剖析机房IP与住宅IP的利与弊

大家好&#xff0c;今天我们来聊聊TikTok运营中的一个重要环节——IP地址的选择。 想象一下&#xff0c;你在TikTok上发布视频&#xff0c;就像是在一个热闹的市集上摆摊&#xff0c;而IP地址就是你的摊位位置。选对了位置&#xff0c;你的摊位就能吸引更多顾客&#xff0c;也…

浪漫情怀:红酒中的诗意与情感

在生活的点滴细节中&#xff0c;总有些元素能触动我们内心较柔软的地方&#xff0c;唤起那份深深的浪漫情怀。而红酒&#xff0c;便是这其中的一种神奇媒介。它以其不同的色泽、香气和口感&#xff0c;让人沉醉其中&#xff0c;感受那份诗意与情感的交织。今天&#xff0c;就让…

使用Kotlin Flow和协程开发高性能Android应用

使用Kotlin Flow和协程开发高性能Android应用:以电影业务为例 引言 在当今移动互联网快速发展的时代,用户对应用的性能和响应速度有了更高的要求。作为开发者,我们需要不断探索和采用新的技术来提升应用的性能和用户体验。Kotlin作为Android开发的首选语言,其协程和Flow特…

抖音/腾讯/百度ocpm深度回传如何操作?广告投放双出价的投放技巧?

要实现抖音、腾讯和百度的OCPM&#xff08;Optimized Cost Per Mille&#xff09;深度回传&#xff0c;可以通过借助第三方平台&#xff0c;例如&#xff08;转化宝&#xff09;实现广告数据精准回传&#xff0c;如此之外&#xff0c;在广告投放过程中还需要注重这些方面。 转化…

Python+Django+MySQL的新闻发布管理系统【附源码,运行简单】

PythonDjangoMySQL的新闻发布管理系统【附源码&#xff0c;运行简单】 总览 1、《新闻发布管理系统》1.1 方案设计说明书设计目标工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 新闻新增界面2.4 文章编辑界面2.5 新闻详情页2.7 其他功能贴图 3、下载 总览 自己做的项目&…

云计算实训06——find、stat、touch、tree、scp、crontab指令相关应用

一、find命令 1.find的作用&#xff1a;对文件进行搜索 2. 基本语法&#xff1a; find [文件路径] [选项 选项的值 ] 3.常见的选项 -name 根据文件的名称搜索文件&#xff0c;支持通配符 * -type f 代表普通文件&#xff0c;-type d 代表目录 4.* 通配符 在 linux 系统…

QT--多页面、定时器和日期时间数据

多页面 widget.ui 负责实现一个页面; mian.cpp创建窗体对象,并监控上面的事件 窗口的显示和隐藏: 一个窗体,比如logpage widget,继承QWidget QWidget::show(); 显示该窗体 QWidget::hide(); 隐藏该窗体 页面间通信采用在main.cpp中创建connect槽函数。 代码如下 //main.c…

socket 收发TCP/UDP

一、c 个人测试记录&#xff0c;有问题还请指出&#xff0c;谢谢 参考&#xff1a;C开发基础之网络编程WinSock库使用详解TCP/UDP Socket开发_c udp使用什么库-CSDN博客 代码中Logger测试见文章&#xff1a; c中spdlog的使用/python中logger的使用-CSDN博客 1、main.cpp 收…

PE安装系统

前些天客户的电脑坏了,需要重装系统,我们的恢复光盘安装的时候,由于主板的原因,导致进入windows安装界面,鼠标键盘没有响应,自然也就无法正常安装了. 那我们只能换个方法,PE安装试试看,那么我们需要做哪些准备工作呢? 1.制作PE启动盘,网上很多制作工具,如""U启动,…

贪心算法总结(1)

一、贪心算法简介 常用方法&#xff1a;交换论证法、数学归纳法、反证法、分类讨论 二、柠檬水找零&#xff08;交换论证法&#xff09; . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool lemonadeChange(vector<int>& bills) {int five0,t…

蜂窝物联云平台:一站式服务,智能生活从此开始!

蜂窝云平台 一、PC端展示与管理 GIS地图整合 在GIS地图上精确展示地块&#xff0c;轻松点选查看详细设备信息、实时监控和控制功能&#xff0c;以及基地的全方位介绍。 个性化定制界面 界面布局与功能展示均可按需求定制&#xff0c;打造独一无二的用户体验。 数据集中看板 将…

html网页使用tesseract实现OCR文字识别

即在前端实现OCR文字识别 1.前端代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>OCR文字识别…

C/C++ json库

文章目录 一、介绍1.1 json 介绍 二、C/C json 库选型2.1 选型范围2.2 jsoncpp2.2.2 jsoncpp 编译和交叉编译 2.3 rapidjson2.4 nlohmann/json2.5 sonic-cpp 五、常见问题5.1 jsoncpp 中关于浮点数的控制和中文显示问题5.2 jsoncpp序列化double类型时精度损失问题的解决办法 一…

JavaWeb JavaScript ① JS简介

目录 一、HTML&CSS&JavaScript的作用 二、前后端关联标签——表单标签 1.form标签 2.input标签 3.get/post提交的差异 4.表单项标签 5.布局相关标签 块元素——div 行内元素——span 三、CSS 1.CSS引入方式 方式1 行内式 方式2 内嵌式 方式3 外部样式表 2.CSS选择器 元…

AWS Certified Developer Associate备考笔记

AWS Certified Developer Associate备考笔记 缓慢更新中&#xff0c;如果你也正在关注该考试&#xff0c;请点赞后评论感兴趣的章节&#xff0c;可加快我的更新速度 &#x1f603; 文章目录 AWS Certified Developer Associate备考笔记一、IAM二、EC2三、EC2 Instance Storage…