浅聊前后端分离开发和前后端不分离开发模式

news/2024/10/11 4:45:26/

1.先聊聊Web开发的开发框架Spring MVC

        首先要知道,Spring MVC是Web开发领域的一个知名框架,可以开发基于请求-响应模式的Web应用。而Web开发的本质是遵循HTTP(Hyper Text Transfer Protocol: 超文本传输协议)协议【发请求,给响应】。所以作为服务端,只要能运行一个服务,此服务监听某个端口上由客户端发送过来的请求,然后获取请求数据,进行业务处理后,最后给客户端发送一个响应,就可以实现Web开发。所以理论上不使用Web开发框架(如Spring MVC)甚至不使用Servlet API,也可以实现Web开发。

        比如经典的网络框架:Netty 就脱离了Servlet API。Netty开发的程序启动后,就监听某个端口上发送过来的数据,然后自己解析这些数据,进行业务处理,处理完成后,给客户端进行响应(按照客户端可以理解的数据格式向其响应数据)。【补充:Netty框架基于TCP协议。同时,Netty也支持UDP协议、HTTP协议、WebSockets协议、SSL/TLS协议等多种协议。所以,虽然Netty主要基于TCP协议,但它也具有广泛的协议支持能力,适用于各种不同类型的网络通信需求。

        通过以上分析可知,想要实现Web开发中的请求-响应。需要客户端和服务端事先约定好数据格式。众所周知的数据格式就是HTTP协议。当客户端根据HTTP协议给服务端传输数据,服务端就可以方便的进行解析;当服务端根据HTTP协议给客户端传输数据,客户端也可以方便的进行解析。

2. 从人的角度理解前后端分离开发

        前端页面由前端开发人员编程实现,后端业务逻辑由后端开发人员编程实现。这就是我一开始理解的前后端分离。

3. 从业务逻辑的角度理解前后端分离开发

3.1 前后不分离开发

        前端页面的跳转逻辑也是由开发人员自己编写控制的。比如在登录页面上输入用户名和密码登录成功后,需要跳转到系统首页,这个过程需要通过后端的业务逻辑控制进行跳转【这个就叫做前后不分离!】。此时,这个开发人员不仅要编写后端的业务逻辑,还要控制页面的数据渲染和页面跳转逻辑。如下图:

        通常在前后端不分离的开发模式中,需要在后端使用 转发 或 重定向跳转到指定页面。并且服务端返回的页面是完整的页面(暂不考虑Ajax),即服务端返回的是页面结构 + 数据。【这种前后端不分离的开发模式,也成为服务端渲染,渲染就是把数据填充到页面上】

3.2 前后分离开发

        服务端不再控制页面的跳转逻辑,以及页面数据的如何填充。如下图:

        所以可以看出,前后端分离,本质上是数据和页面分离。即数据由后端(服务端)负责,页面由前端负责。在前后端分离开发模式下,服务端给客户端响应的数据通常是 JSON格式的数据。

        前后端分离开发模式下,如果使用Spring MVC框架,使用 @RestController 和 @ResponseBody注解。

4. 前后端分离开发模式举例

        Spring MVC的经典例子。客户端发送一个请求给服务端,服务端只响应数据给客户端。如下图:

5. 前后端不分离开发模式举例

        在前后端不分离开发模式中,需要使用到模板引擎,常见的模板引擎有:Velocity, JSP,Freemarker,Thymeleaf等。SpringBoot官方推荐的模板引擎是Thymeleaf,其开发的步骤如下(具体开发案例可以查询网络,有很多案例):

(1)引入 spring-boot-starter-thymeleaf 依赖;

(2)编写页面模板文件(就是 html文件);

(3)接收客户端请求,进行业务处理,然后跳转到指定页面;

(4)使用Thymeleaf语法,给页面填充数据;

(5)把整个页面响应给客户端。


http://www.ppmy.cn/news/1537273.html

相关文章

docker远程端口

docker开启远程端口后,使用本地的访问是不可以访问会docker报错 需要在配置文件中加入sock vi /usr/lib/systemd/system/docker.service 配置文件在 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H uninx://var/run.docker/sock 6443端口也可以使用 systemct…

总结:Flink之DataStream各API介绍

一、介绍 本文主要是详细介绍 DataStream<T> 类中的各个方法,并给出它们的使用场景。 二、基本方法 getId(): 作用:返回转换操作的唯一标识符。场景:当需要调试或日志记录时,有时候需要知道操作的 ID。getParallelism(): 作用:获取流的并行度。场景:在优化作业时…

高级java每日一道面试题-2024年10月1日-服务器篇[Redis篇]-Redis数据结构压缩列表和跳跃表的区别?

如果有遗漏,评论区告诉我进行补充 面试官: Redis数据结构压缩列表和跳跃表的区别&#xff1f; 我回答: 关于Redis数据结构的理解是一个重要的考察点&#xff0c;特别是压缩列表&#xff08;ziplist&#xff09;和跳跃表&#xff08;skiplist&#xff09;这两种数据结构&…

QT-多线程、线程池的使用

在进行桌面应用程序开发的时候&#xff0c; 假设应用程序在某些情况下需要处理比较复杂的逻辑&#xff0c;如果只有一个线程去处理&#xff0c;就会导致窗口卡顿&#xff0c;无法处理用户的相关操作。这种情况下就需要使用多线程&#xff0c;其中一个线程处理窗口事件&#xff…

大载重无人机物资吊运技术培训详解

大载重无人机物资吊运技术培训详解主要涉及理论知识、实操技能、安全规范以及应用领域等多个方面。以下是对这些方面的详细解析&#xff1a; 一、理论知识 1. 无人机基础知识 无人机类型与结构&#xff1a;了解大载重无人机的类型、结构特点及其工作原理&#xff0c;特别是针…

LeetCode-871 最低加油次数

重启力扣每日一题系列&#xff01; 因为过去两个月里掉粉掉的好严重&#xff0c;我想大抵是因为更新的频率不如上半年了&#xff0c;如果我重启了每日一题系列那岂不是至少是每日一更☝&#x1f913;&#xff1f; 也不是每天都更&#xff0c;我有两不更&#xff0c;特难的就不…

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空

【重学 MySQL】四十七、表的操作技巧——修改、重命名、删除与清空 修改表添加字段语法示例注意事项 删除字段语法示例 修改字段使用 MODIFY COLUMN语法示例 使用 CHANGE COLUMN语法示例 重命名表语法示例 删除表语法示例 清空表使用 TRUNCATE TABLE使用 DELETE FROM对比 TRUNC…

如何在 SQL 中创建一个新的数据库?

在SQL中创建一个新的数据库&#xff0c;首先你需要有一个可以执行SQL语句的环境。 这通常意味着你已经有了一个数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;如MySQL、PostgreSQL、Oracle或Microsoft SQL Server等。 不同的DBMS可能有不同的细节&#xff0c;但基本…