-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
541 lines (299 loc) · 98.8 KB
/
atom.xml
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
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>hxy(慌糖盐)</title>
<link href="https://ethanh3514.github.io/atom.xml" rel="self"/>
<link href="https://ethanh3514.github.io/"/>
<updated>2024-06-22T15:21:19.914Z</updated>
<id>https://ethanh3514.github.io/</id>
<author>
<name>EthanH3514</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>2024 CCPC上海市赛 体验</title>
<link href="https://ethanh3514.github.io/2024/06/22/2024-CCPC%E4%B8%8A%E6%B5%B7%E5%B8%82%E8%B5%9B-%E4%BD%93%E9%AA%8C/"/>
<id>https://ethanh3514.github.io/2024/06/22/2024-CCPC%E4%B8%8A%E6%B5%B7%E5%B8%82%E8%B5%9B-%E4%BD%93%E9%AA%8C/</id>
<published>2024-06-22T08:24:28.000Z</published>
<updated>2024-06-22T15:21:19.914Z</updated>
<content type="html"><![CDATA[<p>本来已经退役了,但是队友拉我打,于是就在实习的间隙打了,大概率是最后一场。6.16号的比赛,但现在才写总结。</p><hr><span id="more"></span><h3 id="队友cocomos的总结">队友cocomos的总结</h3><blockquote><p>银了,虽然是市赛(</p><p>感觉这场看一题会一题,单挑了好几个题。开局日常找不到签到,4min后有人过了E再去开,我有点老年人手速9min才过。然后又看到有人5min过J,再去看J,感觉像个找素数合数性质的题,猜想什么区间长度不会很长。一看范围,怎么n²能过的?就直接线性筛+前缀和暴力了,17min就过了。</p><p>签完两道题,看见有人过A就继续跟榜,感觉是个简单数正方形,随便糊了个东西,没过样例,发现理解错题意了。这时队友好像会了,hxy同学还跟我讲“让我也敲敲代码,有点体验感”,那我就让他们去做了。不过好像他们后来换了很多神秘的数法,最后n⁴暴力过的,此时已经58min了。</p><p>他们做A的时候,我先去看了K,感觉来感觉了,再仔细一看,发现范围怎么超了一点,感觉错了,冷静一下。再去看了G题中国象棋,感觉无敌了,状压马的位置然后转移计数肯定就是对的,这时好像只有一两个人过。他们还没做完,又去看了M,猜了个答案是n/2下取整,但是怎么那么多人wa,是不是不对啊,就没想了。</p><p>过了A又轮到我上机了,非常迅速(可能还是调了一些脑残错误)地写完了G,提交发现wa了,不是很理解。再修改了一些小细节,还是wa,开始疑惑。</p><p>没什么进展了,开始想M转换一下思路,虽然感觉不对,但是还是按照猜的结论特判一个n=2的情况交了一发,wa。然后发现好像一个点可以不止有一条出边的,哦,原来题没读对。然后hxy同学M又有了一些想法,我听着感觉很有道理,就让他继续做了。但是好像又wa了一发。</p><p>这下两头都烂了,吃个麦当劳冷静一下。啃完汉堡吃玉米粒的时候突然发现,这个弱智G中国象棋不会是要特判起点的吧?由于我喊的很大声,我们对面一个金牌队也听见了,就听到他们笑了一下,我就知道这题已经过了。</p><p>跟队友交换小调一下,终于在3h5min的时候过了,被这特判硬控将近2小时,真的昏了。好消息是,我过完G的时候hxy也把M调出来了,表演了一个3分钟连过2题。</p><p>这个时候排名已经银牌靠前了,感觉有希望冲金了。于是一边愉快啃香芋派一边找下个题。队友们在我调G的时候好像会D了,但是说写起来很麻烦,lyf就开始写了。后来我看到L过的挺多,就去看L了。看完发现,诶,就是个树上dp啊,好像秒杀了。跟hxy说了一下题意和思路,不知道他有没有懂吧反正我知道肯定是对的了,看这个D现在也处于难产阶段,就申请交换上机了,让他们打印代码继续看。</p><p>飞速写完dfs和状态转移,小改了一下下就过样例了,再测了几个小数据,感觉没什么问题就交了,3h49min一发过。</p><p>看了眼榜,在银牌第一位。感觉封榜再过一题能金。他们继续搞D,我再寻找其他题。发现F好像就是预处理环和链的长度然后背包就好了,但是背包范围有点超。hxy又告诉我可以bitset优化背包,但是我没写过啊,没有很会,就把这题放着了。又继续看K,我跟hxy说会不会搜索剪枝能过,然后他又告诉我这个范围可以双搜,真的无敌,告诉我的全是对的(可惜都没机会开),我觉得就是双搜然后二分合并,但是后面不知道为什么扯到什么随机化了。不过这时感觉已经来不及做这题了,就没想了。</p><p>最后两个队友调了很久也没有把D调出来,后来才知道原来前缀和没考虑逆元不存在的问题,这我确实没想过。早知道还是去尝试F的bitset优化背包了。😭</p><p>颁奖的时候就搞笑了,封榜时银首,突然队名就出现在铜牌第一个了?其他人还都上去领奖了?我人都傻了,还好后来去问了终榜,才知道原来有些组织奖都能发错,后来才给换牌子😅</p><p>总之打的算正常的一场[可怜]</p></blockquote><h3 id="个人总结">个人总结</h3><p>太久没训练,好在在赛场上还是发挥了不小的作用。</p><p>过掉了A题,一个数整点正方形的题,队友和我都看错题,在我手上卡了半个小时,好在看对题之后一分钟推出了公式然后快速A掉。</p><p>过掉了M题的构造。在队友都看不懂题,想不明白为什么不是m/2的时候,我感知到了题目背后的数学结构,是个k分图,过掉了这道题。</p><p>给出了后面两道题的关键思路,一道bitset优化背包,另一道双搜。但可惜,bitset优化背包我们都不会,之前一道CFdiv2E2就是bitset优化背包,结果我们都没补。另一题双搜之后如何合并没想明白。最后卡死在了D题的前缀可能逆元不存在上,这一点我们谁也没想到,都以为实现错了。</p><p>最后6题结局,银牌中上游。</p><hr><h3 id="图片">图片</h3><p>队名:面试官问我CCPC是什么。来源于真实经历)</p><p><img src=".\市赛终榜.jpg" alt="市赛终榜"></p><p><img src=".\市赛银牌.jpg" alt="市赛银牌"></p>]]></content>
<summary type="html"><p>本来已经退役了,但是队友拉我打,于是就在实习的间隙打了,大概率是最后一场。6.16号的比赛,但现在才写总结。</p>
<hr></summary>
<category term="算法竞赛" scheme="https://ethanh3514.github.io/tags/%E7%AE%97%E6%B3%95%E7%AB%9E%E8%B5%9B/"/>
<category term="CCPC" scheme="https://ethanh3514.github.io/tags/CCPC/"/>
<category term="省赛" scheme="https://ethanh3514.github.io/tags/%E7%9C%81%E8%B5%9B/"/>
<category term="上海" scheme="https://ethanh3514.github.io/tags/%E4%B8%8A%E6%B5%B7/"/>
<category term="2024" scheme="https://ethanh3514.github.io/tags/2024/"/>
<category term="SHCPC" scheme="https://ethanh3514.github.io/tags/SHCPC/"/>
</entry>
<entry>
<title>分布式ID 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/10/%E5%88%86%E5%B8%83%E5%BC%8FID-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/10/%E5%88%86%E5%B8%83%E5%BC%8FID-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-10T07:31:44.000Z</published>
<updated>2024-06-10T07:43:14.493Z</updated>
<content type="html"><![CDATA[<p>分布式系统下为不同的数据节点生成全局唯一主键</p><span id="more"></span><h3 id="要求">要求</h3><p><strong>基本要求</strong>:</p><ul><li>全局唯一</li><li>高性能:生成要快</li><li>高可用:生成分布式ID的服务要保证可用性</li><li>方便易用</li></ul><p><strong>额外</strong>:</p><ul><li>安全:不含敏感信息</li><li>有序递增</li><li>有具体的业务含义</li><li>独立部署:单独有一个发号器服务</li></ul><h3 id="常见解决方案">常见解决方案</h3><h4 id="数据库号段">数据库号段</h4><pre class="mysql"><code>CREATE TABLE `sequence_id_generator` ( `id` int(10) NOT NULL, `current_max_id` bigint(20) NOT NULL COMMENT '当前最大id', `step` int(10) NOT NULL COMMENT '号段的长度', `version` int(20) NOT NULL COMMENT '版本号', `biz_type` int(20) NOT NULL COMMENT '业务类型', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;</code></pre><p><code>version</code> 字段主要用于乐观锁</p><ul><li>创建一个数据库表 <code>squence_id_generator</code>,存储当前最大长度、号段的长度</li><li>每一次申请一块的ID,放入内存,需要用的时候从内存中拿</li><li>更新数据库表</li></ul><h4 id="nosql">NoSQL</h4><ul><li>使用Redis Cluster</li><li>MongoDB</li></ul><h4 id="算法">算法</h4><h5 id="uuid">UUID</h5><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="co">//cb4a9ede-fa5e-4585-b9bb-d60bce986eaa</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="bu">UUID</span><span class="op">.</span><span class="fu">randomUUID</span><span class="op">()</span></span></code></pre></div><p>不同版本的UUID的生成规则不同</p><p>可以保证全局唯一性,但是过长、无顺序</p><h5 id="snowflake">Snowflake</h5><ul><li>sign(1 bit):符号位,始终为0,代表ID为正数</li><li>timestamp(41 bit):毫秒为单位的时间戳,可以支撑 <span class="math inline"><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: 0;" xmlns="http://www.w3.org/2000/svg" width="2.919ex" height="1.904ex" role="img" focusable="false" viewBox="0 -841.7 1290.1 841.7"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="TeXAtom" transform="translate(533,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mn"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z"></path><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z" transform="translate(500,0)"></path></g></g></g></g></g></svg></mjx-container></span> 毫秒</li><li>datacenter id + worker id(10 bits):机房ID+机器ID</li><li>sequence(12 bits):单台机器每毫秒所能生成的最大ID数( <span class="math inline"><mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.186ex;" xmlns="http://www.w3.org/2000/svg" width="10.461ex" height="2.072ex" role="img" focusable="false" viewBox="0 -833.9 4623.7 915.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="TeXAtom" transform="translate(533,363) scale(0.707)" data-mjx-texclass="ORD"><g data-mml-node="mn"><path data-c="31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z" transform="translate(500,0)"></path></g></g></g><g data-mml-node="mo" transform="translate(1567.9,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(2623.7,0)"><path data-c="34" d="M462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293Z"></path><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z" transform="translate(500,0)"></path><path data-c="39" d="M352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248Z" transform="translate(1000,0)"></path><path data-c="36" d="M42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397Z" transform="translate(1500,0)"></path></g></g></g></svg></mjx-container></span> ),自增的序列号</li></ul>]]></content>
<summary type="html"><p>分布式系统下为不同的数据节点生成全局唯一主键</p></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="分布式" scheme="https://ethanh3514.github.io/tags/%E5%88%86%E5%B8%83%E5%BC%8F/"/>
<category term="ID" scheme="https://ethanh3514.github.io/tags/ID/"/>
</entry>
<entry>
<title>Gossip 协议 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/10/Gossip-%E5%8D%8F%E8%AE%AE-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/10/Gossip-%E5%8D%8F%E8%AE%AE-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-10T06:27:34.000Z</published>
<updated>2024-06-10T06:35:50.937Z</updated>
<content type="html"><![CDATA[<p>分布式系统中,不同的节点进行信息共享的一种<strong>分散式发散消息</strong>的协议</p><p>被Redis、Apache Cassandra、Consul等项目应用</p><span id="more"></span><h3 id="gossip消息传播模式">Gossip消息传播模式</h3><ul><li>反熵</li><li>传谣</li></ul><h4 id="反熵">反熵</h4><p>集群中的节点,每隔段时间就随机选择某个其他节点,交换数据来消除两者的差异,实现数据的最终一致性</p><p>主要有三种方式实现</p><ul><li>推:把自己的副本数据推给对方,修复对方副本中的熵</li><li>拉:拉取对方的副本数据,修复自己的熵</li><li>推拉:结合上面的两种</li></ul><p><strong>特点</strong>:简单实用,一般设计成闭环传播。节点过多或者节点动态变化时候就不适用了</p><h4 id="谣言传播">谣言传播</h4><p>一个节点一旦有了新的数据,就会变成活跃节点,会周期性地联系其他节点发送新数据,直到所有的节点都同步</p><h3 id="gossip协议的优缺点">Gossip协议的优缺点</h3><p><strong>优点</strong>:</p><ul><li>简单</li><li>容忍动态节点</li><li>速度快</li></ul><p><strong>缺点</strong>:</p><ul><li>消息需要多轮才能传到整个网络</li><li>不允许存在恶意节点</li><li>可能会出现消息冗余</li></ul>]]></content>
<summary type="html"><p>分布式系统中,不同的节点进行信息共享的一种<strong>分散式发散消息</strong>的协议</p>
<p>被Redis、Apache Cassandra、Consul等项目应用</p></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="分布式" scheme="https://ethanh3514.github.io/tags/%E5%88%86%E5%B8%83%E5%BC%8F/"/>
<category term="Gossip" scheme="https://ethanh3514.github.io/tags/Gossip/"/>
<category term="信息共享" scheme="https://ethanh3514.github.io/tags/%E4%BF%A1%E6%81%AF%E5%85%B1%E4%BA%AB/"/>
</entry>
<entry>
<title>CAP BASE 理论 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/10/CAP-BASE-%E7%90%86%E8%AE%BA-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/10/CAP-BASE-%E7%90%86%E8%AE%BA-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-10T02:22:43.000Z</published>
<updated>2024-06-10T02:34:01.187Z</updated>
<content type="html"><![CDATA[<p>是分布式里面比较重要的理论</p><span id="more"></span><h3 id="cap">CAP</h3><p>布鲁尔定理(Brewer's theorem)</p><ul><li>Consistency(一致性):所有节点访问同一份最新的数据副本</li><li>Availability(可用性):非故障节点在合理时间内返回合理响应</li><li>PartitionTolerance(分区容错性):分布式系统出现网络分区的时候,仍然能对外提供服务</li></ul><h4 id="网络分区">网络分区</h4><p>因为某些故障,使得某些节点之间不再连通,网络就分成了几块,便是网络分区</p><h4 id="不是3选2">不是3选2</h4><p>当发生网络分区的时候,如果要继续服务,那么强一致性和可用性只能2选1</p><p>所以分布式系统理论上只能选择CP架构或者AP架构</p><p>系统没有发生分区的话,可以同时保证C和A</p><h3 id="base">BASE</h3><p>牺牲数据的一致性来满足系统的高可用性,是对CAP中AP方案的一个补充</p><ul><li>Basically Available(基本可用)</li><li>Soft-state(软状态)</li><li>Eventually Consistent(最终一致性)</li></ul><h4 id="允许损失部分可用性">允许损失部分可用性</h4><ul><li>响应时间上的损失</li><li>系统功能上的损失(部分非核心功能不可用)</li></ul><h4 id="软状态">软状态</h4><p>允许系统中的数据存在中间状态,允许系统在不同节点间的数据副本间进行数据同步的过程有延时</p><h4 id="最终一致性">最终一致性</h4><p>系统中所有的数据副本,在经过一段时间的同步后,最终能达到一个一致的状态</p><p><strong>实现方式</strong>:</p><ul><li>读时修复:读取数据时,检测数据的不一致,进行修复</li><li>写时修复:写入数据时,检测数据的不一致,进行修复</li><li>异步修复:定时对账检测副本数据的一致性,并修复</li></ul><p>推荐<strong>写时修复</strong>,对性能消耗较低</p><h3 id="分布式一致性">分布式一致性</h3><ul><li>强一致性:系统写入什么,就读出来什么</li><li>弱一致性:会尽量保证某个时刻达到数据一致</li><li>最终一致性:保证在一定时间内达到数据一致</li></ul>]]></content>
<summary type="html"><p>是分布式里面比较重要的理论</p></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="CAP" scheme="https://ethanh3514.github.io/tags/CAP/"/>
<category term="BASE" scheme="https://ethanh3514.github.io/tags/BASE/"/>
<category term="分布式" scheme="https://ethanh3514.github.io/tags/%E5%88%86%E5%B8%83%E5%BC%8F/"/>
<category term="ACID" scheme="https://ethanh3514.github.io/tags/ACID/"/>
</entry>
<entry>
<title>设计模式-六大设计原则 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/03/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%85%AD%E5%A4%A7%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/03/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F-%E5%85%AD%E5%A4%A7%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-03T07:38:15.000Z</published>
<updated>2024-06-03T08:07:44.939Z</updated>
<content type="html"><![CDATA[<p>面对需求的变化,有六大设计原则和23种设计模式来为可预料的变化做准备</p><span id="more"></span><h2 id="六大设计原则">六大设计原则</h2><ul><li>单一职责原则(Single Responsibility Principle)</li><li>开闭原则(Open Closed Principle)</li><li>里氏替换原则(Liskov Substitution Principle)</li><li>迪米特法则(Law of Demeter)</li><li>接口隔离原则(Interface Segregation Principle)</li><li>依赖倒置原则(Dependence Inversion Principle)</li></ul><p>合起来就是SOLID</p><h3 id="单一职责原则">单一职责原则</h3><ul><li>一个类或接口只承担一个职责</li></ul><h3 id="开闭原则">开闭原则</h3><h3 id="开闭原则-1">开闭原则</h3><p>软件实体对扩展开放,对修改关闭</p><ul><li>用扩展而非修改的方式实现对软件实体的变动</li></ul><h3 id="里氏替换原则">里氏替换原则</h3><ul><li>只要父类能出现的地方,子类就可以出现,并且替换成子类也不会产生错误和异常</li></ul><h4 id="注意">注意</h4><ul><li>子类中方法的入参类型必须与父类中被覆写的方法的入参类型相同或更宽松</li></ul><h3 id="迪米特法则">迪米特法则</h3><p>最少知道法则</p><ul><li>一个对象应该对其他对象有最少的了解</li></ul><p>一个类和其他类有关联,那么这些类对这个类就是朋友类,要和朋友类尽可能少的联系</p><ul><li><strong>核心</strong>:类间解耦、弱耦合</li></ul><h3 id="接口隔离原则">接口隔离原则</h3><ul><li>不要对外暴露没有实际意义的接口</li></ul><h3 id="依赖倒置原则">依赖倒置原则</h3><ul><li>高层模块不应该依赖于低层模块,应该依赖抽象</li><li>细节依赖抽象</li></ul><p><a href="https://zhuanlan.zhihu.com/p/110130347">六大设计原则超详细介绍</a></p>]]></content>
<summary type="html"><p>面对需求的变化,有六大设计原则和23种设计模式来为可预料的变化做准备</p></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="设计模式" scheme="https://ethanh3514.github.io/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"/>
<category term="设计原则" scheme="https://ethanh3514.github.io/tags/%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99/"/>
</entry>
<entry>
<title>双数组Trie树(DAT) 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/03/%E5%8F%8C%E6%95%B0%E7%BB%84Trie%E6%A0%91-DAT-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/03/%E5%8F%8C%E6%95%B0%E7%BB%84Trie%E6%A0%91-DAT-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-03T02:02:27.000Z</published>
<updated>2024-06-03T02:09:33.474Z</updated>
<content type="html"><![CDATA[<blockquote><p>Trie树是一种利用空间换时间的数据结构,占用的内存会比较大。也正是因为这个原因,实际工程项目中都是使用的改进版Trie 树例如双数组 Trie 树(Double-Array Trie,DAT)。</p></blockquote><blockquote><p>在双数组所有键中包含的字符之间的联系都是通过简单的数学加法运算表示,不仅提高了检索速度,而且省去了链式结构中使用的大量指针,节省了存储空间。</p></blockquote><p>如果DAT与AC自动机结合,可以达到很高的多模式匹配性能</p><span id="more"></span><p><a href="https://www.hankcs.com/program/java/triedoublearraytriejava.html">双数组Trie树(DoubleArrayTrie)Java实现</a></p>]]></content>
<summary type="html"><blockquote>
<p>Trie
树是一种利用空间换时间的数据结构,占用的内存会比较大。也正是因为这个原因,实际工程项目中都是使用的改进版
Trie 树例如双数组 Trie 树(Double-Array Trie,DAT)。</p>
</blockquote>
<blockquote>
<p>在双数组所有键中包含的字符之间的联系都是通过简单的数学加法运算表示,不仅提高了检索速度,而且省去了链式结构中使用的大量指针,节省了存储空间。</p>
</blockquote>
<p>如果DAT与AC自动机结合,可以达到很高的多模式匹配性能</p></summary>
<category term="算法" scheme="https://ethanh3514.github.io/tags/%E7%AE%97%E6%B3%95/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="数据结构" scheme="https://ethanh3514.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="DAT" scheme="https://ethanh3514.github.io/tags/DAT/"/>
<category term="Trie" scheme="https://ethanh3514.github.io/tags/Trie/"/>
</entry>
<entry>
<title>代码命名规范 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/02/%E4%BB%A3%E7%A0%81%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/02/%E4%BB%A3%E7%A0%81%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-02T10:16:48.000Z</published>
<updated>2024-06-02T10:28:05.832Z</updated>
<content type="html"><![CDATA[<blockquote><p>好的代码本身就是注释</p></blockquote><span id="more"></span><h3 id="基本规范">基本规范</h3><ul><li><p>类名用大驼峰( <code>UpperCamelCase</code> )</p></li><li><p>方法名、参数名、成员变量、局部变量用小驼峰(<code>lowerCamelCase</code> )</p></li><li><p>项目文件夹名称用串式命名法( <code>kebab-case</code> )</p></li><li><p>包名统一小写( <code>org.apach.dubbo.common.threadlocal</code>)</p></li><li><p>抽象类用Abstract开头</p><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> AbstractClient <span class="kw">extends</span> AbstractEndpoint <span class="kw">implements</span> Client <span class="op">{</span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div></li><li><p>异常类命名用Exception结尾</p><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> <span class="bu">NoSuchMethodException</span> <span class="kw">extends</span> <span class="bu">RuntimeException</span> <span class="op">{</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div></li><li><p>测试类用以要测试的类名开头,以Test结尾</p><div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> AnnotationUtilsTest <span class="op">{</span></span><span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div></li><li><p>POJO类中布尔类型的变量,不要加is前缀</p></li></ul>]]></content>
<summary type="html"><blockquote>
<p>好的代码本身就是注释</p>
</blockquote></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="命名规范" scheme="https://ethanh3514.github.io/tags/%E5%91%BD%E5%90%8D%E8%A7%84%E8%8C%83/"/>
</entry>
<entry>
<title>CSRF 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/06/01/CSRF-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/06/01/CSRF-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-06-01T04:40:57.000Z</published>
<updated>2024-06-03T02:10:06.284Z</updated>
<content type="html"><![CDATA[<blockquote><p>CSRF(Cross-Site RequestForgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站向被攻击网站发送跨站请求,利用受害者在被攻击网站的凭证,绕过用户验证</p></blockquote><span id="more"></span><h3 id="例子">例子</h3><ul><li>受害者登录 <code>a.com</code> ,保留登录凭证</li><li>攻击者引诱受害者访问 <code>b.com</code></li><li><code>b.com</code> 向 <code>a.com</code> 发送了一个请求:<code>a.com/act=xx</code> ,浏览器默携带 <code>a.com</code> 的<code>Cookie</code></li><li><code>a.com</code>接收到请求后,验证请求,确认是受害者的凭证,放行</li><li><code>a.com</code> 以受害者的名义执行了 <code>act=xx</code></li></ul><h3 id="防护策略">防护策略</h3><p><a href="https://tech.meituan.com/2018/10/11/fe-security-csrf.html">前端安全系列(二):如何防止CSRF攻击?</a></p>]]></content>
<summary type="html"><blockquote>
<p>CSRF(Cross-Site Request
Forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站向被攻击网站发送跨站请求,利用受害者在被攻击网站的凭证,绕过用户验证</p>
</blockquote></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="CSRF" scheme="https://ethanh3514.github.io/tags/CSRF/"/>
</entry>
<entry>
<title>RBAC 权限控制模型 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/05/31/RBAC-%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6%E6%A8%A1%E5%9E%8B-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/05/31/RBAC-%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6%E6%A8%A1%E5%9E%8B-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-05-31T14:30:00.000Z</published>
<updated>2024-05-31T14:32:11.613Z</updated>
<content type="html"><![CDATA[<blockquote><p>RBAC即基于角色的权限访问控制(Role Based Access Control)</p></blockquote><p>权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限</p><p>是系统权限控制最常采用的访问控制模型</p>]]></content>
<summary type="html"><blockquote>
<p>RBAC即基于角色的权限访问控制(Role Based Access Control)</p>
</blockquote>
<p>权限与角色相关联,用户通过成为包含特定角色的成员而得到这些角色的权限</p>
<p>是系统权限控制最常采用的访</summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="RBAC" scheme="https://ethanh3514.github.io/tags/RBAC/"/>
<category term="权限控制" scheme="https://ethanh3514.github.io/tags/%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6/"/>
</entry>
<entry>
<title>Cookie 与 Session 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/05/31/Cookie-%E4%B8%8E-Session-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/05/31/Cookie-%E4%B8%8E-Session-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-05-31T14:25:39.000Z</published>
<updated>2024-05-31T15:59:21.825Z</updated>
<content type="html"><![CDATA[<blockquote><p>Cookie和Session都是用来跟踪浏览器用户身份的会话方式</p></blockquote><span id="more"></span><h2 id="区别">区别</h2><h3 id="cookie">Cookie</h3><ul><li>存放在客户端</li><li>一般保存用户信息</li></ul><h3 id="session">Session</h3><ul><li>Session存放在服务端</li><li>安全性更高</li></ul><h2 id="使用session-cookie方案进行身份验证">使用Session-Cookie方案进行身份验证</h2><ul><li>用户发送登录信息</li><li>服务器验证通过,为用户创建一个 <code>Session</code> ,将<code>Session</code> 存储</li><li>服务器向用户返回 <code>SessionID</code> ,写入用户的<code>Cookie</code></li><li>用户保持登录状态时, <code>Cookie</code>将与每个后续请求一起发送</li><li>服务器将存储在 <code>Cookie</code> 上的 <code>SessionID</code>与内存中或数据库中的 <code>Session</code> 比对,验证身份</li></ul><h3 id="注意">注意</h3><ul><li>一定要确保客户端开启了 <code>Cookie</code></li><li>注意 <code>Session</code> 的过期时间</li></ul><h2 id="多服务器节点下session-cookie">多服务器节点下Session-Cookie</h2><p>可能会有用户两次访问导向到不同服务器,以至于Session失效</p><h3 id="常见解决方案">常见解决方案</h3><ul><li>通过哈希策略分配</li><li>服务器间的Session互相同步(节点越多成本越高)</li><li>使用一个所有服务器都能访问到的数据节点(缓存)存放Session</li><li>Spring Session</li></ul>]]></content>
<summary type="html"><blockquote>
<p>Cookie和Session都是用来跟踪浏览器用户身份的会话方式</p>
</blockquote></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Cookie" scheme="https://ethanh3514.github.io/tags/Cookie/"/>
<category term="Session" scheme="https://ethanh3514.github.io/tags/Session/"/>
</entry>
<entry>
<title>JWT 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/05/31/JWT-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/05/31/JWT-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-05-31T14:06:49.000Z</published>
<updated>2024-06-01T05:04:41.425Z</updated>
<content type="html"><![CDATA[<blockquote><p>JSON WebToken,是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制</p></blockquote><blockquote><p>JWT自身包含了身份验证所需要的所有信息,因此,服务器不需要存储Session信息</p></blockquote><blockquote><p>JWT 更符合设计RESTful API的 Stateless 原则</p></blockquote><blockquote><p>使用JWT认证可以有效避免CSRF攻击</p></blockquote><span id="more"></span><h3 id="组成">组成</h3><ul><li><p>header:</p><div class="sourceCode" id="cb1"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">"alg"</span><span class="fu">:</span> <span class="st">"HS246"</span><span class="fu">,</span></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">"typ"</span><span class="fu">:</span> <span class="st">"JWT"</span></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div><ul><li>定义生成签名的算法</li><li>定义Token类型</li></ul></li><li><p>payload</p><div class="sourceCode" id="cb2"><pre class="sourceCode json"><code class="sourceCode json"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">"sub"</span><span class="fu">:</span> <span class="st">"1234567890"</span><span class="fu">,</span></span><span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">"name"</span><span class="fu">:</span> <span class="st">"Ethan"</span><span class="fu">,</span></span><span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="dt">"admin"</span><span class="fu">:</span> <span class="kw">true</span><span class="fu">,</span></span><span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">"iat"</span><span class="fu">:</span> <span class="dv">1516239022</span></span><span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div><ul><li>存放实际需要传输的数据</li><li><code>iat</code> 是时间戳</li></ul></li><li><p>signature</p><pre><code>HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), your-256-bit-secret)</code></pre><ul><li>服务器通过payload、header、密钥使用header中指定的签名算法生成</li></ul></li><li><p>基本格式:<code>eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c</code></p></li></ul><h3 id="用法">用法</h3><ul><li>用户向服务器发送登录表单</li><li>校验正确,服务端返回已经签名的Token,即JWT</li><li>用户以后每一次发送请求都在Header里带上这个JWT</li><li>服务端检查JWT并从中获取用户信息</li></ul><h3 id="注意事项">注意事项</h3><ul><li>最好把JWT存在localStorage里面,防在Cookie里有CSRF风险</li><li>常见做法是把JWT放在HTTP Header的 <code>Authorization</code> 字段中(<code>Authorization: Bearer Token</code> )</li></ul><h3 id="安全性">安全性</h3>]]></content>
<summary type="html"><blockquote>
<p>JSON Web
Token,是目前最流行的跨域认证解决方案,是一种基于Token的认证授权机制</p>
</blockquote>
<blockquote>
<p>JWT自身包含了身份验证所需要的所有信息,因此,服务器不需要存储Session信息</p>
</blockquote>
<blockquote>
<p>JWT 更符合设计RESTful API的 Stateless 原则</p>
</blockquote>
<blockquote>
<p>使用JWT认证可以有效避免CSRF攻击</p>
</blockquote></summary>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="JWT" scheme="https://ethanh3514.github.io/tags/JWT/"/>
</entry>
<entry>
<title>《非暴力沟通》 读书总结</title>
<link href="https://ethanh3514.github.io/2024/05/29/%E3%80%8A%E9%9D%9E%E6%9A%B4%E5%8A%9B%E6%B2%9F%E9%80%9A%E3%80%8B-%E8%AF%BB%E4%B9%A6%E6%80%BB%E7%BB%93/"/>
<id>https://ethanh3514.github.io/2024/05/29/%E3%80%8A%E9%9D%9E%E6%9A%B4%E5%8A%9B%E6%B2%9F%E9%80%9A%E3%80%8B-%E8%AF%BB%E4%B9%A6%E6%80%BB%E7%BB%93/</id>
<published>2024-05-29T05:27:33.000Z</published>
<updated>2024-05-30T06:59:45.552Z</updated>
<content type="html"><![CDATA[<p>“非暴力沟通”中的暴力并不是指肢体上的暴力,语言也可以是一把刀。</p><p>在这本书中我学到了很多,我应该会经常回看这本书。</p><p>下面我记录我看书的时候所做的勾划。</p><span id="more"></span><h2 id="非暴力沟通">非暴力沟通</h2><h3 id="区分观察和评论">区分观察和评论</h3><ul><li><code>如果不把事实和意见混为一谈,我们将不再困惑</code></li><li><code>不带评论的观察是人类智力的最高形式</code></li><li><code>将观察和评论混为一谈,别人就会倾向于听到批评,并反驳我们</code></li></ul><h3 id="感受的根源">感受的根源</h3><ul><li><code>了解我们的感受和需要</code></li><li><code>用心体会他人的感受和需要</code></li><li><code>如果我们通过批评来提出主张,人们的反应常常是申辩或反击。反之,如果我们直接说出需要,其他人就较有可能做出积极的回应</code></li><li><code>如果我们不看重自己的需要,别人可能也不会</code></li><li><code>人与人相互依存,损人无法真正利己</code></li><li><code>我们无法牺牲他人来满足自己的需要</code></li><li><code>一般来说,在存在多种感受的情况下,一个人会诉说那些还没有得到倾听的感受。因此,倾听的人无须一开始就对各种感受同时作出反馈,而可以自然地从一种感受过渡到另一种</code></li></ul><h3 id="请求帮助">请求帮助</h3><ul><li><p><code>抽象的语言无助于深化自我认识</code></p></li><li><p><code>如果我们只是表达自己的感受,别人可能就不清除我们想要什么</code></p></li><li><p><code>大多数的人在没有得到期待的反馈时,会将所说的话重复一遍</code></p></li><li><p><code>对自己的认识越深刻,表达越清楚,我们就越可能得到称心的回应</code></p></li><li><p><code>请求没有得到满足时,提出请求的人如果批评和指责,那就是命令;如果想利用对方的内疚来达到目的,也是命令</code></p></li><li><p><code>我们越是将他人的不顺从看作是对我们的排斥,我们所表达的愿望就越有可能被看作是命令</code></p></li><li><p><code>如果我们愿意去体会是什么使他们无法说“是”,那么,根据我的定义,我们提出的就是请求而非命令</code></p></li><li><p><code>一旦人们相信我们看重彼此的感情,并能兼顾双方的需要,那么,他们也就会相信我们所表达的愿望是请求而非命令</code></p></li><li><pre><code> 在提出请求前,如果我们有以下的想法,那么,我们的请求已经成为了对他人的要求。 ·他应该把房间整理干净。 ·她必须照我说的去做。 ·老板应当给我提职加薪。 ·我有权要求更长的假期。</code></pre></li></ul><h3 id="用全身心倾听">用全身心倾听</h3><ul><li><code>如果一个人想要别人了解他的处境,听到的却是安慰和建议,那么,他就有可能觉得不太舒服</code></li><li><code>在安慰他人或提建议前,先看看那是否是他们想要的</code></li><li><code>倾听他人意味着,放下已有的想法和判断,一心一意地体会他人</code></li><li><code>如果我们注意的是别人的需要而非他对我们的看法,我们将发现别人并不那么可怕</code></li><li><code>在倾听他人的观察、感受、需要和请求之后,我们可以主动表达我们的理解</code></li><li><code>非暴力沟通建议我们使用疑问句来给予他人反馈。这将便于他人对我们的理解作出必要的补充</code></li><li><code>如果一个人在说话时有明显的情绪,他一般会期待得到他人的反馈</code></li><li><code>在给他人反馈时,我们的语气十分重要。一旦别人通过我们的语气意识到我们是在体会,而非下结论,他们一般就不会产生反感。</code></li><li><code>只要我们专注于他人的感受和需要,所有的批评、攻击、辱骂或嘲讽就会消失。</code></li><li><code>如果人们常常怀疑我们的诚意,那么,我们就需要好好审视自己的动机。也许,我们只是在机械地运用非暴力沟通,而忘记其目的。这时,我们就可以问自己,我们关心的是加深与人的联系,还是以“标准的”非暴力沟通方式来说话。或者,虽然我们是以非暴力沟通的方式来表达自己,我们在乎的也许只是改变他人来迎合我们的需要。</code></li><li><code>给他人反馈是在节约而非浪费时间</code></li><li><code>在解决问题或询问他人的请求前,为他人的充分表达创造条件。如果过早地提及他人的请求,我们也许就无法传达我们的关心</code></li><li><code>怎样判断对方的感受是否已经充分表达呢?首先,如果一个人觉得别人已经完全明白他的意思,他就会变得轻松。这时,我们也会感到放松。另一个更为明显的标志是,他停止了谈话。如果无法确定对方是否还有话要说,就不妨问一句:“你还有什么话要告诉我吗?”</code></li><li><code>我们无法给别人我们自己都没有的东西。如果告诉他人我们正处于痛苦中,我们无法顾及他们的感受和需要,别人很可能就会伸出援手</code></li><li><code>一旦我们能够敏锐地察觉并照顾自己的感受和需要,我们就有能力迅速调整好状态,来倾听他人</code></li><li><code>我们需要先放下已有的想法和判断,全心全意地体会对方</code></li></ul><h4 id="例子">例子</h4><ul><li><p>甲:“你的表现让我很失望。我本来指望你们部门上个月的产出能够翻番。”</p><p>乙:“我知道你很失望。但上个月我们部门请病假的人很多。”</p></li><li><p>虽然乙提到了甲的感受,但乙主要是在辩解。如果乙用心倾听并给予反馈,他也许会说:“你看来很失望,你看重工作效率,是吗?”</p></li></ul><h3 id="倾听的力量">倾听的力量</h3><ul><li><code>在一个生气的人面前,永远不要用‘不过’‘可是’‘但是’之类的词语</code></li><li><code>有的时候,谈话的气氛很沉闷。我们体会不到说话的人有怎样的感受和需要,也不知道他对我们有什么期待。尽快提醒说话的人留意自己的感受和需要</code></li><li><code>打断别人比假装在听,更符合对方的愿望。所有的人都希望自己的话对人有益,而不想被人当作负担。</code></li></ul><h3 id="爱自己">爱自己</h3><ul><li><code>如果我们习惯于将自己视为工具——充满各种缺陷的工具,自我憎恨还令人奇怪吗?</code></li><li><code>一旦专注于尚未满足的需要,我们就会考虑如何满足它。反之,如果用苛刻的语言指责自己,我们不仅难以找到解决办法,而且容易陷于自我惩罚的痛苦中。</code></li><li><code>爱惜自己的关键之一是同时包容那两个不同的“我”:一方面包容对过去的某种行为感到后悔的“我”,另一方面包容采取那种行为的“我”。</code></li><li><code>一旦意识到我们的行为所服务的需要,即使工作很艰苦、富有挑战性乃至举步维艰,我们也会从中得到乐趣。</code></li><li><code>在日常生活中,我们主动根据需要和价值观来选择生活。用“选择做”来取代“不得不”</code></li></ul><h3 id="充分表达愤怒">充分表达愤怒</h3><ul><li><code>如果人们认为自己的痛苦是由其他人造成的,并认为那些人应该受到谴责或惩罚,那么,就像这位年轻的囚犯那样,他们播下了暴力的种子。</code></li><li><code>表达愤怒的四个步骤是:(1)停下来,除了呼吸,什么都别做;(2)想一想是什么想法使我们生气了;(3)体会自己的需要;(4)表达感受和尚未满足的需要。</code></li></ul><h3 id="表达感激">表达感激</h3><ul><li><p><code>用非暴力沟通的方式表达感激时,我们只是为了庆祝他人的行为提升了我们的生活品质,而不是想得到任何回报。</code></p></li><li><pre><code> 非暴力沟通表达感激的方式包含三个部分: 1.对方做了什么事情使我们的生活得到了改善; 2.我们有哪些需要得到了满足; 3.我们的心情怎么样?</code></pre></li><li><p><code>当我们让自己的光芒闪耀,无意中我们也允许了他人散发光芒。一旦我们从自我的恐惧中解放出来,我们的存在,也会让他人得到解放。”</code></p></li><li><p><code>即使人们在听到感激时会感到尴尬,他们也会想听到明确的表达</code></p></li><li><p><code>在表达感激时,我们说出:(1)对我们有益的行为;(2)我们的哪些需要得到了满足;(3)我们的需要得到满足后,我们是什么样的心情</code></p></li></ul><h2 id="总结">总结</h2><ul><li>观察、感受、需要、请求</li><li><strong>诚实地表达自己,而不批评、指责</strong></li><li><strong>关切地倾听他人,而不解读为批评或指责</strong></li><li></li></ul>]]></content>
<summary type="html"><p>“非暴力沟通”中的暴力并不是指肢体上的暴力,语言也可以是一把刀。</p>
<p>在这本书中我学到了很多,我应该会经常回看这本书。</p>
<p>下面我记录我看书的时候所做的勾划。</p></summary>
<category term="读书" scheme="https://ethanh3514.github.io/tags/%E8%AF%BB%E4%B9%A6/"/>
<category term="非暴力沟通" scheme="https://ethanh3514.github.io/tags/%E9%9D%9E%E6%9A%B4%E5%8A%9B%E6%B2%9F%E9%80%9A/"/>
<category term="总结" scheme="https://ethanh3514.github.io/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>Spring Swagger 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-Swagger-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-Swagger-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T12:32:48.000Z</published>
<updated>2024-04-14T03:15:00.240Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><h4 id="在spring-boot项目中引入swagger">在SpringBoot项目中引入Swagger</h4><ul><li>引入springfox-swagger2、springfox-swagger-ui依赖</li><li>在 <code>pom.xml</code> 中引入</li></ul><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="op"><</span>dependency<span class="op">></span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>groupId<span class="op">></span>io<span class="op">.</span><span class="fu">springfox</span><span class="op"></</span>groupId<span class="op">></span></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>artifactId<span class="op">></span>springfox<span class="op">-</span>swagger2<span class="op"></</span>artifactId<span class="op">></span></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>version<span class="op">></span><span class="fl">2.9.2</span><span class="op"></</span>version<span class="op">></span></span><span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="op"></</span>dependency<span class="op">></span></span><span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="op"><</span>dependency<span class="op">></span></span><span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>groupId<span class="op">></span>io<span class="op">.</span><span class="fu">springfox</span><span class="op"></</span>groupId<span class="op">></span></span><span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>artifactId<span class="op">></span>springfox<span class="op">-</span>swagger<span class="op">-</span>ui<span class="op"></</span>artifactId<span class="op">></span></span><span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="op"><</span>version<span class="op">></span><span class="fl">2.9.2</span><span class="op"></</span>version<span class="op">></span></span><span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a><span class="op"></</span>dependency<span class="op">></span></span></code></pre></div><ul><li>springboot 2.6以上版本和swagger不兼容,需要在<code>application.properties</code> 中加入</li></ul><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">mvc</span><span class="op">.</span><span class="fu">pathmatch</span><span class="op">.</span><span class="fu">matching</span><span class="op">-</span>strategy<span class="op">=</span>ant_path_matcher</span></code></pre></div><ul><li><code>com.hxy.helloworld/config/SwaggerConfig</code>加入配置信息</li></ul><div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="kw">package</span><span class="im"> com</span><span class="op">.</span><span class="im">hxy</span><span class="op">.</span><span class="im">mpdemo</span><span class="op">.</span><span class="im">config</span><span class="op">;</span></span><span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a></span><span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">org</span><span class="op">.</span><span class="im">springframework</span><span class="op">.</span><span class="im">context</span><span class="op">.</span><span class="im">annotation</span><span class="op">.</span><span class="im">Bean</span><span class="op">;</span></span><span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">org</span><span class="op">.</span><span class="im">springframework</span><span class="op">.</span><span class="im">context</span><span class="op">.</span><span class="im">annotation</span><span class="op">.</span><span class="im">Configuration</span><span class="op">;</span></span><span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">builders</span><span class="op">.</span><span class="im">ApiInfoBuilder</span><span class="op">;</span></span><span id="cb3-6"><a href="#cb3-6" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">builders</span><span class="op">.</span><span class="im">PathSelectors</span><span class="op">;</span></span><span id="cb3-7"><a href="#cb3-7" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">builders</span><span class="op">.</span><span class="im">RequestHandlerSelectors</span><span class="op">;</span></span><span id="cb3-8"><a href="#cb3-8" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">service</span><span class="op">.</span><span class="im">ApiInfo</span><span class="op">;</span></span><span id="cb3-9"><a href="#cb3-9" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">spi</span><span class="op">.</span><span class="im">DocumentationType</span><span class="op">;</span></span><span id="cb3-10"><a href="#cb3-10" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">spring</span><span class="op">.</span><span class="im">web</span><span class="op">.</span><span class="im">plugins</span><span class="op">.</span><span class="im">Docket</span><span class="op">;</span></span><span id="cb3-11"><a href="#cb3-11" aria-hidden="true" tabindex="-1"></a><span class="kw">import</span> <span class="im">springfox</span><span class="op">.</span><span class="im">documentation</span><span class="op">.</span><span class="im">swagger2</span><span class="op">.</span><span class="im">annotations</span><span class="op">.</span><span class="im">EnableSwagger2</span><span class="op">;</span></span><span id="cb3-12"><a href="#cb3-12" aria-hidden="true" tabindex="-1"></a></span><span id="cb3-13"><a href="#cb3-13" aria-hidden="true" tabindex="-1"></a><span class="at">@Configuration</span></span><span id="cb3-14"><a href="#cb3-14" aria-hidden="true" tabindex="-1"></a><span class="at">@EnableSwagger2</span></span><span id="cb3-15"><a href="#cb3-15" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> SwaggerConfig <span class="op">{</span></span><span id="cb3-16"><a href="#cb3-16" aria-hidden="true" tabindex="-1"></a></span><span id="cb3-17"><a href="#cb3-17" aria-hidden="true" tabindex="-1"></a> <span class="at">@Bean</span></span><span id="cb3-18"><a href="#cb3-18" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> Docket <span class="fu">createRestApi</span><span class="op">()</span> <span class="op">{</span></span><span id="cb3-19"><a href="#cb3-19" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="kw">new</span> <span class="fu">Docket</span><span class="op">(</span>DocumentationType<span class="op">.</span><span class="fu">SWAGGER_2</span><span class="op">)</span></span><span id="cb3-20"><a href="#cb3-20" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">apiInfo</span><span class="op">(</span><span class="fu">apiInfo</span><span class="op">())</span></span><span id="cb3-21"><a href="#cb3-21" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">select</span><span class="op">()</span></span><span id="cb3-22"><a href="#cb3-22" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">apis</span><span class="op">(</span>RequestHandlerSelectors<span class="op">.</span><span class="fu">basePackage</span><span class="op">(</span><span class="st">"com"</span><span class="op">))</span></span><span id="cb3-23"><a href="#cb3-23" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">paths</span><span class="op">(</span>PathSelectors<span class="op">.</span><span class="fu">any</span><span class="op">()).</span><span class="fu">build</span><span class="op">();</span></span><span id="cb3-24"><a href="#cb3-24" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb3-25"><a href="#cb3-25" aria-hidden="true" tabindex="-1"></a></span><span id="cb3-26"><a href="#cb3-26" aria-hidden="true" tabindex="-1"></a> <span class="kw">private</span> ApiInfo <span class="fu">apiInfo</span><span class="op">()</span> <span class="op">{</span></span><span id="cb3-27"><a href="#cb3-27" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="kw">new</span> <span class="fu">ApiInfoBuilder</span><span class="op">()</span></span><span id="cb3-28"><a href="#cb3-28" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">title</span><span class="op">(</span><span class="st">"演示项目API"</span><span class="op">)</span></span><span id="cb3-29"><a href="#cb3-29" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">description</span><span class="op">(</span><span class="st">"演示项目"</span><span class="op">)</span></span><span id="cb3-30"><a href="#cb3-30" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">version</span><span class="op">(</span><span class="st">"1.0"</span><span class="op">)</span></span><span id="cb3-31"><a href="#cb3-31" aria-hidden="true" tabindex="-1"></a> <span class="op">.</span><span class="fu">build</span><span class="op">();</span></span><span id="cb3-32"><a href="#cb3-32" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb3-33"><a href="#cb3-33" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><ul><li>访问 <code>localhost:8080/swagger-ui.html</code></li></ul>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="Swagger" scheme="https://ethanh3514.github.io/tags/Swagger/"/>
</entry>
<entry>
<title>Spring 动态路径 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-%E5%8A%A8%E6%80%81%E8%B7%AF%E5%BE%84-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-%E5%8A%A8%E6%80%81%E8%B7%AF%E5%BE%84-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T12:21:07.000Z</published>
<updated>2024-04-10T12:23:30.646Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><p>示例:</p><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RestController</span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> UserController <span class="op">{</span></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="at">@GetMapping</span><span class="op">(</span><span class="st">"/user/{id}"</span><span class="op">)</span></span><span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">getUserById</span><span class="op">(</span><span class="at">@PathVariable</span> <span class="dt">int</span> id<span class="op">)</span> <span class="op">{</span></span><span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>id<span class="op">);</span></span><span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"根据ID获取用户信息"</span><span class="op">;</span></span><span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a> <span class="at">@PostMapping</span><span class="op">(</span><span class="st">"/user"</span><span class="op">)</span></span><span id="cb1-11"><a href="#cb1-11" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">save</span><span class="op">(</span>User user<span class="op">)</span> <span class="op">{</span></span><span id="cb1-12"><a href="#cb1-12" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"添加用户"</span><span class="op">;</span></span><span id="cb1-13"><a href="#cb1-13" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-14"><a href="#cb1-14" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-15"><a href="#cb1-15" aria-hidden="true" tabindex="-1"></a> <span class="at">@PutMapping</span><span class="op">(</span><span class="st">"/user"</span><span class="op">)</span></span><span id="cb1-16"><a href="#cb1-16" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">update</span><span class="op">(</span>User user<span class="op">)</span> <span class="op">{</span></span><span id="cb1-17"><a href="#cb1-17" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"更新用户"</span><span class="op">;</span></span><span id="cb1-18"><a href="#cb1-18" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-19"><a href="#cb1-19" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-20"><a href="#cb1-20" aria-hidden="true" tabindex="-1"></a> <span class="at">@DeleteMapping</span><span class="op">(</span><span class="st">"/user/{id}"</span><span class="op">)</span></span><span id="cb1-21"><a href="#cb1-21" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">deleteById</span><span class="op">(</span><span class="at">@PathVariable</span> <span class="dt">int</span> id<span class="op">)</span> <span class="op">{</span></span><span id="cb1-22"><a href="#cb1-22" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>id<span class="op">);</span></span><span id="cb1-23"><a href="#cb1-23" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"根据ID删除用户"</span><span class="op">;</span></span><span id="cb1-24"><a href="#cb1-24" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-25"><a href="#cb1-25" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>要获取动态路径的参数需要加 <code>@PathVariable</code>,否则会获取后面的</p>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="动态路径" scheme="https://ethanh3514.github.io/tags/%E5%8A%A8%E6%80%81%E8%B7%AF%E5%BE%84/"/>
</entry>
<entry>
<title>Spring RESTful 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-RESTful-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-RESTful-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T11:52:04.000Z</published>
<updated>2024-04-10T12:32:22.691Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><ul><li>是一种接口规范</li><li>每一个url代表一种资源</li><li>客户端使用 GET、POST、PUT、DELETE四种方式对服务端资源进行操作<ul><li>GET用于获取资源</li><li>POST用于新建资源(也可以更新)</li><li>PUT用于更新</li><li>DELETE用于删除</li></ul></li><li>对应的注解<ul><li><span class="citation" data-cites="GetMapping">@GetMapping</span></li><li><span class="citation" data-cites="PostMapping">@PostMapping</span></li><li><span class="citation" data-cites="PutMapping">@PutMapping</span></li><li><span class="citation" data-cites="DeleteMapping">@DeleteMapping</span></li><li><span class="citation" data-cites="PatchMapping">@PatchMapping</span></li></ul></li></ul>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="RESTful" scheme="https://ethanh3514.github.io/tags/RESTful/"/>
</entry>
<entry>
<title>Spring 拦截器 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-%E6%8B%A6%E6%88%AA%E5%99%A8-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-%E6%8B%A6%E6%88%AA%E5%99%A8-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T11:29:41.000Z</published>
<updated>2024-04-10T11:51:08.121Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><ul><li>Spring Boot定义了HandlerInterceptor接口来实现自定义拦截器的功能</li><li>HandlerInterceptor接口定义了preHandle、postHandle、afterCompletion三种方法<ul><li>前端请求经过preHandle逐层调入控制器(从浅到深)</li><li>控制器的响应依次调用postHandle方法返回(从深到浅)</li><li>页面渲染完毕之后依次调用afterCompletion方法(从深到浅)</li></ul></li></ul><h4 id="拦截器的定义">拦截器的定义</h4><p>就是一个实现了 <code>HandlerInterceptor</code> 接口的类</p><p><code>com.hxy.helloworld/interceptor/LoginInterceptor.java</code></p><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> LoginInterceptor <span class="kw">implements</span> HandlerInterceptor <span class="op">{</span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <span class="at">@Override</span></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">boolean</span> <span class="fu">preHandle</span><span class="op">(</span>HttpServletRequest request<span class="op">,</span> HttpServletResponse response<span class="op">,</span> <span class="bu">Object</span> handler<span class="op">)</span> <span class="kw">throws</span> <span class="bu">Exception</span><span class="op">{</span></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span><span class="st">"LoginInterceptor"</span><span class="op">);</span></span><span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="kw">true</span><span class="op">;</span></span><span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><h4 id="拦截器的注册">拦截器的注册</h4><ul><li><p>只定义没用,需要配置里注册</p></li><li><p><code>com.hxy.helloworld/config/Webconfig.java</code></p></li><li><p>可以指定拦截路径</p></li></ul><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="at">@Configuration</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> WebConfig <span class="kw">implements</span> WebMvcConfigurer <span class="op">{</span></span><span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span><span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="at">@Override</span></span><span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">addInterceptors</span><span class="op">(</span>InterceptorRegistry registry<span class="op">)</span> <span class="op">{</span></span><span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> registry<span class="op">.</span><span class="fu">addInterceptor</span><span class="op">(</span><span class="kw">new</span> <span class="fu">LoginInterceptor</span><span class="op">());</span></span><span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="co">//registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**");</span></span><span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="拦截器" scheme="https://ethanh3514.github.io/tags/%E6%8B%A6%E6%88%AA%E5%99%A8/"/>
</entry>
<entry>
<title>Spring 文件上传 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T10:49:41.000Z</published>
<updated>2024-04-10T11:28:50.057Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><ul><li>Spring Boot工程嵌入的tomcat限制了请求的文件大小,每个文件的配置最大1Mb,单词请求的文件的总数不能大于10Mb</li><li>可以在配置文件(如application.properties)里更改</li></ul><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">servlet</span><span class="op">.</span><span class="fu">multipart</span><span class="op">.</span><span class="fu">max</span><span class="op">-</span>file<span class="op">-</span>size<span class="op">=</span><span class="er">10</span>MB</span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">servlet</span><span class="op">.</span><span class="fu">multipart</span><span class="op">.</span><span class="fu">max</span><span class="op">-</span>request<span class="op">-</span>size<span class="op">=</span><span class="er">10</span>MB</span></code></pre></div><p>示例</p><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RestController</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> FileUploadController <span class="op">{</span></span><span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a></span><span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a><span class="co">// @RequestMapping(value = "/upload", method = RequestMethod.POST)</span></span><span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="at">@PostMapping</span><span class="op">(</span><span class="st">"/upload"</span><span class="op">)</span></span><span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">up</span><span class="op">(</span><span class="bu">String</span> nickname<span class="op">,</span> MultipartFile photo<span class="op">,</span> HttpServletRequest request<span class="op">)</span> <span class="kw">throws</span> <span class="bu">IOException</span> <span class="op">{</span></span><span id="cb2-7"><a href="#cb2-7" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>nickname<span class="op">);</span></span><span id="cb2-8"><a href="#cb2-8" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>photo<span class="op">.</span><span class="fu">getOriginalFilename</span><span class="op">());</span></span><span id="cb2-9"><a href="#cb2-9" aria-hidden="true" tabindex="-1"></a><span class="co">// System.out.println(System.getProperty("user.dir"));</span></span><span id="cb2-10"><a href="#cb2-10" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>photo<span class="op">.</span><span class="fu">getContentType</span><span class="op">());</span></span><span id="cb2-11"><a href="#cb2-11" aria-hidden="true" tabindex="-1"></a> <span class="bu">String</span> path <span class="op">=</span> request<span class="op">.</span><span class="fu">getServletContext</span><span class="op">().</span><span class="fu">getRealPath</span><span class="op">(</span><span class="st">"/upload/"</span><span class="op">);</span></span><span id="cb2-12"><a href="#cb2-12" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>path<span class="op">);</span></span><span id="cb2-13"><a href="#cb2-13" aria-hidden="true" tabindex="-1"></a> <span class="fu">saveFile</span><span class="op">(</span>photo<span class="op">,</span> path<span class="op">);</span></span><span id="cb2-14"><a href="#cb2-14" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"上传成功"</span><span class="op">;</span></span><span id="cb2-15"><a href="#cb2-15" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb2-16"><a href="#cb2-16" aria-hidden="true" tabindex="-1"></a></span><span id="cb2-17"><a href="#cb2-17" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">saveFile</span><span class="op">(</span>MultipartFile photo<span class="op">,</span> <span class="bu">String</span> path<span class="op">)</span> <span class="kw">throws</span> <span class="bu">IOException</span> <span class="op">{</span></span><span id="cb2-18"><a href="#cb2-18" aria-hidden="true" tabindex="-1"></a> <span class="bu">File</span> dir <span class="op">=</span> <span class="kw">new</span> <span class="bu">File</span><span class="op">(</span>path<span class="op">);</span></span><span id="cb2-19"><a href="#cb2-19" aria-hidden="true" tabindex="-1"></a> <span class="cf">if</span><span class="op">(!</span>dir<span class="op">.</span><span class="fu">exists</span><span class="op">())</span> <span class="op">{</span></span><span id="cb2-20"><a href="#cb2-20" aria-hidden="true" tabindex="-1"></a> dir<span class="op">.</span><span class="fu">mkdir</span><span class="op">();</span></span><span id="cb2-21"><a href="#cb2-21" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb2-22"><a href="#cb2-22" aria-hidden="true" tabindex="-1"></a> <span class="bu">File</span> file <span class="op">=</span> <span class="kw">new</span> <span class="bu">File</span><span class="op">(</span>path<span class="op">,</span> photo<span class="op">.</span><span class="fu">getOriginalFilename</span><span class="op">());</span></span><span id="cb2-23"><a href="#cb2-23" aria-hidden="true" tabindex="-1"></a> photo<span class="op">.</span><span class="fu">transferTo</span><span class="op">(</span>file<span class="op">);</span></span><span id="cb2-24"><a href="#cb2-24" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb2-25"><a href="#cb2-25" aria-hidden="true" tabindex="-1"></a></span><span id="cb2-26"><a href="#cb2-26" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="文件上传" scheme="https://ethanh3514.github.io/tags/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0/"/>
</entry>
<entry>
<title>Spring 静态资源 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T10:38:09.000Z</published>
<updated>2024-04-10T10:49:59.703Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><h3 id="静态资源映射">静态资源映射</h3><p>静态资源默认在 <code>resources/static</code> 目录下</p><h4 id="静态资源过滤">静态资源过滤</h4><ul><li><p><code>application.properties</code> 文件中的配置信息</p></li><li><p>默认为 <code>/**</code> ,直接访问 <code>localhost:8080</code>之后加路径即可</p></li></ul><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">mvc</span><span class="op">.</span><span class="fu">static</span><span class="op">-</span>path<span class="op">-</span>pattern<span class="op">=</span><span class="co">/**</span> </span></code></pre></div><ul><li>修改默认路径</li><li>访问静态资源需要为 <code>localhost:8080/images</code> 后加路径</li></ul><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">mvc</span><span class="op">.</span><span class="fu">static</span><span class="op">-</span>path<span class="op">-</span>pattern<span class="op">=/</span>images<span class="co">/**</span></span></code></pre></div><h4 id="静态资源位置">静态资源位置</h4><div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a>spring<span class="op">.</span><span class="fu">web</span><span class="op">.</span><span class="fu">resources</span><span class="op">.</span><span class="fu">static</span><span class="op">-</span>locations<span class="op">=</span>classpath<span class="op">:/</span><span class="dt">static</span><span class="op">/</span></span></code></pre></div><p>默认即 <code>target/classes</code> 下</p><p>一般不用调整</p>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="静态资源" scheme="https://ethanh3514.github.io/tags/%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90/"/>
</entry>
<entry>
<title>Spring Controller 学习笔记</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-Controller-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-Controller-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
<published>2024-04-10T08:56:13.000Z</published>
<updated>2024-04-10T10:33:18.232Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><h3 id="控制器">控制器</h3><ul><li>Spring Boot 提供了 <code>@Controller</code> 和<code>@RestController</code> 两种注解来标识此类负责接收和处理http请求<ul><li><code>@Controller</code> 需要返回一个视图(可以理解为html页面)</li><li><code>@RestController</code> 可以以纯文本返回</li></ul></li></ul><h3 id="路由映射">路由映射</h3><ul><li><code>@RequestMapping("/user")</code></li><li>支持正则表达式匹配</li><li>Method 匹配:<code>@RequestMapping(value = "/getData", method = RequestMethod.GET)</code></li></ul><div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RestController</span></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">class</span> HelloController <span class="op">{</span></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/hello"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">GET</span><span class="op">)</span></span><span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="co">// @GetMapping("/hello")</span></span><span id="cb1-6"><a href="#cb1-6" aria-hidden="true" tabindex="-1"></a> <span class="co">//这两种方式等价</span></span><span id="cb1-7"><a href="#cb1-7" aria-hidden="true" tabindex="-1"></a> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">hello</span><span class="op">()</span> <span class="op">{</span></span><span id="cb1-8"><a href="#cb1-8" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"你好"</span><span class="op">;</span></span><span id="cb1-9"><a href="#cb1-9" aria-hidden="true" tabindex="-1"></a> <span class="op">}</span></span><span id="cb1-10"><a href="#cb1-10" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>传参的参数名要对上</p><div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/hello"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">GET</span><span class="op">)</span></span><span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="co">//http://localhost:8080/hello?nickname=hxy</span></span><span id="cb2-3"><a href="#cb2-3" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">hello</span><span class="op">(</span><span class="bu">String</span> nickname<span class="op">,</span> <span class="bu">String</span> phone<span class="op">)</span> <span class="op">{</span></span><span id="cb2-4"><a href="#cb2-4" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>phone<span class="op">);</span></span><span id="cb2-5"><a href="#cb2-5" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"你好"</span> <span class="op">+</span> nickname<span class="op">;</span></span><span id="cb2-6"><a href="#cb2-6" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p><code>@RequestParam()</code> 指定必须参数,否则报错</p><div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/getTest3"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">GET</span><span class="op">)</span></span><span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">getTest3</span><span class="op">(</span><span class="at">@RequestParam</span><span class="op">(</span><span class="st">"nickname"</span><span class="op">)</span> <span class="bu">String</span> name<span class="op">)</span> <span class="op">{</span></span><span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span><span class="st">"nickname:"</span> <span class="op">+</span> name<span class="op">);</span></span><span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"GET请求"</span><span class="op">;</span></span><span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>可以通过 <code>required=false</code> 关闭强制要求</p><div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/getTest3"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">GET</span><span class="op">)</span></span><span id="cb4-2"><a href="#cb4-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">getTest3</span><span class="op">(</span><span class="at">@RequestParam</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"nickname"</span><span class="op">,</span>required <span class="op">=</span> <span class="kw">false</span><span class="op">)</span> <span class="bu">String</span> name<span class="op">)</span> <span class="op">{</span></span><span id="cb4-3"><a href="#cb4-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span><span class="st">"nickname:"</span> <span class="op">+</span> name<span class="op">);</span></span><span id="cb4-4"><a href="#cb4-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"GET请求"</span><span class="op">;</span></span><span id="cb4-5"><a href="#cb4-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>用对象接收参数</p><div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/postTest1"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">POST</span><span class="op">)</span></span><span id="cb5-2"><a href="#cb5-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">postTest1</span><span class="op">(</span>User user<span class="op">)</span> <span class="op">{</span></span><span id="cb5-3"><a href="#cb5-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>user<span class="op">);</span></span><span id="cb5-4"><a href="#cb5-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"POST请求"</span><span class="op">;</span></span><span id="cb5-5"><a href="#cb5-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>接收json</p><div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/postTest2"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">POST</span><span class="op">)</span></span><span id="cb6-2"><a href="#cb6-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">postTest2</span><span class="op">(</span><span class="at">@RequestBody</span> User user<span class="op">)</span> <span class="op">{</span></span><span id="cb6-3"><a href="#cb6-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span>user<span class="op">);</span></span><span id="cb6-4"><a href="#cb6-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"POST请求"</span><span class="op">;</span></span><span id="cb6-5"><a href="#cb6-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div><p>通配符</p><div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="at">@RequestMapping</span><span class="op">(</span>value <span class="op">=</span> <span class="st">"/test/**"</span><span class="op">,</span> method <span class="op">=</span> RequestMethod<span class="op">.</span><span class="fu">GET</span><span class="op">)</span></span><span id="cb7-2"><a href="#cb7-2" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="bu">String</span> <span class="fu">postTest3</span><span class="op">()</span> <span class="op">{</span></span><span id="cb7-3"><a href="#cb7-3" aria-hidden="true" tabindex="-1"></a> <span class="bu">System</span><span class="op">.</span><span class="fu">out</span><span class="op">.</span><span class="fu">println</span><span class="op">(</span><span class="st">"Hello"</span><span class="op">);</span></span><span id="cb7-4"><a href="#cb7-4" aria-hidden="true" tabindex="-1"></a> <span class="cf">return</span> <span class="st">"POST"</span><span class="op">;</span></span><span id="cb7-5"><a href="#cb7-5" aria-hidden="true" tabindex="-1"></a><span class="op">}</span></span></code></pre></div>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="笔记" scheme="https://ethanh3514.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="Controller" scheme="https://ethanh3514.github.io/tags/Controller/"/>
</entry>
<entry>
<title>Spring 热部署</title>
<link href="https://ethanh3514.github.io/2024/04/10/Spring-%E7%83%AD%E9%83%A8%E7%BD%B2/"/>
<id>https://ethanh3514.github.io/2024/04/10/Spring-%E7%83%AD%E9%83%A8%E7%BD%B2/</id>
<published>2024-04-10T08:44:35.000Z</published>
<updated>2024-04-10T08:49:36.024Z</updated>
<content type="html"><![CDATA[<p>owo</p><span id="more"></span><ol type="1"><li>在 <code>pom.xml</code> 里加入依赖 devtools</li></ol><div class="sourceCode" id="cb1"><pre class="sourceCode xml"><code class="sourceCode xml"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><<span class="kw">dependency</span>></span><span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a> <<span class="kw">groupId</span>>org.springframework.boot</<span class="kw">groupId</span>></span><span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a> <<span class="kw">artifactId</span>>spring-boot-devtools</<span class="kw">artifactId</span>></span><span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a> <<span class="kw">optional</span>>true</<span class="kw">optional</span>></span><span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a></<span class="kw">dependency</span>></span></code></pre></div><ol start="2" type="1"><li>在 <code>application.properties</code> 里加入配置信息</li></ol><pre><code># 热部署生效spring.devtools.restart.enabled=true# 设置重启目录spring.devtools.restart.additional-paths=src/main/java</code></pre><ol start="3" type="1"><li>设置 -> 构建、执行、部署 -> 编译器 -> 自动构建项目</li><li>设置 -> 高级设置 ->即使开发的应用程序当前正在运行,也允许自动make启动</li></ol>]]></content>
<summary type="html"><p>owo</p></summary>
<category term="Java" scheme="https://ethanh3514.github.io/tags/Java/"/>
<category term="Spring" scheme="https://ethanh3514.github.io/tags/Spring/"/>
<category term="热部署" scheme="https://ethanh3514.github.io/tags/%E7%83%AD%E9%83%A8%E7%BD%B2/"/>
</entry>
</feed>