- 博客(103)
- 收藏
- 关注
原创 tomcat正常启动但 SpringMVC 控制器无法启动
摘要: 排查Tomcat启动后无法访问SpringMVC接口的问题,发现是IDEA工件配置缺失导致依赖JAR未复制到out/artifacts/.../WEB-INF/lib目录。尽管Java类文件正常编译到WEB-INF/classes,但缺少Servlet/SpringMVC核心JAR导致请求无法路由。解决方法是手动将依赖JAR添加到lib目录并重新构建。文中对比了IDEA的out目录(IDE专属)与Maven的target目录(构建工具标准)的区别,强调out/artifacts是Tomcat实际加载
2025-12-10 21:33:27
713
原创 使用docker部署Java项目
本文介绍了使用Docker部署Java项目的完整流程:1.准备Java项目的jar包;2.编写Dockerfile文件,详细说明FROM、WORKDIR、COPY等核心指令;3.通过docker build命令构建镜像;4.使用docker run命令运行容器,包括端口映射等参数设置。重点解析了Docker镜像的只读特性和分层结构,以及容器运行时与镜像的关系,为Java项目容器化部署提供了标准化操作指南。
2025-11-09 19:29:36
744
原创 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon?
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon?
2025-11-07 10:54:15
369
原创 238.除自身以外数组的乘积
本文介绍了一种高效计算数组中除自身外元素乘积的方法。通过两次遍历(左乘积和右乘积)实现O(n)时间复杂度,避免使用除法。具体步骤:1)正向遍历计算每个元素左侧乘积;2)反向遍历结合右侧乘积完成最终结果。该方法空间复杂度O(1),且避免了除零错误,适用于含零数组。以[1,2,3,4]为例,详细演示了计算过程,验证了算法的正确性。
2025-11-03 22:22:47
410
原创 189.轮转数组
摘要:该算法实现将整数数组元素向右循环移动k位。关键处理包括:当k大于数组长度时取模运算,创建临时数组存储后k位元素和前n-k位元素,最后将临时数组复制回原数组。示例显示输入[1,2,3,4,5,6,7]和k=3时输出[5,6,7,1,2,3,4]。算法时间复杂度O(n),空间复杂度O(n)。(149字)
2025-11-02 21:58:14
186
原创 56.合并区间
摘要:该算法解决合并重叠区间问题。首先对区间按起始点排序,然后逐个处理:若当前区间与结果列表最后一个区间不重叠则直接添加,否则合并两个区间的右端点(取较大值)。示例表明该方法能正确处理各种重叠情况(如[1,3]和[2,6]合并为[1,6])。核心思想是通过排序确保区间有序,再通过比较端点实现高效合并,时间复杂度主要取决于排序步骤。
2025-11-01 22:22:11
220
原创 53.最大子数组和
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。方法二:遍历相加的同时选出最大值,每次相加后经过对比选出结果最大的值(最小遍历原则)可以把所有子数组求和情况算出来,每次求和进行比较选出最大值即可。连续子数组 [4,-1,2,1] 的和最大,为 6。子数组是数组中的一个连续部分。
2025-11-01 19:14:11
307
原创 560.和为k的子数组
摘要:本文介绍了求解数组中连续子数组和等于k的两种方法。方法一通过双重循环枚举所有可能的子数组,时间复杂度O(n²);方法二利用前缀和与哈希表优化,将时间复杂度降至O(n)。具体实现时,哈希表需初始化mp.put(0,1)以处理前缀和直接等于k的情况。两种方法都能正确统计满足条件的子数组数量,示例代码展示了两种循环方向(从左到右/从右到左)的实现方式。
2025-10-25 21:32:23
257
原创 438.找到字符串中所有字母异位词
摘要:本文介绍了一个解决字符串异位词查找问题的算法。给定字符串s和p,需要在s中找出所有与p构成异位词的子串,返回这些子串的起始索引。算法使用滑动窗口技术,通过维护两个字符计数数组来比较子串与p的字符分布是否相同。时间复杂度为O(n),空间复杂度为O(1)。示例展示了算法的正确性,如s="cbaebabacd"、p="abc"时输出[0,6]。该解法高效且易于实现。
2025-10-24 22:26:53
242
原创 3.无重复字符的最长子串
所以其长度为 3。注意 "bca" 和 "cab" 也是正确答案。,请你找出其中不含有重复字符的。请注意,你的答案必须是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。因为无重复字符的最长子串是。,所以其长度为 1。,所以其长度为 3。
2025-10-23 22:15:33
346
原创 42.接雨水
本文探讨了如何计算柱状图中能接住的雨水总量。通过双指针法,分别从左右两端遍历,记录左右最大值,并比较当前指针高度。若左指针高度较小,则计算左指针处能接的雨水(左最大值减去当前高度),并右移左指针;反之同理。该方法时间复杂度为O(n)。示例展示了输入[0,1,0,2,1,0,1,3,2,1,2,1]时输出6,输入[4,2,0,3,2,5]时输出9。官方解法通过动态更新左右最大值高效求解,优于直接填充柱子的朴素思路。
2025-10-22 20:23:06
252
原创 15.三数之和
三个数之和用双指针遍历所有情况然后通过Arrays进行排序再添加到集合中。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。下面是暴力算法结果 超出时间限制。答案中不可以包含重复的三元组。唯一可能的三元组和不为 0。唯一可能的三元组和为 0。,判断是否存在三元组。
2025-10-21 22:23:04
233
原创 11. 盛最多水的容器
本文探讨了如何计算由数组元素构成的容器能容纳的最大水量。关键思路是使用双指针法:初始化时左右指针分别指向数组首尾,计算当前面积(两指针较小值×间距),并移动较小值的指针以寻找更大面积。通过逐步缩小范围,最终确定最大储水量。相比暴力解法(时间复杂度O(n²)),该算法优化至O(n)。示例代码展示了这一高效实现,通过比较指针值决定移动方向,确保每次迭代都更接近最优解。
2025-10-20 22:06:02
306
原创 283.移动零
本文介绍了一个将数组中的0移动到末尾的算法问题。要求在不复制数组的情况下原地操作,保持非零元素的相对顺序。通过双指针法实现:p0指向当前待处理位置,p1遍历数组。当p0位置为0且p1位置非0时交换元素,否则继续移动指针。示例展示了算法效果,如输入[0,1,0,3,12]输出[1,3,12,0,0]。关注公众号可获取完整解题代码。该解法时间复杂度O(n),空间复杂度O(1)。
2025-10-19 22:20:27
115
原创 128.最长连续序列
摘要:本文介绍如何找出未排序整数数组中最长连续数字序列的长度。通过排序去重后遍历数组,统计连续序列的最大长度。示例输入如[100,4,200,1,3,2]输出4(对应序列[1,2,3,4])。实现方法使用Arrays.sort排序,Math.max记录最大值,时间复杂度O(nlogn)。欢迎关注公众号获取更多学习资料。
2025-10-18 21:13:04
286
原创 49.字母异位词分组
题目要求将字母异位词分组。字母异位词指字母相同但排列不同的字符串。解决思路是对每个字符串排序,将排序后相同的字符串归为一组。例如["eat","tea","ate"]排序后均为"aet",归为一组。使用哈希表存储,键为排序后的字符串,值为原始字符串列表。最终返回哈希表中的所有值集合即可。时间复杂度O(nklogk),其中n是字符串数量,k是字符串最大长度。
2025-10-17 20:19:40
302
原创 手写简易版rpc框架
RPC(远程过程调用)框架的核心作用是将跨服务的远程调用变得像本地调用一样简单。文章通过电商App案例,演示了订单服务如何通过RPC调用用户服务,并详细拆解了RPC框架的四个关键组件:客户端、服务端、序列化组件和网络传输组件。随后逐步实现了一个简易RPC框架,包含服务注册、动态代理、序列化、请求处理等核心模块,最终通过Vert.x服务器完成服务调用测试。该框架采用JDK动态代理和Java原生序列化,展示了RPC的基本工作原理,为理解分布式系统通信机制提供了实践参考。
2025-10-17 11:24:48
934
原创 Centos7安装Docker(包成功下载镜像)
本文介绍了在CentOS7系统上安装Docker的完整步骤:首先确保虚拟机联网,更新yum源并安装依赖包;然后配置Docker的yum源,安装Docker社区版;关闭防火墙后启动Docker服务;为提高下载速度,配置了多个国内镜像加速器;最后通过加载配置文件和重启服务完成安装,并以拉取nginx镜像进行测试。文中还提供了相关问题的参考链接。
2025-09-16 09:31:01
269
原创 Git的安装和配置(idea中配置Git)
本文详细介绍了Git的安装、配置及常用操作。首先,推荐使用Git 2.40.x或更高版本,并提供了下载和安装步骤。接着,讲解了如何配置用户名和邮箱、创建本地仓库、克隆远程仓库以及文件操作指令。此外,还介绍了如何创建远程仓库、设置SSH公钥实现免密登录,以及如何在IDEA中配置Git并管理项目。最后,文章涵盖了分支与合并的操作,包括创建、切换、推送和合并分支,并提供了处理合并冲突的解决方案。通过本文,用户可以全面掌握Git的基本使用和高级操作。
2025-05-14 21:41:30
13448
原创 Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)
本文详细介绍了如何搭建一个基于Vue3和Spring Boot的前后端分离项目。前端部分使用Vue3框架,结合Element Plus组件库和Axios进行数据请求,并通过代理服务器解决跨域问题。后端部分使用Spring Boot框架,集成MyBatis Plus进行数据库操作,并配置了Druid数据源和分页插件。项目实现了家居信息的增删改查功能,前端通过表单进行数据校验,后端通过JSR303进行数据验证。文章还介绍了如何通过拦截器统一处理请求和响应,并详细说明了跨域问题的解决方案。最后,总结了项目使用的技
2025-05-11 18:56:43
1865
原创 实现SpringBoot底层机制【Tomcat启动分析+Spring容器初始化+Tomcat 如何关联 Spring容器】
当启动springboot程序时,通过netstat -anb命令查询得到。解决:在pom.xml文件中引入依赖 (刷新)创建HspMainApp作为主程序。运行该springboot程序。HiController类。通过浏览器发送请求得到。hspConfig类。
2025-04-23 09:40:31
508
原创 前端vue+后端ssm项目
本文详细介绍了如何搭建一个基于SSM(Spring、Spring MVC、MyBatis)和Vue的前后端分离项目。首先,项目的基础环境搭建包括新建Maven项目、配置pom.xml文件引入依赖、配置Tomcat环境以及配置Spring和MyBatis的整合。接着,通过逆向工程生成数据库表对应的Bean、Mapper接口和Mapper XML文件,并完成了家居信息的增删改查功能。前端部分使用Vue搭建,通过Element Plus组件库实现页面布局和交互,并通过Axios与后端进行数据交互。
2025-04-19 21:54:44
2426
原创 实现 MyBatis 底层机制【 封装 Sqlsession到执行器 + Mapper 接口和 Mapper.xml + MapperBean + 动态代理Mapper的方法
mybatis-config.xml: 进行全局配置,全局只能有一个这样的配置文件,XxxMapper.xml 配置多个 SQL,可以有多个 XxxMappe.xml 配置文件。在sqlSession包中增加方法,该类主要是实现 InvocationHandler 接口并重写动态代理对象调用的invoke方法,这个方法采用硬编码的方式,之后再完善。2、配置pom.xml文件(注意MySQL的版本,自己的版本是8.0,有些人的版本是5.1的)实现接口execute,用于封装SQL语句的查询方法。
2025-04-09 16:46:12
782
原创 实现 SpringMVC 底层机制【 核心分发控制器+ Controller 和 Service 注入容器 + 对象自动装配 + 控制器方法获取参数 + 视图解析 + 返回 JSON 格式数据 】
创建controller类 MonsterControllertry {writer.write("<h1>你好</h1>");创建自定义注解 Controller创建注解RequestMapping功能说明: : 如果给某个类加上, @Service, 则可以将其注入到我们的 Spring 容器编写自定义注解@Service/*** 该注解用于将Service层的对象注入到容器*/增加一个Service层@Service。
2025-04-03 16:14:10
633
原创 手动实现 Spring 底层机制 【初始化 IOC容器+ 依赖注入+BeanPostProcessor 机制+AOP】
最后在测试类中调试得到singleton中也有后置处理器对象,因为在原生的容器中,后置处理器是被当作一个主键 经历createBean和getBean方法,相当于将该后置处理器对象存储在singleton对象中然后再从该对象取出进行调用,但是现在为了方便调用后置处理器的方法,就直接将该对象放入list集合中,并在createBean方法中的初始化方法前后调用before和after方法。原生的后置处理器即使你返回的结果是空,他也不影响原来的初始化的对象。
2025-03-27 16:47:59
793
原创 手写简单的Spring基于注解配置的程序
新建一个包用于存放自己手写的程序创建一个自定义注解:ComponentScan/*** 这个自定义的注解的作用相当于原配置文件中的component-scan* @Target(ElementType.TYPE)表示该注解作用的对象* @Retention(RetentionPolicy.RUNTIME)表示该注解的生命周期表示注解的属性value用于存放包名(即:要扫描的包路径),默认是空字符串*/
2025-03-22 13:14:21
504
原创 韩顺平教育-家居网购
注意细节:1、将html修改为jsp文件时一定要加上下面的声明标签,否则会出现乱码!!!注意下载地址:https://download.csdn.net/download/2401_83418369/90467290MVC 全称。
2025-03-16 09:24:50
764
原创 tomcat的安装与配置(包含在idea中配置tomcat)
JDK 版本 下载对应的 Tomcat 版本对照表下载官网:Apache Tomcat® - Welcome!JDK 版本兼容的 Tomcat 版本支持范围说明早期兼容已淘汰,仅供历史参考。JDK 1.4JDK 1.4+Tomcat 5.5 需 JDK 1.4 或更高。JDK 5.0+Tomcat 6.x 最低需 JDK 5.0。Java SE 6JDK 6+Tomcat 7.x 需 JDK 6+(推荐 JDK 7+)。
2025-03-05 20:45:40
5661
10
原创 c3p0、Druid连接池+工具类 Apache-DbUtils (详解!!!)
数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将这些连接存储在池中。当应用程序需要与数据库通信时,它可以向池中请求一个连接,使用完后将连接归还给池,而不是关闭连接。这样可以减少创建和关闭连接的开销,提高应用程序的性能。
2025-02-21 07:00:00
2007
原创 jdbc连接mysql(5种连接方式,循序渐进!!!)
方法一:直接实例化Driver(静态加载)实现步骤直接创建对象通过方法传递URL和Properties@Test// 显式依赖MySQL驱动类// 直接调用connect方法注意事项:2、URL格式是:jdbc:mysql://主机:端口/数据库名3、MySQL用户名和密码要填自己的,不要写错了方法二:反射动态加载Driver实现步骤通过反射加载驱动类实例化Driver对象后调用connect()@TestClass<?
2025-02-20 15:23:37
4002
原创 坦克大战项目(超详细!!!循序渐进!!!)
项目是一个涉及图形界面、事件驱动编程和算法设计的经典游戏项目。本项目由韩顺平教育开源结合自己的经验总结改编而成。有任何问题可以发表评论!!!
2024-12-10 12:30:57
1240
原创 Centos7 dhcp服务的搭建(超详细)
本期是两台Centos7系统在仅主机模式下搭建dhcp服务1、确保server的网络适配器为仅主机模式
2024-12-06 15:22:08
1928
原创 dhcpd服务器的配置与管理(超详细!!!)
网络中的DHCP服务器收到来自客户端的DHCP Discover报文后,会从IP地址池中挑选一个尚未出租的 IP 地址预分配给 DHCP客户端,并且在网络上广播一个DHCP Offer 响应报文,该报文包含了客户端的MAC地址、服务器所提供的IP地址、子网掩码、租用期限,以及DHCP 服务器本身的 IP 地址。客户端在向服务器请求一个IP地址时,如果DHCP 服务器的IP地址数据中能提供IP,则登记IP信息并分配这个地址给客户端使用,顺带相关的配置选项。按需求进行环境准备和信息采集,如表所示。
2024-12-02 20:58:47
4333
原创 vsftpd 的安装和应用(超详细!!!)
FTP(File Transfer Protocol,文件传输协议)是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互,以及数据传输的过程。
2024-11-29 20:14:23
4025
原创 CentOS7 NAT模式不能联网(成功解决!!!)
虚拟机联网的详细过程:虚拟网络接口:假设我们在宿主机上使用VirtualBox或VMware等虚拟化软件创建了一个虚拟机,并为该虚拟机分配了一个虚拟网络接口(通常是虚拟网卡)。NAT转换器:宿主机上会运行一个NAT转换器,它负责将虚拟机的内部IP地址转换为主机的外部IP地址。以下是具体的联网过程:步骤1:虚拟机发起网络请求虚拟机内部的应用程序发起一个网络请求,比如尝试访问一个网站步骤2:虚拟机内部网络栈处理虚拟机的操作系统将请求发送到其网络栈,然后通过虚拟网络接口发出。步骤3
2024-11-26 20:37:07
4986
1
原创 单列集合Collection和双列集合Map(超全面解析)
ArrayList:适用于读操作频繁、插入删除操作较少的场景,查询效率高,插入删除效率低。它是大多数情况下的首选实现。LinkedList:适用于插入和删除操作频繁,尤其是列表两端插入删除操作较多的场景。由于是链表结构,查询效率较低。Vector:与ArrayList类似,但内置同步机制使其线程安全。由于同步的开销,Vector性能较差,不推荐在单线程环境下使用。HashSet:适用于需要快速查找、插入和删除元素的场景,但不关心元素的顺序。:适用于需要保持插入顺序的场景,同时保持HashSet。
2024-11-23 18:58:17
1955
原创 线程的概述
Thread类是 Java 中实现并发编程的核心,通过创建多个线程可以实现任务的并发执行。我们可以通过继承Thread类或实现Runnable接口来创建线程。多线程的同步机制(如)确保了共享资源的安全性。线程的优先级可以通过方法进行调整,但最终的调度还是由操作系统来决定。
2024-11-18 18:13:41
1087
原创 HashSet中remove方法的底层原理
如果不为空,再次判断hash值是否相等,如果hash值相等,再次判断是否认是同一对象,如果是同一对象就不添加,否则添加到链表上。这段代码后name修改成功,但是hash值还是原来根据name="tom"和id=1001计算出来的值,即hash=3567790。因为计算出来的hash值不同,所以通过 & 按位与计算出来的索引也可能不同,那么索引对应table数组里的Node节点就可能为空,那么就删除失败。如图:通过debug调式,在断点前,p1对象被存储到索引为14的节点上,hash值为3567790。
2024-11-15 16:40:59
1404
原创 字符串常量池(详解)
字符串常量池是Java运行时环境(JRE)的一部分,它用于存储字符串字面量。字符串字面量是源代码中直接用双引号括起来的字符串,例如"hello"。在Java中,字符串是不可变的,这意味着一旦创建了一个字符串对象,它的值就不能改变。当Java编译器遇到字符串字面量时,它会将这些字面量放入字符串常量池中。如果常量池中已经存在相同的字符串字面量,编译器会复用已有的字符串对象,而不是创建一个新的对象。这样做可以节省内存,并提高性能。
2024-11-06 22:35:42
1685
使用Spring原生的组件实现springboot底层Tomcat的创建和spring容器的联系
2025-04-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅