-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
870 lines (808 loc) · 158 KB
/
search.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
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Android数据储存之SharedPreferences-记住密码案例</title>
<url>/posts/f454cc8e/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title-android_2018.11.09.png' >
<!-- more -->
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><blockquote>
<p>SharedPreferences是一种轻型的数据存储方式,通过键值对的形式保存数据,存储数据是以xml文件形式存储,文件存放在/data/data//shared_prefs目录下,一般用来存储一些简单的配置信息。</p>
</blockquote>
<h2 id="SharedPreferences操作模式"><a href="#SharedPreferences操作模式" class="headerlink" title="SharedPreferences操作模式"></a>SharedPreferences操作模式</h2><ol>
<li>MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。</li>
<li>MODE_APPEND:则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。</li>
</ol>
<h2 id="初始化SharedPreferences"><a href="#初始化SharedPreferences" class="headerlink" title="初始化SharedPreferences"></a>初始化SharedPreferences</h2><h3 id="Activity类中的getPreferences-mode-方法"><a href="#Activity类中的getPreferences-mode-方法" class="headerlink" title="Activity类中的getPreferences(mode)方法"></a>Activity类中的getPreferences(mode)方法</h3><ul>
<li>mode:指定操作模式</li>
<li>默认以当前类的类名作为前缀命名文件</li>
</ul>
<h3 id="Context类中的getSharedPreferences-name-mode-方法"><a href="#Context类中的getSharedPreferences-name-mode-方法" class="headerlink" title="Context类中的getSharedPreferences(name, mode)方法"></a>Context类中的getSharedPreferences(name, mode)方法</h3><ul>
<li>用于指定SharedPreferences文件的名称</li>
<li>指定操作模式</li>
</ul>
<h3 id="PreferenceManager类中的getDefaultSharedPreferences-context-方法"><a href="#PreferenceManager类中的getDefaultSharedPreferences-context-方法" class="headerlink" title="PreferenceManager类中的getDefaultSharedPreferences(context)方法"></a>PreferenceManager类中的getDefaultSharedPreferences(context)方法</h3><ul>
<li>静态方法,使用当前应用程序的包名作为前缀命名文件</li>
</ul>
<p><code>注:SharedPreferences可实现数据共享,但是无法直接在多个程序间共享,需要借助于Conttent Providers(内容分发者)</code></p>
<h2 id="SharedPreferences存储数据"><a href="#SharedPreferences存储数据" class="headerlink" title="SharedPreferences存储数据"></a>SharedPreferences存储数据</h2><ol>
<li>SharedPreferences通过Editor进行数据的编辑处理。</li>
</ol>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">Editor editor=sharedPreferences.edit();<br></code></pre></td></tr></table></figure>
<ol start="2">
<li>存放数据<br>以Key-Value的形式储存,只适用于一些简单的数据类型<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/shareputdata20181108234424.png" alt="数据类型"></li>
<li>提交保存</li>
</ol>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-comment">//后台提交,没有返回值</span><br>editor.apply();<br><span class="hljs-comment">//编译处理,返回Boolean</span><br>editor.commit();<br></code></pre></td></tr></table></figure>
<p><code>注:apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘,而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。</code></p>
<ol start="4">
<li>移除数据</li>
</ol>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-comment">//移除数据</span><br>editor.remove(String key);<br><span class="hljs-comment">//清空数据</span><br>editor.clear();<br></code></pre></td></tr></table></figure>
<ol start="5">
<li>读取数据<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/shareGetData20181108235553.png" alt="getData"></li>
</ol>
<h2 id="记住密码案列"><a href="#记住密码案列" class="headerlink" title="记住密码案列"></a>记住密码案列</h2><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/gif/111.gif" alt="记住密码~"></p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-comment">//XML文件的形式储存</span><br><span class="hljs-comment">//设置本程序的私有访问</span><br> sharedPreferences=getSharedPreferences(<span class="hljs-string">"userInfo"</span>,MODE_PRIVATE);<br><br> <span class="hljs-comment">//获取程序中已保存的信息</span><br> rememeber.setChecked(sharedPreferences.getBoolean(<span class="hljs-string">"rememeber"</span>,<span class="hljs-literal">false</span>));<br> mName.setText(sharedPreferences.getString(<span class="hljs-string">"name"</span>,<span class="hljs-string">""</span>));<br> mPassWord.setText(sharedPreferences.getString(<span class="hljs-string">"password"</span>,<span class="hljs-string">""</span>));<br><br> mLogin.setOnClickListener(<span class="hljs-keyword">new</span> <span class="hljs-title class_">View</span>.OnClickListener() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onClick</span><span class="hljs-params">(View v)</span> {<br> String name=mName.getText().toString();<br> String password=mPassWord.getText().toString();<br> Editor editor=sharedPreferences.edit();<br> <span class="hljs-keyword">if</span>(name.equals(<span class="hljs-string">"admin"</span>)&&password.equals(<span class="hljs-string">"admin"</span>)){<br> <span class="hljs-comment">//标记是否勾选记住密码</span><br> <span class="hljs-type">boolean</span> flag=<span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">if</span>(rememeber.isChecked()){<br> flag=<span class="hljs-literal">true</span>;<br> editor.putString(<span class="hljs-string">"name"</span>,name);<br> editor.putString(<span class="hljs-string">"password"</span>,password);<br> editor.putBoolean(<span class="hljs-string">"rememeber"</span>,<span class="hljs-literal">true</span>);<br> }<br> editor.putBoolean(<span class="hljs-string">"rememeber"</span>,flag);<br> editor.commit();<br> startActivityForResult(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Intent</span>(MainActivity.<span class="hljs-built_in">this</span>,Main2Activity.class).putExtra(<span class="hljs-string">"rememeber"</span>,flag),<span class="hljs-number">1</span>);<br> }<br><br> }<br> });<br></code></pre></td></tr></table></figure>
<p>下载地址: 等待上传~~</p>
]]></content>
<tags>
<tag>Android</tag>
<tag>数据储存</tag>
</tags>
</entry>
<entry>
<title>Android网络编程之HttpURLConnection应用-快递查询案例</title>
<url>/posts/660e61a1/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2018.12.06_blog_title_httpdemo.png'>
<span id="more"></span>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote>
<p><strong>HttpURLConnection</strong>是一种多用途、轻量极的HTTP客户端。它的API简单,体积较小,因而非常适用于Android项目,压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用,使用它来进行HTTP操作可以适用于大多数的应用程序。HttpUrlConnection是Android SDK的标准实现,直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用;直接在系统层面做了缓存策略处理,加快重复请求的速度</p>
</blockquote>
<p>本文将以一个查询快递信息的案例来介绍,包括GET,POST两中方式请求网络资源,解析JSON数据,Handler异步消息处理机制等应用~</p>
<h2 id="部分代码"><a href="#部分代码" class="headerlink" title="部分代码"></a>部分代码</h2><ul>
<li>主界面<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181206200417_blog_adroid_httpdemo.png"></li>
<li>这里主要介绍GET和POST两种网络请求方式</li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">doGet</span><span class="hljs-params">(<span class="hljs-keyword">final</span> String params)</span> {<br> <span class="hljs-comment">//子线程执行网络操作</span><br> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Runnable</span>() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> {<br> <span class="hljs-keyword">try</span> {<br> <span class="hljs-type">URL</span> <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">URL</span>(URL_Source+<span class="hljs-string">"?type="</span>+URLEncoder.encode(Param_DHL,<span class="hljs-string">"UTF-8"</span>)+<span class="hljs-string">"&postid="</span>+URLEncoder.encode(params,<span class="hljs-string">"UTF-8"</span>));<br> <span class="hljs-type">HttpURLConnection</span> <span class="hljs-variable">httpURLConnection</span> <span class="hljs-operator">=</span> (HttpURLConnection) url.openConnection();<br> httpURLConnection.setRequestMethod(<span class="hljs-string">"GET"</span>);<span class="hljs-comment">//设置请求方式为GET</span><br> httpURLConnection.setReadTimeout(<span class="hljs-number">3000</span>);<span class="hljs-comment">//设置连接超时时间</span><br> <span class="hljs-keyword">if</span>(httpURLConnection.getResponseCode() == <span class="hljs-number">200</span>){<br> <span class="hljs-type">InputStream</span> <span class="hljs-variable">is</span> <span class="hljs-operator">=</span> httpURLConnection.getInputStream();<br> <span class="hljs-type">BufferedReader</span> <span class="hljs-variable">br</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">BufferedReader</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">InputStreamReader</span>(is));<br> <span class="hljs-type">String</span> <span class="hljs-variable">line</span> <span class="hljs-operator">=</span><span class="hljs-string">""</span>;<br> StringBuffer result= <span class="hljs-keyword">new</span> <span class="hljs-title class_">StringBuffer</span>();<br> <span class="hljs-keyword">while</span>((line = br.readLine()) != <span class="hljs-literal">null</span>){<br> result.append(line);<br> }<br> is.close();<br> br.close();<br><br> httpURLConnection.disconnect();<span class="hljs-comment">//关闭连接</span><br> <span class="hljs-type">Message</span> <span class="hljs-variable">message</span> <span class="hljs-operator">=</span><span class="hljs-keyword">new</span> <span class="hljs-title class_">Message</span>();<span class="hljs-comment">//创建消息体</span><br> message.what = <span class="hljs-number">1</span>;<br> message.obj = parseData(result.toString());<br> handler.sendMessage(message);<span class="hljs-comment">//发送消息体,添加到消息队列中</span><br><br> }<br> } <span class="hljs-keyword">catch</span> (MalformedURLException e) {<br> e.printStackTrace();<br> } <span class="hljs-keyword">catch</span> (IOException e) {<br> e.printStackTrace();<br> }<br><br><br> }<br> }).start();<br> }<br></code></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">doPost</span><span class="hljs-params">(<span class="hljs-keyword">final</span> String params)</span> {<br> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Thread</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Runnable</span>() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">run</span><span class="hljs-params">()</span> {<br> <span class="hljs-keyword">try</span> {<br> <span class="hljs-type">URL</span> <span class="hljs-variable">url</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">URL</span>(URL_Source);<br> <span class="hljs-type">HttpURLConnection</span> <span class="hljs-variable">httpURLConnection</span> <span class="hljs-operator">=</span> (HttpURLConnection) url.openConnection();<br> httpURLConnection.setConnectTimeout(<span class="hljs-number">3000</span>); <span class="hljs-comment">//设置连接超时时间</span><br> httpURLConnection.setDoInput(<span class="hljs-literal">true</span>); <span class="hljs-comment">//打开输入流,以便从服务器获取数据</span><br> httpURLConnection.setDoOutput(<span class="hljs-literal">true</span>); <span class="hljs-comment">//打开输出流,以便向服务器提交数据</span><br> httpURLConnection.setUseCaches(<span class="hljs-literal">false</span>); <span class="hljs-comment">//禁用缓存</span><br> httpURLConnection.setRequestMethod(<span class="hljs-string">"POST"</span>);<br> httpURLConnection.setRequestProperty(<span class="hljs-string">"Content-Type"</span>,<span class="hljs-string">"application/x-www-form-urlencoded"</span>);<span class="hljs-comment">//设置数据编码方式</span><br> <span class="hljs-type">String</span> <span class="hljs-variable">param</span> <span class="hljs-operator">=</span><span class="hljs-string">"type="</span>+URLEncoder.encode(Param_DHL,<span class="hljs-string">"UTF-8"</span>) +<span class="hljs-string">"&postid="</span>+URLEncoder.encode(params,<span class="hljs-string">"UTF-8"</span>);<br><br> <span class="hljs-type">OutputStream</span> <span class="hljs-variable">os</span> <span class="hljs-operator">=</span> httpURLConnection.getOutputStream();<br> os.write(param.getBytes());<br><br> <span class="hljs-keyword">if</span>(httpURLConnection.getResponseCode() == <span class="hljs-number">200</span>){<br> <span class="hljs-type">InputStream</span> <span class="hljs-variable">is</span> <span class="hljs-operator">=</span> httpURLConnection.getInputStream();<br> <span class="hljs-type">BufferedReader</span> <span class="hljs-variable">br</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">BufferedReader</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">InputStreamReader</span>(is));<br> <span class="hljs-type">String</span> <span class="hljs-variable">line</span> <span class="hljs-operator">=</span><span class="hljs-string">""</span>;<br> StringBuffer result= <span class="hljs-keyword">new</span> <span class="hljs-title class_">StringBuffer</span>();<br> <span class="hljs-keyword">while</span>((line = br.readLine()) != <span class="hljs-literal">null</span>){<br> result.append(line);<br> }<br> is.close();<br> br.close();<br><br> httpURLConnection.disconnect();<span class="hljs-comment">//关闭连接</span><br> <span class="hljs-type">Message</span> <span class="hljs-variable">message</span> <span class="hljs-operator">=</span><span class="hljs-keyword">new</span> <span class="hljs-title class_">Message</span>();<br> message.what = <span class="hljs-number">2</span>;<br> message.obj = parseData(result.toString());<br> handler.sendMessage(message);<br><br> }<br> } <span class="hljs-keyword">catch</span> (MalformedURLException e) {<br> e.printStackTrace();<br> } <span class="hljs-keyword">catch</span> (IOException e) {<br> e.printStackTrace();<br> }<br><br><br> }<br> }).start();<br> }<br></code></pre></td></tr></table></figure>
<ul>
<li>JSON数据的解析</li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">private</span> String <span class="hljs-title function_">parseData</span><span class="hljs-params">(String json)</span>{<br> <span class="hljs-type">String</span> <span class="hljs-variable">result</span> <span class="hljs-operator">=</span> <span class="hljs-string">""</span>;<br> <span class="hljs-keyword">try</span> {<br> <span class="hljs-type">JSONObject</span> <span class="hljs-variable">jsonObject</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">JSONObject</span>(json);<br> <span class="hljs-type">JSONArray</span> <span class="hljs-variable">data</span> <span class="hljs-operator">=</span> jsonObject.getJSONArray(<span class="hljs-string">"data"</span>);<br> <span class="hljs-comment">//这里只取最新的一条数据显示</span><br> <span class="hljs-keyword">if</span>(data.length()><span class="hljs-number">0</span>){<br> result=<span class="hljs-string">"更新时间: "</span>+data.getJSONObject(<span class="hljs-number">0</span>).getString(<span class="hljs-string">"time"</span>)+<br> <span class="hljs-string">"\n状态: "</span>+data.getJSONObject(<span class="hljs-number">0</span>).getString(<span class="hljs-string">"context"</span>);<br> }<span class="hljs-keyword">else</span>{<br> result = <span class="hljs-string">"该单号暂无物流进展,请稍后再试,或检查公司和单号是否有误"</span>;<br> }<br> } <span class="hljs-keyword">catch</span> (JSONException e) {<br> e.printStackTrace();<br> }<br> <span class="hljs-keyword">return</span> result;<br> }<br></code></pre></td></tr></table></figure>
<ul>
<li>使用Handler更新UI</li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">private</span> <span class="hljs-type">Handler</span> <span class="hljs-variable">handler</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Handler</span>(){<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">handleMessage</span><span class="hljs-params">(Message msg)</span> {<br> <span class="hljs-keyword">if</span>(msg.what == <span class="hljs-number">1</span>){<br> message.setText(<span class="hljs-string">"最新状态 (GET方式)"</span>);<br> info.setText(msg.obj+<span class="hljs-string">""</span>);<br> }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (msg.what == <span class="hljs-number">2</span>){<br> message.setText(<span class="hljs-string">"最新状态 (POST方式)"</span>);<br> info.setText(msg.obj+<span class="hljs-string">""</span>);<br> }<br> }<br> };<br></code></pre></td></tr></table></figure>
<h2 id="动图演示"><a href="#动图演示" class="headerlink" title="动图演示"></a>动图演示</h2><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/gif/20181206_android_httpdemo.gif"></p>
<h2 id="项目源码"><a href="#项目源码" class="headerlink" title="项目源码"></a>项目源码</h2><p>等待上传中~</p>
]]></content>
<tags>
<tag>Android</tag>
<tag>网络编程</tag>
<tag>JSON</tag>
<tag>HTTP</tag>
</tags>
</entry>
<entry>
<title>Android自定义Dialog对话框</title>
<url>/posts/1bd356c0/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181119_wx_title_dialog.png' >
<!-- more -->
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote>
<p>Android项目经常需要使用对话框来进行交互,本文将介绍一个简单自定义的Dialog案例</p>
</blockquote>
<h2 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h2><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/gif/20181119dialogdemo.gif" alt="在这里插入图片描述"></p>
<h2 id="代码部分"><a href="#代码部分" class="headerlink" title="代码部分"></a>代码部分</h2><h3 id="自定义Dialog布局"><a href="#自定义Dialog布局" class="headerlink" title="自定义Dialog布局"></a>自定义Dialog布局</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span>?></span><br><span class="hljs-tag"><<span class="hljs-name">LinearLayout</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">xmlns:app</span>=<span class="hljs-string">"http://schemas.android.com/apk/res-auto"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">xmlns:tools</span>=<span class="hljs-string">"http://schemas.android.com/tools"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"vertical"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">tools:context</span>=<span class="hljs-string">".MyDialog"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:background</span>=<span class="hljs-string">"@drawable/dialog_layout"</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">TextView</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/title"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#000"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:text</span>=<span class="hljs-string">"提示"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textStyle</span>=<span class="hljs-string">"bold"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"24sp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:padding</span>=<span class="hljs-string">"10dp"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">TextView</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/message"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"18sp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#000"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:padding</span>=<span class="hljs-string">"20dp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:text</span>=<span class="hljs-string">"删除"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">View</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"0.5dp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:background</span>=<span class="hljs-string">"#000"</span></span><br><span class="hljs-tag"> ></span><span class="hljs-tag"></<span class="hljs-name">View</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">LinearLayout</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:orientation</span>=<span class="hljs-string">"horizontal"</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">TextView</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:padding</span>=<span class="hljs-string">"10dp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/canel"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#11c2ee"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"24sp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span>/></span><br> <br> <span class="hljs-tag"><<span class="hljs-name">View</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"0.5dp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"match_parent"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:background</span>=<span class="hljs-string">"#000"</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">View</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">TextView</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:padding</span>=<span class="hljs-string">"10dp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:id</span>=<span class="hljs-string">"@+id/confirm"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_width</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_height</span>=<span class="hljs-string">"wrap_content"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textColor</span>=<span class="hljs-string">"#11c2ee"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:layout_weight</span>=<span class="hljs-string">"1"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:textSize</span>=<span class="hljs-string">"24sp"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:gravity</span>=<span class="hljs-string">"center"</span></span><br><span class="hljs-tag"> /></span><br> <span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span><br><span class="hljs-tag"></<span class="hljs-name">LinearLayout</span>></span><br></code></pre></td></tr></table></figure>
<h3 id="自定义Dialog背景-圆角"><a href="#自定义Dialog背景-圆角" class="headerlink" title="自定义Dialog背景(圆角)"></a>自定义Dialog背景(圆角)</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span>?></span><br><span class="hljs-tag"><<span class="hljs-name">shape</span> <span class="hljs-attr">xmlns:android</span>=<span class="hljs-string">"http://schemas.android.com/apk/res/android"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">android:shape</span>=<span class="hljs-string">"rectangle"</span>></span><br> //内部填充色<br> <span class="hljs-tag"><<span class="hljs-name">solid</span> <span class="hljs-attr">android:color</span>=<span class="hljs-string">"#ffffff"</span>></span><span class="hljs-tag"></<span class="hljs-name">solid</span>></span><br> //圆角半径<br> <span class="hljs-tag"><<span class="hljs-name">corners</span> <span class="hljs-attr">android:radius</span>=<span class="hljs-string">"20dp"</span>></span><span class="hljs-tag"></<span class="hljs-name">corners</span>></span><br><span class="hljs-tag"></<span class="hljs-name">shape</span>></span><br></code></pre></td></tr></table></figure>
<h3 id="通过style样式引用"><a href="#通过style样式引用" class="headerlink" title="通过style样式引用"></a>通过style样式引用</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">style</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"MyDialog"</span> <span class="hljs-attr">parent</span>=<span class="hljs-string">"android:style/Theme.Dialog"</span>></span><span class="language-xml"></span><br><span class="language-xml"> <span class="hljs-comment"><!--背景颜色及和透明程度--></span></span><br><span class="language-xml"> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowBackground"</span>></span>@android:color/transparent<span class="hljs-tag"></<span class="hljs-name">item</span>></span></span><br><span class="language-xml"> <span class="hljs-comment"><!--是否去除标题 --></span></span><br><span class="language-xml"> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowNoTitle"</span>></span>true<span class="hljs-tag"></<span class="hljs-name">item</span>></span></span><br><span class="language-xml"> <span class="hljs-comment"><!--是否去除边框--></span></span><br><span class="language-xml"> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowFrame"</span>></span>@null<span class="hljs-tag"></<span class="hljs-name">item</span>></span></span><br><span class="language-xml"> <span class="hljs-comment"><!--是否浮现在activity之上--></span></span><br><span class="language-xml"> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:windowIsFloating"</span>></span>true<span class="hljs-tag"></<span class="hljs-name">item</span>></span></span><br><span class="language-xml"> <span class="hljs-comment"><!--是否模糊--></span></span><br><span class="language-xml"> <span class="hljs-tag"><<span class="hljs-name">item</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"android:backgroundDimEnabled"</span>></span>true<span class="hljs-tag"></<span class="hljs-name">item</span>></span></span><br><span class="language-xml"> </span><span class="hljs-tag"></<span class="hljs-name">style</span>></span><br></code></pre></td></tr></table></figure>
<h3 id="自定义Dialog类"><a href="#自定义Dialog类" class="headerlink" title="自定义Dialog类"></a>自定义Dialog类</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">package</span> cn.sr.alertdialogdemo;<br><br><span class="hljs-keyword">import</span> android.app.Dialog;<br><span class="hljs-keyword">import</span> android.content.Context;<br><span class="hljs-keyword">import</span> android.graphics.Point;<br><span class="hljs-keyword">import</span> android.support.annotation.NonNull;<br><span class="hljs-keyword">import</span> android.os.Bundle;<br><span class="hljs-keyword">import</span> android.view.Display;<br><span class="hljs-keyword">import</span> android.view.View;<br><span class="hljs-keyword">import</span> android.view.WindowManager;<br><span class="hljs-keyword">import</span> android.widget.TextView;<br><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MyDialog</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">Dialog</span> <span class="hljs-keyword">implements</span> <span class="hljs-title class_">View</span>.OnClickListener{<br><br> <span class="hljs-keyword">private</span> TextView mTitle,mMessage,mCanel,mConfirm;<br> <span class="hljs-keyword">private</span> String title,message,canel,confirm;<br> <span class="hljs-keyword">private</span> OnCancelListtener onCancelListtener;<br> <span class="hljs-keyword">private</span> OnConfirmListtener onConfirmListtener;<br><br> <span class="hljs-keyword">public</span> MyDialog <span class="hljs-title function_">setTitle</span><span class="hljs-params">(String title)</span> {<br> <span class="hljs-built_in">this</span>.title = title;<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>;<br> }<br><br> <span class="hljs-keyword">public</span> MyDialog <span class="hljs-title function_">setMessage</span><span class="hljs-params">(String message)</span> {<br> <span class="hljs-built_in">this</span>.message = message;<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>;<br> }<br><br> <span class="hljs-keyword">public</span> MyDialog <span class="hljs-title function_">setCanel</span><span class="hljs-params">(String canel,OnCancelListtener onCancelListtener)</span> {<br> <span class="hljs-built_in">this</span>.canel = canel;<br> <span class="hljs-built_in">this</span>.onCancelListtener = onCancelListtener;<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>;<br> }<br><br> <span class="hljs-keyword">public</span> MyDialog <span class="hljs-title function_">setConfirm</span><span class="hljs-params">(String confirm,OnConfirmListtener onConfirmListtener)</span> {<br> <span class="hljs-built_in">this</span>.confirm = confirm;<br> <span class="hljs-built_in">this</span>.onConfirmListtener = onConfirmListtener;<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">this</span>;<br> }<br><br><br> <span class="hljs-keyword">public</span> <span class="hljs-title function_">MyDialog</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> Context context)</span> {<br> <span class="hljs-built_in">super</span>(context);<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-title function_">MyDialog</span><span class="hljs-params">(<span class="hljs-meta">@NonNull</span> Context context,<span class="hljs-type">int</span> themeId)</span> {<br> <span class="hljs-built_in">super</span>(context,themeId);<br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> {<br> <span class="hljs-built_in">super</span>.onCreate(savedInstanceState);<br> setContentView(R.layout.activity_my_dialog);<br><br> <span class="hljs-comment">//如果对话框宽度异常,可以通过下方代码根据设备的宽度来设置弹窗宽度</span><br> <span class="hljs-type">WindowManager</span> <span class="hljs-variable">windowManager</span> <span class="hljs-operator">=</span> getWindow().getWindowManager();<br> <span class="hljs-type">Display</span> <span class="hljs-variable">display</span> <span class="hljs-operator">=</span> windowManager.getDefaultDisplay();<br> WindowManager.<span class="hljs-type">LayoutParams</span> <span class="hljs-variable">params</span> <span class="hljs-operator">=</span> getWindow().getAttributes();<br> Point point=<span class="hljs-keyword">new</span> <span class="hljs-title class_">Point</span>();<br> display.getSize(point);<br> params.width= (<span class="hljs-type">int</span>) (point.x * <span class="hljs-number">0.8</span>);<br> getWindow().setAttributes(params);<br><br> mTitle=findViewById(R.id.title);<br> mMessage=findViewById(R.id.message);<br> mCanel=findViewById(R.id.canel);<br> mConfirm=findViewById(R.id.confirm);<br><br> mCanel.setOnClickListener(<span class="hljs-built_in">this</span>);<br> mConfirm.setOnClickListener(<span class="hljs-built_in">this</span>);<br><br> mTitle.setText(title);<br> mMessage.setText(message);<br> mCanel.setText(canel);<br> mConfirm.setText(confirm);<br><br><br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onClick</span><span class="hljs-params">(View v)</span> {<br> <span class="hljs-keyword">switch</span> (v.getId()){<br> <span class="hljs-keyword">case</span> R.id.canel:<br> <span class="hljs-keyword">if</span>(onCancelListtener != <span class="hljs-literal">null</span>){<br> onCancelListtener.onCancel(<span class="hljs-built_in">this</span>);<br> }<br> dismiss();<br> <span class="hljs-keyword">break</span>;<br><br> <span class="hljs-keyword">case</span> R.id.confirm:<br> <span class="hljs-keyword">if</span>(onConfirmListtener != <span class="hljs-literal">null</span>){<br> onConfirmListtener.onConfirm(<span class="hljs-built_in">this</span>);<br> }<br> dismiss();<br> <span class="hljs-keyword">break</span>;<br> }<br> }<br> <span class="hljs-comment">//自定义接口形式提供回调方法</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title class_">OnCancelListtener</span>{<br> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onCancel</span><span class="hljs-params">(MyDialog myDialog)</span>;<br> }<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title class_">OnConfirmListtener</span>{<br> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onConfirm</span><span class="hljs-params">(MyDialog myDialog)</span>;<br> }<br>}<br><br></code></pre></td></tr></table></figure>
<h3 id="调用演示"><a href="#调用演示" class="headerlink" title="调用演示"></a>调用演示</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">AppCompatActivity</span> {<br><br> <span class="hljs-keyword">private</span> Button button;<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onCreate</span><span class="hljs-params">(Bundle savedInstanceState)</span> {<br> <span class="hljs-built_in">super</span>.onCreate(savedInstanceState);<br> setContentView(R.layout.activity_main);<br> button=findViewById(R.id.button);<br> button.setOnClickListener(<span class="hljs-keyword">new</span> <span class="hljs-title class_">View</span>.OnClickListener() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onClick</span><span class="hljs-params">(View v)</span> {<br> MyDialog myDialog=<span class="hljs-keyword">new</span> <span class="hljs-title class_">MyDialog</span>(MainActivity.<span class="hljs-built_in">this</span>);<br> myDialog.setTitle(<span class="hljs-string">"提示"</span>).setMessage(<span class="hljs-string">"这是一个自定义的Dialog"</span>).setCanel(<span class="hljs-string">"取消"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">MyDialog</span>.OnCancelListtener() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onCancel</span><span class="hljs-params">(MyDialog myDialog)</span> {<br> Toast.makeText(MainActivity.<span class="hljs-built_in">this</span>,<span class="hljs-string">"点击了取消按钮"</span>,Toast.LENGTH_SHORT).show();<br> }<br> }).setConfirm(<span class="hljs-string">"确认"</span>, <span class="hljs-keyword">new</span> <span class="hljs-title class_">MyDialog</span>.OnConfirmListtener() {<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">onConfirm</span><span class="hljs-params">(MyDialog myDialog)</span> {<br> Toast.makeText(MainActivity.<span class="hljs-built_in">this</span>,<span class="hljs-string">"点击了确认按钮"</span>,Toast.LENGTH_SHORT).show();<br> }<br> }).show();<br> }<br> });<br> }<br>}<br></code></pre></td></tr></table></figure>
<h2 id="项目下载"><a href="#项目下载" class="headerlink" title="项目下载"></a>项目下载</h2><p>等待上传~</p>
]]></content>
<tags>
<tag>Android</tag>
<tag>数据储存</tag>
</tags>
</entry>
<entry>
<title>CentOS7更换Yum源为阿里云源</title>
<url>/posts/e8a99a62/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title_centos_yum_2018.11.21.png' >
<!-- more -->
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>Yum仓库部署在国外,为了方便之后项目环境的部署更新操作,最好更新为国内的镜像源,本文以阿里云源为例。<br>参考网站:<a href="https://opsx.alibaba.com/mirror">https://opsx.alibaba.com/mirror</a></p>
<h2 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h2><h3 id="1-备份"><a href="#1-备份" class="headerlink" title="1.备份"></a>1.备份</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup<br></code></pre></td></tr></table></figure>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181121_centosbf.png" alt="图中即为重命名的备份文件"></p>
<h3 id="2-下载阿里云的源文件"><a href="#2-下载阿里云的源文件" class="headerlink" title="2.下载阿里云的源文件"></a>2.下载阿里云的源文件</h3><p>这里我的虚拟机版本为CentOS 7,这里根据你的版本进行操作,参考上文链接</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">wget -O /etc/yum.repos.d/CentOS-Base.repo http:<span class="hljs-comment">//mirrors.aliyun.com/repo/Centos-7.repo</span><br></code></pre></td></tr></table></figure>
<p><font color="red">注意:这里需要给与管理员权限<font/><br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181121213830.png" alt="在这里插入图片描述"></p>
<h3 id="3-生成缓存"><a href="#3-生成缓存" class="headerlink" title="3.生成缓存"></a>3.生成缓存</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">yum makecache<br></code></pre></td></tr></table></figure>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181121214100.png" alt="在这里插入图片描述"></p>
<h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>如果更换源后出现问题,则需要先清除默认Yum源的本地缓存</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">yum clean all<br></code></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>Mybatis批量更新的两种方式</title>
<url>/posts/bff75e50/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/weixin_2019.04.23.png' >
<!-- more -->
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote>
<p>在使用Mybatis框架的过程中,经常会通过构建动态SQL来处理批量插入,批量更新数据等相关操作,本文将以批量更新为例,简单介绍其使用过程</p>
</blockquote>
<h3 id="动态SQL元素"><a href="#动态SQL元素" class="headerlink" title="动态SQL元素"></a>动态SQL元素</h3><p><kbd>if</kbd> <kbd>set</kbd> <kbd>trim</kbd> <kbd>foreach</kbd></p>
<h2 id="批量更新"><a href="#批量更新" class="headerlink" title="批量更新"></a>批量更新</h2><p>映射方法</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-type">int</span> <span class="hljs-title function_">updateOrderItem</span><span class="hljs-params">(List<OrderItem> list)</span>;<br></code></pre></td></tr></table></figure>
<p>实体类字段</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">OrderItem</span> {<br> <span class="hljs-keyword">private</span> Integer id;<br> <span class="hljs-keyword">private</span> Integer orderId;<br> <span class="hljs-keyword">private</span> Integer productId;<br> <span class="hljs-keyword">private</span> Integer count;<br> <span class="hljs-comment">//省略...</span><br> }<br></code></pre></td></tr></table></figure>
<p>测试代码</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">List<OrderItem> list=<span class="hljs-keyword">new</span> <span class="hljs-title class_">ArrayList</span><>();<br>OrderItem orderItem=<span class="hljs-keyword">new</span> <span class="hljs-title class_">OrderItem</span>();<br>orderItem.setCount(<span class="hljs-number">66</span>);<br>orderItem.setId(<span class="hljs-number">1</span>);<br>OrderItem orderItem1=<span class="hljs-keyword">new</span> <span class="hljs-title class_">OrderItem</span>();<br>orderItem1.setCount(<span class="hljs-number">5</span>);<br>orderItem1.setId(<span class="hljs-number">2</span>);<br>list.add(orderItem);<br>list.add(orderItem1);<br>orderItemMapper.updateOrderItem(list);<br></code></pre></td></tr></table></figure>
<h3 id="方式一"><a href="#方式一" class="headerlink" title="方式一"></a>方式一</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">update</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"updateOrderItem"</span> <span class="hljs-attr">parameterType</span>=<span class="hljs-string">"java.util.List"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">foreach</span> <span class="hljs-attr">collection</span>=<span class="hljs-string">"list"</span> <span class="hljs-attr">item</span>=<span class="hljs-string">"item"</span> <span class="hljs-attr">separator</span>=<span class="hljs-string">";"</span>></span><br> update order_item<br> <span class="hljs-tag"><<span class="hljs-name">set</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.orderId != null"</span>></span><br> order_id = #{item.orderId},<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.productId != null"</span>></span><br> product_id = #{item.productId},<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.count != null"</span>></span><br> count = #{item.count}<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">set</span>></span><br> where id = #{item.id}<br> <span class="hljs-tag"></<span class="hljs-name">foreach</span>></span><br><span class="hljs-tag"></<span class="hljs-name">update</span>></span><br></code></pre></td></tr></table></figure>
<p>对应SQL:</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><code class="hljs sql">[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> Preparing: <span class="hljs-keyword">update</span> order_item <span class="hljs-keyword">SET</span> count <span class="hljs-operator">=</span> ? <span class="hljs-keyword">where</span> id <span class="hljs-operator">=</span> ? ; <span class="hljs-keyword">update</span> order_item <span class="hljs-keyword">SET</span> count <span class="hljs-operator">=</span> ? <span class="hljs-keyword">where</span> id <span class="hljs-operator">=</span> ? <br>[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> Parameters: <span class="hljs-number">66</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">1</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">5</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">2</span>(<span class="hljs-type">Integer</span>)<br>[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator"><=</span><span class="hljs-operator">=</span> Updates: <span class="hljs-number">1</span><br></code></pre></td></tr></table></figure>
<p>此方式需要允许MySQL的一次执行多条SQL</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">url=jdbc:mysql:<span class="hljs-comment">//localhost:3306/ssm?characterEncoding=utf-8&allowMultiQueries=true</span><br></code></pre></td></tr></table></figure>
<h3 id="方式二"><a href="#方式二" class="headerlink" title="方式二"></a>方式二</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">update</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"updateOrderItem"</span> <span class="hljs-attr">parameterType</span>=<span class="hljs-string">"java.util.List"</span>></span><br> update order_item<br> <span class="hljs-tag"><<span class="hljs-name">trim</span> <span class="hljs-attr">prefix</span>=<span class="hljs-string">"set"</span> <span class="hljs-attr">suffixOverrides</span>=<span class="hljs-string">","</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">trim</span> <span class="hljs-attr">prefix</span>=<span class="hljs-string">"orderId = case"</span> <span class="hljs-attr">suffix</span>=<span class="hljs-string">"end,"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">foreach</span> <span class="hljs-attr">collection</span>=<span class="hljs-string">"list"</span> <span class="hljs-attr">item</span>=<span class="hljs-string">"item"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.orderId != null"</span>></span><br> when id=#{item.id} then #{item.orderId}<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">foreach</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">trim</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">trim</span> <span class="hljs-attr">prefix</span>=<span class="hljs-string">"productId = case"</span> <span class="hljs-attr">suffix</span>=<span class="hljs-string">"end,"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">foreach</span> <span class="hljs-attr">collection</span>=<span class="hljs-string">"list"</span> <span class="hljs-attr">item</span>=<span class="hljs-string">"item"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.productId != null"</span>></span><br> when id=#{item.id} then #{item.productId}<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">foreach</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">trim</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">trim</span> <span class="hljs-attr">prefix</span>=<span class="hljs-string">"count = case"</span> <span class="hljs-attr">suffix</span>=<span class="hljs-string">"end,"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">foreach</span> <span class="hljs-attr">collection</span>=<span class="hljs-string">"list"</span> <span class="hljs-attr">item</span>=<span class="hljs-string">"item"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.count != null"</span>></span><br> when id=#{item.id} then #{item.count}<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">foreach</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">trim</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">trim</span>></span><br> where id in<br> <span class="hljs-tag"><<span class="hljs-name">foreach</span> <span class="hljs-attr">collection</span>=<span class="hljs-string">"idNames"</span> <span class="hljs-attr">index</span>=<span class="hljs-string">"index"</span> <span class="hljs-attr">item</span>=<span class="hljs-string">"item"</span> <span class="hljs-attr">open</span>=<span class="hljs-string">"("</span> <span class="hljs-attr">separator</span>=<span class="hljs-string">","</span> <span class="hljs-attr">close</span>=<span class="hljs-string">")"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"item.objectId != null"</span>></span><br> #{item.id}<br> <span class="hljs-tag"></<span class="hljs-name">if</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">foreach</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">update</span>></span><br></code></pre></td></tr></table></figure>
<p>对应SQL</p>
<figure class="highlight sql"><table><tr><td class="code"><pre><code class="hljs sql">[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> Preparing: <span class="hljs-keyword">update</span> order_item <span class="hljs-keyword">set</span> count <span class="hljs-operator">=</span> <span class="hljs-keyword">case</span> <span class="hljs-keyword">when</span> id<span class="hljs-operator">=</span>? <span class="hljs-keyword">then</span> ? <span class="hljs-keyword">when</span> id<span class="hljs-operator">=</span>? <span class="hljs-keyword">then</span> ? <span class="hljs-keyword">end</span> <span class="hljs-keyword">where</span> id <span class="hljs-keyword">in</span> (?,?)<br>[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator">=</span><span class="hljs-operator">=</span><span class="hljs-operator">></span> Parameters: <span class="hljs-number">1</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">66</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">2</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">5</span>(<span class="hljs-type">Integer</span>),<span class="hljs-number">1</span>(<span class="hljs-type">Integer</span>), <span class="hljs-number">2</span>(<span class="hljs-type">Integer</span>)<br>[cn.srblog.dao.OrderItemMapper.updateOrderItem]<span class="hljs-operator">-</span><span class="hljs-operator"><=</span><span class="hljs-operator">=</span> Updates: <span class="hljs-number">3</span><br></code></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>Mybatis</tag>
<tag>动态SQL</tag>
<tag>ORM</tag>
<tag>SSM</tag>
</tags>
</entry>
<entry>
<title>SSM框架结合LayUi文件上传模块接入COS对象存储服务</title>
<url>/posts/2502e0fe/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019.01.05_wx-cos.png'>
<!-- more -->
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>在日常项目开发中经常会用到图片,视频等文件存储的操作,但是文件如果一直存放在本地服务器中,可以会导致资源浪费,且访问速度也有所限制,这时我们就会考虑<strong>CDN加速</strong>或<strong>云端存储</strong>等方式来解决问题,这里就要介绍下本文用到的<strong>COS对象存储</strong>-安全稳定、海量、便捷、低延迟、低成本的云端存储服务。</p>
<h3 id="COS对象存储"><a href="#COS对象存储" class="headerlink" title="COS对象存储"></a>COS对象存储</h3><blockquote>
<p>对象存储(Cloud Object Storage,COS)是腾讯云提供的面向非结构化数据,支持 HTTP/HTTPS 协议访问的分布式存储服务,它能容纳海量数据并保证用户对带宽和容量扩充无感知,可以作为大数据计算与分析的数据池。腾讯云 COS 提供网页端管理界面、多种语言的 SDK 以及命令行和图形化工具,并且完全兼容 S3 的 API 接口,方便用户直接使用社区工具和插件,COS 还可以和其他云产品结合,比如利用 CDN 的全球节点提供加速服务,利用数据万象的图片处理能力提供一站式图片解决方案等(<a href="https://cloud.tencent.com/product/cos">详细介绍</a>)</p>
</blockquote>
<h3 id="案例实现"><a href="#案例实现" class="headerlink" title="案例实现"></a>案例实现</h3><ul>
<li>本文使用的是腾讯云提供的COS服务,每个月提供50G存储容量,10G流量,对于一般的博客网站,以及项目测试来说绰绰有余</li>
<li>腾讯云对象存储 COS 除了提供多种 API 接口,还提供了丰富多样的 SDK 供开发者使用,如Java、Python、Js等…,本项目后台基于SpringMVC实现,前端通过LayUi框架的文件上传模块结合实现</li>
<li>存储桶相应的还有<strong>防盗链</strong>设置,<strong>跨域规则</strong>设置,<strong>读写权限</strong>设置,以及相应的<strong>CDN加速</strong>服务<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/emoji/2019-01-05%20154723-zx.jpg" alt="www.srblog.cn"></li>
</ul>
<hr>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">package</span> cn.mall.controller.portal;<br><br><span class="hljs-keyword">import</span> cn.mall.common.ServerResponse;<br><span class="hljs-keyword">import</span> cn.mall.util.PropertiesUtil;<br><span class="hljs-keyword">import</span> com.qcloud.cos.COSClient;<br><span class="hljs-keyword">import</span> com.qcloud.cos.ClientConfig;<br><span class="hljs-keyword">import</span> com.qcloud.cos.auth.BasicCOSCredentials;<br><span class="hljs-keyword">import</span> com.qcloud.cos.auth.COSCredentials;<br><span class="hljs-keyword">import</span> com.qcloud.cos.model.PutObjectRequest;<br><span class="hljs-keyword">import</span> com.qcloud.cos.model.PutObjectResult;<br><span class="hljs-keyword">import</span> com.qcloud.cos.region.Region;<br><span class="hljs-keyword">import</span> org.springframework.stereotype.Controller;<br><span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;<br><span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMethod;<br><span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestParam;<br><span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;<br><span class="hljs-keyword">import</span> org.springframework.web.multipart.MultipartFile;<br><br><span class="hljs-keyword">import</span> javax.servlet.http.HttpSession;<br><span class="hljs-keyword">import</span> java.io.File;<br><span class="hljs-keyword">import</span> java.io.IOException;<br><span class="hljs-keyword">import</span> java.util.UUID;<br><br><span class="hljs-meta">@Controller</span><br><span class="hljs-meta">@RequestMapping("/upload/")</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">UploadController</span> {<br><br> <span class="hljs-comment">//密钥请前往腾讯云后台查询</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String secretId=<span class="hljs-string">"*************"</span>;<br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String secretKey=<span class="hljs-string">"*************"</span>;<br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String bucketName=<span class="hljs-string">"你的存储桶名称"</span>;<br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String RegionName=<span class="hljs-string">"存储桶所属地域"</span>;<br> <span class="hljs-comment">/**</span><br><span class="hljs-comment"> * 文件上传</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@param</span> file</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@param</span> session</span><br><span class="hljs-comment"> * <span class="hljs-doctag">@return</span></span><br><span class="hljs-comment"> */</span><br> <br> <span class="hljs-meta">@RequestMapping(value = "upload_image_cos.do",method = RequestMethod.POST)</span><br> <span class="hljs-meta">@ResponseBody</span><br> <span class="hljs-keyword">public</span> Object <span class="hljs-title function_">Upload</span><span class="hljs-params">(<span class="hljs-meta">@RequestParam(value = "file")</span> MultipartFile file, HttpSession session)</span>{<br> <span class="hljs-keyword">if</span>(file == <span class="hljs-literal">null</span>){<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">UploadMsg</span>(<span class="hljs-number">0</span>,<span class="hljs-string">"文件为空"</span>,<span class="hljs-literal">null</span>);<br> }<br> <span class="hljs-comment">//获取文件上传原名</span><br> <span class="hljs-type">String</span> <span class="hljs-variable">oldFileName</span> <span class="hljs-operator">=</span> file.getOriginalFilename();<br> <span class="hljs-type">String</span> <span class="hljs-variable">eName</span> <span class="hljs-operator">=</span> oldFileName.substring(oldFileName.lastIndexOf(<span class="hljs-string">"."</span>));<br> <span class="hljs-comment">//通过UUID随机生成新的文件名</span><br> <span class="hljs-type">String</span> <span class="hljs-variable">newFileName</span> <span class="hljs-operator">=</span> UUID.randomUUID()+eName;<br> <br> <span class="hljs-comment">// 1 初始化用户身份信息(secretId, secretKey)</span><br> <span class="hljs-type">COSCredentials</span> <span class="hljs-variable">cred</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">BasicCOSCredentials</span>(secretId, secretKey);<br> <span class="hljs-comment">// 2 设置bucket的区域, COS地域的简称请参照 https://cloud.tencent.com/document/product/436/6224</span><br> <span class="hljs-type">ClientConfig</span> <span class="hljs-variable">clientConfig</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ClientConfig</span>(<span class="hljs-keyword">new</span> <span class="hljs-title class_">Region</span>(RegionName));<br> <span class="hljs-comment">// 3 生成cos客户端</span><br> <span class="hljs-type">COSClient</span> <span class="hljs-variable">cosclient</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">COSClient</span>(cred, clientConfig);<br> <span class="hljs-comment">// bucket的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式</span><br> <span class="hljs-type">String</span> <span class="hljs-variable">bucketName</span> <span class="hljs-operator">=</span> <span class="hljs-built_in">this</span>.bucketName;<br><br> <span class="hljs-comment">// 简单文件上传, 最大支持 5 GB, 适用于小文件上传, 建议 20 M 以下的文件使用该接口</span><br> <span class="hljs-comment">// 大文件上传请参照 API 文档高级 API 上传</span><br> <span class="hljs-type">File</span> <span class="hljs-variable">localFile</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;<br> <span class="hljs-keyword">try</span> {<br> <span class="hljs-comment">//创建临时文件</span><br> localFile = File.createTempFile(<span class="hljs-string">"temp"</span>,<span class="hljs-literal">null</span>);<br> file.transferTo(localFile);<br> <span class="hljs-comment">// 指定要上传到 COS 上的路径</span><br> <span class="hljs-type">String</span> <span class="hljs-variable">key</span> <span class="hljs-operator">=</span> PropertiesUtil.getProperty(<span class="hljs-string">"cos_key_name"</span>)+newFileName;<br> <span class="hljs-type">PutObjectRequest</span> <span class="hljs-variable">putObjectRequest</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">PutObjectRequest</span>(bucketName, key, localFile);<br> <span class="hljs-type">PutObjectResult</span> <span class="hljs-variable">putObjectResult</span> <span class="hljs-operator">=</span> cosclient.putObject(putObjectRequest);<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">UploadMsg</span>(<span class="hljs-number">1</span>,<span class="hljs-string">"上传成功"</span>, newFileName);<br> } <span class="hljs-keyword">catch</span> (IOException e) {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">UploadMsg</span>(-<span class="hljs-number">1</span>,e.getMessage(),<span class="hljs-literal">null</span>);<br> } <span class="hljs-keyword">finally</span> {<br> <span class="hljs-comment">// 关闭客户端(关闭后台线程)</span><br> cosclient.shutdown();<br> }<br> }<br><br> <span class="hljs-comment">//自定义JSON消息体</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">UploadMsg</span> {<br> <span class="hljs-keyword">public</span> <span class="hljs-type">int</span> status;<br> <span class="hljs-keyword">public</span> String msg;<br> <span class="hljs-keyword">public</span> String path;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-title function_">UploadMsg</span><span class="hljs-params">()</span> {<br> <span class="hljs-built_in">super</span>();<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-title function_">UploadMsg</span><span class="hljs-params">(<span class="hljs-type">int</span> status, String msg,String path)</span>{<br> <span class="hljs-built_in">this</span>.status =status;<br> <span class="hljs-built_in">this</span>.msg =msg;<br> <span class="hljs-built_in">this</span>.path =path;<br> }<br> }<br><br>}<br><br></code></pre></td></tr></table></figure>
<figure class="highlight js"><table><tr><td class="code"><pre><code class="hljs js"><!<span class="hljs-variable constant_">DOCTYPE</span> html><br><html><br><head><br> <meta charset="UTF-8"><br> <meta name="renderer" content="webkit"><br> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><br> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /><br> <title>商品添加</title><br> <link rel="stylesheet" href="../assets/layui/css/layui.css"><br><br></head><br><body><br><form class="layui-form column-content-detail"><br><br> <div class="layui-tab-content"><br> <div class="layui-tab-item layui-show"><br> <div class="layui-form-item"><br> <label class="layui-form-label">商品标题:</label><br> <div class="layui-input-block"><br> <input type="text" name="name" required lay-verify="required" placeholder="请输入商品标题" autocomplete="off" class="layui-input"><br> </div><br> </div><br> <div class="layui-form-item"><br> <label class="layui-form-label">分类:</label><br> <div class="layui-input-block"><br> <select name="categoryId" lay-verify="required"><br> <option value="">请选择分类</option><br> <option value="100001">家用电器</option><br> <option value="100002">数码3C</option><br> <option value="100003">服装箱包</option><br> <option value="100004">食品生鲜</option><br> <option value="100005">酒水饮料</option><br> </select><br> </div><br> </div><br> <div class="layui-form-item"><br> <label class="layui-form-label">图像上传:</label><br> <div class="layui-input-block"><br> <img id="upload_img" src="../images/default_img.png" width="100" height="100"><br> <button type="button" class="layui-btn" id="test1"><br> <i class="layui-icon"></i>上传图片<br> </button><br> </div><br> </div><br> <div class="layui-form-item layui-form-text"><br> <label class="layui-form-label">商品介绍:</label><br> <div class="layui-input-block"><br> <textarea class="layui-textarea layui-hide" name="detail" lay-verify="detail" id="LAY_demo_editor"></textarea><br> </div><br> </div><br> <input type="hidden" id="mainImage" name="mainImage" required value="default_img.png" class="layui-input"><br> <input type="hidden" id="status" name="status" value="1" class="layui-input"><br> <div class="layui-form-item"><br> <label class="layui-form-label">商品库存:</label><br> <div class="layui-input-block"><br> <input type="text" name="stock" required lay-verify="number" placeholder="请输入商品库存" autocomplete="off" class="layui-input"><br> </div><br> </div><br> <div class="layui-form-item"><br> <label class="layui-form-label">商品价格:</label><br> <div class="layui-input-block"><br> <input type="text" name="price" required lay-verify="number" placeholder="请输入商品价格" autocomplete="off" class="layui-input"><br> </div><br> </div><br><br> </div><br> </div><br><br> <div class="layui-form-item" style="padding-left: 10px;"><br> <div class="layui-input-block"><br> <button class="layui-btn" lay-submit lay-filter="add_product">立即提交</button><br> <button id="reset" type="reset" class="layui-btn layui-btn-primary">重置</button><br> </div><br> </div><br></form><br><script src="../js/cos-js-sdk-v5.min.js" type="text/javascript" charset="utf-8"></script><br><script src="../js/jquery-1.10.2.js" type="text/javascript" charset="utf-8"></script><br><script src="../assets/layui/layui.all.js"></script><br><script><br> layui.use(['form', 'jquery', 'laydate', 'layer', 'laypage', 'element', 'upload', 'layedit'], function() {<br> var form = layui.form,<br> layer = layui.layer,<br> $ = layui.jquery,<br> laypage = layui.laypage,<br> laydate = layui.laydate,<br> layedit = layui.layedit,<br> element = layui.element,<br> upload=layui.upload;<br><br> //创建一个编辑器<br> var editIndex = layedit.build('LAY_demo_editor', {<br> tool: ['strong' //加粗<br> , 'italic' //斜体<br> , 'underline' //下划线<br> , 'del' //删除线<br> , '|' //分割线<br> , 'left' //左对齐<br> , 'center' //居中对齐<br> , 'right' //右对齐<br> , 'link' //超链接<br> , 'unlink' //清除链接<br> , 'image' //插入图片<br> ],<br> height: 100<br> });<br> <br> var uploadInst = upload.render({<br> elem: '#test1' //绑定元素<br> ,url:'../upload/upload_image_cos.do'//后台上传接口<br> ,before: function(obj){ //obj参数包含的信息,跟 choose回调完全一致,可参见上文。<br> layer.msg('上传中',{icon: 16,time:0,shade:0.01});<br> }<br> ,done: function(res, index, upload){<br> layer.closeAll('loading');<br> //status=1代表上传成功<br> if(res.status == 1){<br> layer.msg("上传成功",{icon:1});<br> //do something (比如将res返回的图片链接保存到表单的隐藏域)<br> $('#upload_img').attr('src','https://sr-1251242863.cos.ap-shanghai.myqcloud.com/webdemo/images/'+res.path);<br> $('#mainImage').val(res.path);<br> }<br><br> //获取当前触发上传的元素,一般用于 elem 绑定 class 的情况,注意:此乃 layui 2.1.0 新增<br> var item = this.item;<br> //文件保存失败<br> //do something<br> }<br> ,error: function(){<br> layer.closeAll('loading');<br> //请求异常回调<br> layer.msg("上传失败,请重试",{icon:2});<br> }<br> ,size:2048 //文件大小限制<br> ,number:1 //文件数量限制<br> ,accept: 'images' //文件类型限制<br> ,acceptMime: 'image/jpg, image/png' //选择窗口属性<br> });<br> });<br></script><br></body><br></html><br></code></pre></td></tr></table></figure>
<h2 id="动图演示"><a href="#动图演示" class="headerlink" title="动图演示"></a>动图演示</h2><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/gif/2019-0105-10b99e3e-cos.gif" alt="www.srblog.cn"></p>
]]></content>
<categories>
<category>Spring</category>
</categories>
<tags>
<tag>JAVA</tag>
<tag>SSM框架</tag>
<tag>COS对象存储</tag>
<tag>LayUi</tag>
<tag>Spring</tag>
</tags>
</entry>
<entry>
<title>Spring Data JPA 映射VO/DTO对象</title>
<url>/posts/17193f90/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/weixin_title_2019.05.13.png' >
<!-- more -->
<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><blockquote>
<p>在项目开发中,时常需要根据业务需求来映射VO/DTO对象(这两个概念理解感觉很模糊- 。- ),本文将简单介绍以Spring Data JPA的方式处理实体类映射</p>
</blockquote>
<h2 id="HQL方式"><a href="#HQL方式" class="headerlink" title="HQL方式"></a>HQL方式</h2><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title class_">MusicTypeRepository</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">JpaRepository</span><MusicType,Integer> {<br><br> <span class="hljs-meta">@Query("select new cn.srblog.springbootcurd.vo.StudentTypeInfoVo(count(s.id),m.name) " +</span><br><span class="hljs-meta"> "FROM MusicType m left JOIN Student s on s.musicTypeId = m.id group by m.id ")</span><br> List<StudentTypeInfoVo> <span class="hljs-title function_">getTypeInfo</span><span class="hljs-params">()</span>;<br>}<br><br></code></pre></td></tr></table></figure>
<ul>
<li>填写实体类路径,构造参数顺序要一致,字段名一律为实体类中的属性</li>
<li>如果配置了实体类属性的映射关系,则<code>on s.musicTypeId = m.id</code>语句可以省略</li>
</ul>
<h3 id="VO实体类"><a href="#VO实体类" class="headerlink" title="VO实体类"></a>VO实体类</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-meta">@Value</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">StudentTypeInfoVo</span> {<br><br> <span class="hljs-keyword">private</span> Long count;<br><br> <span class="hljs-keyword">private</span> String name;<br>}<br><br></code></pre></td></tr></table></figure>
<p>使用<code>Lombok</code>的 <code>@Value</code> 注解</p>
<ul>
<li>默认生成带参构造方法</li>
<li>默认为成员变量添加<code>final</code>修饰,且只提供getter()方法</li>
</ul>
<h2 id="原生SQL的形式"><a href="#原生SQL的形式" class="headerlink" title="原生SQL的形式"></a>原生SQL的形式</h2><h3 id="接口形式"><a href="#接口形式" class="headerlink" title="接口形式"></a>接口形式</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title class_">CoursePlanRepository</span> <span class="hljs-keyword">extends</span> <span class="hljs-title class_">JpaRepository</span><CoursePlan,Integer> {<br><br> <span class="hljs-meta">@Query(nativeQuery = true,value = "SELECT " +</span><br><span class="hljs-meta"> " c.id as id," +</span><br><span class="hljs-meta"> "DAYOFWEEK(c.start_time) as week," +</span><br><span class="hljs-meta"> "m.name as musicType," +</span><br><span class="hljs-meta"> "t.name as teacherName," +</span><br><span class="hljs-meta"> "c.start_time as startTime," +</span><br><span class="hljs-meta"> "c.end_time as endTime " +</span><br><span class="hljs-meta"> " FROM t_courseplan c,t_musictype m , t_teacher t " +</span><br><span class="hljs-meta"> " WHERE DATE(c.start_time) < DATE_ADD(CURDATE(), INTERVAL 7 DAY ) AND CURDATE() <= DATE(c.start_time) " +</span><br><span class="hljs-meta"> " and t.id=c.tea_id and c.music_type_id = m.id order by c.start_time ")</span><br> List<CoursePlanVos> <span class="hljs-title function_">getWeekList</span><span class="hljs-params">()</span>;<br><br>}<br></code></pre></td></tr></table></figure>
<ul>
<li>nativeQuery = true 表示开启原生SQL查询</li>
<li>查询字段别名需要与实体类中字段一一对应</li>
<li>该方法功能为查询一周后的数据</li>
</ul>
<table>
<thead>
<tr>
<th>函数</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>DAYOFWEEK()</td>
<td>DAYOFWEEK函数返回日期的工作日索引值,即星期日为1,星期一为2,星期六为7。例:<code>DAYOFWEEK('2019-05-09')</code> 返回 <code>5</code></td>
</tr>
<tr>
<td>DATE()</td>
<td>提取日期或日期/时间表达式的日期部分,格式<code>'YYYY-MM-DD'</code>或者<code>'YYYYMMDD'</code></td>
</tr>
<tr>
<td>DATE_ADD(date,INTERVAL expr unit)</td>
<td>给日期添加指定的时间间隔。date 参数是合法的日期表达式,expr 参数是您希望添加的时间间隔,type 参数可以是MySQL支持的时间日期相关类型值</td>
</tr>
<tr>
<td>CURDATE()</td>
<td>返回当前日期 例:<code>'2019-05-09'</code></td>
</tr>
</tbody></table>
<h4 id="VO实体类-接口形式"><a href="#VO实体类-接口形式" class="headerlink" title="VO实体类(接口形式)"></a>VO实体类(接口形式)</h4><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">interface</span> <span class="hljs-title class_">CoursePlanVos</span>{<br><br> Integer <span class="hljs-title function_">getId</span><span class="hljs-params">()</span>;<br><br> Integer <span class="hljs-title function_">getWeek</span><span class="hljs-params">()</span>;<br><br> String <span class="hljs-title function_">getMusicType</span><span class="hljs-params">()</span>;<br><br> String <span class="hljs-title function_">getTeacherName</span><span class="hljs-params">()</span>;<br><br> Date <span class="hljs-title function_">getStartTime</span><span class="hljs-params">()</span> ;<br><br> Date <span class="hljs-title function_">getEndTime</span><span class="hljs-params">()</span>;<br>}<br></code></pre></td></tr></table></figure>
<h3 id="结果集形式"><a href="#结果集形式" class="headerlink" title="结果集形式"></a>结果集形式</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-meta">@Query(value = "select count(s.id) as count,m.name as name " +</span><br><span class="hljs-meta"> " FROM t_musictype m left JOIN t_student s on s.music_type_id = m.id group by m.id ",nativeQuery = true)</span><br> List<Object[]> listType1();<br></code></pre></td></tr></table></figure>
<p>对比第一种方法,使用原生SQL默认会返回Object数组</p>
]]></content>
<categories>
<category>Spring</category>
</categories>
<tags>
<tag>Spring Data JPA</tag>
<tag>VO</tag>
<tag>HQL</tag>
</tags>
</entry>
<entry>
<title>Spring框架入门(一):概念简介</title>
<url>/posts/f9407374/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title_2018.10.30.png'>
<!-- more -->
<blockquote>
<p><strong>简介</strong></p>
</blockquote>
<p>Spring 是一个开源的轻量级 Java SE( Java 标准版本)/Java EE( Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。Spring容器通过反转控制( IoC )和依赖注入( DI )来实现高内聚、低耦合的应用。除此之外它可以整合很多第三方框架,它还提供面向切面编程( AOP )的能力,对通用任务如安全、事务、日志等进行集中式管理</p>
<blockquote>
<p><strong>概念介绍</strong></p>
</blockquote>
<ul>
<li>框架:能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,辅助高效工作。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们的代码编写,让我们专注于业务逻辑开发。</li>
<li>非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架,之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。</li>
<li>轻量级与重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。</li>
<li>POJO : POJO ( Plain Ordinary Java Object )简单的 Java 对象。它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它 Java 框架的类或接口。</li>
<li>容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。</li>
<li>控制反转:即 Inversion of Control ,缩写为 IoC ,控制反转还有一个名字叫做依赖注入( Dependency Injection ),就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。</li>
<li>Bean :一般指容器管理对象,在 Spring 中指 Spring IoC 容器管理对象。</li>
</ul>
<blockquote>
<p><strong>优点</strong></p>
</blockquote>
<ul>
<li>低侵入式设计,代码的污染极低。</li>
<li>独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺。</li>
<li>Spring的IoC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。</li>
<li>Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用。</li>
<li>Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。</li>
<li>Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。</li>
</ul>
<blockquote>
<p><strong>架构图</strong></p>
</blockquote>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/spring_frameword.png"><br><strong>核心容器:包括 Core 、 Beans 、 Context 、 EL 模块</strong></p>
<ul>
<li>Core 模块:封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。</li>
<li>Beans 模块:提供了框架的基础部分,包括控制反转( IOC )和依赖注入( DI )。其中 BeanFactory 是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由 BeanFactory 来维护。</li>
<li>Context 模块:以 Core 和 Beans 为基础,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、 Java EE 支持、容器生命周期、事件传播等;核心接口是 ApplicationContext 。</li>
<li>EL 模块:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean, 它也支持列表投影、选择和一般的列表聚合等。</li>
</ul>
<hr>
<ul>
<li>AOP 模块: Spring AOP 模块提供了符合 AOP Alliance 规范的面向切面的编程( aspect-oriented programming )实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。<br>-Aspects 模块:提供了对 AspectJ 的集成,AspectJ 提供了比 Spring ASP 更强大的功能。</li>
<li>数据访问/集成模块:该模块包括了 JDBC 、 ORM 、 OXM 、 JMS 和事务管理。<br>事务模块:该模块用于 Spring 管理事务,只要是 Spring 管理对象都能得到 Spring 管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事务管理。</li>
<li>JDBC 模块:提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。<br>ORM 模块:提供与流行的“对象-关系”映射框架的无缝集成,包括 Hibernate 、JPA 、 MyBatis 等。而且可以使用 Spring 事务管理,无需额外控制事务。<br>OXM 模块:提供了一个对 Object / XML 映射实现,将 java 对象映射成 XML 数据,或者将 XML 数据映射成 java 对象, Object / XML 映射实现包括 JAXB 、 Castor 、 XMLBeans 和 XStream 。</li>
<li>JMS 模块:用于 JMS ( Java Messaging Service ),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS , JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。</li>
<li>Web / Remoting 模块: Web / Remoting 模块包含了 Web 、 Web-Servlet 、 Web-Struts 、 Web-Porlet 模块。</li>
<li>Web 模块:提供了基础的 web 功能。例如多文件上传、集成 IoC 容器、远程过程访问( RMI 、Hessian 、 Burlap )以及 Web Service 支持,并提供一个 RestTemplate 类来提供方便的 Restful services 访问。<br>Web-Servlet 模块:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。</li>
<li>Web-Struts 模块:提供了与 Struts 无缝集成, Struts1.x 和 Struts2.x 都支持。</li>
<li>Test 模块: Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。</li>
</ul>
<hr>
]]></content>
<categories>
<category>Spring</category>
</categories>
<tags>
<tag>Spring</tag>
</tags>
</entry>
<entry>
<title>Spring框架入门(三):依赖注入和控制反转</title>
<url>/posts/2d0cab43/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/spring3_2018.10.31.png' >
<!-- more -->
<h1 id="依赖注入和控制反转概念"><a href="#依赖注入和控制反转概念" class="headerlink" title="依赖注入和控制反转概念"></a>依赖注入和控制反转概念</h1><p>依赖注入(IoC) 和 控制反转(DI) 有什么关系呢?其实它们是同一个概念的不同角度描述。</p>
<h2 id="依赖注入-Dependency-injection"><a href="#依赖注入-Dependency-injection" class="headerlink" title="依赖注入(Dependency injection)"></a>依赖注入(Dependency injection)</h2><blockquote>
<p>是指应用在运行期,由外部容器(Spring容器)动态地将依赖对象注入到另一个对象中。</p>
</blockquote>
<p>理解 DI 的关键是:<font color="red">“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”</font>:</p>
<ul>
<li>谁依赖于谁:当然是某个容器管理对象依赖于 IoC 容器;“被注入对象的对象”依赖于“依赖对象”;</li>
<li>为什么需要依赖:容器管理对象需要 IoC 容器来提供对象需要的外部资源;</li>
<li>谁注入谁:很明显是 IoC 容器注入某个对象,也就是注入“依赖对象”;</li>
<li>注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。</li>
</ul>
<h2 id="控制反转-Inversion-Of-Control"><a href="#控制反转-Inversion-Of-Control" class="headerlink" title="控制反转(Inversion Of Control)"></a>控制反转(Inversion Of Control)</h2><blockquote>
<p>IoC 容器就是具有依赖注入功能的容器,IoC 容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中 new 相关的对象,应用程序由 IoC 容器进行组装。</p>
</blockquote>
<h3 id="在传统模式下通常有两种做法:"><a href="#在传统模式下通常有两种做法:" class="headerlink" title="在传统模式下通常有两种做法:"></a>在传统模式下通常有两种做法:</h3><ul>
<li>原始做法: 调用者主动创建被依赖对象,然后再调用被依赖对象的方法。</li>
<li>简单工厂模式: 调用者先找到被依赖对象的工厂,然后主动通过工厂去获取被依赖对象,最后再调用被依赖对象的方法。</li>
</ul>
<h3 id="Spring容器的依赖注入"><a href="#Spring容器的依赖注入" class="headerlink" title="Spring容器的依赖注入"></a>Spring容器的依赖注入</h3><ul>
<li>设值注入:是指IoC容器通过成员变量的setter方法来注入被依赖对象。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。</li>
<li>构造注入:利用构造器来设置依赖关系的方式,被称为构造注入。通过构造器参数对成员变量执行初始化,驱动Spring在底层以反射方式执行带指定参数的构造器。</li>
</ul>
<p><strong>注意:</strong> 建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。</p>
<h3 id="实例"><a href="#实例" class="headerlink" title="实例"></a>实例</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-comment"><!-- 通过property属性注入(必须提供set方法) --></span><br><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"cn.sr.spring.javabean.User"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"张三"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"123456"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br><br><span class="hljs-comment"><!-- 通过构造函数注入 --></span><br><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"cn.sr.spring.javabean.User"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">constructor-arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"张三"</span>></span><span class="hljs-tag"></<span class="hljs-name">constructor-arg</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">constructor-arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"123456"</span>></span><span class="hljs-tag"></<span class="hljs-name">constructor-arg</span>></span><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br><br>//除此之外还可以注入集合类型的对象,List、Set、Map、Properties……<br><br></code></pre></td></tr></table></figure>
<h1 id="Spring容器中的Bean"><a href="#Spring容器中的Bean" class="headerlink" title="Spring容器中的Bean"></a>Spring容器中的Bean</h1><blockquote>
<p>对于开发者来说,开发者使用Spring框架主要是做两件事:①开发Bean;②配置Bean。对于Spring框架来说,它要做的就是根据配置文件来创建Bean实例,并调用Bean实例的方法完成”依赖注入”——这就是所谓IoC的本质。</p>
</blockquote>
<h2 id="容器中Bean的作用域"><a href="#容器中Bean的作用域" class="headerlink" title="容器中Bean的作用域"></a>容器中Bean的作用域</h2><p>当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域。Spring支持如下五种作用域:</p>
<ul>
<li>singleton: 单例模式,在整个Spring IoC容器中,singleton作用域的Bean将只生成一个实例。</li>
<li>prototype: 每次通过容器的getBean()方法获取prototype作用域的Bean时,都将产生一个新的Bean实例。</li>
<li>request: 对于一次HTTP请求,request作用域的Bean将只生成一个实例,这意味着,在同一次HTTP请求内,程序每次请求该Bean,得到的总是同一个实例。只有在Web应用中使用Spring时,该作用域才真正有效。</li>
<li>session:该作用域将 bean 的定义限制为 HTTP 会话。 只在web-aware Spring ApplicationContext的上下文中有效。</li>
<li>global session: 每个全局的HTTP Session对应一个Bean实例。在典型的情况下,仅在使用portlet context的时候有效,同样只在Web应用中有效。</li>
</ul>
<h3 id="配置格式如下:"><a href="#配置格式如下:" class="headerlink" title="配置格式如下:"></a>配置格式如下:</h3><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"…"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"…"</span> <span class="hljs-attr">scope</span>=<span class="hljs-string">"singleton"</span>></span><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br></code></pre></td></tr></table></figure>
<blockquote>
<p>如果不指定Bean的作用域,Spring默认使用singleton作用域。prototype作用域的Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成果,就可以重复使用。因此,应该尽量避免将Bean设置成prototype作用域。</p>
</blockquote>
<h2 id="创建Bean的3种方式"><a href="#创建Bean的3种方式" class="headerlink" title="创建Bean的3种方式"></a>创建Bean的3种方式</h2><ol>
<li>使用构造器创建Bean实例:<br>需要提供无参数的构造器,Spring对Bean实例的所有属性执行默认初始化,即所有的基本类型的值初始化为0或false;所有的引用类型的值初始化为null。</li>
<li>使用静态工厂方法创建Bean:<br>class属性须指定静态工厂类,使用factory-method属性来指定静态工厂方法,如果静态工厂方法需要参数,则使用<constructor-arg…/>元素指定静态工厂方法的参数。</li>
</ol>
<figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"cn.sr.spring.javabean.UserFactory"</span> <span class="hljs-attr">factory-mothod</span>=<span class="hljs-string">"getUser"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">constructor-arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"张三"</span>></span><span class="hljs-tag"></<span class="hljs-name">constructor-arg</span>></span><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br></code></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">package</span> cn.sr.spring.javabean;<br><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">UserFactory</span> {<br> <span class="hljs-comment">//对应factory-method</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">getUser</span><span class="hljs-params">(String name)</span> {<br> System.out.println(<span class="hljs-string">"这是"</span>+name);<br> }<br>}<br></code></pre></td></tr></table></figure>
<ol start="3">
<li>使用实例工厂方法创建Bean:</li>
</ol>
<ul>
<li>factory-bean指定工厂实例</li>
<li>factory-method指定实例工厂的工厂方法。</li>
<li></li>
</ul>
<p>若调用实例工厂方法时需要传入参数,则使用<constructor-arg…/>元素确定参数值。</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"userFactory"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"cn.sr.spring.javabean.UserFactory"</span> /></span><br>//此时getUser方法应为非静态<br><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">factory-bean</span>=<span class="hljs-string">"userFactory"</span> <span class="hljs-attr">factory-mothod</span>=<span class="hljs-string">"getUser"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">constructor-arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"name"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"张三"</span>></span><span class="hljs-tag"></<span class="hljs-name">constructor-arg</span>></span><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br></code></pre></td></tr></table></figure>
<h2 id="Bean的生命周期"><a href="#Bean的生命周期" class="headerlink" title="Bean的生命周期"></a>Bean的生命周期</h2><p>这里简单的说明一下,对于作用域为prototype的Bean,Spring在仅仅负责创建Bean,每当容器创建Bean后就交给客户端的代码进行维护。但是对应singlton作用域的Bean,Spring会进行创建一次,然后整个容器中共享。所以Spring容器会负责进行跟踪其状态,负责依赖的注入和依赖实例的分配。</p>
<hr>
<h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><p>本文只是做简单介绍,个人理解方面偏多,更多有关于IOC和DI以及Bean对象的详解介绍请自行查找相关资料!</p>
]]></content>
<categories>
<category>Spring</category>
</categories>
<tags>
<tag>Spring</tag>
<tag>Java EE</tag>
</tags>
</entry>
<entry>
<title>Spring框架入门(二):安装配置</title>
<url>/posts/1df93bf0/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title2_2018.10.30.png' >
<span id="more"></span>
<blockquote>
<h5 id="下载架包"><a href="#下载架包" class="headerlink" title="下载架包"></a>下载架包</h5></blockquote>
<p>这里以4.3.20版本为例,点击下载:<a href="http://repo.spring.io/release/org/springframework/spring/4.3.20.RELEASE/spring-framework-4.3.20.RELEASE-dist.zip">SpringFramewoek 4.3.20版本</a></p>
<hr>
<h6 id="解压缩后目录"><a href="#解压缩后目录" class="headerlink" title="解压缩后目录:"></a>解压缩后目录:</h6><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/20181030144323.png" alt="解压缩"></p>
<p>— docs目录为api和开发文档介绍,schema目录为配置xml的schema约束文件,libs文件夹中为我们要使用的架包<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/lib20181030144732.png" alt="在这里插入图片描述"><br><strong><font color=red size=3>注意:</font>另外还要下载spring的依赖架包:</strong> <a href="http://mirrors.shu.edu.cn/apache//commons/logging/binaries/commons-logging-1.2-bin.zip">commons-logging</a></p>
<hr>
<blockquote>
<h5 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h5></blockquote>
<h6 id="1-打开IDE工具,新建项目,导入上文下载好的架包"><a href="#1-打开IDE工具,新建项目,导入上文下载好的架包" class="headerlink" title="1. 打开IDE工具,新建项目,导入上文下载好的架包"></a>1. 打开IDE工具,新建项目,导入上文下载好的架包</h6><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/prolibs20181030154520.png" alt="导入项目"></p>
<h6 id="2-创建实体类并意添加一个方法打印输入"><a href="#2-创建实体类并意添加一个方法打印输入" class="headerlink" title="2. 创建实体类并意添加一个方法打印输入"></a>2. 创建实体类并意添加一个方法打印输入</h6><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">package</span> cn.sr.spring;<br><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">User</span> {<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">isSelf</span><span class="hljs-params">()</span> {<br> System.out.println(<span class="hljs-string">"我是谁,我在哪,我在干什么"</span>);<br> }<br><br>}<br></code></pre></td></tr></table></figure>
<h6 id="3-在src目录下-创建xml文件"><a href="#3-在src目录下-创建xml文件" class="headerlink" title="3. 在src目录下 创建xml文件"></a>3. 在src目录下 创建xml文件</h6><figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span>?></span><br><span class="hljs-tag"><<span class="hljs-name">beans</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans</span></span><br><span class="hljs-string"><span class="hljs-tag"> http://www.springframework.org/schema/beans/spring-beans.xsd"</span>></span><br> <span class="hljs-comment"><!-- 配置javabean对象 --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"cn.sr.spring.User"</span>></span><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br><span class="hljs-tag"></<span class="hljs-name">beans</span>></span><br></code></pre></td></tr></table></figure>
<h6 id="4-创建测试类"><a href="#4-创建测试类" class="headerlink" title="4. 创建测试类"></a>4. 创建测试类</h6><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">package</span> cn.sr.spring;<br><span class="hljs-keyword">import</span> org.springframework.context.ApplicationContext;<br><span class="hljs-keyword">import</span> org.springframework.context.support.ClassPathXmlApplicationContext;<br><span class="hljs-keyword">import</span> org.junit.*;<br><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">TestBean</span> {<br><br> <span class="hljs-meta">@Test</span><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">test</span><span class="hljs-params">()</span> {<br> <span class="hljs-comment">//通过xml文件获取Spring的上下文对象</span><br> <span class="hljs-type">ApplicationContext</span> <span class="hljs-variable">context</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ClassPathXmlApplicationContext</span>(<span class="hljs-string">"beans.xml"</span>);<br> <span class="hljs-comment">//通过id获取Spring管理的JavaBean对象</span><br> <span class="hljs-type">User</span> <span class="hljs-variable">user</span> <span class="hljs-operator">=</span> (User) context.getBean(<span class="hljs-string">"user"</span>);<br> System.out.println(user);<br> user.isSelf();<br> }<br><br>}<br></code></pre></td></tr></table></figure>
<blockquote>
<h5 id="配置完成"><a href="#配置完成" class="headerlink" title="配置完成"></a>配置完成</h5></blockquote>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/prolibs.png"></p>
<p>如图所示,即配置成功。</p>
<hr>
]]></content>
<categories>
<category>Spring</category>
</categories>
<tags>
<tag>Spring</tag>
</tags>
</entry>
<entry>
<title>Tomcat服务器配置Https协议</title>
<url>/posts/8baea545/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title_2019.04.25.png'>
<!-- more -->
<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><blockquote>
<p>日常开发项目时,一般本机都是基于http协议,但是要实现某些需求必须要开启https协议。<br>现在https协议已经成为主流,网站如果未开启https协议,浏览器会进行安全提示。<br>本文以<strong>Tomcat</strong>服务器为例,简单介绍如何在<strong>本机开发环境</strong>配置https协议</p>
</blockquote>
<h3 id="证书生成"><a href="#证书生成" class="headerlink" title="证书生成"></a>证书生成</h3><p><strong>使用JDK自带的keytool工具来生成证书库</strong>:</p>
<figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">keytool -genkeypair -alias <span class="hljs-string">"tomcat"</span> -keyalg <span class="hljs-string">"RSA"</span> -keystore <span class="hljs-string">"d:\https\tomcat.keystore"</span> <br></code></pre></td></tr></table></figure>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-4-25-https1.png"></p>
<table>
<thead>
<tr>
<th>属性</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>alias</td>
<td>证书别名</td>
</tr>
<tr>
<td>keyalg</td>
<td>加密算法,RSA</td>
</tr>
<tr>
<td>keystore</td>
<td>证书保存路径</td>
</tr>
</tbody></table>
<h3 id="环境设置"><a href="#环境设置" class="headerlink" title="环境设置"></a>环境设置</h3><p><strong>修改Tomcat配置文件</strong>:<br>打开Tomcat安装目录/conf/server.xml,修改如下配置,并取消注释<br>注:这里以Tomcat8.0为例,8.5以上配置请另行百度</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><code class="hljs xml"><span class="hljs-tag"><<span class="hljs-name">Connector</span> <span class="hljs-attr">port</span>=<span class="hljs-string">"8443"</span> <span class="hljs-attr">protocol</span>=<span class="hljs-string">"org.apache.coyote.http11.Http11NioProtocol"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">maxThreads</span>=<span class="hljs-string">"150"</span> <span class="hljs-attr">SSLEnabled</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">scheme</span>=<span class="hljs-string">"https"</span> <span class="hljs-attr">secure</span>=<span class="hljs-string">"true"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">clientAuth</span>=<span class="hljs-string">"false"</span> <span class="hljs-attr">sslProtocol</span>=<span class="hljs-string">"TLS"</span></span><br><span class="hljs-tag"> <span class="hljs-attr">keystoreFile</span>=<span class="hljs-string">"d:\https\tomcat.keystore"</span> <span class="hljs-attr">keystorePass</span>=<span class="hljs-string">"123456"</span> /></span><br></code></pre></td></tr></table></figure>
<h3 id="启动Tomcat"><a href="#启动Tomcat" class="headerlink" title="启动Tomcat"></a>启动Tomcat</h3><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java">https:<span class="hljs-comment">//localhost:8443/</span><br></code></pre></td></tr></table></figure>
<p>访问链接,浏览器会提示站点不安全,点击继续访问即可(<strong>本地安装证书</strong>或者<strong>互联网申请证书解决</strong>)<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-4-25-https2.png" alt="在这里插入图片描述"></p>
]]></content>
<tags>
<tag>Tomcat</tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<url>/posts/4a17b156/</url>
<content><![CDATA[<h3 id="永远相信美好的事情即将发生"><a href="#永远相信美好的事情即将发生" class="headerlink" title="永远相信美好的事情即将发生~"></a>永远相信美好的事情即将发生~</h3>]]></content>
</entry>
<entry>
<title>一段Js代码开启任意网站的匿名聊天室</title>
<url>/posts/ccb2c90f/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/blog_chart_2018.12.05.png'>
<!-- more -->
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>一个’神奇’的在线聊天室 (<a href="http://www.topurl.cn/">http://www.topurl.cn/</a>)</p>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><ol>
<li>浏览器控制台输入</li>
</ol>
<figure class="highlight js"><table><tr><td class="code"><pre><code class="hljs js"><span class="hljs-keyword">var</span> s=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'script'</span>);<br>s.<span class="hljs-property">src</span>=<span class="hljs-string">'//topurl.cn/chat.js'</span>;<br><span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-title function_">append</span>(s);<br></code></pre></td></tr></table></figure>
<ol start="2">
<li>地址栏输入</li>
</ol>
<figure class="highlight js"><table><tr><td class="code"><pre><code class="hljs js"><span class="hljs-attr">javascript</span>:<span class="hljs-keyword">var</span> s=<span class="hljs-variable language_">document</span>.<span class="hljs-title function_">createElement</span>(<span class="hljs-string">'script'</span>);s.<span class="hljs-property">src</span>=<span class="hljs-string">'//topurl.cn/chat.js'</span>;<span class="hljs-variable language_">document</span>.<span class="hljs-property">body</span>.<span class="hljs-title function_">append</span>(s);<br></code></pre></td></tr></table></figure>
<ol start="3">
<li>书签<br>地址为方法2中的代码</li>
</ol>
<h2 id="动图演示"><a href="#动图演示" class="headerlink" title="动图演示"></a>动图演示</h2><p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/gif/blog_chart_2018.12.05.gif"></p>
]]></content>
<tags>
<tag>JS</tag>
<tag>聊天室</tag>
</tags>
</entry>
<entry>
<title>回忆清单之情景喜剧篇</title>
<url>/posts/7a9127ac/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/sitcom.png' >
<!-- more -->
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>听《活着》时,我突然想起了《废柴兄弟》这部电视剧,以及剧中许之一、张晓蛟的形象。从过去的“废柴”,到现在的“摆烂”青年,一切周而复始。紧接着《屌丝男士》、《麻辣隔壁》等作品中的片段也浮现在我脑海里,从那些方方正正的屏幕中涌现出来。曾经我们也聚在一起,以这些剧情为话题沟通交流,汇聚成自己的故事。但是世界仿佛是一个巨大的圆环,我们每个人是一个小圆环,随着时间渐行渐远,有些圆环即使怎样翻滚变化,也再难与之产生交集。<br>好了,不絮叨了。下面整理了一下曾经我看过的电视剧(我也不知道怎么分类,就暂且都认为是情景喜剧吧),虽然以后可能没机会再完整的看一遍了,但是想起时去看看片段,还是会很开心的。</p>
<h2 id="清单"><a href="#清单" class="headerlink" title="清单"></a>清单</h2><blockquote>
<p>我尽量以时间前后排序,虽然我也不知道对不对,哈哈</p>
</blockquote>
<h3 id="星际精灵蓝多多"><a href="#星际精灵蓝多多" class="headerlink" title="星际精灵蓝多多"></a>星际精灵蓝多多</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405155908857.png" style="zoom: 50%;" /></td>
<td align="center">蔡小豆<br />蓝多多<br />唐古拉<br />唐古丽<br />包大雷<br />黑心博士<br /></td>
</tr>
</tbody></table>
<h3 id="家有外星人"><a href="#家有外星人" class="headerlink" title="家有外星人"></a>家有外星人</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405160133844.png" style="zoom: 50%;" /></td>
<td align="center">唐不苦<br />唐朝<br />美丽果<br />可儿<br /></td>
</tr>
</tbody></table>
<h3 id="淘气包马小跳"><a href="#淘气包马小跳" class="headerlink" title="淘气包马小跳"></a>淘气包马小跳</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405163155427.png" style="zoom: 33%;" /></td>
<td align="center">马小跳<br />马天笑<br />丁蕊<br />丁克<br />姥爷<br /></td>
</tr>
</tbody></table>
<h3 id="家有儿女"><a href="#家有儿女" class="headerlink" title="家有儿女"></a>家有儿女</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405161244158.png" style="zoom: 50%;" /></td>
<td align="center">夏东海<br />刘梅<br />夏雪<br />夏雨<br />刘星<br />胡一统<br />键盘<br />鼠标<br /></td>
</tr>
</tbody></table>
<h3 id="疯丫头"><a href="#疯丫头" class="headerlink" title="疯丫头"></a>疯丫头</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405163010525.png" style="zoom:33%;" /></td>
<td align="center">雪儿<br />糖糖<br />爆米花<br /></td>
</tr>
</tbody></table>
<h3 id="粉红女郎"><a href="#粉红女郎" class="headerlink" title="粉红女郎"></a>粉红女郎</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405163353644.png" style="zoom: 50%;" /></td>
<td align="center">方小萍<br />万人迷<br />哈妹<br />罗密欧<br /> 龚喜<br />何茹男<br /></td>
</tr>
</tbody></table>
<h3 id="炊事班的故事"><a href="#炊事班的故事" class="headerlink" title="炊事班的故事"></a>炊事班的故事</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405163832435.png" style="zoom:33%;" /></td>
<td align="center">小毛<br />胖洪<br />大周<br />小姜<br />老高<br />连长<br /></td>
</tr>
</tbody></table>
<h3 id="武林外传"><a href="#武林外传" class="headerlink" title="武林外传"></a>武林外传</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405164222944.png" style="zoom:33%;" /></td>
<td align="center">白展堂<br />佟湘玉<br />李大嘴<br />吕轻侯<br />郭芙蓉<br />莫小贝<br />刑捕头<br />祝无双<br />燕小六<br />姬无命<br /></td>
</tr>
</tbody></table>
<h3 id="爱情公寓"><a href="#爱情公寓" class="headerlink" title="爱情公寓"></a>爱情公寓</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405165020578.png" style="zoom: 50%;" /></td>
<td align="center">曾小贤<br />胡一菲<br />张伟<br />吕子乔<br />陈美嘉<br />陆展博<br />林宛瑜<br />唐悠悠<br />关顾神奇<br />秦羽墨<br /></td>
</tr>
</tbody></table>
<h3 id="龙门镖局"><a href="#龙门镖局" class="headerlink" title="龙门镖局"></a>龙门镖局</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405170824862.png" style="zoom: 50%;" /></td>
<td align="center">盛秋月<br />陆三金<br />温良恭<br />蔡八斗<br />吕青橙<br />糊糊<br />邱璎珞<br /></td>
</tr>
</tbody></table>
<h3 id="极品家丁"><a href="#极品家丁" class="headerlink" title="极品家丁"></a>极品家丁</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405171601882.png" style="zoom:50%;" /></td>
<td align="center">林晚荣<br />高酋<br />萧玉若<br />萧玉霜<br />福伯<br />四德<br />元大猛<br />程德<br />陶东成<br />陆中平<br /></td>
</tr>
</tbody></table>
<h3 id="废柴兄弟"><a href="#废柴兄弟" class="headerlink" title="废柴兄弟"></a>废柴兄弟</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405173102717.png" style="zoom:50%;" /></td>
<td align="center">许之一<br />张晓蛟<br />艾玛<br />兰菲<br />小白<br />多多<br /></td>
</tr>
</tbody></table>
<h3 id="麻辣隔壁"><a href="#麻辣隔壁" class="headerlink" title="麻辣隔壁"></a>麻辣隔壁</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220705174056424.png" style="zoom:80%;" /></td>
<td align="center">林大冲<br />吕胖胖<br />李凡达<br />柳小刀<br />四姑娘<br /></td>
</tr>
</tbody></table>
<h3 id="极品女士"><a href="#极品女士" class="headerlink" title="极品女士"></a>极品女士</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405174056424.png" style="zoom:50%;" /></td>
<td align="center">于莎莎(哈哈哈)</td>
</tr>
</tbody></table>
<h3 id="屌丝男士"><a href="#屌丝男士" class="headerlink" title="屌丝男士"></a>屌丝男士</h3><table>
<thead>
<tr>
<th align="center">封面</th>
<th align="center">主要角色</th>
</tr>
</thead>
<tbody><tr>
<td align="center"><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/recall/image-20220405173815212.png" style="zoom:50%;" /></td>
<td align="center">大鹏(哈哈哈)</td>
</tr>
</tbody></table>
<hr>
<blockquote>
<p>主图拼接工具:<a href="https://www.photocollage.com/">Create online photo collages - PhotoCollage.com</a></p>
</blockquote>
]]></content>
<tags>
<tag>随笔</tag>
</tags>
</entry>
<entry>
<title>荷兰国旗-快速排序应用</title>
<url>/posts/5644be5d/</url>
<content><![CDATA[<hr>
<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-04-20%20.png' height=120px >
<hr>
<span id="more"></span>
<h2 id="荷兰国旗"><a href="#荷兰国旗" class="headerlink" title="荷兰国旗"></a>荷兰国旗</h2><blockquote>
<p>”荷兰国旗难题“是计算机科学中的一个程序难题,它是由Edsger Dijkstra提出的。荷兰国旗是由红、白、蓝三色组成的。现有红白蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。<br>ps:我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。</p>
</blockquote>
<h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><blockquote>
<p>arr[i]< key时相当于“荷兰国旗问题”中的0<br>arr[i]= key时相当于“荷兰国旗问题”中的1<br>arr[i]> key时相当于“荷兰国旗问题”中的2</p>
</blockquote>
<p>这样就可以使用“荷兰国旗问题”的解法来解决快速排序了,这样一来,即使待排序的元素中有一些元素和key一样,也能保证时间复杂度是最差是NlogN的,因为对于待排序的等于Key的数值,可以在执行下一次Partition时直接跳过,利于数据规模的降低。</p>
<hr>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight java"><figcaption><span>荷兰国旗</span></figcaption><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">NetherlandsFlag</span> {<br> <br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span>[] partition(<span class="hljs-type">int</span>[] arr,<span class="hljs-type">int</span> L,<span class="hljs-type">int</span> R,<span class="hljs-type">int</span> p) {<br> <span class="hljs-type">int</span> <span class="hljs-variable">less</span> <span class="hljs-operator">=</span> L-<span class="hljs-number">1</span>;<br> <span class="hljs-type">int</span> <span class="hljs-variable">more</span> <span class="hljs-operator">=</span> R+<span class="hljs-number">1</span>;<br> <span class="hljs-keyword">while</span>(L < more) {<br> <span class="hljs-keyword">if</span>(arr[L] < p) {<br> swap(arr,++less,L++);<br> }<span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span>(arr[L] > p) {<br> swap(arr,--more,L);<br> }<span class="hljs-keyword">else</span> {<br> L++;<br> }<br> <br> }<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[] {less+<span class="hljs-number">1</span>,more-<span class="hljs-number">1</span>};<br> <br> }<br> <br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">swap</span><span class="hljs-params">(<span class="hljs-type">int</span>[] arr, <span class="hljs-type">int</span> i, <span class="hljs-type">int</span> j)</span> {<br> <span class="hljs-type">int</span> <span class="hljs-variable">temp</span> <span class="hljs-operator">=</span> arr[i];<br> arr[i] = arr[j];<br> arr[j] = temp;<br> <br> }<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span>[] getArray() {<br> <span class="hljs-type">int</span> arr[] = <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[<span class="hljs-number">10</span>];<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;i < arr.length;i++) {<br> arr[i] = (<span class="hljs-type">int</span>)(Math.random()*<span class="hljs-number">3</span>);<br> }<br> <span class="hljs-keyword">return</span> arr;<br> }<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">printArray</span><span class="hljs-params">(<span class="hljs-type">int</span> arr[])</span> {<br> <span class="hljs-keyword">if</span>(arr == <span class="hljs-literal">null</span>) {<br> <span class="hljs-keyword">return</span> ;<br> }<br> <span class="hljs-keyword">for</span>(<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;i < arr.length;i++) {<br> System.out.print(arr[i]+<span class="hljs-string">" "</span>);<br> }<br> System.out.println();<br> <br> }<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String args[])</span> {<br> <span class="hljs-type">int</span> test[] = getArray();<br> printArray(test); <br> <span class="hljs-type">int</span> res[] = partition(test,<span class="hljs-number">0</span>,test.length-<span class="hljs-number">1</span>,<span class="hljs-number">1</span>); <span class="hljs-comment">//p值为1,用来判断0,1,2 </span><br> printArray(test);<br> System.out.println(res[<span class="hljs-number">0</span>]);<br> System.out.println(res[<span class="hljs-number">1</span>]);<br> }<br><br>}<br></code></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>算法</tag>
<tag>快速排序</tag>
</tags>
</entry>
<entry>
<title>记录腾讯云服务器当矿机的一天</title>
<url>/posts/23f6ec83/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/wx_title_2019-11-26-0.png' >
<span id="more"></span>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近入手了一台腾讯云服务器玩玩,兴致勃勃的装上<code>Docker</code>,打算把之前的<code>SpringBoot</code>项目跑一跑。</p>
<p>安装<code>Docker</code>、配置<code>Maven Docker</code>插件、开放<code>Docker</code>远程端口(这里划重点要考)、配置服务器安全组端口、编写<code>Dockerfile</code>文件、打包上传镜像、运行项目,一切都很正常。</p>
<p>第二天早上,再次登录服务器时发现特别卡,下意识以为是自己运行项目的问题,初步排查一下,CPU占用100%,2M小水管带宽被占满……</p>
<h2 id="排查"><a href="#排查" class="headerlink" title="排查"></a>排查</h2><h3 id="TOP命令查看进程信息"><a href="#TOP命令查看进程信息" class="headerlink" title="TOP命令查看进程信息"></a><code>TOP</code>命令查看进程信息</h3><ul>
<li><p><code>TOP</code>命令查看进程信息,可以看到“sic”这个进程内存占用非常高,下面的“masscan”进程占用也相当高(百度发现可能是扫描端口的程序)</p>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-11-26-192508-3.png"></p>
</li>
</ul>
<h3 id="定位进程文件"><a href="#定位进程文件" class="headerlink" title="定位进程文件"></a>定位进程文件</h3><ul>
<li><p>根据<code>PID</code>执行命令,<code>ll /proc/7844</code>,发现执行路径在 /var/tmp/sic/sic ,同目录有一个<code>config.json</code>文件,其内容如下图,百度一下发现各个属性像极了挖矿程序的配置 - .-</p>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-11-26-192525-2.png"></p>
</li>
</ul>
<h3 id="查看定时任务"><a href="#查看定时任务" class="headerlink" title="查看定时任务"></a>查看定时任务</h3><ul>
<li>执行<code>crontab -l</code>命令,发现三个异常任务,以第一个为例,<code>corn表达式</code>0,30 * * * *表示每0分钟和每三十分钟执行一次任务,网址返回的为一段shell脚本代码,通过管道在本地执行脚本,任务三则是每0秒(每分钟)执行一段<code>Python</code>脚本,任务四是腾讯云的监控组件。</li>
<li>脚本内容大概就是通过<code>ssh</code>提权,删除系统日志,卸载安全组件,挖矿程序,代理服务等,然后定时执行,循环往复。</li>
</ul>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-11-26-192531-1.png"></p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>百度一圈发现是因为<code>Docker</code>的远程服务没有任何加密措施,黑客可以远程直接运行任意容器,通过<code>-v</code> 命令(数据卷)将他的<code>ssh</code>公钥挂载到宿主机的<code>/root/.ssh</code>目录,从而实现提权。</p>
<p>傻乎乎当了一天矿机,出于安全考虑(系统已经惨不忍睹,也无法保证没有其他暗门),我立刻更换了公网IP,并且重置了系统镜像,然后我又安装上了<code>Docker</code>,不同的是这次我老老实实地在本地构建了镜像~</p>
]]></content>
<tags>
<tag>服务器</tag>
<tag>Docker</tag>
<tag>网络安全</tag>
</tags>
</entry>
<entry>
<title>最大间隔数-桶排序应用</title>
<url>/posts/28e83e0e/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/2019-05-23_wx_title.png' >
<span id="more"></span>
<h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><blockquote>
<p>给定一个未排序的数组,返回其排序后的数组中<strong>相邻元素之差</strong>的最大值<br>例:给定数组:[5,9,8,3,15]<br>   排序后:[3,5,8,9,15]<br>相邻元素之差最大的是15-9=6,结果即为6。<br>要求:时间空间复杂度均为O(n)。</p>
</blockquote>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight java"><table><tr><td class="code"><pre><code class="hljs java"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MaximumGap</span> {<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span> <span class="hljs-title function_">maximumGap</span><span class="hljs-params">(<span class="hljs-type">int</span>[] arr)</span> {<br> <span class="hljs-keyword">if</span> (arr == <span class="hljs-literal">null</span> || arr.length < <span class="hljs-number">2</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br> }<br> <span class="hljs-type">int</span> <span class="hljs-variable">len</span> <span class="hljs-operator">=</span> arr.length;<br> <span class="hljs-type">int</span> <span class="hljs-variable">min</span> <span class="hljs-operator">=</span> Integer.MAX_VALUE;<br> <span class="hljs-type">int</span> <span class="hljs-variable">max</span> <span class="hljs-operator">=</span> Integer.MIN_VALUE;<br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < len; i++) {<br> min = Math.min(min, arr[i]);<br> max = Math.max(max, arr[i]);<br> }<br> <span class="hljs-keyword">if</span> (min == max) {<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br> }<br> <span class="hljs-type">boolean</span> book[] = <span class="hljs-keyword">new</span> <span class="hljs-title class_">boolean</span>[len + <span class="hljs-number">1</span>];<br> <span class="hljs-type">int</span> maxs[] = <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[len + <span class="hljs-number">1</span>];<br> <span class="hljs-type">int</span> mins[] = <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[len + <span class="hljs-number">1</span>];<br> <span class="hljs-type">int</span> <span class="hljs-variable">id</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;<br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < len; i++) {<br> <span class="hljs-comment">// 划分桶号</span><br> id = (<span class="hljs-type">int</span>) ((arr[i] - min) * len / (max - min));<br> mins[id] = book[id] ? Math.min(mins[id], arr[i]) : arr[i];<br> maxs[id] = book[id] ? Math.max(maxs[id], arr[i]) : arr[i];<br> book[id] = <span class="hljs-literal">true</span>;<br> }<br> <span class="hljs-type">int</span> <span class="hljs-variable">res</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>;<br> <span class="hljs-comment">// 第一个桶内默认是最小值</span><br> <span class="hljs-type">int</span> <span class="hljs-variable">lastMax</span> <span class="hljs-operator">=</span> maxs[<span class="hljs-number">0</span>];<br> <span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">1</span>;<br> <span class="hljs-keyword">for</span> (; i <= len; i++) {<br> <span class="hljs-keyword">if</span> (book[i]) {<br> <span class="hljs-comment">// 两个相邻的非空桶,后一个的最小值减去前一个的最大值为相对间隔最大值</span><br> res = Math.max(res, mins[i] - lastMax);<br> <span class="hljs-comment">// 当前桶的最大值更新为前一个最大值</span><br> lastMax = maxs[i];<br> }<br> }<br> <span class="hljs-keyword">return</span> res;<br><br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span> <span class="hljs-title function_">comparator</span><span class="hljs-params">(<span class="hljs-type">int</span>[] arr)</span> {<br> <span class="hljs-keyword">if</span> (arr == <span class="hljs-literal">null</span> || arr.length < <span class="hljs-number">2</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;<br> }<br> Arrays.sort(arr);<br> <span class="hljs-type">int</span> <span class="hljs-variable">gap</span> <span class="hljs-operator">=</span> Integer.MIN_VALUE;<br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">1</span>; i < arr.length; i++) {<br> gap = Math.max(arr[i] - arr[i - <span class="hljs-number">1</span>], gap);<br> }<br> <span class="hljs-keyword">return</span> gap;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span>[] getRandomArray(<span class="hljs-type">int</span> maxSize, <span class="hljs-type">int</span> maxValue) {<br> <span class="hljs-type">int</span>[] arr = <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[(<span class="hljs-type">int</span>) ((maxSize + <span class="hljs-number">1</span>) * Math.random())];<br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < arr.length; i++) {<br> <span class="hljs-comment">// 获取 -maxVlaue + 1 ~ maxValue 的值</span><br> arr[i] = (<span class="hljs-type">int</span>) ((maxValue + <span class="hljs-number">1</span>) * Math.random()) - (<span class="hljs-type">int</span>) (maxValue * Math.random());<br> }<br><br> <span class="hljs-keyword">return</span> arr;<br><br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-type">int</span>[] copyArray(<span class="hljs-type">int</span>[] arr) {<br> <span class="hljs-keyword">if</span> (arr == <span class="hljs-literal">null</span>) {<br> <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;<br> }<br> <span class="hljs-type">int</span>[] book = <span class="hljs-keyword">new</span> <span class="hljs-title class_">int</span>[arr.length];<br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < arr.length; i++) {<br> book[i] = arr[i];<br> }<br> <span class="hljs-keyword">return</span> book;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> {<br> <span class="hljs-comment">// 测试次数</span><br> <span class="hljs-type">int</span> <span class="hljs-variable">test</span> <span class="hljs-operator">=</span> <span class="hljs-number">50000</span>;<br><br> <span class="hljs-comment">// 数组长度</span><br> <span class="hljs-type">int</span> <span class="hljs-variable">maxSize</span> <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;<br><br> <span class="hljs-comment">// 最大数值</span><br> <span class="hljs-type">int</span> <span class="hljs-variable">maxValue</span> <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;<br><br> <span class="hljs-type">boolean</span> <span class="hljs-variable">flag</span> <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;<br><br> <span class="hljs-keyword">for</span> (<span class="hljs-type">int</span> <span class="hljs-variable">i</span> <span class="hljs-operator">=</span> <span class="hljs-number">0</span>; i < test; i++) {<br> <span class="hljs-type">int</span> arr1[] = getRandomArray(maxSize, maxValue);<br> <span class="hljs-comment">// 拷贝比较</span><br> <span class="hljs-type">int</span> arr2[] = copyArray(arr1);<br> <span class="hljs-keyword">if</span> (maximumGap(arr1) != comparator(arr2)) {<br> flag = <span class="hljs-literal">false</span>;<br> <span class="hljs-keyword">break</span>;<br> }<br><br> }<br> System.out.println(flag ? <span class="hljs-string">"测试正常"</span> : <span class="hljs-string">"发生错误"</span>);<br> <span class="hljs-comment">// 随机测试一组数据</span><br> <span class="hljs-type">int</span> arr[] = getRandomArray(maxSize, maxValue);<br> <span class="hljs-type">int</span> <span class="hljs-variable">t</span> <span class="hljs-operator">=</span> maximumGap(arr);<br> System.out.println(<span class="hljs-string">"原数组:"</span>+Arrays.toString(arr));<br> Arrays.sort(arr);<br> System.out.println(<span class="hljs-string">"排序后:"</span>+Arrays.toString(arr));<br> System.out.println(<span class="hljs-string">"最大差值:"</span>+t);<br> }<br>}<br></code></pre></td></tr></table></figure>]]></content>
<tags>
<tag>桶排序</tag>
<tag>对数器</tag>
</tags>
</entry>
<entry>
<title>腾讯云轻量应用服务器入门指南</title>
<url>/posts/6e63f1a7/</url>
<content><![CDATA[<img src='https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/lighthouse1.png' >
<!-- more -->
<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、小程序/小游戏、电商、云盘/图床以及各类开发测试和学习环境。</p>
<blockquote>
<p>最近同学们都在准备毕业设计,正好借这次征文活动,水一水文章 - 。-</p>
</blockquote>
<h1 id="使用指南"><a href="#使用指南" class="headerlink" title="使用指南"></a>使用指南</h1><h2 id="地域"><a href="#地域" class="headerlink" title="地域"></a>地域</h2><ul>
<li>优先选择距离自己所在地相近区域,降低访问时延迟(类似CF游戏大区模式,hhh)</li>
<li>如果拥有多台服务器,尽量选择相同地域可以组建内网服务</li>
<li>非中国大陆地域不支持Linux与Windows之间系统转换</li>
</ul>
<h2 id="镜像"><a href="#镜像" class="headerlink" title="镜像"></a>镜像</h2><h3 id="系统镜像"><a href="#系统镜像" class="headerlink" title="系统镜像"></a>系统镜像</h3><ul>
<li>Linux Server:CentOS、Ubuntu、Debian、TencentOS……</li>
<li>Windows Server :系统盘容量>50G,不支持二次虚拟化</li>
</ul>
<h3 id="应用镜像(这里主要列举用途)"><a href="#应用镜像(这里主要列举用途)" class="headerlink" title="应用镜像(这里主要列举用途)"></a>应用镜像(这里主要列举用途)</h3><ul>
<li>宝塔Linux面板:服务器运维面板,可以快速集成各类应用环境。小白首选(bushi<br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/baota.png"></li>
<li>SRS流媒体服务器:个人服务器规格可能只适合于音视频相关知识学习,以及测试Demo</li>
<li>Typecho/WordPress/Discuz! Q:个人博客和内容管理网站</li>
<li>Theia IDE:云端IDE,便于临时开发,以及调研各类Demo(这里推荐下<a href="https://www.cloudstudio.net/">Cloud Studio - 开启云端开发模式 WebIDE</a>)</li>
</ul>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/couldstudio.png"></p>
<ul>
<li>Docker镜像:开源的容器引擎,实现容器虚拟化。如选择基础镜像,则可以通过腾讯云控制台直接管理Docker容器</li>
</ul>
<p><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/docker.png"></p>
<ul>
<li>更多用途:个人网盘/图床/<strong>毕业设计</strong>……</li>
</ul>
<h2 id="防火墙"><a href="#防火墙" class="headerlink" title="防火墙"></a>防火墙</h2><ul>
<li>开放公有协议访问端口</li>
<li>开放自定义程序访问端口</li>
</ul>
<h2 id="快照"><a href="#快照" class="headerlink" title="快照"></a>快照</h2><ul>
<li>备份功能,在某个不可逆操作节点前进行快照备份</li>
<li>存储型套餐的实例不支持创建快照</li>
<li>免费快照配额为已创建实例数(待回收实例和存储型套餐实例除外)乘以2,且最多不超过10个</li>
</ul>
<h2 id="监控告警"><a href="#监控告警" class="headerlink" title="监控告警"></a>监控告警</h2><ul>
<li>实时监控服务器状态,最低时间粒度10s。(基于实例中默认安装的腾讯云监控组件,可卸载)</li>
<li>可配置告警规则,当服务器状态异常时(植入挖矿程序/程序卡死/硬盘爆满/内存溢出),触发告警通知</li>
</ul>
<h2 id="公网IP"><a href="#公网IP" class="headerlink" title="公网IP"></a>公网IP</h2><ul>
<li>最新策略:每台服务器生命周期内,只可更换一次公网IP(2022年3月)</li>
</ul>
<h2 id="域名解析"><a href="#域名解析" class="headerlink" title="域名解析"></a>域名解析</h2><ul>
<li>域名备案接入腾讯云</li>
<li>添加解析记录指向轻量应用服务器公网IP即可</li>
</ul>
<h1 id="体验-选购"><a href="#体验-选购" class="headerlink" title="体验&选购"></a>体验&选购</h1><p><a href="https://curl.qcloud.com/bUpvTDNp">【腾讯云轻量应用服务器】新用户首单特惠秒杀,2核2G云服务器(开箱即用)最低仅需45元/年</a><br><a href="https://curl.qcloud.com/bUpvTDNp"><br><img src="https://blog-resource-1251242863.cos.ap-shanghai.myqcloud.com/imags/cps2.png" style="zoom: 60%;" /><br></a></p>
]]></content>
<tags>
<tag>服务器</tag>
</tags>
</entry>
</search>