Java [后端] 开发日常记录(1)

目录

1、常用的注解

2、对字符串的处理

3、对JSON串的处理

-- The End --


详细如下:

1、常用的注解

  • 若返回的字段中有NUll,则不返回 
  • @JsonInclude(value = JsonInclude.Include.NON_NULL)
//在实体类中添加这个注解
@JsonInclude(JsonInclude.Include.NON_NULL)
  • @RequestBody

常用来接收处理application/jsonapplication/xml等类型的数据 contentType  为  application/json类型

@RestController = @Controller + @ResponseBody

  • @requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),
它有三个常用参数:defaultValue = "0", required = false, value = "isApp";defaultValue 表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

  • @Synchronized

@synchronized 可以解决接口简单的并发,使用的时候只需要放在对应并发的接口或者代码块前面即可。 @synchronized 所处理的问题与锁(递归锁NSRecursiveLock)类似;可以防止不同的线程同时执行同一段代码。@synchronized 用着更方便,可读性更高, 自然效率会比较低。

递归锁: 同一个线程可以重复的加锁而不会导致死锁(互斥锁: 同一个线程重复加锁会导致死锁) ,加的递归锁全部执行完后 才会把资源让给别的线程。

@synchronized 递归锁详解_想名真难的博客-CSDN博客_递归锁原理

锁主要存在四种状态,依次是:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态,锁可以从偏向锁升级到轻量级锁,再升级的重量级锁。但是锁的升级是单向的,也就是说只能从低到高升级,不会出现锁的降级

  • @JsonFormat()

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")可以格式化时间,接口可以返回格式化后的时间。如:@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

推荐使用:

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

  • 后端数据校验(当然前端校验可能会更方便一些,可以前端校验的话,可以使用前端校验)

Validator + BindResult进行数据校验
Validator可以非常方便的制定校验规则,在实体类里需要校验的字段加上注解,每个注解对应不同的校验规则。

如:在实体类中的name添加

@ NotNull(message = "用户名不能为空") 
@ Size(min = 6, max = 11, message = "用户名长度必须是6-16个字符")
private String username;

然后在接口中添加 注解@Valid

/*** 用户新增*/
@PostMapping("/add")
public String addUser(@RequestBody @Valid UserInfo userInfo, BindingResult bindingResult) {// 如果有参数校验失败,会将错误信息封装成对象组装在BindingResult里for (ObjectError error : bindingResult.getAllErrors()) {return error.getDefaultMessage();}return userInfoService.insertUserInfo(userInfo);
}//当然也可以这样,就会直接把异常返给前端了
@PostMapping("/add")
public String addUser(@RequestBody @Valid UserInfo userInfo) {return userInfoService.insertUserInfo(userInfo);}

校验的结果就会返回到BindingResult中,有错误信息就直接返回给前端了。

当然前端校验也可能会方便一些,前端vue中数据校验如下,在form中添加:rules="rules",然后在中定义即可:

: rules = "rules"// 表单校验data() {return {rules: {phone: [{required: true,message: "联系电话不能为空",trigger: "blur"}, {pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,message: "请输入正确的手机号码",trigger: "blur"}],}}

@PathVariable
@PathVariable 映射 URL 绑定的占位符;带占位符的 URL 是 Spring3.0 新增的,通过 URL 中的 {xxxx} 占位符可以通过@PathVariable(“xxxx“) 绑定到操作方法的入参中。

具体实例如下:

    @PostMapping("/login/{name}/{pwd}")@ResponseBodypublic String loginTest(@PathVariable("name")String name, @PathVariable("pwd")String pwd){System.out.println("name = " + name);System.out.println("pwd = " + pwd);return "Success";}@DeleteMapping("/del/{ids}")public AjaxResult remove(@PathVariable Long[] ids) {System.out.println("ids = " + ids);return toAjax(deleteDataService.deleteDatainfoByIds(ids));}

@RequestHeader
获取发送请求地址的头部信息如:一些浏览器信息
Accept 浏览器可接受的MIME类型
Accept-Charset 浏览器支持的字符编码
Accept-Encoding 浏览器知道如何解码的数据编码类型(如 gzip)。Servlets 可以预先检查浏览器是否支持gzip并可以对支持gzip的浏览器返回gzipped的HTML页面,并设置Content-Encoding回应头(response header)来指出发送的内容是已经gzipped的。在大多数情况下,这样做可以加快网页下载的速度。
Accept-Language 浏览器指定的语言,当Server支持多语种时起作用。
Authorization 认证信息,一般是对服务器发出的WWW-Authenticate头的回应。
Connection 是否使用持续连接。如果servlet发现这个字段的值是Keep-Alive,或者由发出请求的命令行发现浏览器支持 HTTP 1.1 (持续连接是它的默认选项),使用持续连接可以使保护很多小文件的页面的下载时间减少。
Content-Length (使用POST方法提交时,传递数据的字节数)
Cookie (很重要的一个Header,用来进行和Cookie有关的操作,详细的信息将在后面的教程中介绍)
Host (主机和端口)
If-Modified-Since (只返回比指定日期新的文档,如果没有,将会反回304 “Not Modified”)
Referer (URL)
User-Agent (客户端的类型,一般用来区分不同的浏览器)

如下:红框即为可通过@RequestHeader获取的内容

 @RequestParam

是将请求URL的参数获取到;

具体如下:

	请求 URL:GET http://127.0.0.1:8081/applet/info?code=1234567890@GetMapping("/applet/info")public String loginTest(@RequestParam("code")String code){System.out.println("code = " + code);return "Success";}

@RequestParam(value = "queryName", required = false) String queryName
不传值后台也不会报错,默认为null,但是int类型不能为null,解决办法,修改成Integer 

@JsonIgnore 接口不返回指定的字段:

如:用户表查询的时候不返回密码等字段;

@JsonIgnoreprivate String password;

也可以这样的使用

//忽略,不返回预留字段一,预留字段二"resOne ", "resTwo"
@JsonIgnoreProperties(value = {"resOne", "resTwo"})

2、对字符串的处理

  • 字符串的截取、拼接、替换

截取:具体可使用subString()方法来进行字符串截取、或使用StringUtils方法、或使用split()+正则表达式来进行截取字符串;

//===============substring()==================    String str = "zbcad123456";int i;public String Aa = str.substring( int beginIndex);//该子字符串从指定索引处的字符开始,直到此字符串末尾;str = str.substring(i);//如:取第i个后面的字符public String Ab = str.substring( int beginIndex, int endIndex);//从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符,该子字符串的长度为 endIndex-beginIndex;//参数说明:beginIndex – 起始索引(包括)、endIndex – 结束索引(不包括)。//如:取字符串的前i个字符str = str.substring(0, i);//从右边开始取i个字符str = str.substring(str.length() - i);str = str.substring(str.length() - i, str.length());//从右边开始去掉i个字符str = str.substring(0, str.length() - i);//从开始截取到中间某个指定字符  midChar (该字符出现的第一次)str = str.substring(0, str.indexOf("1"));System.out.println("str = " + str);//从开始截取到指定某段字符串结尾  midStrstr = str.substring(0, str.indexOf("a") + "a".length());System.out.println("str = " + str);//=======StringUtils方法===================================================//与str.subString()方法相同String str1 = "abcdefgsad123456";StringUtils.substring(str1, 2);StringUtils.substring(str1, 2, 8);//截取某个字符串之前的字符 ,第一个”d”开始StringUtils.substringBefore(str1, "d");//最后一个“d”开始StringUtils.substringBeforeLast(str1, "d");//截取某个字符串之后之前的字符StringUtils.substringAfter(str1, "d");StringUtils.substringAfterLast(str1, "d");//截取两个字符串之间隔的字符StringUtils.substringBetween(str1, "d");//第一个字符“d”与第一个字符“1”之间的字符串StringUtils.substringBetween(str1, "d", "1");//第一个字符“d”与第一个字符“1”之间的字符串  结果是数组StringUtils.substringsBetween(str1, "d", "1");//======================split()=====================//1. split() 主要是用于对一个字符串进行分割成多个字符串数组。标准形式为String[] strings = str.split("");//2. split() 方法中括号中的参数可以为一个也可以为多个,每个参数之间用 | 隔开。并且每个参数之间要紧挨着 |。如:这里有三个参数:空格、逗号、问号:String[] strings = string.split(" |,|\\?");//3. 像?.(点)((正括弧))(反括弧)*(星号)|(竖线)等特殊符号都要在其前面加上\\。//4. str.split("");使用默认的情况下,split()方法对每个字符进行分割。//split()和正则表达式String str2 = "A,B,C,D,E";String[] strs = str.split(",");for (int i = 0, len = strs.length; i < len; i++) {System.out.println(strs[i].toString());}

拼接:直接使用“+”即可;

替换:直接使用 replace()或replaceAll() 即可;

  • 使用NanoId生成ID

UUID和NanoID是开发中常用ID标识符之一;NanoId的特点:容量小、更安全、速度快、兼容性好、支持自定义字符、没有第三方依赖。

使用方法:

<!--导入 https://mvnrepository.com/artifact/com.aventrix.jnanoid/jnanoid -->
<dependency><groupId>com.aventrix.jnanoid</groupId><artifactId>jnanoid</artifactId><version>2.0.0</version><scope>runtime</scope>
</dependency>

添加工具类:


import java.security.SecureRandom;
import java.util.Random;public final class NanoIdUtils {public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom();public static final char[] DEFAULT_ALPHABET = "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();public static final int DEFAULT_SIZE = 21;private NanoIdUtils() {}public static String randomNanoId() {return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, 21);}public static String randomNanoId(Random random, char[] alphabet, int size) {if (random == null) {throw new IllegalArgumentException("random cannot be null.");} else if (alphabet == null) {throw new IllegalArgumentException("alphabet cannot be null.");} else if (alphabet.length != 0 && alphabet.length < 256) {if (size <= 0) {throw new IllegalArgumentException("size must be greater than zero.");} else {int mask = (2 << (int)Math.floor(Math.log((double)(alphabet.length - 1)) / Math.log(2.0D))) - 1;int step = (int)Math.ceil(1.6D * (double)mask * (double)size / (double)alphabet.length);StringBuilder idBuilder = new StringBuilder();while(true) {byte[] bytes = new byte[step];random.nextBytes(bytes);for(int i = 0; i < step; ++i) {int alphabetIndex = bytes[i] & mask;if (alphabetIndex < alphabet.length) {idBuilder.append(alphabet[alphabetIndex]);if (idBuilder.length() == size) {return idBuilder.toString();}}}}}} else {throw new IllegalArgumentException("alphabet must contain between 1 and 255 symbols.");}}
}

3、对JSON串的处理

使用阿里巴巴的 fastjson 进行处理

//JSON字符串转换成JSON对象JSONObject JscodeParaseObject = JSONObject.parseObject(jsCode);String jscode = JscodeParaseObject.getString("jsCode");

这个就是可以拿到JSON串里面的值了。

解析json字符串内容(多层)

下面是实例:

{"msg": "操作成功","code": 200,"data": {"ChannelCode": "001","Body": {"dov": "000","doc": [{"id": "1","name": "java","url": "https://www.oracle.com/cn/java/technologies/downloads/","dept": {"remark": "xxxx","params": {},"orderNum": "xxxx","phone": "xxxx","children": []}},{"id": "2","name": "python","url": "https://www.python.org/downloads/"},{"id": "3","name": "C","url": "http://c.biancheng.net/"}]}}
}

java 处理

        //两个依赖包//com.alibaba.fastjson2.JSONArray;//com.alibaba.fastjson2.JSONObject;        String jsonString = "上面的Json串";System.out.println("jsonString = " + jsonString);JSONObject jsonObject = JSONObject.parseObject(jsonString);//解析【第一层节点】 获取第一层的集合内容String code = jsonObject.getString("code");System.out.println("code = " + code);//解析【第二层节点】 获取第二层的集合内容JSONObject A0 = jsonObject.getJSONObject("data");String ChannelCode = A0.getString("ChannelCode");System.out.println("ChannelCode = " + ChannelCode);//解析【第三层节点】 获取第三层的集合内容JSONObject Ai = A0.getJSONObject("Body");String dov = Ai.getString("dov");System.out.println("dov = " + dov);//解析【第四层节点】 获取第四层数组内容JSONArray A1 = Ai.getJSONArray("doc");//创建List nameList = [java, python, C]List<String> nameList = new ArrayList<String>();//对doc的数据进行循环,第四层数组中集合的内容for (int i = 0; i < A1.size(); i++) {JSONObject jsonObject1 = A1.getJSONObject(i);String name = jsonObject1.getString("name");System.out.println("name = " + name);nameList.add(jsonObject1.getString("name"));}System.out.println("nameList = " + nameList);

4、Map和Json转换

1、Map => Json

有如下两个常用方法:

        Map<String, Object> data = new HashMap<>();data.put("userId", sqJhyNedis.getReceiver());data.put("title", sqJhyNedis.getTitle());data.put("content", sqJhyNedis.getContent());System.out.println("data = " + data);//将map集合中的数据转成json格式//【方法一】使用net.sf.json.JSONObject包JSONObject mapToJson1 = JSONObject.fromObject(data);System.out.println("mapToJson1 = " + mapToJson1);//【方法二】使用org.json.JSONObject包JSONObject mapToJson2 =new JSONObject(data);System.out.println("mapToJson2 = " + mapToJson2);

2、Json => Map

具体的方法如下:

        //将json格式转成Map集合String jsonStr="{\"releaseTime\":\"xxxxxxxxxx\",\"title\":\"xxxxxxxxxx\",\"userId\":\"xxxxxxxxxx\",\"content\":\"xxxxxxxxxx\"}";ObjectMapper objectMapper = new ObjectMapper();Map<String, Object>  mapData =  new HashMap<>();mapData =objectMapper.readValue(jsonStr, HashMap.class);System.out.println("mapData = " + mapData);//Map mapData1 =objectMapper.readValue(jsonStr, Map.class);//System.out.println("mapData1 = " + mapData1);

-- The End --

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

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

相关文章

C高级:Day3

思维导图 总览 链接&#xff1a;C高级&#xff1a;思维导图-CSDN博客 用数组求出当前目录下以.sh结尾文件个数 用数组求出当前目录下所有文件个数 代码 结果 表明 直接通配任意名称文件&#xff0c;也会通配隐藏文件

地理数据库Telepg面试内容整理-相关技术与工具

以下是与 GIS(地理信息系统)相关的技术与工具的全面整理。这些技术和工具涵盖数据存储、处理、分析、可视化等多个领域,适用于构建和优化 GIS 应用。 数据存储 (1) 空间数据库 ● PostGIS: ○

Anaconda+PyTorch(CPU版)安装

1.Anaconda下载 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 如果已安装python&#xff0c;下载之前要彻底删除之前下载的python 2.Anaconda安装 3.添加环境变量 //根据实际安装路径进行更改 D:\Anaconda D:\Anaconda\Scripts D:\…

【RISC-V CPU debug 专栏 4 -- RV CSR寄存器介绍】

文章目录 Overview1. CSR寄存器访问指令2. 为何CSR地址不是4字节对齐(1) CSR寄存器空间是独立的地址空间(2) 节省编码空间(3) 对硬件实现的简化 3. CSR的物理大小和对齐无关总结 Overview 思考个问题&#xff1a; RISC-V 64bit CSR 寄存器是如何访问的&#xff0c;为何地址不是…

ROS2+OpenCV综合应用--10. AprilTag标签码追踪

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车摄像头云台运动的功能&#xff0c;摄像头会保持标签码在视觉中间而运动&#xff0c;根据这一特性&#xff0c;从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…

正弦函数解析(sin.rs)

sin.rs文件提供了sin函数的实现&#xff0c;它计算并返回一个浮点数&#xff08;f64类型&#xff09;的正弦值。这个函数首先处理了一些特殊情况&#xff0c;如极小的值、无穷大和NaN&#xff08;非数字&#xff09;&#xff0c;然后使用rem_pio2函数将输入参数x归约到[-π/2, …

如何查看服务器内存占用情况?

如何查看服务器的内存占用情况&#xff1f;你知道内存使用情况对服务器性能的重要性吗&#xff1f;内存是服务器运行的核心资源之一&#xff0c;了解内存的占用情况可以帮助你优化系统性能。 要查看服务器的内存占用情况&#xff0c;首先需要确定你使用的是哪种操作系统。不同…

Linux内核修改内存分配策略

今天遇到了如下的内核报错 Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f0e1e06c000, 65536, 1) failed; errorCannot allocate memory (errno12)这个报错是因为&#xff0c;linux会对大部分的内存资源申请都回复允许&#xff0c;以便于运行更…

【MATLAB APP Designer】小波阈值去噪(第一期)

代码原理及流程 小波阈值去噪是一种信号处理方法&#xff0c;用于从信号中去除噪声。这种方法基于小波变换&#xff0c;它通过将信号分解到不同的尺度和频率上来实现。其基本原理可以分为以下几个步骤&#xff1a; &#xff08;1&#xff09;小波变换&#xff1a;首先对含噪信…

C语言 练习2

1.求10个整数中的最大值 //求10个整数中的最大值 int main() {//准备10个数//char arr[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//输入10个数char arr[10] { 0 };int i 0;for (i 0; i < 10; i){scanf("%d", &arr[i]);}//找出最大值int max arr[0];for (…

Java Map 集合详解:基础用法、常见实现类与高频面试题解析

在 Java 集合框架中&#xff0c;Map 是用于存储键值对&#xff08;Key-Value&#xff09;的重要接口&#xff0c;广泛应用于开发中的各种场景。本文将详细讲解 Map 的基础概念、常见实现类及其特性&#xff0c;并结合代码示例和高频面试问题&#xff0c;帮助你深入理解 Map 的用…

ubuntu 使用samba与windows共享文件[注意权限配置]

在Ubuntu上使用Samba服务与Windows系统共享文件&#xff0c;需要正确配置Samba服务以及相应的权限。以下是详细的步骤&#xff1a; 安装Samba 首先&#xff0c;确保你的Ubuntu系统上安装了Samba服务。 sudo apt update sudo apt install samba配置Samba 安装完成后&#xff0c…

lua-debug for Sublime

目标 Sublime 也支持 lua-debug&#xff0c;操作体验与 VSCode 一致。 优势 执行效率高&#xff0c;不掉帧 可随时开启 配置简单&#xff0c;一份配置兼容 VSCode 和 Sublime 安装 要求 Sublime 4 的版本&#xff08;注&#xff1a;从 Sublime 3 升到 4 的不算&#xff0c;…

光伏电站发电量提升秘籍

在如今这个倡导清洁能源的时代&#xff0c;光伏电站成为了不少人的选择。但怎样才能让自家的光伏电站发电量更高呢&#xff1f;下面就给大家分享几个实用方法。 一、光伏组件的选择与安装角度至关重要。优质的光伏组件转换效率更高&#xff0c;像单晶硅组件就比多晶硅组件在转…

pytorch 计算图中的叶子节点介绍

1. 什么是叶子节点&#xff1f; 在 PyTorch 的自动微分机制中&#xff0c;叶子节点&#xff08;leaf node&#xff09; 是计算图中&#xff1a; 由用户直接创建的张量&#xff0c;并且它的 requires_gradTrue。这些张量是计算图的起始点&#xff0c;通常作为模型参数或输入变…

flux文生图模型实践

flux文生图模型实践 flyfish https://github.com/black-forest-labs/flux Black Forest Labs发布FLUX.1 Tools&#xff0c;这是一套模型全家桶&#xff0c;旨在为FLUX.1基础文本转图像模型添加控制和可操纵性&#xff0c;从而实现对真实图像和生成图像的修改和重新创建。FLU…

macos 支持外接高分辩率显示器开源控制软件

macos 支持外接高分辩率显示器开源控制软件 软件&#xff08;app应用&#xff09;名&#xff1a;BetterDisplay 官方地址&#xff1a; https://github.com/waydabber/BetterDisplay

Android Room 框架的初步使用

一、简介 Room 是一个强大的对象关系映射库&#xff0c;它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象&#xff08;称为实体&#xff09;上。你可以使用简单的注解&#xff08;如 Entity、Dao 和 Database&#xff09;来定义数据库表、数据访问对象&#xff08…

UCAS 24秋网络认证技术 CH15 Kerberos复习

Key Distribution Center-KDC 基本流程可分为两大部分&#xff1a;初始认证 和 服务票据获取与使用。 初始认证 Authenticate&#xff1a;客户端向认证服务器&#xff08;Authentication Server&#xff0c;AS&#xff09;发送请求以验证身份。Receive TGT&#xff1a;AS 验证…

字符串模糊匹配-TheFuzz

TheFuzz: 模糊字符串匹配的利器 在日常编程任务中&#xff0c;我们经常需要处理字符串的匹配问题&#xff0c;比如判断两个字符串是否相似、从列表中找到最接近的字符串等。而TheFuzz库&#xff08;前身为fuzzywuzzy&#xff09;就是为了解决这些问题而生的。本文将介绍TheFuz…