基于 Delphi 的前后端分离:之二

news2024/12/27 13:34:19

本系列文章之二

# 摘要

上一篇文章,我在页面里面,使用 JS 向服务器端获取数据,然后修改页面元素显示数据成功。接下来,真正的页面,是需要格式的,要好看。如何做到?

# 开始

# 网页模板和 Delphi

要设计好看的页面,大多数程序员做不到。一方面缺乏美感,一方面做服务器端的程序员也是不擅长前端页面设计的 HTML, CSS, JS 代码。总之头疼。

那么,我们去下载现成的页面模板好了。我找了一个显示得好看的页面模板下载回来做一次实验。

## 页面模板

我下载的页面模板是一个基于 BootStrap 的页面模板。最新版的 BootStrap 里面已经不使用  jQuery 了。于是我要在页面里面增加 axios 库的代码,用来访问服务器。

据说因为 **jquery** 里面包含了 AJAX 的代码(访问服务器)以及操作 DOM 的代码(访问页面元素)导致 jquery 很臃肿,而 axios 仅仅是 HTTP 访问服务器的代码,很小巧,所以 VUE 也用它。

下载好页面模板后,我下载的页面模板里面只有一个 index.html 文件,然后有个目录结构,底下包含图片,JS,CSS 等等。这些我通通不管。

## Delphi 服务器端

在我的 WebBroker 程序里面,拖一个 WebFileDispatcher1 到我的 TWebModule1 里面,开始设置:

1. 设置 WebFileDispatcher1 的属性:RootDiretory 为:D:\test\WebBroker前后端分离\BootStrap_1\Appvila-free-lite\Appvila-free-lite
2. 上述目录下是我下载的一个 BootStrap 的模板页面。里面有 index.html;
3. WebFileDispatcher1 的默认属性:WebFileExtension 里面,已经指定了可以访问的文件是 html,jpeg 等等。如果有其它的,自己添加;
4. WebFileDispatcher1 的属性 virtualPath 默认是 “/”
5. 浏览器使用 http://127.0.0.1:8080/index.html  就能看到硬盘下的页面文件了。相当于这个独立的程序是一个提供静态页面的 WebServer;

这时候,浏览器显示出来的页面很好看。页面如图:

 如果点击上述页面的 Pricing 菜单,显示价格页如下图:

上面的那个价格页,是静态页面,里面的价格,是 index.html 页面里面写死了的!

我要想页面价格随时可以根据服务器端的输出不同而变化,怎么搞?

### 前端页面 index.html 修改

在前端页面增加 JS 就好了。

首先给页面元素增加 ID,否则 JS 怎么去找到它来修改呢。比如上面那个价格显示 12 刀的东西,我在 index.html 里面一搜索,就发现它的代码是:

 <h2 class="amount">$12<span class="duration">/mo</span></h2>

 这里是写死 $12 的。我要用程序去修改它,因此我给它加上一个 ID,简单修改 index.html 的代码为:

 <h2 class="amount"><span id="price_1">$12</span><span class="duration">/mo</span></h2>

我增加了一个 span, id 是 price_1;

页面元素有了。再使用上一篇文章里面的代码向服务器请求数据然后修改页面元素,在 Index.html 里面,增加 JS 代码如下

 <script>
    
      axios.get('http://127.0.0.1:8080/price?Id=1')
    .then(function(response){
        //请求成功
        document.getElementById("price_1").innerHTML = "$" + response.data;
    }).catch(function(erroe){
        //请求失败
    });
  </script>

### 对应的后端代码

我给 Delphi 的 WebBroker 增加一个 Action,定义它的 path 属性为 price,双击这个 Action 产生它的事件代码,在里面写:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
  Response.Content := '99';
end;

上面直接返回字符串 99,其实这里可以根据参数去数据库查价格查到后把价格数据变成字符串输出给客户端。注意这里没有任何的 HTML 标签,仅仅是数据。后端代码根本不要去处理和 HTML 有关的事情。

### 运行结果

编译运行 Delphi 的程序,其实就是按一下 F9 或者点击 IDE 界面上的绿色三角形运行按钮,服务器端就运行起来了,不到 1 秒钟,速度非常快。

然后,在浏览器里面输入地址:http://127.0.0.1/index.html

当然,主页面显示出来了。然后,点击 Pircing 菜单,价格页面出来了,图如下:

 看看第一个价格,原本显示 12 的,现在显示为服务器端输出的 99;

##搞定!

我从写完上一篇文章,然后想到要套用模板,到网上搜索模板,吃了个晚饭,下载模板,到现在,只间隔了几个小时。下载完模板后,真正把代码实现出来,前后花了几分钟而已。

#进一步的探讨

老实说,看了 VUE 的教程,发现这个玩意的代码,其实非常的对程序员不友好。

高级语言,为啥高级?就是易读易懂啊,否则不如写汇编。现在的前端代码包括 JS,明明可以写得易读的,一堆人非要写成人看不懂的样子才显得水平高。而这个 VUE 充分发挥了要显得高级的特性,语法直接整成不易读的格式。

这也是为啥 Delphi 之父,要搞个 TypeScript 的原因了。

Delphi PASCAL 语言,当年发明出来是用于编程教学的教学语言,严谨,因此易读。

这个 VUE 是让程序员自己用 JS 代码去写一个按钮放哪里之类的东西,要命啊。Delphi 已经可以可视化拖放布局几十年了。

那么,我现在可以用现成的页面框架,通过修改页面的 HTML JS 代码的方法,让一个好看的页面变成动态页面。但是,这个好看的页面,我的修改依然是改代码,而不是可视化设计。

进一步,如果能够做一个工具程序,将 Delphi 的设计期的 Form 可视化设计的方式, 比如设计 FireMonkey 的 Form ,把 Form 里面用于布局的 Layout 控件,解析为 html 里面的 DIV 字符串,那我就可以通过 Delphi 的 Form 可视化设计,再套用一个前端的框架比如 BootStrap,输出一个排版好的页面;使用 BootStrap 主要是避免程序员自己去调试页面代码来实现页面布局和风格。

这样一来,似乎在可以可视化设计前端页面的同时,前端页面的代码和后端的代码是彻底分离了。后端可以用 Delphi 的 WebBroker 框架就可以很简单地写出服务器端的代码。
 

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

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

相关文章

用于安装和维护光纤单模和多模的光纤网络测试套件

VIAVI 唯亚威OMK-3xV2 光纤测试套件是一系列小巧且坚固耐用的仪表&#xff0c;用于安装和维护单模 (SM) 和多模 (MM) 光纤网络。所有测试套件均配备光功率计&#xff0c;以及专用于光功率、插入损耗测量和连续性检查的双波长或四波长功率计光源。 优点 随时可用 - 超高可靠性和…

四大主流BI工具的对比分析!

一、简介 1.Tableau Tableau 是一个 BI 分析和可视化工具。它为分析数据和创建交互式可视化提供了强大的功能。Tableau 旨在支持复杂的数据科学和分析&#xff0c;让数据专家可以使用一系列可视化工具构建分析。 2.Power BI Power BI 是 Microsoft 的产品&#xff0c;因此它…

[附源码]Python计算机毕业设计SSM久宠宠物店管理系统(程序+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…

Spring MVC中的拦截器

在之前学习JAVAWEB 的时候&#xff0c;我们学习了过滤器的知识。过滤器的作用是保护请求的服务器资源&#xff0c;在请求资源被执行之前&#xff0c;如果请求地址符合拦截范围&#xff0c;则会先执行过滤器。过滤器的执行时机&#xff0c;是在Servlet之前执行的。但是在使用了S…

Java项目导入IDEA的流程配置及常见问题解决(持续更新中...)

Java项目导入IDEA的流程配置及常见问题解决 本文主要演示一个普通 java 项目导入IDEA的流程步骤及可能出现的问题、原因及解决办法。 本文使用的部分软件版本如下&#xff1a; IDEA 2018.3 JDK 1.8 Windows 1.导入Java Priject 导入之后可能发出现大面积红色&#xff0c;这…

StringTable

文章目录1. String的基本特性2. String的内存分配3. String的基本操作4.字符串的拼接操作5. intern()的使用6. G1中的String去重操作1. String的基本特性 2. String的内存分配 使用String的intern方法可以把字符串加入到字符串常量池。同时可以使用该方法来证明JDK8中字符串常量…

PL7022/PL7022B原厂双节/两节锂电池串联充电IC和保护IC

双节锂电池串联管理系列选型表&#xff1a; 型号 封装 功能 PL7022B SOT23-6 双节4.2V锂电池串联保护电路 PL7022 SOT23-6 双节4.35V锂电池串联保护电路 PL7501C ESOP8 升压型双节锂电池串联充电电路&#xff08;VIN:5V&#xff09; PL7222 ESOP8 降压型双节锂电…

ABC 分析法(帕累托分析法、2/8分析法)

在任何特定群体中&#xff0c;重要的因子通常只占少数&#xff0c;而不重要的因子则占多数&#xff0c;因此只要能控制具有重要性的少数因子即能控制全局。例如&#xff0c;在企业中&#xff0c;通常认为它80%的利润来自于20%的项目或重要客户&#xff1b;全球最富有的 20% 人口…

帮公司面试了一个33岁的程序员,只因这一个细节,被我一眼看穿是培训班出来的,没啥工作经验...

首先&#xff0c;我说一句&#xff1a;培训出来的&#xff0c;优秀学员大有人在&#xff0c;我不希望因为带着培训的标签而无法达到用人单位和候选人的双向匹配&#xff0c;是非常遗憾的事情。 最近&#xff0c;在网上看到这样一个留言&#xff0c;引发了程序员这个圈子不少的…

基于功能安全的车载计算平台开发:硬件层面

作为车载智能计算平台功能软件与系统软件的载体&#xff0c;硬件的失效可能直接导致功能软件输出不可信任的结果&#xff0c;从而违背安全目标。由于硬件故障在硬件生命周期中发生时间的随机性&#xff0c;在通过改善流程降低系统性失效的同时&#xff0c;ISO 26262功能安全标准…

Mysql的时间类型选定:Datetime,Timestamp,Bigint

1. 基本区别: 2. 其他特性: 1. TIMESTAMP是以utc格式存储,会自动检索当前时区对时间进行转换,而DATETIME不会。 2. 存入null时,TIMESTAMP会自动存储当前时间,而DATETIME存储null值。 3. 时间计算: DATETIME翻译为汉语即"时间戳",它是当前时间到 Unix元年(1…

RabbitMQ_消息的TTL与死信队列

什么是消息的TTL? TTL time to live&#xff0c;消息的TTL 消息的存活时间或过期时间 什么是死信队列&#xff1f; 当队列中的消息到达存活时间或过期时间后&#xff0c;若未设置死信队列&#xff0c;则该消息将被抛弃&#xff0c;反之则转入死信队列 死信队列 配置类 死…

Polygon zkEVM R1CS与Plonk电路转换

1. 引言 前序博客有&#xff1a; Polygon zkEVM的pil-stark Fibonacci状态机初体验Polygon zkEVM的pil-stark Fibonacci状态机代码解析rank-1 constraint system R1CS 由上图可知&#xff0c;zkEVM会借助SNARK来“验证&#xff08;&#xff08;验证STARK证明&#xff09;的SN…

博安生物再次冲刺港交所上市:负债规模高企,持续出现亏损

11月30日&#xff0c;山东博安生物技术股份有限公司&#xff08;下称“博安生物”&#xff09;再次向港交所递交招股书&#xff0c;准备在港交所主板上市。据贝多财经了解&#xff0c;博安生物曾于2022年5月13日递表&#xff0c;现已“失效”。 相较于此前招股书&#xff0c;博…

【图像分割】基于神经气体网络的图像分割与量化(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

了解抖音小程序的评级。为什么我的抖音小程序申请不了某个功能?

目录前言评级评级运营规范评级周期查看评级评级对应的权益小程序评级审核驳回场景信用分常见问题为什么我的小程序不能挂载短视频&#xff1f;前言 小程序评级体系是衡量小程序整体质量的参照&#xff0c;也是小程序获取对应权益的指南&#xff0c;旨在推动、鼓励开发者提升小…

matlab如何从信号中去除60 Hz Hum电源线噪声

美国和其他几个国家的交流电流以60赫兹的频率振荡。这些振荡经常会破坏测量值并且必须减去。 最近我们被客户要求撰写关于信号去噪数据的研究报告&#xff0c;包括一些图形和统计输出。 在存在60 Hz电源线噪声的情况下研究模拟仪器输入端的开环电压。电压以1 kHz采样。 lo…

C/C++内存管理(malloc/calloc/realloc/free/new/delete/operator new/operator delete)

目录 C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free C内存管理方式:new/delete operator new与operator delete函数 new和delete的实现原理 malloc/free和new/delete的区别 (用法上和底层) 内存泄漏 C/C中程序内存区域划分&#xff1a; 1. 栈又叫堆栈…

Linux C简单服务器模型解析及完整代码

Linux C简单服务器模型解析及完整代码1.服务器端流程及解析2.服务器端代码3.客户端流程及解析4.客户端代码5.不足之处&#xff08;注&#xff1a;流程解析可结合相应代码处一起理解&#xff09;1.服务器端流程及解析 服务器端做的事情&#xff1a; 1.创建监听的套接字。 int s…

JAVA培训之数据库表关联关系

数据库表的关联关系有如下三种&#xff1a; 一对多 一对一 多对多 一对多的关系比较常见&#xff0c;我们在之前练习的都是一对多的关系操作&#xff0c;因此这里就不再重复介绍了。 1.一对一关系 在现实生活中&#xff0c;丈夫与妻子之间的关系就是一对一的关系&…