- 博客(35)
- 收藏
- 关注
原创 Node.js安装与全局配置
⑤在【系统变量】中选择【Path】点击【编辑】后点击新建【%NODE_PATH%】,随后一直点击【确定】直到关闭所有窗口即可。④将默认的 C 盘下【 AppData\Roaming\npm 】修改成 【node_global】的路径,点击【确定】变量值:D:\common\develop\Nodejs\node_global\node_modules。③编辑【用户变量】中的【Path】② 在【系统变量】中点击【新建】第一步:node.js下载配置。变量名:NODE_PATH。
2024-11-11 15:03:56
668
原创 ThreadLocal从入门到精通
● 在事务管理中,可以通过 ThreadLocal 来确保每个线程拥有独立的事务状态,从而保证事务的原子性和隔离性,因为事物的提交或者回滚是基于一条数据库连接的,使用这个可以确保使用一条连接。● 可以在日志系统中使用 ThreadLocal 存储线程级别的上下文信息,比如 requestId 或 traceId,这样在整个请求链中都可以记录统一的上下文信息,方便追踪日志。● 解决并发问题:在高并发场景下,ThreadLocal 可以用来存储线程相关的状态信息,这样可以减少线程间的竞争,提高程序的并发性能。
2024-11-06 19:28:12
670
原创 JWT进阶——实现session数据共享
我们通过jwt令牌来做到session数据共享,有关jwt我们可以见上篇文章。在本次功能中我们使用了hutool工具。这里需要注意的是设置过期时间的时候需要定义的key值为exp,固定的。
2024-11-05 19:57:02
297
原创 JWT令牌——从入门到精通
互联网服务离不开用户认证。一般流程是下面这样。1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。3、服务器向用户返回一个 session_id,写入用户的 Cookie。4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。这种模式的问题在于,扩展性不好。
2024-11-05 19:47:41
1035
原创 SpringBoot自动装配原理
到这里我们就可以知道当一个springboot启动类加载的时候,会根据@EnableAutoConfiguration注解找到项目依赖库中对应的需要开启自动装配的配置文件实现自动装配,这其中使用了spring的SPI机制,全名是service provide interface 服务提供接口,spring的这一机制可以然我们不局限于单独的接口进行服务实现,可以借助类或者注解。可以看到对应的key-value结构,注解以及对应的文件我们找到这个配置文件可以看到以下配置。
2024-11-04 21:06:52
977
原创 云服务器进阶-部署springboot项目
点击网页中的网站选项,在php项目那个页面我们下载nginx(可以当做服务器),然后点击java项目,点击对应的java环境管理,进入以下页面,下载安装我们需要的jdk。接着我们需要下载对应的数据库,点击网页中的数据库,会提示我们下载,这里我们如果使用的是8.0.x版本的可以选择8.0.36进行下载。但是这里的用户名我们一般项目中使用的是root需要修改,意思是我们打包项目的时候需要就数据库名修改成这里的用户名,并且不能是root。大家可以下载绑定资源中的finalshell,通过它来访问我们的服务器,
2024-10-26 10:28:20
534
原创 阿里云服务器基础配置
点击使用之后会出现让我们创建实例并选择需要安装的系统,这里我选择的是centos7系统,并附带选择宝塔工具方便之后我们项目的导入,其他的都按默认项。首先是购买云服务器,我们先注册号账号并实名认证成功,进入以下界面。选择放行端口这里我选择的是所有,大家可以根据选择放行。然后我们就基本配置好了我们的云服务器。点击之后这里提供了免费试用三个月。
2024-10-26 09:25:13
218
原创 spring的两种容器-BeanFactory与ApplicationContext
这个层次图中,第一个ApplicationContext接口提供的是基础的功能,下面的ConfigurableApplicationContext接口是一个子接口,对接口进行了功能的追加。它提供了更丰富的功能和更好的开发体验。BeanFactory:适用于资源受限的环境或轻量级的应用程序,因为它具有较小的内存占用和较快的启动速度。按照类型查找时,容器中这个类型的bean只能有一个,存在多个类型相同的bean就会报错。是Spring应用中的核心容器,用于管理和配置应用中的对象(称为beans)。
2024-10-24 11:52:15
443
原创 分页进阶-使用redis实现基础分页缓存(一)使用aop代理
本项目采用基础ssm配置来实现,首先我们使用redis来做缓存,那么我们就需要先在spring中整合redis。做缓存的对象都是查询操作,从这一点我们可以想到使用spring的aop来对对应的查询操作进行拦截处理,步骤如下。到这里我们就实现了使用aop和redis来实现分页缓存。有关redis的配置。
2024-10-24 11:30:06
414
原创 ssm+PageHelper+freemarker实现基础CRUD
因为传统的ssm项目如果不使用jsp和ajax无法将列表信息动态展示到前端页面,所以我们整合了freemarker来帮助我们进行数据展示。首先我们先创建一个对应数据库表的实体类,并使用lombook注解,这里我用的是User类,属性如下。这样就实现了基础的分页查找功能,由于代码很多,具体代码可以参考我上传的文件ssm_free。前台传递当前页码,每页条数,以及用户名,这里使用User接收,可以在后面扩展多条件查询。第二步创建Dao层接口,这里使用了map集合作为形参,方便前后端传值。
2024-10-19 09:15:57
153
原创 从零搭建基础ssm项目(spring、springMVC、mybatis)
版本尽量保持一致,否则可能会出现版本冲突问题。服务器:spring内置jetty服务器。这样一个简单的ssm框架就搭建好了。
2024-10-14 21:08:21
294
原创 springMVC入门-从零搭建一个springMVC项目
Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能,把软件按照模型,视图,控制器来划分。Model:模型层,指工程中的JavaBean,用来处理数据,主要指的是实体类。这里我们需要选择对应的maven支撑,并选择对应框架,然后新建得到一个web项目。五.书写对应的配置文件,spring.xml与web.xml。具体版本视个人而定,这里使用的是jdk1.8版本。
2024-10-09 16:11:11
541
原创 idea2024.1.6创建原生web项目
然后就可以生成对应的web目录,之后我们需要在WEB-INF下创建两个文件夹,用于指定库和输出class文件。然后将下图路径改为tomcat中webapps文件夹下新建文件夹的路径,文件夹名称与项目保持相关。可以为它设置快捷键,点击之后会出现如下界面,点击我们需要创建的web application。新版idea没有对应的Java EE选项,所以我们需要先新建一个普通的java项目。然后将lib文件夹指定为该项目对应的库。新建好的项目中是没有对应的项目的。这样就完成了原生web项目的创建。
2024-09-30 16:59:40
254
原创 Mybatis的一级二级缓存
blocking:true或者false,Blocking=true,那么会调用BlockingCache,则针对同一个- CacheKey,拿数据与放数据、删数据是互斥的。type:缓存类,可以自定义缓存,实现Cache,默认是"PERPETUAL",也就是org.apache.ibatis.cache.impl.PerpetualCache。首先是一级缓存,mybatis的一级缓存是存放在SqlSession对象域中的。LRU – 最近最少使用的:移除最长时间不被使用的对象。size:缓存的对象数目。
2024-09-25 10:49:12
320
原创 Servlet+Jsp+jdbcTemplate实现基础的CRUD
通过这三种技术我们可以实现一个简单的前端页面表格展示,并附带基础的CRUD功能,这里只书写搜索,更多代码见附件。1.首先我们需要书写对应的实体类,dao接口,以及接口实现类,在这里我们定义连接数据库需要的方法以及方法实现。2.我们需要书写jsp页面-userList.jsp,用来展示信息。3.书写对应的servlet。
2024-09-20 10:57:16
277
原创 filter登录验证
在这一步我们还需要在webapp下面创建登录成功之后需要访问的页面,这里我们创建一个admin文件夹,然后把登录成功adminMain.jsp页面放进去。5.filter实现登录验证-AdminFilter,这里在拦截路径上设置admin文件夹都被拦截,可以将登录后才能访问的页面都写在这里。在servlet的学习中我们必须要知道这两个特殊的Servlet,可以帮助我们解决一些问题。下面实现了一个简单的登录验证,没有实现异常处理,首先我们需要实现登录功能。这样就实现了简单的登录验证。
2024-09-19 14:53:35
289
原创 Servlet基础:使用jsp加servlet实现基础分页
让我们可以使用标签。页面如下:存在有bug,当我们搜索关键字时如果有多页并且和总页数不一致,那么点击最后一页会出错。首先我们需要创建实体类来映射数据库表,然后对书写对应的Dao层接口以及,接口实现类。对应的接口实现类:这里使用了JdbcTemplate来实现对数据库的查询。在这个环节我们需要将对应的信息传递到jsp中使用request来传递。下面书写对应的jsp页面,这里用到了。需要在pom.xml中引入依赖。
2024-09-18 15:28:46
431
原创 Maven下载安装以及IDEA新建web项目
图中有两种zip,Binary zip和Source Zip,第二种通常是给maven开发者提供的,我们下载第一种。首先我们需要打开IDEA并关闭所有项目,确保我们配置的maven仓库路径能够被所有项目使用。下载完毕之后,将压缩包解压到对应的d盘目录下(建议不要解压到系统盘)找到setter.xml文件,记事本打开,修改其中的missors。因为默认是从中央仓库下载,下载速度慢,所以我们改为aliyun。打开maven目录中的conf文件夹。解压完之后,我们需要配置环境变量。选择webapp模板创建项目。
2024-09-12 11:12:20
493
原创 git的安装以及远程连接gitee仓库
首先我们想要安装就必须先下载,下载的官网地址如下https://git-scm.com/download/win/之后我们需要先设置用户名和邮箱,可以是虚拟的,用来在gitee上显示是谁提交了修改。安装好git之后我们可以在d盘创建一个文件夹,不要出现中文路径,然后右键,选择。这里需要输入你上面连接中出现的账户名,以及你gitee的账户密码。然后运行对应的exe文件,会出现路径,默认为c盘,建议修改。接下来的步骤直接按照提示给的信息,不用做出修改。新建完之后进入如下页面。
2024-09-10 17:27:48
368
原创 Java集合之Map集合
java中集合分为两大类,第一类是set集合和list集合是Collection接口的实现接口,第二类是map集合,也是一个接口。对于Map集合我们需要知道,它是一个存储键值对的集合,和List、Set只能存放单个引用元素不同,它内部可以存放一个键值对。boolean containsValue(V): 判断值是否存在。V remove(K): 根据键删除整个键值对。3.value(值)无序,无下标,可以重复。旧V put(k,v): 添加一个键值对。V get(K): 根据键获取值。
2024-09-06 20:12:53
865
原创 Java集合之Set集合
哈希表的底层是数据库加链表的结构,当我们向Set集合中添加元素时,底层会通过hashCode方法来获取该元素的哈希码值,再将获取到的哈希码值对数组长度减一进行取余操作,从而获得元素在数组中存放的位置,当有相同元素存放时,它们的存放地址一致,这时会先判断当前位置是否有值,如果有值,就会通过调用equals方法来比较两者内容是否相同,如果相同就会放弃存放,如果不同就会在当前存放元素的后面链表存放。1.首先Set集合中的元素是无序-存放和取出元素不按顺序(这里的顺序指的是存放的顺序)
2024-09-05 21:33:19
469
原创 Java集合之List集合
首先,我们需要知道List并不是一个类而是一个Collection的子接口,如果我们想要使用List集合,那么我们需要使用List接口对应的实现类。利用集合的foreach方法,传入一个Consumer的接口实现类对象。2.元素有下标-可以通过下标来访问集合中元素。1.元素有序-元素存放和取出顺序一致。子遍历过程中无法使用累加器和标识变量。3.元素可以重复-可以存放相同元素。这种方法可以使用Lambda来简化。只有下标遍历过程中可以增加删除元素。这种方法需要先创建迭代器对象。
2024-08-28 17:59:41
414
原创 SQL注入攻击
占位符来书写拼接sql就可以解决这个问题,因为使用?占位符之后会先将sql语句发送到数据库进行预编译,这样做保证了sql原有语法结构的正常执行,不会让特殊字符影响sql语句原有结构执行。通过输入特殊的参数拼接SQL语句,进而破坏原有的SQL语句的含义,然后非法获取数据库数据或者进行非法数据库操作,是一种常见的web安全漏洞。通常在jdbc中sql注入攻击是发生在使用字符串拼接来书写sql中参数的情况。
2024-08-27 21:02:29
211
原创 JDBCTemplate与数据库进行交互
2.第二种是在第一种的基础上对RowMapper进行了进一步的简化,通过传入BeanPropertyRowMapper实现类对象进行查询,这个实现类是RowMapper的接口实现类,它内部实现了RowMapper接口,对它进行了进一步的封装。它的操作是需要传入对应实体类的类对象,底层代码会通过反射将数据库返回的数据映射成为对象。相较于使用原生JDBC技术连接数据库,使用JDBCTemplate技术简化了操作。
2024-08-27 20:06:56
235
原创 算法训练——礼物
学习分享【问题描述】JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。这些石子很漂亮,JiaoShou决定以此为礼物。但是这N个石子被施加了一种特殊的魔法。如果要取走石子,必须按照以下的规则去取。每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。由于时间紧迫,Jiaoshou只能取一次。 现在JiaoShou找到了聪明的你,问他最多可以带走多少
2022-04-02 08:52:13
669
原创 java省赛B组——时间显示
学习分享问题:小蓝要和朋友开发一个时间显示的网站,在服务器上朋友已经获取了当前的时间用一个整数表示,值为从1970年1月1日到现在经过的毫秒数。现在小蓝要在客户端上显示这个时间,小蓝不用显示出年月日,只需要显示出时分秒即可,毫秒直接舍去。输入输入一行包含一个整数,表示时间。输出输出时分秒表示的当前时间,格式如下:HH:MM:SS,其中H表示时,值为0到23;M表示分,值为0到59;S表示秒,值为0到59;时分秒不足两位时补足前导零。代码如下import java.util.*;publi
2022-04-02 08:40:04
363
原创 杨辉三角形
学习分享这篇是关于杨辉三角的代码,代码的主要作用是给定一个数N,输出此数在杨辉三角中第一次出现时在杨辉三角中的位置(不适用于蓝桥杯)代码如下:import java.util.*;public class b4{ public static void main(String args[]){ Scanner sc=new Scanner(System.in); int N=sc.nextInt(); Long[][] a=new Long[100][]; for(int i=0;i
2022-03-26 20:09:30
760
原创 括号匹配数据结构
学习分享本周学习的是数据结构的括号匹配,所谓括号匹配指的是在命令端输入一行只含有括号的代码,然后运行代码,判断每一个左括号是否有一个右括号与之对应,从而判断输入的数据是否违法代码如下:#define MAXSIZE 100#define OK 1#define ERROR 0#include<iostream>#include<stdio.h>#define OVERFLOW 0using namespace std;typedef char SElemType
2022-03-26 19:52:55
3198
原创 蓝桥杯-java练习-十六进制转八进制
学习分享例题给定n个十六进制正整数,输出它们对应的八进制数。十六进制转八进制首先需要将其转化为二进制,然后再转化为八进制这样计算可以加快
2022-03-19 08:48:26
454
原创 用链表实现一元稀疏多项式相加
学习分享用链表表示多项式时,每个链表结点存储多项式中的一个非零项,包括系数(coef)和指数(expn)两个数据域以及一个指针域(next)。对应的数据结构定义为typedef struct PNode{ float coef; int expn; struct PNode *next;}PNode,*Polynomial;定义完数据结构后我们要创建一个链表并进行相应的初始化,然后在输入时还应该将链表中元素进行排序,排序的原则通过比较多项式的指数expn来进行。代码如下//单个多项式指
2022-03-18 19:56:07
1591
原创 算法初学-二维前缀和
分享计算二维数组前缀和我们需要先了解二位前缀和的计算公式,公式如下:我们令b[i][j]为a[i][j]的前缀和数组b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+a[i][j]二位前缀和相较于一维前缀和难度增加了很多,下面用一个例题来解释具体的操作,题目如下:城主小明在王国里圈出一块占地K*K的正方形作为自己的城池希望你选出一块合适的位置,使得他的城池土地价值和最大。输入第一行三个整数N,M,K,表示大陆的宽和长以及占地正方形的边长。接下来有N行,每行M
2022-03-12 09:41:00
927
原创 周学习分享
学习分享快速排序数组void quick_sort(int q[], int l, int r){ if (l >= r) return; int i = l - 1, j = r + 1, x = q[l + r >> 1]; while (i < j) { do i ++ ; while (q[i] < x); do j -- ; while (q[j] > x); if (i &l
2022-03-12 09:06:58
200
原创 2020-12-17
今天是我第一天写博客,这是一个全新的开始,未来的大学生活才刚刚开始,虽然并没有进入理想的学校,但是生活总要向前看,何况现在的生活依旧美好,就让过去的不开心随风飘散,现在又是美好的将来,加油(ง •̀_•́)ง,奥利给!...
2020-12-17 06:59:29
101
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人