编辑
2024-08-01
实用工具
00

git简介

git是一个优秀的代码版本管理工具,其主要由三个部分组成:

  • 工作空间
  • 本地仓库(本地缓冲区)
  • 远程仓库
    程序员在本地IDE中编写的为工作空间。本地完成开发后准备提交远程仓库需要提交(cmmit)到本地仓库先。本地仓库会保存你每次对代码进行的改动,因此,你可以回退到指定commit来将你的代码恢复到某个状态。
    本地仓库保存的代码和变更历史保存在.git(Windows)文件夹中,因此误删可能会遗失。远程仓库可实现云上代码托管。提交到远程仓库必须经过本地仓库,无法从工作空间直接提交。

术语

  • 提交(Commit):提交是Git中最基本的操作之一,它表示对代码库的一个修改或一组修改的快照。每次提交都包含一个唯一的哈希值,以及作者、日期和提交消息等元数据。
  • 分支(Branch):分支是基于某个特定提交的可编辑的代码路径。主分支(通常是master或main)是项目的主要开发线,而其他分支可以用于开发新功能、修复错误或进行实验性工作。分支的合并(Merge)是将一个分支的更改合并到另一个分支的过程。
  • 远程仓库(Remote Repository):远程仓库是位于网络上的Git代码库,通常托管在服务提供商(如GitHub、GitLab或Bitbucket)上。开发者可以从远程仓库拉取(Pull)代码,也可以推送(Push)本地更改到远程仓库。
  • 工作区(Working Directory):工作区是指开发者正在编辑和修改文件的地方。Git监视工作区中的文件,并记录其中的更改。
  • 索引(Index):索引也称为暂存区(Staging Area),是一个缓冲区,用于准备提交的更改。在执行提交之前,开发者可以将要提交的更改添加到索引中。
  • 撤销更改(Undoing Changes):Git提供了多种方式来撤销更改,包括使用git reset命令回滚提交、使用git checkout命令恢复单个文件或文件夹的特定版本,以及使用git revert命令创建一个新的提交来撤销之前的更改。
  • 标签(Tag):标签是用于标记代码库中重要的版本或里程碑的指针。与分支不同,标签通常用于标识特定的提交,而不是用于开发新功能或进行更改。
编辑
2024-07-31
遇到的问题
00

单个yml文件

application.yml或者bootstrap.yml

java
@RunWith(SpringRunner.class) @SpringBootTest public class ClientTest { }

多个yml文件

  • application.yml
  • application-dev.yml
  • application-local.yml

或者

  • bootstrap.yml
  • bootstrap-dev.yml
  • bootstrap-local.yml
java
//指定local文件的配置 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {"spring.profiles.active=local"}) public class ClientTest { }
编辑
2024-07-22
实用工具
00

Java_webSocket实现

依赖引入

xml
<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.5.3</version> <!-- 使用最新版本 --> </dependency>

配置类

目的是项目启动的时候自动去连接webSocket地址

java
import com.lhw.WsRobClient; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; import java.net.URI; import java.net.URISyntaxException; @Configuration public class WebSocketConfig { @Value("${websocket.url}") private String url; @Bean public WsRobClient wsClient() throws URISyntaxException { WsRobClient client=new WsRobClient(new URI(url)); client.connect(); return client; } }
编辑
2024-07-22
实用工具
00

介绍

WebSocketServer的目的是为了实时推送数据到客户端,才使用webSocket的双全工的方式

spring简单实现有两种方式

  1. WebSocketConfigurer接口
  2. 通过@ServerEndpoint注解配合ServerEndpointExporter bean来配置WebSocket端点

优缺点

在Spring框架中配置WebSocket服务器时,您可以选择使用WebSocketConfigurer接口或者通过@ServerEndpoint注解配合ServerEndpointExporter bean来配置WebSocket端点。这两种方式各有优缺点,适用于不同的场景。

使用WebSocketConfigurer接口

优点:

  • 集成度更高: 与Spring框架的集成更加紧密,可以充分利用Spring的依赖注入、AOP等特性。
  • 配置灵活: 可以通过WebSocketHandlerRegistry注册多个处理器,并且可以配置拦截器、异常处理器等。
  • 支持Spring Security: 可以更容易地与Spring Security集成,实现WebSocket层的安全控制。

缺点:

学习曲线: 需要熟悉Spring WebSocket的配置和使用方式。

使用@ServerEndpoint注解和ServerEndpointExporter

优点:

  • 简单直接: 配置相对简单,适合快速开发和小型项目。
  • 标准支持: @ServerEndpoint是Java EE WebSocket API的一部分,因此具有更好的跨平台兼容性(尽管在Spring环境中使用时,通常还是会依赖Spring的一些特性)。

缺点:

  • 集成度较低: 与Spring框架的集成不如WebSocketConfigurer紧密,依赖注入等特性需要额外配置或使用其他手段实现。
  • 配置不够灵活: 相比WebSocketConfigurer,配置选项较少,例如不能方便地添加拦截器或异常处理器。
  • 安全性: 需要手动配置WebSocket层的安全控制,与Spring Security的集成不如WebSocketConfigurer方便。
  • 结论
  • 对于大多数Spring项目来说,使用WebSocketConfigurer接口是更好的选择。它提供了更高的集成度和更灵活的配置选项,可以充分利用Spring框架的优势。同时,随着Spring框架的不断发展和完善,WebSocketConfigurer接口也可能会得到更多的功能和优化。

然而,如果您的项目比较简单,或者您更熟悉Java EE WebSocket API的标准实现方式,并且不需要与Spring框架进行深度集成,那么使用@ServerEndpoint注解和ServerEndpointExporter也是一种可行的选择。

实现

引入spring-websocket依赖

springBoot项目需要引入spring的webSocket依赖

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency>

1.ServerEndpoint注解和ServerEndpointExporter

配置类

java
@Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } }
编辑
2024-07-09
遇到的问题
00

问题

前端获取不到header里面的文件名 后端代码

java
try (OutputStream outputStream = res.getOutputStream()) { res.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode((String) fileList.get(0).get("fileName"), "utf-8")); res.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); // 将字节数组写入输出流 outputStream.write((byte[]) fileList.get(0).get("bytes")); // 刷新输出流,确保所有数据都被发送出去 outputStream.flush(); } catch (IOException e) { // 异常处理 throw new SystemException(500, "导出word文件失败!"); }

解决

加上

java
res.setHeader("Access-Control-Expose-Headers", "Content-Disposition");