初识别三层架构

简介: 本文介绍了三层架构在Web开发中的工作流程,从前端请求到后端处理,再到数据返回与页面渲染,详细解析了客户端、Controller、Service、Dao各层之间的调用关系及前后端交互过程。

三层架构理解:

当客户端发送请求GET /users/list时,完整流程如下:

  1. 客户端请求
    浏览器或其他客户端发送 HTTP 请求到服务器。
  2. DispatcherServlet 接收请求
    Spring MVC 的前端控制器DispatcherServlet捕获请求,根据@RequestMapping注解找到对应的UserController#findAll()方法。
  3. Controller 调用 Service
    UserController注入了UserService,调用其getAllUsers()方法。
  4. Service 调用 Dao
    UserService注入了UserDao,调用其getAllUsers()方法获取数据。
  5. Dao 访问文件
    UserDao通过类加载器读取user.txt文件并解析为User对象列表。

如何与前端界面进行交互的

浏览器请求index.html → 服务器返回HTML → 浏览器解析Vue代码 →
Vue mounted钩子触发axios请求 → 请求到达Spring Controller →
Controller调用Service → Service调用Dao → Dao读取文件 →
数据返回Service → Service返回Controller → Controller返回JSON →
axios接收响应 → Vue更新数据 → 表格渲染完成

服务器返回HTML

"服务器返回 HTML" 是 Web 应用的起点,浏览器先加载 HTML 骨架,再通过 JS 与后端 API 交互获取数据,最终完成页面渲染。这种模式使前后端分离更加彻底,提升了开发效率和可维护性。

在没有index.html文件时就需要显示调用

Spring Boot 不会自动将user.html视为默认首页,需显式访问

为什么最终访问的是user.html(前端页面的名字)而不是请求的/list

1. 前后端分离的请求流程

当你在浏览器中输入 URL 并访问时,完整的流程如下:

步骤 1:浏览器请求 HTML 页面

  1. 用户在浏览器输入:http://localhost:8080/user.html(或根路径/
  2. 浏览器发送 HTTP 请求到服务器:GET /user.html
  3. 服务器查找static目录下的user.html文件并返回

步骤 2:浏览器解析 HTML 并执行 JS

  1. 浏览器接收 HTML 内容并开始解析
  2. 遇到 JS 引用(如 Vue、axios),发送请求获取这些资源
  3. 执行 Vue 初始化代码,创建 Vue 实例

步骤 3:前端 JS 发送 API 请求

  1. Vue 实例在mounted钩子中调用search()方法
  2. search()方法使用 axios 发送请求:GET /list
  3. 该请求指向后端的 Controller 接口

步骤 4:后端处理 API 请求

  1. 后端 Controller 接收/list请求
  2. 调用 Service 和 Dao 获取数据
  3. 将数据序列化为 JSON 返回给前端

步骤 5:前端渲染数据

  1. 前端接收 JSON 数据并赋值给userList
  2. Vue 检测数据变化,自动更新 DOM(表格)

2. 关键区别:页面请求 vs API 请求

请求类型

示例 URL

请求者

响应内容

用途

页面请求

/user.html

/

浏览器

HTML 文件

加载页面骨架

API 请求

/list

前端 JS 代码

JSON 数据

获取动态数据并渲染到页面中

3. 为什么不能直接请求 /list?

如果你直接在浏览器地址栏输入/list,会发生以下情况:

  1. 浏览器发送请求:GET /list
  2. 后端返回 JSON 数据(如[{id:1,username:"admin"}]
  3. 浏览器将 JSON 数据作为纯文本显示在页面上(而非 HTML 表格)

这是因为:

  • 浏览器默认发送页面请求,期望接收 HTML 内容
  • /list是 API 接口,只返回数据,不返回 HTML
  • 数据渲染逻辑(如表格生成)在前端 JS 中,而非后端

为什么原来的vue可以直接渲染(学习vue可以直接渲染)原因:

因为原来提供的是json格式的文件,不需要用Java后端进行解析

Vue 可以直接渲染 JSON 数据,但对于其他格式的数据:

  1. 简单场景:可以在前端使用 JavaScript 解析。
  2. 复杂场景:推荐通过后端 API 中转,将数据转换为 JSON 后再返回给前端。
相关文章
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
361 0
【数据挖掘】神经网络与感知机基础概念讲解(图文解释 超详细)
|
1月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
1月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
1月前
|
SQL JavaScript Java
三层架构理解(实现前后端分离)
本文介绍了三层架构实现前后端分离的流程,从前端Vue发起请求,到后端Spring处理数据,最后返回结果并由前端渲染展示。同时详细解析了Bean重复问题的解决方案,包括使用@Service、@Primary、@Qualifier和@Resource注解进行依赖注入控制。此外还介绍了MyBatis中#{}与${}的区别及使用场景,以及三层架构中各组件的协作方式。
|
1月前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
5月前
|
存储 JSON API
深入研究:淘宝天猫商品详情查询API详解
淘宝开放平台提供一系列API接口,帮助开发者获取淘宝商品的详细信息并集成到自有应用中。主要功能包括:获取单个商品详情(item_get)、评论信息(item_review)、快递费用(item_fee)、等。此外,还支持搜索商品(item_search)、按图搜索(item_search_img)、优惠券查询(item_search_coupon)、类目信息(item_cat_get)等功能。返回数据通常为JSON格式,包含商品标题、价格、库存、主图链接等基本信息,以及HTML格式的详细描述内容,方便开发者解析与展示。
|
JSON 数据挖掘 API
各大电商平台的商品详情数据接口(API接口系列)
各大电商平台的商品详情数据接口(API接口系列)是开发者在构建电商应用或进行数据分析时的重要工具。这些接口允许开发者通过编程方式获取商品的详细信息,如商品ID、标题、价格、库存、属性、描述、图片等。以下是对淘宝、京东、拼多多等电商平台商品详情数据接口的汇总,以及开发者在使用这些接口时需要注意的事项。
各大电商平台的商品详情数据接口(API接口系列)
|
10月前
|
TensorFlow 算法框架/工具 Swift
魔搭的notebook再次打开时swift导入失败
每次重新打开Notebook时,系统会显示一系列警告和错误信息。主要问题是当前安装的Keras版本为Keras 3,而Transformers库尚不支持该版本。解决方法是安装与Transformers兼容的`tf-keras`包,命令为`pip install tf-keras`,但pip后仍然报错
|
10月前
|
机器学习/深度学习 人工智能 算法
【AI系统】关键设计指标
本文介绍了AI芯片设计中的关键指标与设计点,涵盖OPS、MACs、FLOPs等计算单位,以及精度、吞吐量、时延、能耗、成本和易用性等六大关键指标。文章还探讨了MACs和PE优化策略,以及通过算术强度和Roofline模型评估AI模型在特定芯片上的性能表现,为AI芯片的性能优化提供了理论依据和实践指导。
663 1
|
10月前
|
监控 Java 开发者
什么是 Spring Boot?
什么是 Spring Boot?
2261 6