-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
430 lines (324 loc) · 40.9 KB
/
index.html
File metadata and controls
430 lines (324 loc) · 40.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
<!DOCTYPE html><html lang="zh_CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><title>Katashi的博客 - 每天进步一丢丢</title><meta name="author" content="Katashi"><meta name="copyright" content="Katashi"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta property="og:type" content="website">
<meta property="og:title" content="Katashi的博客">
<meta property="og:url" content="https://katashixz.github.io/index.html">
<meta property="og:site_name" content="Katashi的博客">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://katashixz.github.io/img/pic.png">
<meta property="article:author" content="Katashi">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://katashixz.github.io/img/pic.png"><link rel="shortcut icon" href="/img/K.png"><link rel="canonical" href="https://katashixz.github.io/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.min.css" media="print" onload="this.media='all'"><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
translate: undefined,
noticeOutdate: undefined,
highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
copy: {
success: '复制成功',
error: '复制错误',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
date_suffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: undefined,
source: {
justifiedGallery: {
js: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.js',
css: 'https://cdn.jsdelivr.net/npm/flickr-justified-gallery/dist/fjGallery.min.css'
}
},
isPhotoFigcaption: false,
islazyload: false,
isAnchor: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: 'Katashi的博客',
isPost: false,
isHome: true,
isHighlightShrink: false,
isToc: false,
postUpdate: '2023-03-13 14:42:03'
}</script><noscript><style type="text/css">
#nav {
opacity: 1
}
.justified-gallery img {
opacity: 1
}
#recent-posts time,
#post-meta time {
display: inline !important
}
</style></noscript><script>(win=>{
win.saveToLocal = {
set: function setWithExpiry(key, value, ttl) {
if (ttl === 0) return
const now = new Date()
const expiryDay = ttl * 86400000
const item = {
value: value,
expiry: now.getTime() + expiryDay,
}
localStorage.setItem(key, JSON.stringify(item))
},
get: function getWithExpiry(key) {
const itemStr = localStorage.getItem(key)
if (!itemStr) {
return undefined
}
const item = JSON.parse(itemStr)
const now = new Date()
if (now.getTime() > item.expiry) {
localStorage.removeItem(key)
return undefined
}
return item.value
}
}
win.getScript = url => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
script.onerror = reject
script.onload = script.onreadystatechange = function() {
const loadState = this.readyState
if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
script.onload = script.onreadystatechange = null
resolve()
}
document.head.appendChild(script)
})
win.activateDarkMode = function () {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
win.activateLightMode = function () {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
const t = saveToLocal.get('theme')
if (t === 'dark') activateDarkMode()
else if (t === 'light') activateLightMode()
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
if (asideStatus === 'hide') {
document.documentElement.classList.add('hide-aside')
} else {
document.documentElement.classList.remove('hide-aside')
}
}
const detectApple = () => {
if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
document.documentElement.classList.add('apple')
}
}
detectApple()
})(window)</script><meta name="generator" content="Hexo 5.4.0"></head><body><div id="loading-box"><div class="loading-left-bg"></div><div class="loading-right-bg"></div><div class="spinner-box"><div class="configure-border-1"><div class="configure-core"></div></div><div class="configure-border-2"><div class="configure-core"></div></div><div class="loading-word">加载中...</div></div></div><div id="web_bg"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="/img/pic.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">19</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">3</div></a></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 目录</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="full_page" id="page-header" style="background-image: url('/./img/indexBG.jpg')"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">Katashi的博客</a></span><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 时间轴</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 目录</span></a></div></div><div id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="site-info"><h1 id="site-title">Katashi的博客</h1><div id="site-subtitle"><span id="subtitle"></span></div><div id="site_social_icons"><a class="social-icon" href="https://github.com/Katashixz" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:hyihao2001@163.com" target="_blank" title="Email-hyihao2001@163.com"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://user.qzone.qq.com/435129920/infocenter" target="_blank" title="QQ空间"><i class="fa-brands fa-qq"></i></a></div></div><div id="scroll-down"><i class="fas fa-angle-down scroll-down-effects"></i></div></header><main class="layout" id="content-inner"><div class="recent-posts" id="recent-posts"><div class="recent-post-item"><div class="post_cover left"><a href="/2022/08/04/%E4%B8%AA%E4%BA%BA%E9%A1%B9%E7%9B%AE%E3%80%8A%E5%9F%8E%E9%99%A2%E7%94%9F%E6%80%81%E5%9C%88%E3%80%8B%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/" title="个人项目《城院生态圈》微信小程序"><img class="post_bg" src="/../image/ZUCCBiosphere/ZUCCBiosphere.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="个人项目《城院生态圈》微信小程序"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/08/04/%E4%B8%AA%E4%BA%BA%E9%A1%B9%E7%9B%AE%E3%80%8A%E5%9F%8E%E9%99%A2%E7%94%9F%E6%80%81%E5%9C%88%E3%80%8B%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F/" title="个人项目《城院生态圈》微信小程序">个人项目《城院生态圈》微信小程序</a><div class="article-meta-wrap"><span class="article-meta"><i class="fas fa-thumbtack sticky"></i><span class="sticky">置顶</span><span class="article-meta-separator">|</span></span><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-08-04T09:42:58.000Z" title="发表于 2022-08-04 17:42:58">2022-08-04</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">城院生态圈简介
《城院生态圈》是一款基于微信小程序+SpringBoot的校内动植物百科以及论坛小程序,面向浙大城市学院范围内的师生,目前正在开发中。在这里你可以查看本校内所有动植物的个体信息,包括学名、外号、习性、生物学分类、养护指南等,也可以在里面和其他动植物爱好者交流,甚至可以云领养流浪动物,在虚拟世界中完成和流浪动物的交互。
前端技术栈
wxml + wxss + js
后端技术栈
SpringBoot + SpringSecurity + Redis + MySQL + RabbitMQ效果预览图
开发进度
动植物科普模块
动物百科功能
动物养护指南、照片、外号、学名、性格、外貌、亲属关系等。
植物百科功能
植物养护指南、照片、校内分布位置、学名、生物分类学信息等。
动植物搜索功能
文字模糊搜索。
拍照识别(TBD)。
支持用户对百科条目的修订、照片上传,帮助维护。
论坛模块
交流功能
发帖
图片上传
视频上传
表情
点赞
收藏
评论
举报
分享
打赏
实时热帖
帖子搜索 ...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/03/13/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E5%B9%B6%E5%8F%91%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于并发的一些面试问答"><img class="post_bg" src="/../image/Thread/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于并发的一些面试问答"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/03/13/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E5%B9%B6%E5%8F%91%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于并发的一些面试问答">【Java知识点】关于并发的一些面试问答</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-03-13T06:40:51.000Z" title="发表于 2023-03-13 14:40:51">2023-03-13</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">本篇文章内容参考JavaGuide,自己整理一遍加深印象。
关于进程和线程进程与线程的定义
进程
程序的一次执行过程,是系统运行程序的基本单位,进程是动态的。
线程
比进程更小的执行单位
一个进程执行过程中可以产生多个线程
同类的多个线程共享进程的堆和方法区资源
每个线程有自己的程序计数器、虚拟机栈和本地方法栈
也被称为轻量级进程
程序计数器为什么是私有的一句话概括——为了让线程切换后能够恢复到正确的执行位置
堆和方法区的作用
是所有线程共享的资源
堆
进程中最大的一块内存
存放新创建的对象(几乎所有对象都是在这里分配内存)
方法区
存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
并发和并行的区别
并发:两个及两个以上的作业在同一时间段内执行
并行:两个及两个以上的作业在同一时刻执行
同步和异步的区别
同步: 发出一个调用之后,在没有得到结果之前,该调用就不可以返回,一直等待。
异步: 调用发出之后,不用等待返回结果,该调用直接返回。
线程的生命周期和状态
NEW:初始状态,线程被创建出来,但是没有被调用start()
RUNNABLE:运行 ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/03/02/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E9%9B%86%E5%90%88%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于集合的一些面试问答"><img class="post_bg" src="/../image/Collection-Map/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于集合的一些面试问答"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/03/02/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E9%9B%86%E5%90%88%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于集合的一些面试问答">【Java知识点】关于集合的一些面试问答</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-03-02T09:17:12.000Z" title="发表于 2023-03-02 17:17:12">2023-03-02</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">本篇文章内容参考JavaGuide,自己整理一遍加深印象。
集合概述Java集合,也叫做容器。主要是由Collection(存放单一元素)、Map(存放键值对)两大接口派生而来。对于Collection接口,有三个主要的子接口:List、Set、Queue
常见问答说说List,Set,Queue,Map四者的区别
List(对付顺序的好帮手)
存储的元素是有序的、可重复的。
Set(注重独一无二)
存储的元素是无序的、不可重复的。
Queue(排队,注重规则排序)
按特定的规则来确定先后顺序,存储的元素是无序的、可重复的。
Map(Key-Value,key独一无二,一一对应)
key是无序的、不可重复的。
value是无序的、可重复的。
常用的集合类有哪些
List
ArrayList
底层是Object[]数组
Vector
底层是Object[]数组,线程安全,效率低,使用较少
LinkedList
底层是双向链表
Set
HashSet
无序,底层是HashMap,放到HashSet集合中的元素等同于放到HashMap集合Key部分。
...</div></div></div><div class="recent-post-item"><div class="post_cover right"><a href="/2023/02/20/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91IO%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/" title="【Java知识点】关于I/O你需要知道的基础"><img class="post_bg" src="/../image/IO/IO.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于I/O你需要知道的基础"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/02/20/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91IO%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/" title="【Java知识点】关于I/O你需要知道的基础">【Java知识点】关于I/O你需要知道的基础</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-02-20T04:41:50.000Z" title="发表于 2023-02-20 12:41:50">2023-02-20</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">基础知识IO流简介IO,即(Input/Output),也就是输入和输出。IO流在Java中分为输入流和输出流,根据数据的处理方式又分为字节流和字符流。
为什么IO操作有字节流和字符流?
在不知道编码类型的情况下,字节流操作容易出现乱码。
字符流要通过Java虚拟机转换得到的,过程比较耗时。
音频文件、图片等媒体文件用字节流较好,文字用字符流较好。
字节流InputStream(字节输入流)java.io.InputStream抽象类是所有字节输入流的父类。
作用
用于从源头(通常是文件)读取数据(字节信息)到内存中。
FileInputStream
作用
常用的字节输入流对象,可以指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。
一般不直接单独使用,常与BufferedInputStream(字节缓冲输入流)搭配,如下面这段代码。12345// 新建一个 BufferedInputStream 对象BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInp ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2023/01/10/Spider/" title="【爬虫实战】获取某租房网站的房源信息"><img class="post_bg" src="/../image/housePriceSpider/Spider.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【爬虫实战】获取某租房网站的房源信息"></a></div><div class="recent-post-info"><a class="article-title" href="/2023/01/10/Spider/" title="【爬虫实战】获取某租房网站的房源信息">【爬虫实战】获取某租房网站的房源信息</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2023-01-10T08:38:50.000Z" title="发表于 2023-01-10 16:38:50">2023-01-10</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">爬虫实战-获取某租房网站的房源信息Github代码地址
帮助朋友编一个爬虫来获取信息建立房价预测的数据集,顺便回忆一下之前自学的爬虫。首先确定好要使用的几个库。
requests库模拟请求
BeautifulSoup库处理数据
json库序列化接口数据
traceback库打印请求信息
保存数据的库一开始本来是用xlwt的,但是写完发现保存的数据无法被pandas读取(编码问题),于是采用csv库手搓爬虫开始直接用request发请求的话必然是会被阻拦的,尝试了下返回403,果然被拦截了。那么这时候就要把爬虫伪装一下。添加头部信息:123headers = { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76"}
接下来开始分析网站台湾租房网
从首页可以看出我们需要的数据在列表 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2022/11/18/%E8%BF%9B%E9%98%B6%E6%97%A5%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A8%E5%B1%80%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E4%B8%8E%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E6%A0%BC%E5%BC%8F/" title="进阶日记(一)——全局异常处理与统一处理返回体">进阶日记(一)——全局异常处理与统一处理返回体</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-11-18T05:47:22.000Z" title="发表于 2022-11-18 13:47:22">2022-11-18</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">统一返回格式身为一名后端开发者,少不了前后端的信息交互,这个时候如果你传给前端的信息乱七八糟,往往少不了挨一顿揍。所以统一一下返回格式还是很有必要的。有点经验的开发者一般都会养成这个习惯,所以今天这篇文章的目的并不在于讲解如何统一返回信息。现在有这么一个问题,你已经封装好了统一的返回信息,按照标准给前端返回了code,msg和data,但是你每次写接口都要重新写一遍生成这个对象,再包装,让代码变得十分冗余并且不美观。接下来就记录我个人在自己的项目上对这个现象进行优化的过程。
@RestControllerAdvice注解首先他是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component。个人理解他的作用是,在Controller层return完数据,在最终返回给前端信息前对数据进行拦截并自定义处理。看一下ResponseBodyAdvice的接口源码。
12345678910111213public interface ResponseBodyAdvice<T> { / ...</div></div></div><div class="recent-post-item"><div class="post_cover left"><a href="/2022/11/02/Nginx%E4%BD%BF%E7%94%A8%E4%B8%8A%E7%9A%84%E5%9D%91/" title="Nginx使用上遇到的坑"><img class="post_bg" src="/../image/NginxNote/Nginx.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="Nginx使用上遇到的坑"></a></div><div class="recent-post-info"><a class="article-title" href="/2022/11/02/Nginx%E4%BD%BF%E7%94%A8%E4%B8%8A%E7%9A%84%E5%9D%91/" title="Nginx使用上遇到的坑">Nginx使用上遇到的坑</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-11-02T08:14:50.000Z" title="发表于 2022-11-02 16:14:50">2022-11-02</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E9%A1%B9%E7%9B%AE/">项目</a></span></div><div class="content">记录一次Nginx使用的坑情况描述https甲方配置了已经绑定到我们8082端口了,Nginx如何配才能让自己的请求通过这个端口在本地无证书的情况下变成https。
使用环境Docker安装最新版Nginx,并映射到各自的80端口,做好了文件映射
1docker run -p 80:80 --name nginx --restart=always -v /opt/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/docker/nginx/conf.d:/etc/nginx/conf.d -v /opt/docker/nginx/html:/usr/share/nginx/html -v /opt/docker/nginx/logs:/var/log/nginx -d nginx
坑一不论怎么配置80端口的代理,永远不生效,指定root目录后依旧是展示Nginx启动页,换了资源目录、配置全局root、换成alias都无效。以下是配置文件
1234567891011121314151617181920212223 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2022/09/15/%E5%88%A9%E7%94%A8Redis%E5%AE%8C%E6%88%90%E8%AE%BA%E5%9D%9B%E5%B8%96%E5%AD%90%E7%9A%84%E5%88%86%E9%A1%B5%E5%8A%A0%E8%BD%BD/" title="利用Redis完成论坛帖子的分页加载">利用Redis完成论坛帖子的分页加载</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-09-15T01:18:08.000Z" title="发表于 2022-09-15 09:18:08">2022-09-15</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">利用Redis完成论坛帖子的分页加载核心思路
利用Redis的ZSet(SortedSet)和Hash做分页。
SortedSet会给每个添加的元素member绑定一个用于排序的值score,SortedSet就会根据score值的大小对元素进行排序,在论坛的应用场景中可以将发布日期当作score用于排序。在RedisTemplate中提供了相关的函数来进行分页取出操作。详情见下。
在Hash里对应存储ID->帖子信息,在SortedSet中存储帖子ID,分页取出每个帖子ID后在Hash中直接根据ID找到对应的帖子信息,返回数组即可。
实现操作
设置定时任务每天在访问低峰期更新数据。
使用@EnableScheduling开启基于注解的定时任务
使用@Scheduled搭配cron表达式设置时间
加载1000条帖子到本地,用getTime()取到Long类型的时间数据作为排序依据,用postID作值。1234567891011121314//每天凌晨四点更新缓存,把数据库里前1000条更新到缓存里。(没人能这么闲看完这么多帖子吧)List<CommunityPos ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2022/08/26/Redis/" title="Redis知识点复习整理">Redis知识点复习整理</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-08-26T01:33:17.000Z" title="发表于 2022-08-26 09:33:17">2022-08-26</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">Redis学习笔记笔记声明
本篇文章是根据视频【尚硅谷】Redis 6 入门到精通 超详细 教程学习得来,参考老师的笔记进行整理
NoSQL概念
NoSQL(Not Only SQL) 泛指非关系型数据库,不依赖业务逻辑方式存储,而以简单的Key-Value方式存储,大大增加了数据库的扩展能力
特点
不遵循SQL标准
不支持ACID
ACID,是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)。
远超于SQL的性能
适用场景
对数据高并发的读写
海量数据读写
对数据高可扩展性的
不适用场景
需要事务支持
基于sql的结构化查询存储,处理复杂的关系,需要即席查询
用不着sql的和用了sql也不行的情况,考虑用NoSQL
Redis基础知识
Redis是单线程+多路IO复用技术
原子操作
定义
不会被线程调度机制打断的操作。一旦开始操作就 ...</div></div></div><div class="recent-post-item"><div class="recent-post-info no-cover"><a class="article-title" href="/2022/07/22/JVM%E5%AD%A6%E4%B9%A0/" title="JVM知识点整理">JVM知识点整理</a><div class="article-meta-wrap"><span class="post-meta-date"><i class="far fa-calendar-alt"></i><span class="article-meta-label">发表于</span><time datetime="2022-07-22T09:32:24.000Z" title="发表于 2022-07-22 17:32:24">2022-07-22</time></span><span class="article-meta"><span class="article-meta-separator">|</span><i class="fas fa-inbox"></i><a class="article-meta__categories" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/">自主学习</a></span></div><div class="content">JVM学习笔记
双亲委派机制
目的
安全
内容
例如自己写了一个java.lang.String类,在里面写main方法时,会提示找不到main方法。原因是因为双亲委派机制会逐步向上找,通过APP(应用程序加载器)->EXTEND(扩展类加载器)->BOOTSTRAP(启动类(根)加载器)逐级向上找其他地方有没有String类
步骤
类加载器收到类加载的请求
将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,如果都找不到,就抛出异常,通知子加载器进行加载。
重复步骤3
百度解释(1.8以及之前版本)1如果一个类加载器收到了类加载请求,它首先不会自动去尝试加载这个类,而是把这个类委托给父类加载器去完成,每一层依次这样,因此所有的加载请求都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成该加载请求(找不到所需的类)时,这个时候子加载器才会尝试自己去加载,这个过程就是双亲委派机制!
优势
避免了类的重复加载
保护了程序的安全性,防止核心API被修改
nati ...</div></div></div><nav id="pagination"><div class="pagination"><span class="page-number current">1</span><a class="page-number" href="/page/2/#content-inner">2</a><a class="extend next" rel="next" href="/page/2/#content-inner"><i class="fas fa-chevron-right fa-fw"></i></a></div></nav></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="/img/pic.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"/></div><div class="author-info__name">Katashi</div><div class="author-info__description"></div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">19</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">5</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">3</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/Katashixz"><i class="fab fa-github"></i><span>关注</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/Katashixz" target="_blank" title="Github"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:hyihao2001@163.com" target="_blank" title="Email-hyihao2001@163.com"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://user.qzone.qq.com/435129920/infocenter" target="_blank" title="QQ空间"><i class="fa-brands fa-qq"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">有问题欢迎指正!请通过邮箱联系我!</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/2023/03/13/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E5%B9%B6%E5%8F%91%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于并发的一些面试问答"><img src="/../image/Thread/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于并发的一些面试问答"/></a><div class="content"><a class="title" href="/2023/03/13/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E5%B9%B6%E5%8F%91%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于并发的一些面试问答">【Java知识点】关于并发的一些面试问答</a><time datetime="2023-03-13T06:40:51.000Z" title="发表于 2023-03-13 14:40:51">2023-03-13</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2023/03/02/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E9%9B%86%E5%90%88%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于集合的一些面试问答"><img src="/../image/Collection-Map/cover.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于集合的一些面试问答"/></a><div class="content"><a class="title" href="/2023/03/02/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91%E9%9B%86%E5%90%88%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%95%B4%E7%90%86/" title="【Java知识点】关于集合的一些面试问答">【Java知识点】关于集合的一些面试问答</a><time datetime="2023-03-02T09:17:12.000Z" title="发表于 2023-03-02 17:17:12">2023-03-02</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2023/02/20/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91IO%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/" title="【Java知识点】关于I/O你需要知道的基础"><img src="/../image/IO/IO.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【Java知识点】关于I/O你需要知道的基础"/></a><div class="content"><a class="title" href="/2023/02/20/%E3%80%90Java%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91IO%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86/" title="【Java知识点】关于I/O你需要知道的基础">【Java知识点】关于I/O你需要知道的基础</a><time datetime="2023-02-20T04:41:50.000Z" title="发表于 2023-02-20 12:41:50">2023-02-20</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/2023/01/10/Spider/" title="【爬虫实战】获取某租房网站的房源信息"><img src="/../image/housePriceSpider/Spider.jpg" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="【爬虫实战】获取某租房网站的房源信息"/></a><div class="content"><a class="title" href="/2023/01/10/Spider/" title="【爬虫实战】获取某租房网站的房源信息">【爬虫实战】获取某租房网站的房源信息</a><time datetime="2023-01-10T08:38:50.000Z" title="发表于 2023-01-10 16:38:50">2023-01-10</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/2022/11/18/%E8%BF%9B%E9%98%B6%E6%97%A5%E8%AE%B0%E2%80%94%E2%80%94%E5%85%A8%E5%B1%80%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86%E4%B8%8E%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E6%A0%BC%E5%BC%8F/" title="进阶日记(一)——全局异常处理与统一处理返回体">进阶日记(一)——全局异常处理与统一处理返回体</a><time datetime="2022-11-18T05:47:22.000Z" title="发表于 2022-11-18 13:47:22">2022-11-18</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
<i class="fas fa-folder-open"></i>
<span>分类</span>
</div>
<ul class="card-category-list" id="aside-cat-list">
<li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E8%87%AA%E4%B8%BB%E5%AD%A6%E4%B9%A0/"><span class="card-category-list-name">自主学习</span><span class="card-category-list-count">9</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%93%B6%E8%A1%8C%E7%A7%92%E6%9D%80%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"><span class="card-category-list-name">银行秒杀系统学习笔记</span><span class="card-category-list-count">6</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E9%A1%B9%E7%9B%AE/"><span class="card-category-list-name">项目</span><span class="card-category-list-count">2</span></a></li>
</ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/Docker/" style="font-size: 1.1em; color: #999">Docker</a> <a href="/tags/Nginx/" style="font-size: 1.3em; color: #99a1ac">Nginx</a> <a href="/tags/Python/" style="font-size: 1.1em; color: #999">Python</a> <a href="/tags/RabbitMQ/" style="font-size: 1.5em; color: #99a9bf">RabbitMQ</a> <a href="/tags/Redis/" style="font-size: 1.5em; color: #99a9bf">Redis</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多">
<i class="fas fa-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/03/"><span class="card-archive-list-date">三月 2023</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/02/"><span class="card-archive-list-date">二月 2023</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2023/01/"><span class="card-archive-list-date">一月 2023</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/11/"><span class="card-archive-list-date">十一月 2022</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/09/"><span class="card-archive-list-date">九月 2022</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/08/"><span class="card-archive-list-date">八月 2022</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/07/"><span class="card-archive-list-date">七月 2022</span><span class="card-archive-list-count">4</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/04/"><span class="card-archive-list-date">四月 2022</span><span class="card-archive-list-count">4</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">19</div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2023-03-13T06:42:02.805Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">©2020 - 2023 By Katashi</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/ui/dist/fancybox.umd.min.js"></script><script>var preloader = {
endLoading: () => {
document.body.style.overflow = 'auto';
document.getElementById('loading-box').classList.add("loaded")
},
initLoading: () => {
document.body.style.overflow = '';
document.getElementById('loading-box').classList.remove("loaded")
}
}
window.addEventListener('load',preloader.endLoading())</script><div class="js-pjax"><script>function subtitleType () {
fetch('https://v1.hitokoto.cn')
.then(response => response.json())
.then(data => {
if (true) {
const from = '出自 ' + data.from
const sub = []
sub.unshift(data.hitokoto, from)
window.typed = new Typed('#subtitle', {
strings: sub,
startDelay: 300,
typeSpeed: 150,
loop: true,
backSpeed: 50,
})
} else {
document.getElementById('subtitle').innerHTML = data.hitokoto
}
})
}
if (true) {
if (typeof Typed === 'function') {
subtitleType()
} else {
getScript('https://cdn.jsdelivr.net/npm/typed.js/lib/typed.min.js').then(subtitleType)
}
} else {
subtitleType()
}
</script></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div></body></html>