当前位置: 首页 > news >正文

JavaWeb后端开发知识储备1

目录

1.DTO/VO/PO

2.MVC架构/微服务架构

3.JWT令牌流程

4.ThreadLocal

5.接口路径/路径参数


1.DTO/VO/PO

1.1 DTO

DTO 即 Data Transfer Object—— 数据传输对象,是用于传输数据的对象,通常在服务层与表现层之间传递数据,DTO 通常用于减少网络传输的数据量,因为它只包含需要传递的数据,而不包含业务逻辑。DTO 常用于不同服务或系统之间的数据交换。

public class UserDTO {private String id;private String username;private String email;// 可能还包含其他的传输相关字段// Getters and Setters
}

1.2 VO

VO 即 Value Object-——值对象,VO 通常在表示层(如前端)使用,表示一个具体的业务场景中的数据结构,可能是多个领域对象或实体对象的组合。

public class UserVO {private String username;private String displayName;// 可能包含一些展示相关的信息,比如角色、权限等// Getters and Setters
}

1.3 PO

PO 即 Persistent Object——持久化对象,PO 是与数据库表结构一一对应的 Java 对象,用于表示数据库中的一行记录。特点:

  • 直接映射到数据库表结构,通常对应于数据库中的一张表
  • 包含数据库字段的所有属性
  • 可能包括一些与数据库相关的注解或映射信息
@Entity
@Table(name = "users")
public class UserPO {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username")private String username;@Column(name = "password")private String password;@Column(name = "email")private String email;// Getters and Setters
}

三者的工作流程:

  1. 从数据库到业务逻辑:在系统需要从数据库中获取数据时,通过 DAO 层获取 PO 对象,将其从数据库加载到内存
  2. 业务层处理:如果业务逻辑复杂或者需要传递给其他服务时,将 PO 转换成 DTO 或 VO 对象进行传输,以减少依赖性和安全风险。
  3. 传输到客户端:DTO 将业务层处理后的数据传输到控制器层,最终封装为 API 响应返回给客户端。
  4. 从客户端到数据库:客户端提交的数据通过控制器层接收后转换为 DTO 或 VO,再经业务逻辑处理后转化为 PO,最终将数据保存至数据库。

总结:

  • PO:用于数据库交互,直接与数据库表结构相关
  • DTO:用于跨层传输数据,通常为精简版或安全版的数据结构
  • VO:用于业务逻辑,封装系统内的不可变数据

2.MVC架构/微服务架构

MVC架构和微服务架构是两种不同层次的架构模式,MVC是一种应用内的架构模式,主要用于组织单个应用程序的代码逻辑,而微服务是一种系统级的架构模式,用于将一个大型应用分解成多个可独立部署的服务。

具体来说,MVC(Model-View-Controller)是一种常见的软件架构模式,用于将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种分层结构帮助组织代码,提高应用的可维护性和扩展性。

Model负责处理应用程序的核心数据逻辑。它包含应用程序的数据结构和业务逻辑,直接与数据库进行交互,并进行数据的增删改查操作。

View负责呈现数据给用户,是用户与应用程序交互的界面。视图的主要目的是展示数据,但不包含业务逻辑。

Controller是模型和视图之间的桥梁,负责处理用户输入并协调模型和视图的工作。控制器从视图接收用户输入,将其解释为对模型的操作。

3.JWT令牌流程

4.ThreadLocal

客户端每次发送的请求都属于单独的一个线程(最小单位,进程是软件),所以如果想要在一个请求中获取信息就可以通过ThreadLoacl。ThreadLocal 并不是一个Thread(线程),而是Thread的局部变量。ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。ThreadLocal常用方法:

  • public void set(T vare)  设置当前线程的线程局部变量的值
  • public T get()  返回当前线程所对应的线程局部变量的值
  • public void remove()  移除当前线程的线程局部变量

当然,往往使用ThreadLocal的时候都会简单地封装成一个工具类:

public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}

5.接口路径/路径参数

在Java后端开发中,接口路径和路径参数是指向服务器资源和处理请求数据的重要概念,接口路径是API中一个特定的URL地址,用于定位资源或功能,例如:

  • https://example.com/api/users:其中/api/users就是接口路径,表示访问用户资源的接口

在Java后端开发中,接口路径通常由控制器(Controller)类来定义。例如在Spring框架中,可以使用@RequestMapping@GetMapping等注解来指定路径,例如下面的代码中,/api/users就是getAllUsers()方法的接口路径

@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/users")public List<User> getAllUsers() {// 逻辑代码}
}

路径参数是URL路径中的动态部分,通常用于识别特定资源。路径参数使用{}括起来,并且会在方法中被解析并绑定。例如:

  • https://example.com/api/users/123:其中123就是路径参数,表示要访问ID为123的用户资源

假设我们有一个电商系统,需要获取特定商品的详细信息。可以使用路径参数来标识商品的ID:接口路径定义为:/api/products/{productId},如果要获取ID为888的商品信息,客户端会发起以下请求:

GET https://example.com/api/products/101

在Spring框架中,我们可以用@PathVariable注解来捕获这个路径参数:

@RestController
@RequestMapping("/api/products")
public class ProductController {@GetMapping("/{productId}")public Product getProductById(@PathVariable("productId") Long productId) {// 假设我们从数据库获取商品信息Product product = productService.findProductById(productId);return product;}
}
  • {productId} 是路径参数占位符
  • @PathVariable("productId") 把URL中的productId参数提取出来,并赋值给方法参数productId
  • 当请求GET /api/products/101到达时,Spring会自动将路径中的101赋值给productId,然后在getProductById方法中使用这个值来获取商品信息

再举一个例子,要写一个启用禁用员工账号的接口,接口路径+路径参数为/status/{status}

@PostMapping("/status/{status}")
@ApiOperation("启用禁用员工账号")
public Result startOrStop(@PathVariable("status") Integer status, Long id){employeeService.startorstpp(status,id);return Result.success();
}

相关文章:

JavaWeb后端开发知识储备1

目录 1.DTO/VO/PO 2.MVC架构/微服务架构 3.JWT令牌流程 4.ThreadLocal 5.接口路径/路径参数 1.DTO/VO/PO 1.1 DTO DTO 即 Data Transfer Object—— 数据传输对象&#xff0c;是用于传输数据的对象&#xff0c;通常在服务层与表现层之间传递数据&#xff0c;DTO 通常用于…...

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…...

大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

百度搜索AI探索版多线程批量生成TXT原创文章软件-可生成3种类型文章

百度搜索AI探索版是百度推出的一款基于大语言模型文心一言的综合搜索产品‌。以下是关于百度搜索AI探索版的详细介绍&#xff1a; ‌产品发布‌&#xff1a;百度搜索AI探索版在百度世界大会上进行了灰度测试&#xff0c;并面向用户开放体验‌。 ‌核心功能‌&#xff1a;与传…...

ubuntu20.04 解决Pytorch默认安装CPU版本的问题

ubuntu20.04 解决Pytorch默认安装CPU版本的问题 在使用Anaconda安装支持CUDA的PyTorch版本时&#xff0c;遇到只能安装CPU版本的PyTorch是一个常见问题。这通常由于Anaconda环境配置、镜像源设置不当或版本匹配问题导致。以下是详尽的解决方案和步骤&#xff0c;以确保能够正确…...

名词解释-2-形状算数实验、潜在空间、3D生成模型

形状算术实验&#xff08;Shape Arithmetic&#xff09;是一种在3D生成模型中进行的实验&#xff0c;旨在通过在潜在空间中对形状的潜在向量进行算术操作来实现形状的变换。具体来说&#xff0c;该实验通过选择两个不同的3D形状实例&#xff0c;将其输入到编码器中生成两个潜在…...

Android 使用python统计getevent按键

1、连接ADB 2、开启脚本 作用&#xff1a; 统计时间内相应的event数量 python代码&#xff1a; import subprocess import redef parse_getevent_output():# 启动getevent进程getevent_process subprocess.Popen([adb, shell, getevent, -t, -l], stdoutsubprocess.PIPE,st…...

NVIDIA jetson查看资源占用情况,打印/保存资源使用情况日志

1.jtop jtop这个一般都有安装&#xff0c;只能实时查看 安装方式为 sudo -H pip install jetson-stats运行就是直接 jtop 即可 2.tegrastats 这个是jetson自带的工具&#xff0c;可以保存日志到文件&#xff0c;用于测试资源占用有无异常比较好用&#xff0c;如果资源有异常…...

ssm102“魅力”繁峙宣传网站的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;“魅力”繁峙宣传网站系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了“魅力”繁峙宣传网站系统的发展&#x…...

逐行加载 HTML 内容并实时显示效果:使用 wxPython 的实现

这篇博客中&#xff0c;我们将详细分析如何使用 wxPython 构建一个简单的桌面应用程序&#xff0c;用于逐行加载并显示 HTML 文件的内容&#xff0c;并在加载完成后通过浏览器组件呈现最终页面。通过该应用&#xff0c;我们可以体验到逐行加载 HTML 内容的视觉效果&#xff0c;…...

UE4 Cook 从UAT传递参数给UE4Editor

需求 一句Cook的命令如下&#xff1a; ${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project${ClientPath}/${ProjectName}.uproject -noP4 -platformIOS -cooksinglepackage -client -clientconfig${CookConfig} -iterate -skipbuild -nocompile -NoMutex…...

【学习日记】notebook添加JAVA支持

作者是个大学生 这个专栏主要收集课时常用的软件 以及女朋友上课用的软件的教程 新开了gitcode 用于上传安装包 环境说明 windows11 java23.0.1 ijava1.1.2 Anaconda-2024.02 需提前配置好java环境 本篇仅对添加支持进行说明 ijava的GitCode链接NotebookAddsSupportForJava:no…...

以太坊系地址衍生算法分层确定性生成逻辑

文章目录 一、前言1.1 衍生算法生成的私钥1.2 随机生成的私钥二、私钥生成及私钥提取2.1 golang如何使用衍生算法生成私钥,然后为用户生成地址2.1.1 实现步骤2.1.2 golang代码示例2.1.3 代码说明2.2 地址交易时,如何提取地址私钥2.2.1 私钥恢复说明2.2.2 golang代码通过助记词…...

【Unity】ScriptableObject的应用:利用配方合成新物体

前一篇已经使用ScriptableObject(SO)类配置可放置物体&#xff0c;本篇探索更多的SO类应用场景。 需求分析 将若干指定物体放在工作台上&#xff0c;可以生成新的物体。 成果展示 Scene部分 准备工作台&#xff0c;放在工作台上的物体全部放在指定PlacedObjects空物体下。 …...

31DNS设置

每天五分钟学Linux | 第三十一课&#xff1a;DNS设置 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了如何配置Linux系统的IP地址。今天&#xff0c;我们将探讨如何设置DNS&#xff08;域名系统&#xff09;&#…...

使用Docker快速部署FastAPI Web应用

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行&#xff0c;镜像是容器的只读模板&#xff0c;容器是模板的一个实例。镜像是分层结…...

全面掌握Spring Boot异常处理:策略与实践

标题&#xff1a;全面掌握Spring Boot异常处理&#xff1a;策略与实践 引言 在Spring Boot应用开发中&#xff0c;异常处理是一个关键环节&#xff0c;它不仅关系到应用的稳定性&#xff0c;也直接影响用户体验。本文将详细介绍如何在Spring Boot中实现异常处理&#xff0c;包…...

【LeetCode】【算法】11. 盛最多水的容器

LeetCode 11. 盛水最多的容器 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 思…...

ES6代理和反射新特性,详细讲解

代理与反射 es6新增了代理和反射特性&#xff0c;这两个特性为开发者提供了拦截并向基本操作嵌入额外行为的能力。 代理基础 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta charset"UTF-8"&g…...

vue计算属性 初步使用案例

<template><div><h1>购物车</h1><div v-for"item in filteredItems" :key"item.id"><p>{{ item.name }} - {{ item.price }} 元</p><input type"number" v-model.number"item.quantity"…...

大模型时代,呼叫中心部门如何建设一套呼出机器人系统?

大模型时代&#xff0c;呼叫中心部门如何建设一套呼出机器人系统&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 在大模型时代&#xff0c;呼叫中心部门建设一套呼出机器人系统需要综合考虑技…...

使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面

今天上线的时候发现系统不同显示好像不一样&#xff0c;苹果手机打开的时候是正常的&#xff0c;但是一旦用安卓手机打开就会出现label不置顶的情况。尝试了很多种办法&#xff0c;也在官方查看了map相关的文档&#xff0c;发现并没有给label设置zIndex的属性&#xff0c;只看到…...

力扣 LeetCode 142. 环形链表II(Day2:链表)

解题思路&#xff1a; 使用set判断是否重复添加&#xff0c;如果set加入不进去证明之前到达过该节点&#xff0c;有环 public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();ListNode cur head;while (cur …...

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM&#xff08;Model-View-ViewModel&#xff09;是一种架构模式&#xff0c;广泛应用于现代前端开发&#xff0c;尤其是在微软的WPF&#xff08;Windows Presentation Foundation&#xff09;应用程序中。它旨在通过将视图&#xff08;UI&#xff09;与业务逻辑&#xff08;…...

C++中的动态断言和静态断言

C中包含动态断言&#xff08;assert&#xff09;和静态断言&#xff08;static_assert&#xff09;&#xff0c;下面分别分析各自的用法。 1.动态断言&#xff08;assert&#xff09; assert 是一个宏&#xff0c;在预处理阶段不生效&#xff0c;在运行阶段才起作用&#xff0…...

运算放大器的学习(一)输入阻抗

输入阻抗 最近需要对运算放大器进行学习&#xff0c;我们后面逐一对其参数进行了解。 首先了解下输入阻抗。 放大电路技术指标测试示意图&#xff1a; 输入电阻&#xff1a; 从放大电路的输入端看进去的等效电阻称为放大电路的输入电阻&#xff0c;如上图&#xff0c;此处考虑…...

Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作

文章目录 Rust 枚举之卧龙凤雏枚举的基本概念枚举定义示例 Result 枚举&#xff1a;凤雏Result 枚举的定义Result 的使用场景示例 1&#xff1a;文件读取示例 2&#xff1a;链式操作与错误处理 Option 枚举&#xff1a;卧龙Option 枚举的定义Option 的使用场景示例 1&#xff1…...

TCP/IP协议,TCP和UDP区别

TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff0c;传输控制协议/互联网协议&#xff09;是一组用于计算机网络中的通信协议&#xff0c;它为数据传输提供了标准框架&#xff0c;广泛用于互联网和局域网中。TCP/IP协议包括多个层次&#xff0c;每…...

【go从零单排】Timer、Epoch 时间函数

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;time.Timer 是一个用于在指定时间后执行操作的计时器。…...

壁仞科技上市前最后一波 校招 社招 内推

随着美国大选结束&#xff0c;国内GPU 产业得到空前的的发展空间&#xff0c;国内芯片相关股票一片飘红。 国内大型 GPU厂商壁仞科技&#xff0c;摩尔线程等正紧锣密鼓地加紧上市。 GPGPU 芯片赛道来到了史无前例的红利点&#xff0c;抓住机会&#x1f4aa; 壁仞科技正在火热…...