后端请求响应和分层解耦web开发的三层架构

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 后端请求响应和分层解耦web开发的三层架构

请求响应案例

步骤

步骤1 配置环境 引入依赖

我们需要引入解析dom4j的工具类

再引入一个实体类

dom4j技术

dom4j 是一个用于处理 XML 文档的 Java 库,具有以下主要作用:

  1. 解析 XML 文档:dom4j 可以帮助你解析 XML 文档,将 XML 文档中的数据提取出来,以便在 Java 应用程序中进行处理和操作。
  2. 创建 XML 文档:使用 dom4j,你可以动态地创建 XML 文档,设置元素、属性和文本内容,并将其保存为 XML 文件或输出到流中。
  3. XPath 支持:dom4j 提供了对 XPath 查询语言的支持,可以方便地通过 XPath 表达式查询和定位 XML 文档中的元素。
  4. XML 文档的遍历与操作:dom4j 提供了灵活的 API,使你可以轻松地遍历和操作 XML 文档的各个部分,包括元素、属性、文本节点等。
  5. 与其他 XML 相关技术的集成:dom4j 可以与其他 XML 相关技术(如 XSLT、XPath、XML Schema 等)配合使用,实现更加复杂的 XML 处理任务。

总的来说,dom4j 是一个功能强大且易于使用的 XML 处理库,适用于在 Java 应用程序中进行各种 XML 相关的操作和处理。

dom4j 是一个用于处理 XML 的 Java 库。如果你想在你的 Java 项目中使用 dom4j,你需要将 dom4j 库添加到你的项目依赖中。

你可以通过 Maven、Gradle 或手动下载 JAR 文件来添加 dom4j 依赖。

使用 Maven

如果你使用 Maven,可以在你的项目的 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

使用 Gradle

如果你使用 Gradle,可以在你的项目的 build.gradle 文件中添加以下依赖

groovy复制代码implementation 'org.dom4j:dom4j:2.1.3'

手动下载

你也可以手动下载 dom4j 的 JAR 文件,并将它添加到你的项目的类路径中。你可以从 dom4j 的官方网站或 Maven 仓库中下载相应的 JAR 文件。

无论你选择哪种方法,确保添加了正确的版本,以满足你的项目需求。

步骤2 部署前端页面并配置Vue

对于springboot项目来说 我们是可以在项目中添加前端页面的

但是存放目录有考究 默认是放在static目录下的

一般我们推荐static目录 因为springboot工程会自动创建static目录

这里在教的就是后端处理数据的流程:获取请求、参数;处理数据业务;响应数据。到后面会封装起来的

案例中要返回统一结果 我们使用之前采用的result类

我们查看引入的html页面

发现再script标签类创建了一个vue对象

vue接管的区域是app

服务端的路径为 /listEmp

步骤3 配置后端控制器

创建类 加载员工数据 (EmpController)员工控制器

  1. MVC(Model-View-Controller)中的控制器(Controller): 在软件架构中,控制器是MVC模式的一部分,负责处理用户输入并调度对应的业务逻辑处理程序(模型)和视图(View)。在Web开发中,控制器通常是处理HTTP请求的组件,根据请求的路径和参数调用相应的业务逻辑并返回结果。
  2. Spring MVC中的控制器(Controller): Spring MVC是一个基于MVC模式的Web框架,其中的控制器负责接收和处理HTTP请求,并将请求委托给适当的业务逻辑处理器,最终返回响应给客户端。
  3. 前端开发中的控制器(Controller): 在前端开发中,控制器通常是指AngularJS、React等前端框架中的组件,负责管理视图和模型之间的交互逻辑,响应用户输入并更新视图状态。

加载xml文件 运用了工具类XmlParserUtils 事先导入的工具类

import org.w3c.dom.*;
import org.xml.sax.SAXException;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
 
public class XmlParserUtils {
 
    // 解析XML文件并返回Document对象
    public static Document parseXmlFile(String filePath) throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        return builder.parse(new File(filePath));
    }
 
    // 获取指定节点的子节点列表
    public static NodeList getChildNodes(Element element, String tagName) {
        return element.getElementsByTagName(tagName);
    }
 
    // 获取节点的文本内容
    public static String getNodeText(Node node) {
        return node.getTextContent();
    }
 
    // 获取节点的属性值
    public static String getNodeAttribute(Node node, String attributeName) {
        if (node.getNodeType() == Node.ELEMENT_NODE) {
            Element element = (Element) node;
            return element.getAttribute(attributeName);
        }
        return null;
    }
 
    // 示例用法
    public static void main(String[] args) {
        try {
            // 解析XML文件
            Document doc = parseXmlFile("example.xml");
 
            // 获取根节点
            Element root = doc.getDocumentElement();
 
            // 获取根节点下的所有子节点
            NodeList nodeList = root.getChildNodes();
 
            // 遍历子节点
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    // 获取节点名称
                    String nodeName = element.getNodeName();
                    // 获取节点的文本内容
                    String nodeText = getNodeText(element);
                    // 获取节点的属性值
                    String attributeValue = getNodeAttribute(element, "attributeName");
 
                    // 打印节点信息
                    System.out.println("Node Name: " + nodeName);
                    System.out.println("Node Text: " + nodeText);
                    System.out.println("Attribute Value: " + attributeValue);
                    System.out.println();
                }
            }
        } catch (ParserConfigurationException | IOException | SAXException e) {
            e.printStackTrace();
        }
    }
}

对数据进行转换处理

响应数据

用类加载器获取资源

类加载器在Java中具有以下几个重要作用:

  1. 加载类文件: 类加载器负责将.class文件加载到内存中,并转换成对应的Class对象。这个过程是Java程序运行的基础,没有类加载器,Java程序无法运行。
  2. 类的唯一性和一致性: 类加载器通过委托机制,保证了类的唯一性和一致性。即同一个类文件只会被加载一次,并且被不同的类加载器加载得到的是同一个Class对象。
  3. 实现类加载的安全机制: 类加载器可以根据特定的策略来加载类文件,例如根据类路径、URL等。这种灵活性可以实现类加载的安全控制,防止恶意类文件的加载和执行。
  4. 实现模块化和动态加载: 类加载器可以根据需要动态加载类文件,从而实现模块化的程序设计和动态扩展功能。例如,在Java的模块化系统中,可以通过自定义类加载器实现模块的动态加载和卸载。
  5. 实现类的加载优化: 类加载器可以根据具体的应用场景实现类的加载优化,例如缓存已加载的类、延迟加载等。这样可以提高程序的性能和效率。
  6. 支持类的热部署: 类加载器可以在运行时动态加载新的类文件,从而实现类的热部署功能。这对于需要频繁更新和修改的应用程序是非常有用的。

总的来说,类加载器在Java中扮演着至关重要的角色,它不仅负责将类文件加载到内存中,还可以实现一些额外的功能,如模块化、安全控制、动态加载等,为Java程序的灵活性和可扩展性提供了基础支持。

用类加载器

因为返回值的是result 统一的一个响应结果

响应统一结果 所以我们要将empList传递进方法

然后数据类型就是json形式的

并且响应回去了统一的数据 就是这个empList集合

控制器 EmpController

做的是解析xml文件 将数据放到泛型为emp的集合里去

然后将集合用Result类里面的success方法

将数据封装到result里面去

返回统一的响应结果

这样我们就获取到了接口数据

用postman测试接口数据

启动springboot工程

访问本地端服务器 这样就能展示页面

代表我们的程序已经搭建完毕

分层解耦

在 web 开发中,三层架构通常指的是将一个应用程序分为三个逻辑层:表示层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。

  1. 表示层(Presentation Layer):
  • 表示层是用户与应用程序交互的界面,通常是用户界面(UI)或者用户体验(UX)层。
  • 它负责接收用户的请求,展示信息给用户,并将用户的输入传递给业务逻辑层进行处理。
  • 在 web 开发中,表示层通常由 HTML、CSS、JavaScript 和用户界面框架(如 React、Vue.js 等)来实现。
  1. 业务逻辑层(Business Logic Layer):
  • 业务逻辑层负责处理应用程序的业务逻辑,即应用程序中真正的核心功能。
  • 它接收表示层传递过来的请求,执行相应的业务逻辑,然后将结果返回给表示层。
  • 在这一层中,会进行数据处理、业务规则验证、逻辑运算等操作,以确保应用程序的正确运行。
  • 业务逻辑层通常由后端服务器端的编程语言和框架(如 Python 的 Django、Java 的 Spring、Node.js 的 Express 等)实现。
  1. 数据访问层(Data Access Layer):
  • 数据访问层负责与数据存储(通常是数据库)进行交互,从而实现数据的持久化和管理。
  • 它负责执行数据库操作(如查询、插入、更新、删除等),并将数据返回给业务逻辑层进行处理。
  • 数据访问层的设计应该独立于具体的数据库类型,以便于在需要时更换数据库而不需要修改业务逻辑层的代码。
  • 数据访问层通常由数据库访问框架或 ORM(对象关系映射)库来实现,如 SQLAlchemy(Python)、Hibernate(Java)、Sequelize(Node.js)等。

示意图以及自我理解

前端发起请求 先到达controller层

然后交给service层执行业务逻辑

service层向dao层拿数据

然后处理后再交给controller层

controller层返回给前端页面展示给用户

思考

我们以后软件设计开发时

要尽量让每一个类 接口 方法功能单一

单一职责原理

一个类 接口 方法只管自己的区域

这样有利于代码的拓展与维护

那么我们刚刚的请求案例书写就存在代码冗余的问题

改进请求响应案例

我们在上一个案例中的所有方法都写在了一个控制器方法中

代码冗余 逻辑复杂

代码的复用性太差 难以拓展 难以维护

web开发三层架构分析

我们在Java包下通常这样书写

使用三层架构将大数据展示在前端页面有几个好处:

  1. 分层清晰:三层架构将应用程序分为数据访问层、业务逻辑层和表示层(UI层),使得各层的职责清晰明确。这样的结构使得系统更易于理解、维护和扩展。
  2. 可维护性:由于各层之间的明确分离,使得系统的维护更为容易。例如,如果需要更改数据访问逻辑,可以只修改数据访问层,而不影响业务逻辑层和表示层。
  3. 可扩展性:三层架构使得系统的各个部分相对独立,因此很容易实现水平或垂直扩展。例如,如果需要增加更多的数据源或者改变数据处理方式,可以只对数据访问层进行修改而不影响其他层。
  4. 性能优化:通过在不同层次上分配和优化资源,可以更有效地管理系统的性能。例如,可以在数据访问层使用缓存技术来提高数据检索的速度,而在表示层使用异步加载来提高页面加载速度。
  5. 安全性:通过在不同层次上实施安全措施,可以增强系统的安全性。例如,可以在数据访问层实施访问控制来限制对数据库的访问,而在表示层实施输入验证来防止恶意输入。

这是我最近在做的数据可视化ppt 其中我就展示了web开发的三层架构

目录
相关文章
|
1月前
|
负载均衡 应用服务中间件 持续交付
微服务架构下的Web服务器部署
【8月更文第28天】随着互联网应用的不断发展,传统的单体应用架构逐渐显露出其局限性,特别是在可扩展性和维护性方面。为了解决这些问题,微服务架构应运而生。微服务架构通过将应用程序分解成一系列小型、独立的服务来提高系统的灵活性和可维护性。本文将探讨如何在微服务架构中有效部署和管理Web服务器实例,并提供一些实际的代码示例。
65 0
|
14天前
|
SQL 存储 安全
Web安全-CSRF跨站请求伪造
Web安全-CSRF跨站请求伪造
33 5
|
20天前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
31 3
|
27天前
|
开发者 图形学 API
从零起步,深度揭秘:运用Unity引擎及网络编程技术,一步步搭建属于你的实时多人在线对战游戏平台——详尽指南与实战代码解析,带你轻松掌握网络化游戏开发的核心要领与最佳实践路径
【8月更文挑战第31天】构建实时多人对战平台是技术与创意的结合。本文使用成熟的Unity游戏开发引擎,从零开始指导读者搭建简单的实时对战平台。内容涵盖网络架构设计、Unity网络API应用及客户端与服务器通信。首先,创建新项目并选择适合多人游戏的模板,使用推荐的网络传输层。接着,定义基本玩法,如2D多人射击游戏,创建角色预制件并添加Rigidbody2D组件。然后,引入网络身份组件以同步对象状态。通过示例代码展示玩家控制逻辑,包括移动和发射子弹功能。最后,设置服务器端逻辑,处理客户端连接和断开。本文帮助读者掌握构建Unity多人对战平台的核心知识,为进一步开发打下基础。
61 0
|
27天前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
34 0
|
27天前
|
前端开发 微服务 API
微服务浪潮下的JSF革新:如何在分散式架构中构建统一而强大的Web界面
【8月更文挑战第31天】随着微服务架构的兴起,企业将应用拆分成小型、独立的服务以提高系统可维护性和可扩展性。本文探讨如何在微服务架构下构建和部署JavaServer Faces (JSF) 应用,通过RESTful服务实现前后端分离,提升灵活性和适应性。
44 0
|
28天前
|
存储 缓存 NoSQL
【性能飙升的秘密】FastAPI应用如何借助缓存技术实现极速响应?揭秘高效Web开发的制胜法宝!
【8月更文挑战第31天】FastAPI是一个高性能Web框架,利用Starlette和Pydantic实现高效API构建。本文介绍如何通过缓存提升FastAPI应用性能,包括使用`starlette-cache[redis]`实现Redis缓存,以及缓存一致性和缓存策略的注意事项。通过具体示例展示了缓存的配置与应用,帮助开发者构建更高效的Web应用。
56 0
|
28天前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
26 0
|
1月前
|
Web App开发 安全 JavaScript
【Azure 应用服务】App Service 通过配置web.config来添加请求返回的响应头(Response Header)
【Azure 应用服务】App Service 通过配置web.config来添加请求返回的响应头(Response Header)
|
1月前
|
缓存 运维 网络协议
一台新PC进行Web页面请求的历程:技术深度剖析
【8月更文挑战第24天】在当今数字化时代,当我们轻轻点击浏览器上的一个链接,背后其实经历了一场复杂而精妙的交互过程。本文将带您深入探索,从一台全新PC的角度出发,揭秘Web页面请求的全过程,展现这背后隐藏的技术奥秘。
28 0