-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearch.xml
1021 lines (491 loc) · 875 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
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>docker安装必备软件</title>
<link href="/2024/05/12/37-2024-05-12-docker-an-zhuang/"/>
<url>/2024/05/12/37-2024-05-12-docker-an-zhuang/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> docker 安装软件踩坑。</p><a id="more"></a><p>[toc]</p><h2 id="Docker安装MySQL并使用Navicat连接"><a href="#Docker安装MySQL并使用Navicat连接" class="headerlink" title="Docker安装MySQL并使用Navicat连接"></a>Docker安装MySQL并使用Navicat连接</h2><p>用<code>docker search mysql</code>命令来查看可用版本</p><h3 id="拉取最新版本的MySQL镜像:"><a href="#拉取最新版本的MySQL镜像:" class="headerlink" title="拉取最新版本的MySQL镜像:"></a>拉取最新版本的MySQL镜像:</h3><p>注意:tag是可选的,tag表示标签,多为软件的版本,默认是latest版本(最新版)</p><pre class=" language-shell"><code class="language-shell">$ docker pull mysql:latest</code></pre><h3 id="验证MySQL镜像是否成功拉取到本地"><a href="#验证MySQL镜像是否成功拉取到本地" class="headerlink" title="验证MySQL镜像是否成功拉取到本地:"></a>验证MySQL镜像是否成功拉取到本地:</h3><p>使用以下命令来查看mysql镜像是否成功拉取到本地:</p><pre class=" language-shell"><code class="language-shell">$ docker images</code></pre><h3 id="创建并运行一个MySQL容器:"><a href="#创建并运行一个MySQL容器:" class="headerlink" title="创建并运行一个MySQL容器:"></a>创建并运行一个MySQL容器:</h3><pre class=" language-shell"><code class="language-shell">$ docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -v /Users/ctwang/home/docker/mysql/data:/var/lib/mysql -v /Users/ctwang/home/docker/mysql/config:/etc/mysql/conf.d -d mysql:latest</code></pre><p><strong>参数说明:</strong></p><ul><li>--name:指定了容器的名称,方便之后进入容器的命令行。\</li><li>-p:指在本地生成一个随机端口,用来映射mysql的3306端口。</li><li>-e:设置环境变量 MYSQL_ROOT_PASSWORD=root:指定了MySQL的root密码</li><li>-v: 指定数据文件和配置文件</li><li>-d mysql:指运行mysql镜像,设置容器在在后台一直运行。</li></ul><h3 id="验证MySQL容器是否创建并运行成功:"><a href="#验证MySQL容器是否创建并运行成功:" class="headerlink" title="验证MySQL容器是否创建并运行成功:"></a>验证MySQL容器是否创建并运行成功:</h3><pre class=" language-shell"><code class="language-shell">$ docker ps -a</code></pre><p><strong>1、进入MySQL容器:</strong></p><pre class=" language-shell"><code class="language-shell">$ docker exec -it mysql /bin/bash</code></pre><p><strong>2、进入MySQL:</strong></p><pre class=" language-shell"><code class="language-shell">mysql -uroot -pEnter password:root</code></pre><h3 id="MySQL开启远程访问权限:"><a href="#MySQL开启远程访问权限:" class="headerlink" title="MySQL开启远程访问权限:"></a>MySQL开启远程访问权限:</h3><h4 id="1、切换数据库"><a href="#1、切换数据库" class="headerlink" title="1、切换数据库"></a>1、切换数据库</h4><blockquote><p>注意:默认应该就是这个,不切换也行,保险起见还是切换一下</p></blockquote><h4 id="2、给root用户分配远程访问权限"><a href="#2、给root用户分配远程访问权限" class="headerlink" title="2、给root用户分配远程访问权限"></a>2、给root用户分配远程访问权限</h4><pre class=" language-shell"><code class="language-shell">mysql> use mysql;mysql> GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH GRANT OPTION;mysql> flush privileges;</code></pre><p><strong>参数说明:</strong></p><ul><li>GRANT:赋权命令</li><li>ALL PRIVILEGES:当前用户的所有权限</li><li>ON:介词</li><li>*.*:当前用户对所有数据库和表的相应操作权限</li><li>TO:介词</li><li>‘root’@’%’:权限赋给root用户,所有ip都能连接</li><li>WITH GRANT OPTION:允许级联赋权</li></ul><h4 id="3、强制刷新权限"><a href="#3、强制刷新权限" class="headerlink" title="3、强制刷新权限"></a>3、强制刷新权限</h4><p><img src="http://oss.willhappy.cn/img/202405130000545.png" alt></p><p><strong>踩坑:Navicat 连接 MySQL8 报错:2059 - Authentication plugin ‘caching_sha2_password’ cannot be loaded:xxxx;</strong></p><p>参考:<a href="https://cloud.tencent.com/developer/article/2129793" target="_blank" rel="noopener">传送</a></p><h4 id="错误问题原因:"><a href="#错误问题原因:" class="headerlink" title="错误问题原因:"></a>错误问题原因:</h4><p> 这是因为MySQL8之前密码加密规则为mysql_native_password,而 MySQL8 之后的加密规则为caching_sha2_password,也就是说,如果要用Navicat连接MySQL,其实只需要将密码规则改回 mysql_native_password 即可;</p><h4 id="解决方法:"><a href="#解决方法:" class="headerlink" title="解决方法:"></a>解决方法:</h4><h5 id="1-进入MySQL数据库"><a href="#1-进入MySQL数据库" class="headerlink" title="1.进入MySQL数据库"></a>1.进入MySQL数据库</h5><pre class=" language-shell"><code class="language-shell">docker exec -it mysql-test /bin/bashmysql -uroot -pEnter password:root</code></pre><h5 id="2-选择数据库"><a href="#2-选择数据库" class="headerlink" title="2.选择数据库"></a>2.选择数据库</h5><h5 id="3-更改密码加密方式"><a href="#3-更改密码加密方式" class="headerlink" title="3.更改密码加密方式"></a>3.更改密码加密方式</h5><pre class=" language-shell"><code class="language-shell">mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'root' PASSWORD EXPIRE NEVER; </code></pre><h5 id="4-更新用户密码"><a href="#4-更新用户密码" class="headerlink" title="4.更新用户密码"></a>4.更新用户密码</h5><pre class=" language-shell"><code class="language-shell">mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';</code></pre><p><strong>报错:ERROR 1524 (HY000): Plugin ‘mysql_native_password’ is not loaded</strong></p><p>问题原因参考:<a href="https://sakaik.hateblo.jp/entry/20240430/mysql_8_4_0_lts_is_coming" target="_blank" rel="noopener">传送</a></p><p><code>/mysql/config/my.cnf</code>文件添加配置项<code>mysql_native_password=ON</code></p><p>完整配置:</p><pre class=" language-config"><code class="language-config">[mysqld]lower_case_table_names=1mysql_native_password=ON</code></pre><p>说明:<br><code>lower_case_table_names=1</code> 大小写不敏感</p><h5 id="5-刷新权限"><a href="#5-刷新权限" class="headerlink" title="5.刷新权限"></a>5.刷新权限</h5><p><img src="http://oss.willhappy.cn/img/202405130034201.png" alt></p><h3 id="Navicat连接MySQL测试"><a href="#Navicat连接MySQL测试" class="headerlink" title="Navicat连接MySQL测试"></a>Navicat连接MySQL测试</h3><p>成功</p>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> mysql </tag>
<tag> docker </tag>
</tags>
</entry>
<entry>
<title>部署相关小记</title>
<link href="/2019/06/20/36-2019-06-20-fen-bu-shi-bu-shu-wen-ti-xiao-ji/"/>
<url>/2019/06/20/36-2019-06-20-fen-bu-shi-bu-shu-wen-ti-xiao-ji/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> 一次项目分布式部署,遇到相关问题的总结笔记。</p><a id="more"></a><p>[toc]</p><p>服务器结构图:</p><p><img src="http://oss.willhappy.cn/hexo/img/2019-9-5-23-35-15.png-willhappy" alt="2019-9-5-23-35-15.png"></p><h2 id="springboot-jar启动应用"><a href="#springboot-jar启动应用" class="headerlink" title="springboot jar启动应用"></a>springboot jar启动应用</h2><p>这个主要是在部署上层业务平台时遇到配置文件反复修改时需要重新打包,比较麻烦,所以建议,将配置文件外置,可直接服务器上修改。</p><h3 id="配置文件加载顺序、原则"><a href="#配置文件加载顺序、原则" class="headerlink" title="配置文件加载顺序、原则"></a>配置文件加载顺序、原则</h3><p>SpringBoot项目启动会去扫描以下目录位置的application.yml或application.properties配置文件来加载bean。</p><p><strong>配置文件优先级从高到低:</strong></p><ol><li>file:./config/ - 优先级最高(项目根路径下的config,即和jar包同级目录的/config/)</li><li>file:./ - 优先级第二 -(项目根路径下, 即jar包所在目录)</li><li>classpath:/config/ - 优先级第三(项目resources/config下,即jar包内/classes/config/)</li><li>classpath:/ - 优先级第四(项目resources根目录, 即jar包内/classes/)</li></ol><pre class=" language-js"><code class="language-js"><span class="token operator">--</span><span class="token operator">-</span> <span class="token operator">|</span><span class="token operator">--</span> springboot<span class="token operator">-</span>demo<span class="token punctuation">.</span>jar <span class="token operator">|</span><span class="token operator">--</span> BOOT<span class="token operator">-</span>INF <span class="token operator">|</span><span class="token operator">--</span> classes <span class="token operator">|</span><span class="token operator">--</span> config <span class="token operator">|</span><span class="token operator">--</span> ③application<span class="token punctuation">.</span>yml <span class="token operator">|</span><span class="token operator">--</span> ④application<span class="token punctuation">.</span>yml <span class="token operator">|</span><span class="token operator">--</span> config <span class="token operator">|</span><span class="token operator">--</span> ①application<span class="token punctuation">.</span>yml <span class="token operator">|</span><span class="token operator">--</span> ②application<span class="token punctuation">.</span>yml</code></pre><p><strong>原则:</strong></p><ul><li><code>高优先级</code>配置会覆盖<code>低优先级</code>配置</li><li>多个配置文件<code>互补</code></li></ul><p><strong>小总结:</strong></p><p>使用:</p><pre class=" language-shell"><code class="language-shell">> java -jar demo.jar --spring.config.location=/opt/config/application.properties</code></pre><p>使用命令指定jar外部的配置文件或者直接配置jar包的配置文件,可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。</p><p><strong>另安利几篇干货:</strong></p><ul><li><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html" target="_blank" rel="noopener">官方springboot配置api</a></li><li><a href="https://www.infoq.cn/article/Q-ese4CxV2IWmltsJcGX" target="_blank" rel="noopener">Spring Boot 多环境配置最佳实践</a></li><li><a href="http://blog.didispace.com/spring-boot-learning-21-1-3/" target="_blank" rel="noopener">Spring Boot 2.x基础教程:配置文件详解</a></li><li><a href="https://www.cnblogs.com/yueshutong/p/10025820.html" target="_blank" rel="noopener">史上最全的Spring Boot配置文件详解</a></li></ul><h2 id="内网服务器间共享挂载"><a href="#内网服务器间共享挂载" class="headerlink" title="内网服务器间共享挂载"></a>内网服务器间共享挂载</h2><p>要实现集群之间共享的文件(静态资源)的操作,可以通过挂载方式实现。即将共享文件统一放到一台共享文件的服务器上,通过挂载的形式,访问这些共享文件。<br>具体实现操作,参考<a href="https://my.oschina.net/ManderSY/blog/1576936" target="_blank" rel="noopener">文章</a></p><p>使用到的命令:</p><pre class=" language-shell"><code class="language-shell">// 查看磁盘挂载情况$ df –h// 挂载$ mount t nfs 192.168.0.199:/upload /home/web/upload// 取消挂载$ umount /home/web/upload</code></pre><h2 id="https混合http请求的问题"><a href="#https混合http请求的问题" class="headerlink" title="https混合http请求的问题"></a>https混合http请求的问题</h2><p>这个问题是在视频都是使用http的,当https网站去使用http请求拉流时出现,出报错。<br><img src="http://oss.willhappy.cn/hexo/img/2019-9-7-13-44-35.png-willhappy" alt="2019-9-7-13-44-35.png"></p><p>像这种,HTTPS页面混合不安全的HTTP请求,如何解决呢?那就是把不安全的http请求升级为https请求。<br>方法参考<a href="https://zhongwuzw.github.io/2016/12/02/%E8%A7%A3%E5%86%B3https%E6%B7%B7%E5%90%88http%E7%9A%84%E9%97%AE%E9%A2%98/" target="_blank" rel="noopener">文章</a></p><h2 id="cdn防盗链拦截静态资源"><a href="#cdn防盗链拦截静态资源" class="headerlink" title="cdn防盗链拦截静态资源"></a>cdn防盗链拦截静态资源</h2><p>这个是在使用<code>cdn</code>中,去拉取<code>flash</code>资源存在跨域,会触发请求跨域策略文件<code>crossdomain.xml</code>的情况, 而在请求类似这种静态资源时,cdn如果设置了比较高级的防盗链措施,则这种请求会被拦截掉,所以,解决方案就是,在<code>cdn防盗链</code>配置中过滤掉对这种文件的拦截,这样就可以正常的请求到flash资源了。</p><h2 id="进程管理Supervisor使用"><a href="#进程管理Supervisor使用" class="headerlink" title="进程管理Supervisor使用"></a>进程管理Supervisor使用</h2><p><code>Supervisor</code>是一个客户端/服务器系统,采用 <code>Python(2.4+)</code> 开发的,它是一个允许用户管理,基于 <code>Unix</code> 系统进程的 <code>Client/Server</code> 系统,提供了大量功能来实现对进程的管理。</p><h3 id="安装和基本使用"><a href="#安装和基本使用" class="headerlink" title="安装和基本使用"></a>安装和基本使用</h3><pre class=" language-shell"><code class="language-shell">// 安装$ yum install supervisor// 启动并设置开机自启$ systemctl start supervisord.service$ systemctl enable supervisord.service</code></pre><h3 id="应用配置"><a href="#应用配置" class="headerlink" title="应用配置"></a>应用配置</h3><p>yum安装完成之后,会生成<code>/etc/supervisord.conf</code>主配置文件和一个<code>/etc/supervisord.d</code> 自配置文件目录.</p><p>(1) 我们可以先在自定义配置目录创建两个文件夹<code>conf</code>和<code>log</code>来存放我们各个应用的配置和日志。</p><pre class=" language-shell"><code class="language-shell">// 创建文件夹$ cd /etc/supervisord.d && mkdir conf log// 比如创建一个manager.conf的配置$ cd /etc/supervisord.d/conf$ vim manager.conf</code></pre><p>(2) 各应用配置自定义配置</p><p>我们现在创建一个使用springboot构建的java应用配置。</p><pre class=" language-shell"><code class="language-shell">[program:manager]directory = /home/web ; 程序的启动目录command = java -jar manager.jar ; 启动命令,与命令行启动的命令是一样的autostart = true ; 在 supervisord 启动的时候也自动启动startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了autorestart = true ; 程序异常退出后自动重启startretries = 3 ; 启动失败自动重试次数,默认是 3user = root ; 用哪个用户启动redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 falsestdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MBstdout_logfile_backups = 20 ; stdout 日志文件备份数; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)stdout_logfile = /etc/supervisord.d/log/manager.log ;日志统一放在log目录下; 可以通过 environment 来添加需要的环境变量,一种常见的用法是修改 PYTHONPATH; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere</code></pre><p>当然,这都是一些我们基本的配置,更多配置,我们可以在<a href="http://supervisord.org/" target="_blank" rel="noopener">官网</a>查看。</p><p>(3) 修改主配置文件</p><p>修改主配置文件,使其包含我们自定义的应用配置文件。</p><pre class=" language-shell"><code class="language-shell">$ vim /etc/supervisord.conf 在最后一行[include]files = supervisord.d/conf/*.conf</code></pre><p>(4) 加载自定义配置文件使其生效</p><pre class=" language-shell"><code class="language-shell">// 重新加载配置文件$ supervisorctl reread// 将配置文件里新增的子进程加入进程组,如果设置了autostart=true则会启动新新增的子进程$ supervisorctl update</code></pre><p>其他常用命令:</p><pre class=" language-shell"><code class="language-shell">// other$ supervisorctl status$ supervisorctl stop <program_name>$ supervisorctl start <program_name>$ supervisorctl restart <program_name>$ supervisorctl remove <program_name></code></pre><p>当然,也可以输入命令 <code>supervisorctl</code> 进入 <code>supervisorctl</code> 的 <code>shell</code> 交互界面(还是纯命令行😓),就可以在下面输入命令了。</p><p>参考文章:</p><ul><li><a href="http://supervisord.org/" target="_blank" rel="noopener">官网</a></li><li><a href="https://www.cnblogs.com/along21/p/10255681.html" target="_blank" rel="noopener">Supervisor 为服务创建守护进程</a></li><li><a href="https://juejin.im/entry/5c1f01616fb9a049cd543042" target="_blank" rel="noopener">Supervisor使用教程</a></li><li><a href="https://www.jianshu.com/p/866a755e2c2d" target="_blank" rel="noopener">Spring Boot 项目自动发布与Supervisor</a></li></ul>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> java </tag>
<tag> https </tag>
</tags>
</entry>
<entry>
<title>深入了解java虚拟机</title>
<link href="/2019/04/01/36-2019-04-01-shen-ru-liao-jie-java-xu-ni-ji/"/>
<url>/2019/04/01/36-2019-04-01-shen-ru-liao-jie-java-xu-ni-ji/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p> 系统记录jvm相关知识点,形成系统性知识结构。</p><a id="more"></a><p>[toc]</p><h2 id="jvm是什么"><a href="#jvm是什么" class="headerlink" title="jvm是什么"></a>jvm是什么</h2><p><code>Java虚拟机</code>(英语:<code>Java Virtual Machine</code>,缩写为JVM),一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做。<br>Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java 虚拟机在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。</p><blockquote><p><strong>我的理解:</strong> jvm其实就是一个软件,运行于操作系统之上<br>,当我们输入信息(字节码文件)时,它就帮我们解释成当前操作系统能理解的机器指令,由机器执行完,输出结果。这就是java程序执行的过程。</p></blockquote><h2 id="jvm的组成"><a href="#jvm的组成" class="headerlink" title="jvm的组成"></a>jvm的组成</h2><p>java虚拟机主要有四部分组成:<code>类装载子系统(ClassLoader)</code>、<code>运行时数据区</code>、<code>执行引擎</code>、<code>垃圾收集</code>.</p><p>其中我们最为关注的<code>运行时数据区</code>,也就是JVM的内存部分则是由<code>方法区(Method Area)</code>、<code>JAVA堆(Java Heap)</code>、<code>虚拟机栈(JVM Stack)</code>、<code>程序计数器</code>、<code>本地方法栈(Native Method Stack)</code>这几部分组成。</p><p><img src="http://oss.willhappy.cn/hexo/img/2019-8-31-14-18-3.png-willhappy" alt="jvm结构图"></p><p>先看张详细的总图,各部分之间的联系,这张图是结合下面这段简单代码来绘制的jvm工作流程。<br>当然,想要更进一步的理解jvm工作流程,也要学会理解分析jvm指令码(javap生成的),有必要的话,之后会总结一片分析指令码的文章(//todo)<br>现在也可以自己使用<code>javap命令</code>生成下,然后对照<a href="https://segmentfault.com/a/1190000008722128" target="_blank" rel="noopener">jvm字节码指令表</a>分析一下下面程序。</p><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">Math</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> Integer CONSTANT <span class="token operator">=</span> <span class="token number">666</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> Math math <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Math</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> c <span class="token operator">=</span> math<span class="token punctuation">.</span><span class="token function">compute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>c<span class="token punctuation">)</span><span class="token punctuation">;</span> Math math2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Math</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> c2 <span class="token operator">=</span> math2<span class="token punctuation">.</span><span class="token function">compute</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>c2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">compute</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">int</span> b <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">int</span> c <span class="token operator">=</span> <span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span> <span class="token operator">*</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token keyword">return</span> c<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="http://oss.willhappy.cn/hexo/img/2019-8-31-14-20-30.png-willhappy" alt="jvm工作流程总图"></p><p>下面分开理解jvm各个部分。</p><h3 id="程序计数器(Program-Counter-Register)"><a href="#程序计数器(Program-Counter-Register)" class="headerlink" title="程序计数器(Program Counter Register)"></a>程序计数器(Program Counter Register)</h3><p>也叫<code>PC寄存器</code>,是一块较小的内存空间,它可以看做是<u>当前线程所执行的字节码的行号指示器</u>。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li>线程私有内存,每条线程都要有一个独立的程序计数器</li><li>如果线程正在执行 <code>Java</code> 方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行 <code>native</code> 方法,则计数器为空</li><li>唯一一个不会出现 <code>OutOfMemoryError</code> 的内存区域</li></ul><h3 id="虚拟机栈区-JVM-Stack)"><a href="#虚拟机栈区-JVM-Stack)" class="headerlink" title="虚拟机栈区(JVM Stack)"></a>虚拟机栈区(JVM Stack)</h3><p><code>虚拟机栈</code>描述了Java方法执行的内存模型:每个方法在执行的同时都会创建一个<code>栈帧</code>,用于存储<code>局部变量表</code>、<code>操作数栈</code>、<code>动态链接</code>、<code>方法出口</code>等信息。<u>每一个方法从调用直至完成的过程,都对应一个栈帧从入栈到出栈的过程</u>。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li><u>线程私有内存</u>,它的生命周期与线程相同(随线程而生,随线程而灭)</li><li>在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出<code>StackOverflowError</code>异常;如果虚拟机栈可以动态扩展(当前大部分的Java虚拟机都可动态扩展,只不过Java虚拟机规范中也允许固定长度的虚拟机栈),如果扩展时无法申请到足够的内存,就会抛出<code>OutOfMemoryError</code>异常。 –《深入理解Java虚拟机》</li></ul><p>这部分结构最好结合代码来理解一下,比较抽象。</p><p><strong>栈帧</strong>:执行<code>main()</code>方法时,创建一个栈帧,压入栈,我们称其为<code>main()-栈帧</code>吧,同样的,执行到<code>compute()</code>, 会有一个<code>compute()-栈帧</code>被压入栈。当<code>compute()</code>执行完成,那么,就伴随着<code>compute()-栈帧</code>出栈,<code>main()</code>是同样的道理。这也就符合了栈先进后出(FILO)数据结构特点。</p><p><strong>局部变量表</strong>:一组局部变量值存储空间,用于存放方法参数和方法内部定义的局部变量。比如本例中:<code>a=1</code>, <code>a=2</code>, <code>math</code>, <code>math2</code>, ……</p><p><strong>操作数栈</strong>:当方法刚开始执行时,这个方法的操作数栈是空的,在方法执行的过程中,会有各种字节码指向操作数栈中写入和提取值,也就是入栈与出栈操作。如:<code>(a + b) * 10</code>, 即是先将a的值1,压入操作数栈,将b的值2压入栈,指令执行相加变为值3(其实是2,1出栈执行相加指令得到3,把3重新压入操作数栈),再把把数值10压入栈,同样的操作,出栈相乘,把相乘的值压入栈,最后,把数值赋给局部变量,存入局部变量表。通过这样的一系列操作看,<u>操作数栈其实就是一个进行计算操作的临时中转存储区域</u>。</p><p><strong>动态链接</strong>:Java虚拟机栈中,每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的<code>动态连接(Dynamic Linking)</code>。这些符号引用一部分会在类加载阶段或者第一次使用时就直接转化为直接引用,这类转化称为<code>静态解析</code>。另一部分将在每次运行期间转化为直接引用,这类转化称为<code>动态连接</code>。<u>我的理解:当执行到调用方法处时,jvm是是如何找到对应的方法代码的呢?其实就是在动态链接区域存储着方法对应jvm指令码的内存地址,方法执行时,通过这个内存地址,去方法区中找到方法对应的代码指令执行(理解可能不完全准确,比较抽象,最好结合jvm指令码文件自己分析一下)</u></p><p>解释一:<br>符号引用和直接引用在运行时进行解析和链接的过程,叫<strong>动态链接</strong>。</p><p>一个方法调用另一个方法,或者一个类使用另一个类的成员变量时,需要知道其名字;符号引用就相当于名字,这些被调用者的名字就存放在Java字节码文件里(.class 文件);名字是知道了,但是Java真正运行起来的时候,如何靠这个名字(符号引用)找到相应的类和方法。</p><p>需要解析成相应的直接引用,利用直接引用来准确地找到。</p><p><strong>方法出口</strong>:两种方式退出该方法,<code>正常完成出口</code>和<code>异常完成出口</code>。方法退出过程实际上就等同于把当前栈帧出栈,因此退出可以执行的操作有:恢复上层方法的局部变量表和操作数栈,把返回值(如果有的话)压如调用者的操作数栈中,调整PC计数器的值以指向方法调用指令后的下一条指令。</p><p><strong>附加信息</strong>:虚拟机规范允许具体的虚拟机实现增加一些规范中没有描述的信息到栈帧之中,例如和调试相关的信息,这部分信息完全取决于不同的虚拟机实现。在实际开发中,一般会把动态连接,方法返回地址与其他附加信息一起归为一类,称为栈帧信息。</p><p>具体的关于通过<code>javap命令</code>生成的指令码的分析方法,可以参考:<a href="https://zhuanlan.zhihu.com/p/45354152" target="_blank" rel="noopener">文章</a></p><h3 id="本地方法栈-Native-Method-Stack"><a href="#本地方法栈-Native-Method-Stack" class="headerlink" title="本地方法栈(Native Method Stack)"></a>本地方法栈(Native Method Stack)</h3><p><code>本地方法栈(Native Method Stack)</code>与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务(也就是字节码)服务,而本地方法栈为虚拟机使用到的Native方法服务。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li>Java虚拟机规范对本地方法栈使用的语言、使用方法与数据结构并没有强制规定,因此可以由虚拟机自由实现。例如:HotSpot虚拟机直接将本地方法栈和虚拟机栈合二为一。</li><li>同虚拟机栈相同,Java虚拟机规范对这个区域也规定了两种异常情况<code>StackOverflowError</code> 和 <code>OutOfMemoryError</code>异常。</li></ul><h3 id="Java堆(Java-Heap)"><a href="#Java堆(Java-Heap)" class="headerlink" title="Java堆(Java Heap)"></a>Java堆(Java Heap)</h3><p><code>Java堆</code>是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是<u>存放对象实例,几乎所有的对象实例都在这里分配内存</u>。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li>线程共享内存,所有线程共享的一块内存区域</li><li>所有的<code>对象实例以及数组</code>都要在堆上分配,但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,<code>栈上分配</code>、<code>标量替换优化</code>技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。参考<a href="https://www.hollischuang.com/archives/3875" target="_blank" rel="noopener">文章</a></li><li>Java堆是垃圾收集器管理的主要区域,也称为<code>GC堆</code>.从内存回收的角度看,由于现在收集器基本都采用分代收集算法,所以Java堆可以细分为:新生代、老生代</li><li>如果在堆中没有内存完成实例分配,并且堆上也无法再扩展时,将会抛出OutOfMemoryError异常</li></ul><p>//todo Java堆涉及到垃圾收集,会单独写文章来分析垃圾收集相关知识。</p><h3 id="方法区(Method-Area)"><a href="#方法区(Method-Area)" class="headerlink" title="方法区(Method Area)"></a>方法区(Method Area)</h3><p><code>方法区(Method Area)</code>与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的<code>类信息</code>、<code>常量</code>、<code>静态变量</code>、<code>即时编译器编译后的代码</code>等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 <code>Non-Heap(非堆 )</code>,目的应该是与Java堆区分开来。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li>线程共享内存,各个线程共享的内存区域</li><li>Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样 不需要连续的内存和可以选择固定大小或者可扩展之外,还可以选择不实现垃圾回收。 这区域的内存回收目标主要是针对常量池的回收和类型的卸载,一般而言,这个区域的内存回收比较难以令人满意,尤其是类型的回收,条件相当苛刻,但是这部分区域的内存回收确实是必要的</li><li>当方法区无法满足内存分配需求时,将抛出<code>OutOfMemoryError</code>异常</li></ul><p><strong>永久代与元空间</strong></p><p>这里区分两个概念, 有时会看到方法区被称为<code>永久代</code>,其实两者有着本质的区别。方法区是 JVM 规范中的定义,而永久代是 JVM 规范的一种实现,并且只有在 HotSpot 虚拟机中如此,其他虚拟机中没有永久代的说法。</p><p>在 <code>JDK1.6</code> 之前,HotSpot 虚拟机把 GC 分代收集扩展至方法区,或者说使用永久代实现方法区。不过永久代有 <code>-XX:MaxPermSize</code> 的上限,很容易遇到内存溢出问题。</p><p>所以在 <code>JDK1.7</code> 中,将部分数据已经转移 <code>Java Heap</code> 或 <code>Native Heap</code> 中,例如:将原本放在永久代中的<code>字符串池</code>和<code>类的静态变量</code>移出到 <code>Java Heap</code> 中,将符号引用转移到 <code>Native Heap</code> 中。但永久代仍然存在,并没有移除。</p><p>在 <code>JDK1.8</code> 中,取消了永久代,代替为<code>元空间</code>实现,它也是 JVM 规范中方法区的一种实现。不过它与永久代最大的不同是:元空间并不在虚拟机中,而是将元空间放到本地内存中。所以默认情况下,它只受本地内存的限制,可以通过 <code>-XX:MetaspaceSize</code> 参数设置初始空间大小,默认没有最大空间限制。</p><p><strong>why 取消永久代</strong></p><p>移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。</p><h3 id="运行时常量池-Runtime-Constant-Pool"><a href="#运行时常量池-Runtime-Constant-Pool" class="headerlink" title="运行时常量池(Runtime Constant Pool)"></a>运行时常量池(Runtime Constant Pool)</h3><p><code>运行时常量池(Runtime Constant Pool)</code>是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),<u>用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放</u>。 –《深入理解Java虚拟机》</p><p><strong>特点</strong>:</p><ul><li><code>动态性</code>是运行时常量池相对于 Class 文件常量池的一个重要特征,即不要求常量一定只有编译期才能产生,运行期间也可能将新的常量放入池中,比如String类的<code>intern()</code>方法</li><li>运行时常量池受到方法区内存的限制,如果常量池无法再申请内存,就会抛出 <code>OutOfMemoryError</code> 异常。</li></ul><h3 id="直接内存"><a href="#直接内存" class="headerlink" title="直接内存"></a>直接内存</h3><p><code>直接内存</code>不是运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域, 是利用 <code>Native</code> 函数库在 Java 堆外申请分配的内存区域.<br>比如 <code>NIO</code> 中的 <code>DirectByteBuffer</code> 就可以作为这块内存的引用进行操作直接内存.</p><p><strong>特点</strong>:</p><ul><li>避免在 <code>Java 堆</code>和 <code>Native 堆</code>中复制数据以提高性能</li><li>这一部分内存也被频繁使用,而且也有可能导致<code>OutOfMemoryError</code>异常出现</li><li>内存的分配不受Java堆大小的限制,但是他还是会收到服务器总内存的影响</li></ul>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> interview </tag>
<tag> jvm </tag>
</tags>
</entry>
<entry>
<title>mysql全文索引</title>
<link href="/2018/09/13/35-2018-09-13-mysql-quan-wen-suo-yin/"/>
<url>/2018/09/13/35-2018-09-13-mysql-quan-wen-suo-yin/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>由前面<a href="xx">倒排索引</a>延申过来,做一个学习记录,方便以后使用到对大规模文档的关键字搜索服务。</p><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><h3 id="mysql索引类型"><a href="#mysql索引类型" class="headerlink" title="mysql索引类型"></a>mysql索引类型</h3><ul><li>primary 唯一索引,不允许为null</li><li>NORMAL 普通非唯一索引</li><li>UNIQUE 表示唯一的,不允许重复的索引,可以为null</li><li>FULLTEXT 表示全文搜索的索引。 FULLTEXT用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的INDEX 也可以</li><li>SPATIAL 只有MyISAM引擎支持,并且支持的不好。可以忽略</li></ul><h3 id="mysql索引方法"><a href="#mysql索引方法" class="headerlink" title="mysql索引方法"></a>mysql索引方法</h3><ul><li>HASH</li><li>BTREE</li></ul><p>区别详见<a href="https://blog.csdn.net/u011305680/article/details/55520853" target="_blank" rel="noopener">文章1</a>, <a href="https://blog.csdn.net/defonds/article/details/46779169" target="_blank" rel="noopener">文章2</a></p><h3 id="全文索引"><a href="#全文索引" class="headerlink" title="全文索引"></a>全文索引</h3><p>我们应用里面经常要用到搜索功能,一般简单的搜索功能我们使用MySQL的关键字Like实现模糊查询即可,但使用Like语句一般不会使用到索引,在数据量大的时候效率会大大降低,亦或我们需要全文搜索的时候,这个时候索引就变得特别重要。</p><p><a href="https://xinyo.org/archives/66421" target="_blank" rel="noopener">更多…</a></p><p><strong>MySQL支持三种模式的全文检索模式:</strong></p><ul><li>自然语言模式(IN NATURAL LANGUAGE MODE)</li><li>布尔模式(IN BOOLEAN MODE)</li><li>查询扩展模式 (WITH QUERY EXPANSION)</li></ul><blockquote><p>参考文档:</p><ol><li><a href="https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html" target="_blank" rel="noopener">官方文档</a></li><li><a href="https://my.oschina.net/guqj/blog/866570" target="_blank" rel="noopener">MySql全文索引详解</a></li><li><a href="https://zhuanlan.zhihu.com/p/33977653" target="_blank" rel="noopener">全文检索</a></li></ol></blockquote><h3 id="关于索引使用的注意事项"><a href="#关于索引使用的注意事项" class="headerlink" title="关于索引使用的注意事项"></a>关于索引使用的注意事项</h3><p>参考: <a href="http://thephper.com/?p=142" target="_blank" rel="noopener">mysql索引需要了解的几个注意</a></p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>关于一点,全文检索,对于我们需求,也就是刚开始提到的根据视频名称或文章名称模糊查询,有没有必要使用全文检索呢?</p><p>个人看法:</p><ul><li>前期项目数据量不大,可以使用普通索引,like模糊查询解决</li><li>后期数据量上来了,可以自己去维护倒排索引,定时维护,查询去查倒排索引,至于分词可能有些疑惑</li><li>小规模文本(像文章名称这些),尽量避开全文索引,可能全文索引对大规模文本,效果较好</li></ul><p>关于一个查询,可以引出一系列的知识点,这仅仅是大数据量查询的起点基础而已,后面还需要再进行知识的深入,基础知识只做备忘处理,关键在与后期在基础上的深入理解学习,才能达到融会贯通。</p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> mysql </tag>
</tags>
</entry>
<entry>
<title>搜索引擎算法-倒排索引</title>
<link href="/2018/09/12/34-2018-09-12-sou-suo-yin-qing-suan-fa-dao-pai-suo-yin/"/>
<url>/2018/09/12/34-2018-09-12-sou-suo-yin-qing-suan-fa-dao-pai-suo-yin/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>由于公司需要从海量的视频资源中快速搜索到相关性高的视频,中间考虑过like的使用,由于需要取得多张表的资源并集,并进行like匹配还有其他条件的匹配,但是这样如果数据量上去的话,查询效率是极低的;然后,后面有同学提到使用维护倒排索引的方案解决,所以,特此查看此解决方案;在这个过程中,也有看到过使用mysql的全文索引解决mysql大数据量搜索的方案,但是,mysql全文索引针对大篇幅文档的搜索效果是好的,比较简短的文档,搜索效果可能一般,但是,秉着举一反三地思想,我们后面会开一篇mysql全文索引的文章。</p><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><h3 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h3><p>倒排索引是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射,常被应用于搜索引擎和关键字查询的问题中。</p><p>见名知其意,有倒排索引(inverted index),就有正排索引(forward index),我们主要举例来看区别,加深理解。</p><p>以英文为例,下面是要被索引的文本:</p><pre class=" language-shell"><code class="language-shell">T0 = "it is what it is" T1 = "what is it" T2 = "it is a banana" </code></pre><p>我们就能得到下面的反向文件索引:</p><pre class=" language-shell"><code class="language-shell">"a": {2}"banana": {2}"is": {0, 1, 2}"it": {0, 1, 2}"what": {0, 1}</code></pre><p>正向索引是用来存储每个文档的单词列表,即通过文档编号可以查询到关键字的集合;而反向索引则是通过关键词来找到关键词所在的文档,可以迅速定位到关键字对应的文档列表。</p><h3 id="单词——文档矩阵"><a href="#单词——文档矩阵" class="headerlink" title="单词——文档矩阵"></a>单词——文档矩阵</h3><p>单词-文档矩阵是表达两者之间所具有的一种包含关系的概念模型<br>| 关键字/文档 | 文档1 | 文档2 | 文档3 | 文档4 |<br>|:———-:|:—–:|:—–:|:—–:|:—–:|<br>| 关键字1 | √ | | √ | |<br>| 关键字2 | | √ | | |<br>| 关键字3 | | √ | √ | |<br>| 关键字4 | √ | | | √ |<br>| 关键字5 | | √ | √ | |<br>| 关键字6 | √ | √ | | √ |</p><p>从纵向即文档维度来看,是每个文档包含了哪些关键字,即是正常的我们查询文档,可以查看关键字列表,如文档1中有关键词1,4,6;<br>从横向即关键字维度来看,是每个关键字在哪些文档中出现过,即是我们通过关键字快速查询到相关的文档,如关键字4在文档1,4中出现,快速定位到文档列表。</p><p>搜索引擎的索引其实就是实现“单词-文档矩阵”的具体数据结构。可以有不同的方式来实现上述概念模型,比如“倒排索引”、“签名文件”、“后缀树”等方式。但是各项实验数据表明,“倒排索引”是实现单词到文档映射关系的最佳实现方式。</p><p>总结来看:</p><blockquote><p>正排索引:文档编号到关键字的关联关系<br>倒排索引:关键字到文档编号的关联关系</p></blockquote><h3 id="倒排索引-查询过程"><a href="#倒排索引-查询过程" class="headerlink" title="倒排索引-查询过程"></a>倒排索引-查询过程</h3><p>查询包含某关键字的文档</p><ol><li>通过倒排索引获得某关键字对应的文档id列表</li><li>通过正排索引查询id列表对应文档的完整内容</li><li>返回最终结果</li></ol><h3 id="倒排索引-重要组成部分"><a href="#倒排索引-重要组成部分" class="headerlink" title="倒排索引-重要组成部分"></a>倒排索引-重要组成部分</h3><ul><li>单词词典(Term Dictionary)</li><li>倒排列表(PostingList)</li></ul><p><strong>单词词典:</strong><br>单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息。在支持搜索时,根据用户的查询词,去单词词典里查询,就能够获得相应的倒排列表,并以此作为<strong>后续排序的基础</strong>。</p><p><strong>倒排列表:</strong><br>倒排列表记载了<strong>出现过某个单词的所有文档的文档列表</strong>及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。倒排列表的更多,参考<a href="https://juejin.im/post/5b799cf551882542f676daba" target="_blank" rel="noopener">文章</a>中关于倒排列表的部分。</p><h3 id="单词词典-常用数据结构"><a href="#单词词典-常用数据结构" class="headerlink" title="单词词典-常用数据结构"></a>单词词典-常用数据结构</h3><ul><li>哈希加链表结构</li><li>树形词典结构</li></ul><p>对于一个规模很大的文档集合来说,可能包含几十万甚至上百万的不同单词,能否快速定位某个单词,这直接影响搜索时的响应速度,所以需要高效的数据结构来对单词词典进行构建和查找.</p><p>关于这两种数据结构的介绍,请查看<a href="http://www.cnblogs.com/zlslch/p/6440114.html" target="_blank" rel="noopener">文章</a>,在这里就不再重复了。</p><h3 id="如何得到单词列表-分词"><a href="#如何得到单词列表-分词" class="headerlink" title="如何得到单词列表-分词"></a>如何得到单词列表-分词</h3><p>如何通过一篇大规模的文档得到我们的关键字词典,就需要用到<strong>分词技术</strong>,通常在创建文档和更新文档时来进行分词的操作。</p><p>关于分词的知识点请关注<a href="https://juejin.im/post/5b799cf551882542f676daba" target="_blank" rel="noopener">文章</a>,介绍的很详细,关键是中文和英文分词的区别。</p><blockquote><p>声明:感谢学习期间,各位博主文章的启发,特此声明本文章只做学习记录使用。<br>参考文档:</p><ol><li><a href="http://www.cnblogs.com/zlslch/p/6440114.html" target="_blank" rel="noopener">什么是倒排索引?</a></li><li><a href="https://juejin.im/post/5b799cf551882542f676daba" target="_blank" rel="noopener">Elasticsearch 6.x 倒排索引与分词</a></li></ol></blockquote>]]></content>
<categories>
<category> 大数据 </category>
</categories>
<tags>
<tag> 算法 </tag>
</tags>
</entry>
<entry>
<title>gitlab搭建端口配置踩坑和ssh多账户配置解读</title>
<link href="/2018/07/03/31-2018-07-03-gitlab-da-jian-cai-keng-he-ssh-duo-zhang-hu-pei-zhi-jie-du/"/>
<url>/2018/07/03/31-2018-07-03-gitlab-da-jian-cai-keng-he-ssh-duo-zhang-hu-pei-zhi-jie-du/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>因为公司刚开展新项目,之前都是使用的svn,现在转成git进行版本控制,虽然自己之前很久开始使用git,但是对于git的https和ssh两种传输方式只是一知半解,也造就了今天发时间去搞清楚这个东西,时间搭了,搞清楚也是值得的,对以后自己工作的顺利开展还是有帮助的,所以也在此记录,可能主要记录过程,以参考别人文章为主,都是有用文章,避免以后查看费劲,长时间的资料过滤,不划算。</p><a id="more"></a><p>[toc]</p><h3 id="一-关于gitlab搭建"><a href="#一-关于gitlab搭建" class="headerlink" title="一. 关于gitlab搭建"></a>一. 关于gitlab搭建</h3><p>gitlab搭建是由同事搭建完成,所以并未参与,这里只附比较高质量的教程。<br>下面教程都是基于docker搭建的gitlab.</p><p>gitlab官方教程:<a href="https://docs.gitlab.com/omnibus/docker/README.html#after-starting-a-container" target="_blank" rel="noopener">GitLab Docker images</a><br>掘金:<a href="https://juejin.im/post/5a4c9ff36fb9a04507700fcc" target="_blank" rel="noopener">通过 docker 搭建自用的 gitlab 服务</a></p><p>❗注:教程中在做端口映射的时候,都将容器的22端口映射到宿主机的22端口,但是很可能这个docker容器是创建不成功的,为什么呢? 因为22端口是被占用的,我们登陆远程主机是通过22端口的,所以不会创建成功的。至于解决方案,参考一下文章:</p><p><a href="https://92du.github.io/2018/06/28/Docker%E9%83%A8%E7%BD%B2GitLab/" target="_blank" rel="noopener">Docker 部署 GitLab#2.修改ssh和nginx端口</a></p><p>但是这样又有一个比较恶心的问题,重启docker服务后,再登陆gitlab你会发现,ssh地址上出现<code>:2222</code>加上端口访问的地址,看着很恶心。解决方案,参考下面文章(可以自己测试,我没测试,比较麻烦,原谅我比较懒):</p><p><a href="https://devtor.cn/operation/gogs-and-linux-shares-port22.html" target="_blank" rel="noopener">Gogs与Linux共享SSH22端口</a><br><a href="http://notes.guoliangwu.com/2018/04/19/gitlab-docker-share-22-port/" target="_blank" rel="noopener">Docker运行Gitlab与Host共享22端口</a></p><p>📌总结:</p><ol><li>关于使用docker搭建gitlab整体过程相对简单,可能坑就在端口号的处理上,特别是22端口;</li><li>如果不在docker中搭建gitlab的话,对于22端口来说,如果host开放了,就不需要格外配置了,gitlab使用默认配置即可。</li></ol><h3 id="二-ssh多账户配置解读"><a href="#二-ssh多账户配置解读" class="headerlink" title="二. ssh多账户配置解读"></a>二. ssh多账户配置解读</h3><h4 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h4><p>❓why: 我们可能有自己的github,公司的gitlab等都需要ssh key, 当然我们都可以使用同意公钥来进行配置,但是,为了安全,我们对每个账户来分别配置公钥私钥。</p><h4 id="ssh原理及必要说明"><a href="#ssh原理及必要说明" class="headerlink" title="ssh原理及必要说明"></a>ssh原理及必要说明</h4><p>阮一峰:<a href="http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html" target="_blank" rel="noopener">SSH原理与运用</a><br>简书:<a href="https://www.jianshu.com/p/33461b619d53" target="_blank" rel="noopener">图解SSH原理</a></p><p>❗注:文章中有关于各个关于ssh的名词解释,仔细阅读。</p><h4 id="ssh多账户配置说明及实践"><a href="#ssh多账户配置说明及实践" class="headerlink" title="ssh多账户配置说明及实践"></a>ssh多账户配置说明及实践</h4><p>知乎:<a href="https://zhuanlan.zhihu.com/p/31253789" target="_blank" rel="noopener">ssh、git与多账户</a><br>掘金:<a href="https://juejin.im/post/5a8fe5d4f265da4e710f7042" target="_blank" rel="noopener">https://juejin.im/post/5a8fe5d4f265da4e710f7042</a><br><a href="https://w3ctrain.com/2016/03/06/mutiple-ssh-key/" target="_blank" rel="noopener">多个 git 账号的 ssh 配置</a></p><p>❗注:知乎的那篇文章要重点度,写的很好,因为网上大部分关于git多账户的解释都是模糊的,或者说有问题的。</p><p>📌总结:</p><ol><li>重点说下<code>~/.ssh/conf</code>文件,自己测试:</li></ol><ul><li><p><strong><code>Host</code>: 我们任意起名,但不可重复,尽量和Hostname保持一致,方便<code>git clone</code>等操作,不用修改地址,针对gitlab,github等,如果连接的是远程主机,可起简单点的名字,方便链接</strong></p></li><li><p><strong><code>Hostname</code>: 真实的主机域名或者IP地址,要与Host区分开来</strong></p></li><li><strong><code>User</code>: 登陆主机用户名, 像github,gitlab等服务提供商固定为git,默认为git</strong></li><li><strong>参考<code>知乎</code>那篇文章,充分理解这几个字段的意思,很重要</strong></li></ul><ol start="2"><li>配置git本地的用户名和email</li></ol><pre class=" language-shell"><code class="language-shell"># 取消全局 用户名/邮箱 配置$ git config –global –unset user.name$ git config –global –unset user.email# 查看全局用户名/email$ git config –global user.name$ git config –global user.email# 单独设置每个repo 用户名/邮箱$ git config user.name 'xxxx'$ git config user.email '[email protected]'</code></pre><p>ok, 在此记录,感觉各位作者带来的高质量文章,丰富了我的知识,再次感谢!</p>]]></content>
<categories>
<category> cvs </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title>【转】2018文章分享</title>
<link href="/2018/07/01/32-2018-07-01-share/"/>
<url>/2018/07/01/32-2018-07-01-share/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>自己查资料阅读到写的比较好的文章分享出来大家一起看。也欢迎大家支持原创!同时也方便自己以后查阅翻看。</p><a id="more"></a><p>[toc]</p><h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><ul><li>分享页分为几大类:<code>项目构建</code>,<code>框架</code>,<code>前端</code>,<code>后端</code>等</li><li>可在本页面使用<code>Ctrl+F</code>按日期搜索,也可以按主题搜索,<code>ex:</code> 2018/07/01, java</li><li>每大类按日期降序排列</li></ul><h4 id="项目构建"><a href="#项目构建" class="headerlink" title="项目构建"></a>项目构建</h4><p><strong>2018/07/01-Maven</strong> <a href="http://www.infoq.com/cn/news/2011/01/xxb-maven-3-pom-refactoring" target="_blank" rel="noopener">Maven实战——多模块项目的POM重构</a><br><strong>2018/09/04-url</strong> <a href="http://fex.baidu.com/blog/2014/05/what-happen/" target="_blank" rel="noopener">从输入 URL 到页面加载完成的过程中都发生了什么事情?</a></p><h4 id="框架"><a href="#框架" class="headerlink" title="框架"></a>框架</h4><p><strong>2018/07/01-spring</strong> <a href="https://www.cnblogs.com/wuchanming/p/5426746.html#undefined" target="_blank" rel="noopener">spring中bean配置和bean注入</a><br><strong>2018/07/01-RabbitMQ</strong> <a href="https://blog.csdn.net/whoamiyang/article/details/54954780" target="_blank" rel="noopener">RabbitMQ的应用场景以及基本原理介绍</a><br><strong>2018/07/01-SpringWorld</strong> <a href="https://www.jianshu.com/p/f4c81373094f" target="_blank" rel="noopener">SpringBoot+zk+dubbo架构实践</a><br><strong>2018/09/03-日志</strong> <a href="https://www.cnblogs.com/Sinte-Beuve/p/5758971.html" target="_blank" rel="noopener">slf4j log4j logback关系详解和相关用法</a><br><strong>2018/09/04-日志</strong> <a href="http://tengj.top/2017/04/05/springboot7/" target="_blank" rel="noopener">Spring Boot干货系列:(七)默认日志logback配置解析</a></p><h4 id="前端"><a href="#前端" class="headerlink" title="前端"></a>前端</h4><p><strong>2018/07/01-前端</strong> <a href="https://www.jianshu.com/p/bef1c1ee5a0e" target="_blank" rel="noopener">一起理解 Virtual DOM</a><br><strong>2018/07/01-前端</strong> <a href="http://tinyambition.com/Single-Page-App-Break/" target="_blank" rel="noopener">单页应用开发权威指南</a><br><strong>2018/07/01-vue</strong> <a href="http://www.qinshenxue.com/article/20171102091836.html" target="_blank" rel="noopener">搭建 vue2 vue-router2 webpack3 多入口工程</a><br><strong>2018/07/13-兼容性</strong> <a href="https://imququ.com/post/document-scrollingelement-in-chrome.html" target="_blank" rel="noopener">Chrome 中 scrollingElement 的变化</a><br><strong>2018/08/30-跨域</strong> <a href="https://www.cnblogs.com/sloong/p/cors.html" target="_blank" rel="noopener">CORS 跨域 实现思路及相关解决方案</a></p><h4 id="后端"><a href="#后端" class="headerlink" title="后端"></a>后端</h4><p><strong>2018/07/01-java</strong> <a href="https://goo.gl/6Yafjb" target="_blank" rel="noopener">Java内存模型(需科学上网)</a><br><strong>2018/08/16-Java多线程系列</strong> <a href="http://www.cnblogs.com/skywang12345/p/3533887.html" target="_blank" rel="noopener">Java多线程系列–“JUC锁”09之 CountDownLatch原理和示例</a></p><h4 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h4><p><strong>2018/12/03-单元测试</strong> <a href="https://gitbook.cn/books/58f5a5c8b7f44bd669c11b79/index.html" target="_blank" rel="noopener">单元测试之旅:预见优秀</a></p><h4 id="API"><a href="#API" class="headerlink" title="API"></a>API</h4><p><strong>2018/12/03-java8新特性</strong> <a href="http://www.importnew.com/11908.html" target="_blank" rel="noopener">Java 8新特性终极指南</a><br><strong>2018/12/03-java8新特性</strong> <a href="http://zh.lucida.me/blog/java-8-lambdas-insideout-language-features/" target="_blank" rel="noopener">深入理解Java 8 Lambda</a></p><h4 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h4><p><strong>2018/07/23-git</strong> <a href="http://blog.psjay.com/posts/git-revert-merge-commit/" target="_blank" rel="noopener">Git 撤销合并</a><br><strong>2018/07/23-git</strong> <a href="http://blog.chenzuhuang.com/archive/62.html" target="_blank" rel="noopener">Git使用revert命令撤销合并</a><br><strong>2018/07/23-git</strong> <a href="https://blog.csdn.net/paul_wei2008/article/details/77477932" target="_blank" rel="noopener">解决Git Revert操作后再次Merge代码被冲掉的问题</a><br><strong>2018/07/26-git</strong> <a href="https://blog.twofei.com/695/" target="_blank" rel="noopener">master、origin master 与 origin/master 有什么区别</a></p>]]></content>
<categories>
<category> 分享 </category>
</categories>
<tags>
<tag> articles </tag>
</tags>
</entry>
<entry>
<title>前端基础知识工作归结</title>
<link href="/2018/06/15/33-2018-06-15-qian-duan-ji-chu-gui-jie/"/>
<url>/2018/06/15/33-2018-06-15-qian-duan-ji-chu-gui-jie/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>由于工作需要,所以巩固一下前端的基础知识,因为不是专职前端coder,所以补的都是基础的基础,勿喷…😭</p><h3 id="1-jquery给动态生成的元素添加绑定事件"><a href="#1-jquery给动态生成的元素添加绑定事件" class="headerlink" title="1. jquery给动态生成的元素添加绑定事件"></a>1. jquery给动态生成的元素添加绑定事件</h3><pre class=" language-javascript"><code class="language-javascript"><span class="token function">$</span><span class="token punctuation">(</span>parentSelector<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'event'</span><span class="token punctuation">,</span> childSelector<span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token operator">...</span><span class="token punctuation">}</span><span class="token punctuation">)</span></code></pre><p>说明:选择动态元素的某个父级静态元素来绑定,父级元素必须为静态的,否则不效果</p><h3 id="2-append-prepend-after-before区分"><a href="#2-append-prepend-after-before区分" class="headerlink" title="2. append,prepend,after,before区分"></a>2. append,prepend,after,before区分</h3><p>Ex:</p><pre class=" language-javascript"><code class="language-javascript"><span class="token operator"><</span>script type<span class="token operator">=</span><span class="token string">"text/javascript"</span> src<span class="token operator">=</span><span class="token string">"http://common.jb51.net/jslib/jquery/jquery.min.js"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span><span class="token operator"><</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"testdiv"</span><span class="token operator">></span> <span class="token operator"><</span>ul<span class="token operator">></span> <span class="token operator"><</span>li<span class="token operator">></span>第一个li标签<span class="token operator"><</span><span class="token operator">/</span>li<span class="token operator">></span> <span class="token operator"><</span><span class="token operator">/</span>ul<span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>div<span class="token operator">></span><span class="token operator"><</span>script<span class="token operator">></span> <span class="token comment" spellcheck="true">//append</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.testdiv ul'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">'<li>append 插入的li</li>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//prepend</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.testdiv ul'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">prepend</span><span class="token punctuation">(</span><span class="token string">'<li>prepend 插入的li</li>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//after</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.testdiv ul'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">after</span><span class="token punctuation">(</span><span class="token string">'<li>after 插入的li</li>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//before</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'.testdiv ul'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">before</span><span class="token punctuation">(</span><span class="token string">'<li>before 插入的li</li>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre><p>运行结果:</p><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>testdiv<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>before 插入的li<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>prepend 插入的li<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>第一个li标签<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>append 插入的li<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span>after 插入的li<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre><h3 id="3-js中的-与-amp-amp-运算符"><a href="#3-js中的-与-amp-amp-运算符" class="headerlink" title="3. js中的 || 与 && 运算符"></a>3. js中的 || 与 && 运算符</h3><p>这个都不会,是不是该打脸…</p><p><strong>公式</strong><br>表达式a && 表达式b :<br>计算表达式a(也可以是函数)的运算结果,<br>如果为 True, 执行表达式b(或函数),并返回b的结果;<br>如果为 False,返回a的结果;</p><p>表达式a || 表达式b :<br>计算表达式a(也可以是函数)的运算结果,<br>如果为 Fasle, 执行表达式b(或函数),并返回b的结果;<br>如果为 True,返回a的结果;</p><p><strong>转换规则</strong><br>对象为true;<br>非零数字为true;<br>零为false;<br>非空字符串为true;<br>空字符串为法false;<br>undefined为false<br>其他为false;</p><p><strong>Ex:</strong></p><pre class=" language-javascript"><code class="language-javascript"><span class="token keyword">var</span> a <span class="token operator">=</span> obj <span class="token operator">||</span> <span class="token string">" "</span> <span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//如果 obj 为空,a就赋值为 “ ” ;</span><span class="token keyword">var</span> a <span class="token operator">=</span> <span class="token function">check</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token keyword">do</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//如果check()返回为真,就执行do(),并将结果赋值给 a;</span></code></pre><p>||和&& 运算符的优先级参考<a href="http://blog.csdn.net/lidiansheng/article/details/7962770" target="_blank" rel="noopener">文章</a></p><h3 id="4-js匿名函数的使用"><a href="#4-js匿名函数的使用" class="headerlink" title="4. js匿名函数的使用"></a>4. js匿名函数的使用</h3><p>实际上这两种写法都是匿名函数的写法。<br>第一种写法 var x = ( function( ){ … })( … ); 比较常见,它是先声明匿名函数,再执行。<br>第二种写法 var x = ( function( ){ … }( … ) ); 它是先强制执行表达式。(在js中,圆括号运算符与[]、.运算符具有最高的优先级)<br>其实你调试一下就知道了</p><pre class=" language-js"><code class="language-js"><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"你看不见我执行"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">)</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"竟然被你看见了"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">var</span> x <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"竟然又被你看见了"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h3 id="5-onlick-onsubmit-submit-的执行顺序"><a href="#5-onlick-onsubmit-submit-的执行顺序" class="headerlink" title="5. onlick onsubmit submit 的执行顺序"></a>5. onlick onsubmit submit 的执行顺序</h3><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>form</span> <span class="token attr-name">action</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>#<span class="token punctuation">"</span></span> <span class="token attr-name">method</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>POST<span class="token punctuation">"</span></span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>A<span class="token punctuation">"</span></span> <span class="token attr-name">onsubmit</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>return X();<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>text<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>Y()<span class="token punctuation">"</span></span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>submit<span class="token punctuation">"</span></span> <span class="token attr-name">value</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>提交<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>form</span><span class="token punctuation">></span></span></code></pre><p>自己写X()、Y()函数,我们会发现,这几个函数的执行顺序</p><p>1) onclick: Y()<br>2) onsubmit: X()<br>3) submit()</p><p>只要 onclick 未 return false 那么就继续执行 onsubmit<br>只要 onsubmit 未return false 那么表单就被提交出去了<br>另外一点写法上注意一定要 “return X();” 才能取得函数的返回值,否则只是调用函数,返回值未被传递</p><p>正确写法:</p><pre class=" language-html"><code class="language-html"><span class="token comment" spellcheck="true"><!-- X() 返回false后,form的submit会被终止 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>input</span> <span class="token attr-name">type</span><span class="token attr-value"><span class="token punctuation">=</span>submit</span> <span class="token attr-name">onclick</span><span class="token attr-value"><span class="token punctuation">=</span>”return</span> <span class="token attr-name">X();”</span><span class="token punctuation">></span></span></code></pre><h3 id="6-JavaScript-之-回调函数的返回值给全局变量赋值问题"><a href="#6-JavaScript-之-回调函数的返回值给全局变量赋值问题" class="headerlink" title="6. JavaScript 之 回调函数的返回值给全局变量赋值问题"></a>6. JavaScript 之 回调函数的返回值给全局变量赋值问题</h3><p>jQuery 中,会遇到<code>$.get(url,data,callback,type)</code> 或 <code>$.post(url,data,callback,type)</code> 返回值给全局变量赋值的问题:</p><p>例如:</p><pre class=" language-js"><code class="language-js"><span class="token operator"><</span>script language<span class="token operator">=</span><span class="token string">"JavaScript"</span><span class="token operator">></span> <span class="token keyword">var</span> count<span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> $<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span> <span class="token string">"<%=path%>/AdminCenter/SysFunction/GetOrderNo"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> parentCode<span class="token punctuation">:</span> pc <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token punctuation">{</span> count <span class="token operator">=</span> data<span class="token punctuation">.</span>result<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"json"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">alert</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre><p>问题:想用JavaScript 取testController中GetIsExist的值,赋给test.aspx中的全局变量 count,可是返回的值只在$.getJSON中起作用count为8,在全局中显示时仍为1,请问该问题如何解决?</p><p>问题原因:Ajax是默认都是异步JavaScript&XML,浏览器解析页面时,JS只管执行当前代码,顺序执行。发送请求了,那是请求响应的事,它不管这些,只管继续执行在它面前的代码,所以不等Ajax响应返回,<br>便会继续向下执行,这时你的全局 count 仍然是初始值(在这里为1),如果你在回调函数function(data){}内部alert的话,就会是8了。</p><p>方法一:直接在回调函数中实现操作</p><pre class=" language-js"><code class="language-js"><span class="token operator"><</span>script language<span class="token operator">=</span><span class="token string">"JavaScript"</span><span class="token operator">></span> <span class="token keyword">var</span> count<span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> $<span class="token punctuation">.</span><span class="token function">post</span><span class="token punctuation">(</span> <span class="token string">"<%=path%>/AdminCenter/SysFunction/GetOrderNo"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> parentCode<span class="token punctuation">:</span> pc <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token punctuation">{</span> count <span class="token operator">=</span> data<span class="token punctuation">.</span>result<span class="token punctuation">;</span> <span class="token function">alert</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token string">"json"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre><p>方法二:在回调函数外实现,把异步改为同步 <code>async: false</code></p><pre class=" language-js"><code class="language-js"><span class="token operator"><</span>script language<span class="token operator">=</span><span class="token string">"JavaScript"</span><span class="token operator">></span> <span class="token keyword">var</span> count<span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> $<span class="token punctuation">.</span><span class="token function">ajax</span><span class="token punctuation">(</span><span class="token punctuation">{</span> url<span class="token punctuation">:</span> <span class="token string">"<%=path%>/AdminCenter/SysFunction/GetOrderNo"</span><span class="token punctuation">,</span> <span class="token keyword">async</span><span class="token punctuation">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token comment" spellcheck="true">//改为同步方式</span> type<span class="token punctuation">:</span> <span class="token string">"POST"</span><span class="token punctuation">,</span> data<span class="token punctuation">:</span> <span class="token punctuation">{</span> parentCode<span class="token punctuation">:</span> pc <span class="token punctuation">}</span><span class="token punctuation">,</span> success<span class="token punctuation">:</span> <span class="token keyword">function</span> <span class="token punctuation">(</span>data<span class="token punctuation">)</span> <span class="token punctuation">{</span> count <span class="token operator">=</span> data<span class="token punctuation">.</span>result<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> dataType<span class="token punctuation">:</span><span class="token string">"json"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">alert</span><span class="token punctuation">(</span>count<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre><h3 id="7-jQuery中-fn的用法示例介绍"><a href="#7-jQuery中-fn的用法示例介绍" class="headerlink" title="7. jQuery中$.fn的用法示例介绍"></a>7. jQuery中$.fn的用法示例介绍</h3><p><code>$.fn</code>是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效,<br>如扩展<code>$.fn.abc()</code>,即<code>$.fn.abc()</code>是对jquery扩展了一个abc方法,那么后面你的每一个jquery实例都可以引用这个方法了.<br>那么你可以这样子:$(“#div”).abc();</p><p>jQuery为开发插件提拱了两个方法,分别是:</p><p>jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法。<br>jQuery.fn.extend(object);给jQuery对象添加方法。</p><p>fn是什么东西呢。查看jQuery代码,就不难发现。<br>复制代码 代码如下:</p><pre class=" language-js"><code class="language-js">jQuery<span class="token punctuation">.</span>fn <span class="token operator">=</span> jQuery<span class="token punctuation">.</span>prototype <span class="token operator">=</span><span class="token punctuation">{</span> init<span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span> selector<span class="token punctuation">,</span> context <span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment" spellcheck="true">//.... </span> <span class="token comment" spellcheck="true">//......</span><span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre><p>原来 jQuery.fn =jQuery.prototype.对prototype肯定不会陌生啦。<br>jQuery便是一个封装得非常好的类,比如我们用语句 $(“#btn1”) 会生成一个 jQuery类的实例。</p><p>jQuery.extend(object); 为jQuery类添加添加类方法,可以理解为添加静态方法。如:<br>复制代码 代码如下:</p><pre class=" language-js"><code class="language-js">$<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span> add<span class="token punctuation">:</span><span class="token keyword">function</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>b<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">return</span> a<span class="token operator">+</span>b<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>便为 jQuery 添加一个为add 的“静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,</p><pre class=" language-js"><code class="language-js">$<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//return 7</span></code></pre><p><code>jQuery.fn.extend(object);</code>对<code>jQuery.prototype</code>进得扩展,就是为jQuery类添加“成员函数”。<br>jQuery类的实例可以使用这个“成员函数”。<br>比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert当前编辑框里的内容。可以这么做:</p><p>jQuery代码<br>复制代码 代码如下:</p><pre class=" language-js"><code class="language-js">$<span class="token punctuation">.</span>fn<span class="token punctuation">.</span><span class="token function">extend</span><span class="token punctuation">(</span><span class="token punctuation">{</span> alertWhileClick<span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">click</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token function">$</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">val</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>参考:</p><p><a href="http://blog.csdn.net/yangzhihello/article/details/8789032" target="_blank" rel="noopener">jQuery.fn和jQuery.prototype区别</a><br><a href="http://blog.csdn.net/suyu_yuan/article/details/52690278" target="_blank" rel="noopener">jQuery.prototype的含义</a><br><a href="http://blog.csdn.net/xuemoyao/article/details/19021659" target="_blank" rel="noopener">.extend()方法和(function(){})(jQuery)详解</a><br><a href="https://www.cnblogs.com/keyi/p/5919392.html" target="_blank" rel="noopener">$(function(){})和(function(jq){})(jQuery)区别</a></p><h3 id="8-JavaScript-unshift-方法"><a href="#8-JavaScript-unshift-方法" class="headerlink" title="8. JavaScript unshift() 方法"></a>8. JavaScript unshift() 方法</h3><h3 id="9-form表单提交-ajaxForm-提交-ajaxSubmit-提交区别"><a href="#9-form表单提交-ajaxForm-提交-ajaxSubmit-提交区别" class="headerlink" title="9. form表单提交,ajaxForm()提交,ajaxSubmit()提交区别"></a>9. form表单提交,ajaxForm()提交,ajaxSubmit()提交区别</h3><p>参考另一篇<a href="http://blog.willhappy.cn/2015/11/20/3_2015-11-20_jQuery.formANDjQuery.validate/">文章</a></p><h3 id="10-avalon-mix-extend-Ojbect-assign-js合并两个对象的不同点"><a href="#10-avalon-mix-extend-Ojbect-assign-js合并两个对象的不同点" class="headerlink" title="10. avalon.mix(),$.extend(),Ojbect.assign(),js合并两个对象的不同点"></a>10. avalon.mix(),$.extend(),Ojbect.assign(),js合并两个对象的不同点</h3><p>参考:</p><p><a href="https://www.cnblogs.com/yuqingfamily/p/5813650.html" target="_blank" rel="noopener">关于$.extend()深拷贝和浅拷贝</a><br><a href="https://www.cnblogs.com/Chen-XiaoJun/p/6217373.html" target="_blank" rel="noopener">Ojbect.assign()</a></p>]]></content>
<categories>
<category> 前端 </category>
</categories>
<tags>
<tag> 基础 </tag>
</tags>
</entry>
<entry>
<title>主页部署docker+ng+tomcat+https</title>
<link href="/2018/06/13/30-2018-06-13-zhu-ye-bu-shu-docker-ng-tomcat-https/"/>
<url>/2018/06/13/30-2018-06-13-zhu-ye-bu-shu-docker-ng-tomcat-https/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>上一章<a href="http://blog.willhappy.cn/2018/06/11/29_2018-06-11_docker%E5%88%9D%E8%AF%86/">docker初识</a>结合docker的文档,将博客主页所需的生产环境镜像及容器准备好了,这一章主要是写一些在博客部署到线上时出现的一些问题,从而对使用容器部署有一个更深层次的理解。</p><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>之前想着是使用一个纯净的linux镜像,然后使用dockerfile构建一个自己博客环境镜像的,但是自己的水平有限,目前就使用拉去官方镜像,进行一些配置,已达到自己的生产环境需求。后面有机会学习的话,会构建一个自己的镜像出来,期待ing。</p><p>另外,我是使用的服务器是google平台,搭建的服务器环境是基于debian(stretch 9.4),所以很多相关的服务器操作和centos有所不同,比如包管理工具apt-get,vim(<a href="https://blog.csdn.net/weixin_39800144/article/details/79231002" target="_blank" rel="noopener">需要安装</a>,<a href="https://wiki.debian.org/iptables" target="_blank" rel="noopener">iptables</a>)</p><h3 id="一-博客部署到tomcat容器"><a href="#一-博客部署到tomcat容器" class="headerlink" title="一. 博客部署到tomcat容器"></a>一. 博客部署到tomcat容器</h3><p>这个还是比较简单的,前面<a href="http://blog.willhappy.cn/2018/06/11/29_2018-06-11_docker%E5%88%9D%E8%AF%86/">一章</a>, 我们已经将主机中目录下的/usr/lcoal/docker/tomcat/apps挂载到容器的/apps, 那么我们可以直接将war包放到/usr/local/docker/tomcat/apps目录下,即可进入容器内部,然后进行相关配置。</p><pre class=" language-bash"><code class="language-bash">$ <span class="token function">cd</span> /usr/local/docker/tomcat/apps<span class="token comment" spellcheck="true"># 上传博客war包</span><span class="token comment" spellcheck="true"># 进入tomcat 容器</span>$ docker <span class="token function">exec</span> -it tomcat_will /bin/bash<span class="token comment" spellcheck="true"># tomcat容器shell操作,进入容器后,直接是在/usr/local/tomcat/目录下</span><span class="token comment" spellcheck="true"># 进入webapps/apps/目录下,会发现我们刚刚上传到宿主机的war包,把他移动到webapps目录下,会自动解压缩</span><span class="token comment" spellcheck="true"># 进入/usr/local/tomcat/conf/目录下,配置server.xml文件</span></code></pre><p>配置<code>server.xml</code>文件:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Host</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>localhost<span class="token punctuation">"</span></span> <span class="token attr-name">appBase</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>webapps<span class="token punctuation">"</span></span> <span class="token attr-name">unpackWARs</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">autoDeploy</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">xmlValidation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name">xmlNamespaceAware</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Context</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">docBase</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/usr/local/tomcat/webapps/XX你的项目名<span class="token punctuation">"</span></span> <span class="token attr-name">reloadable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Host</span><span class="token punctuation">></span></span></code></pre><p>推出tomcat容器,回到宿主机</p><pre class=" language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 重启tomcat容器</span>$ docker resatrt tomcat_will</code></pre><p>测试访问:<a href="http://35.197.142.179:8080/" target="_blank" rel="noopener">http://35.197.142.179:8080/</a> ,如果访问到你的项目说明部署成功。<br>如果出现无法访问的情况,请查看是否开放服务器端口号。可使用站长工具的<a href="http://tool.chinaz.com/" target="_blank" rel="noopener">端口扫描工具</a>来查看是否真正开放。<br>google平台的话,可在vpc网路中<a href="https://console.cloud.google.com/networking/firewalls/list?project=beaming-oarlock-197105&tab=INGRESS" target="_blank" rel="noopener">创建防火墙规则</a>来开放端口号。</p><h3 id="二-nginx-https相关配置"><a href="#二-nginx-https相关配置" class="headerlink" title="二. nginx+https相关配置"></a>二. nginx+https相关配置</h3><p>如果单纯只是http配置的话,相对简单,可参考<a href="https://blog.csdn.net/mlc1218559742/article/details/53117520" target="_blank" rel="noopener">文章</a>, 这里我们重点介绍结合配置https.</p><h4 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h4><p>docker的nginx容器,配置文件在<code>/etc/nginx</code>目录下,有<code>nginx.conf</code>主配置文件,会加载<code>conf.d/*.conf</code>目录的所有配置文件,通过<code>nginx.conf</code>可以看出。</p><pre class=" language-conf"><code class="language-conf">http { ... include /etc/nginx/conf.d/*.conf; ...}</code></pre><p>这也就是为什么我们在运行容器的时候,挂载<code>server.conf</code>到<code>conf.d/</code>目录下,这样可以通过主配置文件将其加载进来,我们就可直接在宿主机上目录下更改<code>server.conf</code>.当然,这仅限于更改http块里面的内容。</p><p>另外参考我的<a href="http://blog.willhappy.cn/2018/04/25/21_2018-04-25_%E5%B0%8F%E7%BB%BF%E9%94%81https%E7%9A%84web%E5%AE%B9%E5%99%A8%E9%85%8D%E7%BD%AE/">另一篇文章</a>来配置https,因为知道在哪里配置,配置的内容自然就差不多了。</p><h4 id="上传证书"><a href="#上传证书" class="headerlink" title="上传证书"></a>上传证书</h4><p>通过我们挂在目录,我们将证书上传docker容器,挂载文件主要是方便容器和宿主机的文件共享,避免了频繁的在宿主机和容器间进行文件的拷贝。</p><pre class=" language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 进入daocker nginx容器</span>$ docker <span class="token function">exec</span> -it nginx_will_v2 /bin/bash<span class="token comment" spellcheck="true"># 为了方便,我们把证书文件统一放到/etc/nginx/cert目录下</span></code></pre><h4 id="修改配置"><a href="#修改配置" class="headerlink" title="修改配置"></a>修改配置</h4><p>配置挂载文件/etc/nginx/conf.d/server.conf,当然可在容器内修改,也可在宿主机上修改,文件是共享的(我的理解,没有完全实践)。<br>server.conf添加内容如下:</p><pre class=" language-conf"><code class="language-conf"># 和我们前面文章中的https配置基本一致,需要更改的就是upstream中的server,更改为你的ip地址,因为容器的隔离技术,再使用localhost可能转发失败(可自己尝试)。server { listen 80; listen 443; server_name willhappy.cn; #拦截的域名 ssl on; root html; index index.html index.htm; ssl_certificate cert/XX.pem; #你自己申请的证书文件 ssl_certificate_key cert/XX.key; #私钥文件 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://whome; #提供数据服务的服务器 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}upstream whome{ server ip地址:8080;}</code></pre><h4 id="访问测试"><a href="#访问测试" class="headerlink" title="访问测试"></a>访问测试</h4><p>通过 <a href="https://willhappy.cn/" target="_blank" rel="noopener">https://willhappy.cn/</a> ,访问到自己的项目即表示配置成功。</p><h4 id="自己挖的坑"><a href="#自己挖的坑" class="headerlink" title="自己挖的坑"></a>自己挖的坑</h4><p>通过nginx容器名称(nginx_will_v2)可以看到,这是我运行的第二个容器,第一个容器,我在创建时只开放了80端口,所以当一切都配置好之后,发现通过443端口(也就是通过https方式)访问,怎么都无法访问。第一时间想到的时宿主机没有开放443端口,没想到容器的443端口没有映射到443端口上,通过在google云平台配置防火墙,开放443端口,但是,依然无效,这时就陷入了一个巨大的坑,难道云平台上配置无效?那就去服务器上手动开放443端口。鉴于服务器是debian版本,iptables配置有所不同,结果去单独配置443端口时,把其他的端口全都抹掉了,其中包括docker和宿主机的防火墙设置都清除掉,导致容器都无法启动。这中间经历艰辛,无从言起,记录下,避免下次再出现。</p><ol><li><strong>不明原理,贸然根据网上教程更改服务器(debian)的iptables配置。</strong><br>更改参考<a href="https://www.centos.bz/2017/10/debian%E9%85%8D%E7%BD%AEiptables/" target="_blank" rel="noopener">文章1</a>,<a href="https://my.oschina.net/winHerson/blog/143465" target="_blank" rel="noopener">文章二</a>, 根据这两篇文章修改,虽然没有最终完成修改,但是依然更改了端口号的配置。发现情况不妙;<br>发现情况不妙后,准备恢复防火墙设置,参考<a href="http://www.codebelief.com/article/2017/08/linux-25-useful-iptables-firewall-rules/" target="_blank" rel="noopener">iptables配置</a>, 因为不知道哪个是原来防火墙的最终配置,所以选择了<code>/etc/iptables.up.rules</code>进行恢复。<br>从文件恢复IPtables规则:</li></ol><pre class=" language-shell"><code class="language-shell">sudo iptables-restore < iptables.up.rules</code></pre><p>这样虽然挽回了部分端口规则,但是docker的防火墙规则被破坏,出现了问题2.</p><ol start="2"><li><strong>docker 启动容器报”No chain/target/match by that name”错误,无法启动容器。</strong><br>同样参考了几篇文章:<a href="http://ystyle.top/2015/09/24/centos-7-docker-qi-dong-bao/" target="_blank" rel="noopener">文章</a>,但是都是基于centos修改防火墙规则的,但是已经不敢再去动debian的规则了,怕再出问题。所以继续找。<br>google搜索最终看到一种<a href="https://support.plesk.com/hc/en-us/articles/115000186754-Docker-container-does-not-start-with-error-No-chain-target-match-by-that-name" target="_blank" rel="noopener">解决方法</a>,即重启docker服务,即可自动恢复docker关于防火墙的配置,测试,最终解决,QAQ。</li></ol><pre class=" language-shell"><code class="language-shell"># 重启docker服务,须在所有容器停止后重启$ sudo systemctl restart docker</code></pre><ol start="3"><li><strong>至此,debian防火墙规则恢复到原来的状态,冷静下来后,恍然发现,是因为nginx容器的443端口没有映射到宿主机上,再次泪奔,问题忽然这么明朗、容易,或许,总是要经历些什么,才能成长吧!</strong></li></ol><pre class=" language-bash"><code class="language-bash"><span class="token comment" spellcheck="true"># 重新创建运行开放80和443端口的容器,这才有了nginx_will_v2这个容器</span>$ docker run -p 80:80 -p 443:443 --name nginx_will_v2 -v <span class="token variable">$PWD</span>/conf/server.conf:/etc/nginx/conf.d/server.conf -v <span class="token variable">$PWD</span>/www:/www -v</code></pre><p>访问 <a href="https://willhappy.cn/" target="_blank" rel="noopener">https://willhappy.cn/</a> 测试成功。</p><p>解决过程艰辛,关于debian系统的各种骚操作,还得要深入学习,传送<a href="https://www.debian.org/" target="_blank" rel="noopener">debian官网</a>, 不然,随便一操作,那都是一个坑啊,泪奔。</p><h4 id="more"><a href="#more" class="headerlink" title="more"></a>more</h4><p>关于nginx, 可参考<a href="http://www.nginx.cn/doc/index.html" target="_blank" rel="noopener">nginx中文文档</a>,查看相关参数说明。<br>通过nginx配置更多负载均衡,动静分离,参考<a href="http://www.runoob.com/w3cnote/linux-nginx-tomcat.html" target="_blank" rel="noopener">文章</a></p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>相关命令</p><pre><code>lsb_release -a #查看debian版本信息sudo systemctl restart docker #重启docker服务(debian)须在所有容器停止后重启</code></pre><p>相关工具</p><ul><li><a href="http://tool.chinaz.com/" target="_blank" rel="noopener">站长工具</a>: 本章所用功能->端口扫描</li><li><a href="https://www.debian.org/" target="_blank" rel="noopener">debian官网</a>: 关于iptables部分</li></ul>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> https </tag>
<tag> docker </tag>
<tag> nginx </tag>
</tags>
</entry>
<entry>
<title>docker初识(博客环境准备)</title>
<link href="/2018/06/11/29-2018-06-11-docker-chu-shi/"/>
<url>/2018/06/11/29-2018-06-11-docker-chu-shi/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为什么要开始学习docker呢?主要是自己博客home页部署在同事的阿里云上,但是,目前他的服务器已经快到期,所以我要对我的主页迁移,但是想到重现搭建生产环境的不确定性,决定研究下docker,同时也方便以后博客主页的迁移,也没必要为生产环境的不确定性承担风险。</p><a id="more"></a><p>[toc]</p><h3 id="一-docker安装"><a href="#一-docker安装" class="headerlink" title="一. docker安装"></a>一. docker安装</h3><p>关于docker的大部分学习来源<a href="http://oss.willhappy.cn/pdf/18-6-11/docker_practice.pdf" target="_blank" rel="noopener">docker实践</a>,安装方法参考此pdf文档, 也可参考<a href="https://yeasy.gitbooks.io/docker_practice/" target="_blank" rel="noopener">在线文档</a>。</p><h3 id="二-docker-web环境搭建"><a href="#二-docker-web环境搭建" class="headerlink" title="二. docker web环境搭建"></a>二. docker web环境搭建</h3><p>此生产环境的搭建是基于我的blog的,所需的软件<code>java</code>,<code>tomcat</code>,<code>nginx</code>,<code>mysql</code>等;另外软件的安装方法大概有两种,一是通过dockerfile去构建,二就是通过拉去<a href="https://hub.docker.com/" target="_blank" rel="noopener">dockerHub</a>的官方镜像来构建,因为刚开始学习,所以主要通过拉去官方镜像来构建。</p><h4 id="安装-MySQL"><a href="#安装-MySQL" class="headerlink" title="安装 MySQL"></a>安装 MySQL</h4><p>查找Docker Hub上的mysql镜像</p><pre class=" language-bash"><code class="language-bash">$ docker search mysqlNAME DESCRIPTION STARS OFFICIAL AUTOMATEDmysql MySQL is a widely used, open-source relation… 6349 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> mariadb MariaDB is a community-developed fork of MyS… 1993 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> mysql/mysql-server Optimized MySQL Server Docker images. Create… 456 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>percona Percona Server is a fork of the MySQL relati… 343 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 101 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 87 <span class="token punctuation">..</span>.</code></pre><p>这里我们拉取官方的镜像,标签为5.7.22</p><pre class=" language-bash"><code class="language-bash">docker pull mysql:5.7.22</code></pre><p>等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.7.22的镜像。</p><p><strong>使用镜像</strong></p><p>运行容器<br>MySQL(5.7.19)的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。<br>具体操作:<br>首先需要创建将要映射到容器中的目录以及.cnf文件,然后再创建容器</p><pre class=" language-bash"><code class="language-bash">$ <span class="token function">pwd</span>/opt$ <span class="token function">mkdir</span> -p docker_v/mysql/conf$ <span class="token function">cd</span> docker_v/mysql/conf$ <span class="token function">touch</span> my.cnf$ docker run -p 3306:3306 --name mysql -v /opt/docker_v/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD<span class="token operator">=</span>123456 -d imageID</code></pre><p>命令说明:</p><ul><li><strong>-p 3306:3306</strong>:将容器的3306端口映射到主机的3306端口</li><li><strong>-v /opt/docker_v/mysql/conf:/etc/mysql/conf.d</strong>:将主机/opt/docker_v/mysql/conf目录挂载到容器的/etc/mysql/conf.d</li><li><strong>-e MYSQL_ROOT_PASSWORD=123456</strong>:初始化root用户的密码</li><li><strong>-d</strong>: 后台运行容器,并返回容器ID</li><li><strong>imageID</strong>: mysql镜像ID</li></ul><p>查看容器运行情况</p><pre class=" language-bash"><code class="language-bash">$ docker <span class="token function">ps</span>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES1d7dd4ffba73 mysql:5.7.22 <span class="token string">"docker-entrypoint.s…"</span> 46 hours ago Up 46 hours 0.0.0.0:3306-<span class="token operator">></span>3306/tcp mysql_will</code></pre><p><strong>使用navicat连接mysql</strong></p><p>类似,首先在云服务器控制面板上开放mysql端口号,然后进行连接测试,如果还是连接不上,查看mysql是否开启远程访问权限。</p><h4 id="安装-nginx并配置"><a href="#安装-nginx并配置" class="headerlink" title="安装 nginx并配置"></a>安装 nginx并配置</h4><p>查找Docker Hub上的nginx镜像</p><pre class=" language-bash"><code class="language-bash">$ docker search nginxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDnginx Official build of Nginx. 8785 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> jwilder/nginx-proxy Automated Nginx reverse proxy <span class="token keyword">for</span> docker con… 1346 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 547 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>jrcs/letsencrypt-nginx-proxy-companion LetsEncrypt container to use with nginx as p… 377 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>kong Open-source Microservice <span class="token operator">&</span> API Management la… 192 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> <span class="token punctuation">..</span>.</code></pre><p>这里我们拉取官方的镜像, 标签为<code>stable</code>, 即稳定版。</p><pre class=" language-bash"><code class="language-bash">docker pull nginx:stable</code></pre><p>等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为nginx的镜像。</p><p><strong>使用镜像</strong></p><p>运行容器</p><pre class=" language-bash"><code class="language-bash">docker run -p 80:80 -p 443:443 --name nginx_will_v2 -v <span class="token variable">$PWD</span>/conf/server.conf:/etc/nginx/conf.d/server.conf -v <span class="token variable">$PWD</span>/www:/www -v <span class="token variable">$PWD</span>/logs:/wwwlogs -d nginx:stable</code></pre><p></p><p style="color: red;">注:</p>这里开放了两个端口号,是因为后面会配置https, 后面使用docker搭建生产环境一节也会介绍,自己掉坑了。<p></p><p>命令说明:</p><ul><li><strong>-p 80:80</strong>:将容器的80端口映射到主机的80端口</li><li><strong>-p 443:443</strong>: 将容器的443端口映射到主机的443端口</li><li><strong>–name mynginx</strong>:将容器命名为mynginx</li><li><strong>-v $PWD/www:/www</strong>:将主机中当前目录下的www挂载到容器的/www</li><li><strong>-v $PWD/conf/server.conf:/etc/nginx/conf.d/server.conf</strong>:将主机中当前目录下的server.conf挂载到容器的/etc/nginx/conf.d/server.conf (后面重点讲为啥)</li><li><strong>-v $PWD/logs:/wwwlogs</strong>:将主机中当前目录下的logs挂载到容器的/wwwlogs</li></ul><p>查看容器运行情况</p><pre class=" language-bash"><code class="language-bash">$ docker <span class="token function">ps</span>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES5b22ae556d53 nginx:stable <span class="token string">"nginx -g 'daemon of…"</span> 14 hours ago Up 14 hours 0.0.0.0:80-<span class="token operator">></span>80/tcp, 0.0.0.0:443-<span class="token operator">></span>443/tcp nginx_will_v2</code></pre><p>通过浏览器访问测试: <a href="http://35.197.142.179/" target="_blank" rel="noopener">http://35.197.142.179/</a> ,出现nginx欢迎界面成功。</p><h4 id="安装-tomcat并配置"><a href="#安装-tomcat并配置" class="headerlink" title="安装 tomcat并配置"></a>安装 tomcat并配置</h4><p>查找Docker Hub上的tomcat镜像</p><pre class=" language-bash"><code class="language-bash">$ docker search tomcatNAME DESCRIPTION STARS OFFICIAL AUTOMATEDtomcat Apache Tomcat is an <span class="token function">open</span> <span class="token function">source</span> implementati… 1879 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> tomee Apache TomEE is an all-Apache Java EE certif… 51 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span> dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 49 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 with… 24 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>consol/tomcat-7.0 Tomcat 7.0.57, 8080, <span class="token string">"admin/admin"</span> 16 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>bitnami/tomcat Bitnami Tomcat Docker Image 16 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span>cloudesire/tomcat Tomcat server, 6/7/8 15 <span class="token punctuation">[</span>OK<span class="token punctuation">]</span><span class="token punctuation">..</span>.</code></pre><p>这里我们拉取官方的镜像, 标签为<code>8.5.31</code></p><pre class=" language-bash"><code class="language-bash">docker pull tomcat:8.5.31</code></pre><p>等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为tomcat的镜像。</p><p><strong>使用镜像</strong></p><p>运行容器</p><pre class=" language-bash"><code class="language-bash">docker run --name tomcat_will -p 8080:8080 -v <span class="token variable">$PWD</span>/apps:/usr/local/tomcat/webapps/apps -d tomcat:8.5.31</code></pre><p>命令说明:</p><ul><li><strong>-p 8080:8080</strong>:将容器的8080端口映射到主机的8080端口</li><li><strong>-v $PWD/apps:/usr/local/tomcat/webapps/apps</strong>:将主机中当前目录下的apps挂载到容器的/apps</li></ul><p>查看容器运行情况</p><pre class=" language-bash"><code class="language-bash">$ docker <span class="token function">ps</span>CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdd2e4a1e03c3 tomcat:8.5.31 <span class="token string">"catalina.sh run"</span> 19 hours ago Up 14 hours 0.0.0.0:8080-<span class="token operator">></span>8080/tcp tomcat_will</code></pre><p>通过浏览器访问测试:<a href="http://35.197.142.179:8080/" target="_blank" rel="noopener">http://35.197.142.179:8080/</a> ,出现tomcat页面成功启动。</p><p>至此,关于博客的生产环境准备工作完成,后面<a href="http://blog.willhappy.cn/2018/06/13/30_2018-06-13_%E4%B8%BB%E9%A1%B5%E9%83%A8%E7%BD%B2docker+ng+tomcat+https/">一章</a>介绍生产环境的项目部署。</p>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> docker </tag>
</tags>
</entry>
<entry>
<title>git进阶历程</title>
<link href="/2018/05/29/28-2018-05-09-git-jin-jie-li-cheng/"/>
<url>/2018/05/29/28-2018-05-09-git-jin-jie-li-cheng/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>前面的<a href="http://blog.willhappy.cn/2018/04/26/22_2018-04-26_git%E5%85%BB%E6%88%90%E6%97%A5%E8%AE%B0/">git养成日记</a>中已经学习了git的基本的操作了,关键是养成使用git的习惯,那为什么还会有这篇文章呢?是因为我在使用git的过程中,也遇到了问题,所以写这篇文章是记录下自己的问题解决和需求的解决。</p><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>git高阶教程参考指南,<a href="https://github.com/geeeeeeeeek/git-recipes" target="_blank" rel="noopener">git-recipes</a></p><h3 id="一-小知识点"><a href="#一-小知识点" class="headerlink" title="一. 小知识点"></a>一. 小知识点</h3><p><strong>开发分支</strong></p><blockquote><p>git clone #克隆下来的代码只做本地master分支和远程分支的关联</p></blockquote><p>想要需要在其他分支上开发(存在其他远程分支),两种方式:</p><blockquote><p>git checkout -b dev origin/dev #checkout远程的dev分支,在本地起名为dev分支,并切换到本地的dev分支</p></blockquote><p>或者:</p><blockquote><p>git checkout -b dev #新建并切换分支<br>git branch –set-upstream dev origin/dev #本地分支关联远程分支</p></blockquote><p>其实下面两条命令合并起来就是上面一条。可通过下面的命令查看分支的关联情况</p><blockquote><p>git branch -vv</p></blockquote><p><strong>仓库关联</strong><br>如果在本地初始化的git仓库,在远程新建了远程仓库,通过下面的命令进行关联:</p><blockquote><p>git remote add origin <a href="https://github.com/willhappy/will.git" target="_blank" rel="noopener">https://github.com/willhappy/will.git</a> #origin 别名</p></blockquote><h3 id="二-git-HEAD-游离问题"><a href="#二-git-HEAD-游离问题" class="headerlink" title="二. git HEAD 游离问题"></a>二. git HEAD 游离问题</h3><p>错误:<br><img src="http://oss.willhappy.cn/18-5-9/54275503.jpg" alt="HEAD detached"></p><p>解决方案,参考<a href="https://blog.csdn.net/u011240877/article/details/76273335" target="_blank" rel="noopener">文章</a>:D,感谢,不想重复造轮子了,就记录下,下次解决参考方便。</p><h3 id="三-git-子模块"><a href="#三-git-子模块" class="headerlink" title="三. git 子模块"></a>三. git 子模块</h3><p><strong>why?</strong><br>关于为什么折腾git子模块呢,因为最近博客折腾的比较多,包括主题,在原来的主题上更改了很多,想着以后可以造福他人(QAQ完全臆想吖),想把主题单独从<code>hexo</code>的git仓库中给拿出来,单独管理,同时也方便他人使用更新过的主题。</p><p><strong>解决</strong><br>给予上面的需求,我开始查找解决方案,目前呢,git有两种解决方案:</p><ul><li>git submodule #这是Git官方以前的推荐方案</li><li>git subtree #从 Git 1.5.2 开始,Git 新增并推荐使用这个功能来管理子项目</li></ul><p>通过<code>git submodule</code>方式来解决,参考文章<a href="https://blessing.studio/splitting-a-subfolder-out-into-a-new-git-repository/" target="_blank" rel="noopener">传送门</a>,另外关于git子模块的管理查看<a href="http://imtianx.cn/2018/03/08/git_submodule/" target="_blank" rel="noopener">传送门</a><br>通过<code>git subtree</code>方式解决,可参考文章<a href="https://tech.youzan.com/git-subtree/" target="_blank" rel="noopener">传送门</a>,发现这是有赞的帖子,很高兴,好好学习。也可以参考<a href="https://blog.csdn.net/gatieme/article/details/64212666" target="_blank" rel="noopener">文章</a>,这篇文章中也对比了这两种方式,可以好好看一下。</p><h3 id="四-git-flow-的工作流程"><a href="#四-git-flow-的工作流程" class="headerlink" title="四. git-flow 的工作流程"></a>四. git-flow 的工作流程</h3><p>关于git-flow,查看<a href="https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow#start" target="_blank" rel="noopener">文章</a></p><h3 id="五-关于git分支管理策略"><a href="#五-关于git分支管理策略" class="headerlink" title="五. 关于git分支管理策略"></a>五. 关于git分支管理策略</h3><p>关于如何利用git进行team项目分支管理,参考阮一峰老师的<a href="http://www.ruanyifeng.com/blog/2012/07/git.html" target="_blank" rel="noopener">Git分支管理策略</a></p><h3 id="六-git命令常见问题及场景"><a href="#六-git命令常见问题及场景" class="headerlink" title="六. git命令常见问题及场景"></a>六. git命令常见问题及场景</h3><h4 id="1-master、origin-master-与-origin-master-有什么区别?(参考)"><a href="#1-master、origin-master-与-origin-master-有什么区别?(参考)" class="headerlink" title="1. master、origin master 与 origin/master 有什么区别?(参考)"></a>1. master、origin master 与 origin/master 有什么区别?(<a href="https://blog.twofei.com/695/" target="_blank" rel="noopener">参考</a>)</h4><ul><li><code>master</code> 这个很好理解,它代表本地的某个分支名。</li><li><code>origin master</code> 代表着两个概念,前面的 origin 代表远程名,后面的 master 代表远程分支名。</li><li><code>origin/master</code> 只代表一个概念,即远程分支名,是从远程拉取代码后在本地建立的一份拷贝(因此也有人把它叫作本地分支)。</li></ul><h4 id="2-git-revert和git-reset理解。(参考)(科学上网)"><a href="#2-git-revert和git-reset理解。(参考)(科学上网)" class="headerlink" title="2. git revert和git reset理解。(参考)(科学上网)"></a>2. git revert和git reset理解。(<a href="https://goo.gl/fgWC1G" target="_blank" rel="noopener">参考</a>)(科学上网)</h4><ul><li><code>git revert</code>是用一次新的commit来回滚之前的commit,<code>git reset</code>是直接删除指定的commit。(<code>git revert</code>是撤销某次提交,不影响要撤销提交后面的提交;<code>git reset</code>是回滚到某次提交,会影响这次提交后面的提交,个人觉得这样理解比较好)</li><li>在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为<code>git revert</code>是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是<code>git reset</code>是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。</li><li><code>git reset</code> 是把HEAD向后移动了一下,而<code>git revert</code>是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。</li></ul><h4 id="3-git-rebase和git-merge"><a href="#3-git-rebase和git-merge" class="headerlink" title="3. git rebase和git merge"></a>3. git rebase和git merge</h4><ul><li>形象理解变基,参考<a href="https://goo.gl/d4LdGv" target="_blank" rel="noopener">这里</a>(科学上网),解释很有意思,相信你会开心。</li><li>搞清楚<code>git rebase</code>和<code>git merge</code>的区别,谨记<code>git rebase</code>的黄金法则,参考<a href="https://juejin.im/post/5a3b97ee5188252103346d46" target="_blank" rel="noopener">这里</a>或者<a href="https://goo.gl/1YXazm" target="_blank" rel="noopener">这里</a>(科学上网).</li><li>关于<code>git merge --squash</code>和<code>git rebase</code>区别,<a href="https://www.jianshu.com/p/684a8ae9dcf1" target="_blank" rel="noopener">了解一下</a>.</li><li>最后,如何保证主干分支的提交历史的简洁可追溯可回滚,一般操作,<a href="https://blog.csdn.net/yuxin6866/article/details/70156863" target="_blank" rel="noopener">了解下</a>.</li></ul><h4 id="4-git-revert撤销合并请求"><a href="#4-git-revert撤销合并请求" class="headerlink" title="4. git revert撤销合并请求"></a>4. git revert撤销合并请求</h4><ul><li><code>git revert</code>为撤销一次提交操作,<code>git reset</code>为回滚到某次提交的操作,再次重申。</li><li>当使用<code>git revert</code>来撤销一次合并的提交时,会报错,需要使用<code>-m</code>来指定一下要恢复的版本线。</li></ul><pre class=" language-shell"><code class="language-shell">git revert fcd8a10 -m 1 #撤回提交的commit id:fcd8a10 1代表当前分支 2代表在当前分支 merge的分支</code></pre><ul><li>参考<a href="http://blog.chenzuhuang.com/archive/62.html" target="_blank" rel="noopener">文章一</a>和<a href="https://blog.csdn.net/paul_wei2008/article/details/77477932" target="_blank" rel="noopener">文章二</a></li></ul><p><strong>说明</strong></p><ol><li>虽然上面贴出了解决方案,但是,比较遗憾的是自己还没有把我的需求整理处理,后期有机会会把博客的主题模块独立出来,进行单独的管理。</li><li>文章众多引用,首先感谢原作者,然后,本文仅供用于学习笔记,有助以后回顾,切勿用于商业用途。</li></ol><h3 id="other"><a href="#other" class="headerlink" title="other"></a>other</h3><p>学习git比较好的可视化操作项目<a href="https://github.com/pcottle/learnGitBranching" target="_blank" rel="noopener">learnGitBranching</a></p><p><strong>更多git学习内容持续更新中…</strong></p>]]></content>
<categories>
<category> cvs </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title>hexo主题配置再升级--插件配置</title>
<link href="/2018/05/06/27-2018-05-06-hexo-zhu-ti-pei-zhi-sheng-ji/"/>
<url>/2018/05/06/27-2018-05-06-hexo-zhu-ti-pei-zhi-sheng-ji/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>关于hexo博客搭建的知识请移步<a href="http://blog.willhappy.cn/2015/07/24/2_2015-07-24_hexoCreate/">GitHub+Hexo搭建个人博客</a>, 主题样式等相对简单,中间也有几次对主题的更改更换,也在版本更新里面做了相应的记录,博客的实用性在于他不断地完善, 对读者更加的友善, 让读者也更感兴趣, 此节就是博客的插件配置上介绍。</p><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>在此申明, 我博客使用的主题为<a href="https://github.com/WongMinHo/hexo-theme-miho" target="_blank" rel="noopener">hexo-theme-miho</a>, 之前使用的主题是<a href="https://github.com/MOxFIVE/hexo-theme-yelee" target="_blank" rel="noopener">yelee</a> 基础配置,在主题文档中都有介绍,我是在此基础上,对主题的样式进行了小的优化使其符合我的风格,对于主题样式的修改,在我的版本更新说明中都有介绍,可<a href="https://github.com/williamHappy/williamHappy.github.io/tree/blog_source" target="_blank" rel="noopener">点击查看</a>,所以,在本节中所有的插件安装配置等,都是基于该主题的,如你使用其他主题,大同小异,好好研究以下即可。</p><h3 id="一-DaoVoice实现在线联系"><a href="#一-DaoVoice实现在线联系" class="headerlink" title="一. DaoVoice实现在线联系"></a>一. DaoVoice实现在线联系</h3><p>用于用户之间的沟通插件。</p><h4 id="注册登陆"><a href="#注册登陆" class="headerlink" title="注册登陆"></a>注册登陆</h4><p><a href="http://www.daovoice.io/" target="_blank" rel="noopener">官方网站</a>注册登陆,注册登陆后创建团队,填写邀请码<code>ab5cf222</code>, 即可创建完成</p><h4 id="安装代码"><a href="#安装代码" class="headerlink" title="安装代码"></a>安装代码</h4><p>在<code>themes/hexo-theme-miho/layout/layout.ejs</code>文件中追加js代码:</p><pre class=" language-js"><code class="language-js"><span class="token operator"><</span><span class="token operator">%</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>theme<span class="token punctuation">.</span>daovoice<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">%</span><span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span>s<span class="token punctuation">,</span>o<span class="token punctuation">,</span>g<span class="token punctuation">,</span>r<span class="token punctuation">,</span>a<span class="token punctuation">,</span>m<span class="token punctuation">)</span><span class="token punctuation">{</span> i<span class="token punctuation">[</span><span class="token string">"DaoVoiceObject"</span><span class="token punctuation">]</span><span class="token operator">=</span>r<span class="token punctuation">;</span> i<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token operator">=</span>i<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token operator">||</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">(</span>i<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">.</span>q<span class="token operator">=</span>i<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">.</span>q<span class="token operator">||</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>arguments<span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">,</span>i<span class="token punctuation">[</span>r<span class="token punctuation">]</span><span class="token punctuation">.</span>l<span class="token operator">=</span><span class="token number">1</span><span class="token operator">*</span><span class="token keyword">new</span> <span class="token class-name">Date</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> a<span class="token operator">=</span>s<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span>o<span class="token punctuation">)</span><span class="token punctuation">,</span>m<span class="token operator">=</span>s<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span>o<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> a<span class="token punctuation">.</span><span class="token keyword">async</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span>a<span class="token punctuation">.</span>src<span class="token operator">=</span>g<span class="token punctuation">;</span>a<span class="token punctuation">.</span>charset<span class="token operator">=</span><span class="token string">"utf-8"</span><span class="token punctuation">;</span> m<span class="token punctuation">.</span>parentNode<span class="token punctuation">.</span><span class="token function">insertBefore</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span>m<span class="token punctuation">)</span><span class="token punctuation">}</span> <span class="token punctuation">)</span><span class="token punctuation">(</span>window<span class="token punctuation">,</span>document<span class="token punctuation">,</span><span class="token string">"script"</span><span class="token punctuation">,</span><span class="token punctuation">(</span><span class="token string">'https:'</span> <span class="token operator">==</span> document<span class="token punctuation">.</span>location<span class="token punctuation">.</span>protocol <span class="token operator">?</span> <span class="token string">'https:'</span> <span class="token punctuation">:</span> <span class="token string">'http:'</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"//widget.daovoice.io/widget/"</span> <span class="token operator">+</span> <span class="token string">"<%- theme.daovoice.app_id %>"</span> <span class="token operator">+</span> <span class="token string">".js"</span><span class="token punctuation">,</span><span class="token string">"daovoice"</span><span class="token punctuation">)</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token function">daovoice</span><span class="token punctuation">(</span><span class="token string">'init'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> app_id<span class="token punctuation">:</span> <span class="token string">"<%- theme.daovoice.app_id %>"</span><span class="token punctuation">,</span> user_id<span class="token punctuation">:</span> <span class="token string">"<%- theme.daovoice.user_id %>"</span><span class="token punctuation">,</span> email<span class="token punctuation">:</span> <span class="token string">"<%- theme.daovoice.email %>"</span><span class="token punctuation">,</span> name<span class="token punctuation">:</span> <span class="token string">"<%- theme.daovoice.name %>"</span><span class="token punctuation">,</span> signed_up<span class="token punctuation">:</span> <span class="token operator"><</span><span class="token operator">%</span><span class="token operator">-</span> theme<span class="token punctuation">.</span>daovoice<span class="token punctuation">.</span>signed_up <span class="token operator">%</span><span class="token operator">></span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">daovoice</span><span class="token punctuation">(</span><span class="token string">'update'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span> <span class="token operator"><</span>script<span class="token operator">></span> <span class="token function">daovoice</span><span class="token punctuation">(</span><span class="token string">'init'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> app_id<span class="token punctuation">:</span> <span class="token string">"<%- theme.daovoice_app_id %>"</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">daovoice</span><span class="token punctuation">(</span><span class="token string">'update'</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span><span class="token operator"><</span><span class="token operator">%</span> <span class="token punctuation">}</span> <span class="token operator">%</span><span class="token operator">></span></code></pre><p>⚠️注意<code>ejs文件</code>的中对变量的引用,同时区别于<code>swing文件</code>, 不清楚的自行<code>google</code></p><h4 id="修改主题配置文件"><a href="#修改主题配置文件" class="headerlink" title="修改主题配置文件"></a>修改主题配置文件</h4><p>主题配置文件:<code>MyBlog/_config.yml</code>,<br>添加配置:</p><pre class=" language-yml"><code class="language-yml"># 在线联系 | DaoVoicedaovoice: enable: true app_id: user_id: # 必填: 该用户在您系统上的唯一ID email: # 选填: 该用户在您系统上的主邮箱 name: # 选填: 用户名 signed_up: 1449821660 # 选填: 用户的注册时间,用Unix时间戳表示</code></pre><h4 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h4><p>至此,代码安装修改完成, 重新部署博客, daovoice后台<code>ping</code>一下,看是否安装成功。</p><h3 id="二-live2d安装配置"><a href="#二-live2d安装配置" class="headerlink" title="二. live2d安装配置"></a>二. live2d安装配置</h3><p>单调的博客主题可能产生审美疲劳,那我们就增加点二次元元素。</p><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><p>一条命令解决了:</p><blockquote><p>npm install -save hexo-helper-live2d</p></blockquote><h4 id="添加代码"><a href="#添加代码" class="headerlink" title="添加代码"></a>添加代码</h4><p>在<code>themes/hexo-theme-miho/layout/layout.ejs</code>文件中追加:</p><pre class=" language-js"><code class="language-js"><span class="token operator"><</span><span class="token operator">%</span><span class="token operator">-</span> <span class="token function">live2d</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token operator">></span></code></pre><h4 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h4><p>主题配置文件:<code>MyBlog/_config.yml</code>,<br>添加配置:</p><pre class=" language-yml"><code class="language-yml"># Live2Dlive2d: model: Epsilon2.1 width: 200 # The width of your model. default: 150 height: 350 # The height of your model. default: 300 position: left opacityDefault: 1</code></pre><p>更多配置参考<a href="https://github.com/EYHN/hexo-helper-live2d" target="_blank" rel="noopener">官方文档</a></p><h3 id="三-鼠标点击♥️♥️效果"><a href="#三-鼠标点击♥️♥️效果" class="headerlink" title="三. 鼠标点击♥️♥️效果"></a>三. 鼠标点击♥️♥️效果</h3><ol><li>下载<a href="http://7u2ss1.com1.z0.glb.clouddn.com/love.js" target="_blank" rel="noopener"><code>love.js</code></a>代码, <a href="http://7u2ss1.com1.z0.glb.clouddn.com/love.js" target="_blank" rel="noopener">点击下载</a></li><li>在<code>themes/hexo-theme-miho/source/js/</code>下面新建<code>love.js</code>,将上面下载的代码copy进去。</li><li>在<code>themes/hexo-theme-miho/layout/layout.ejs</code>文件中追加代码:</li></ol><pre class=" language-js"><code class="language-js"><span class="token operator"><</span><span class="token operator">%</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>theme<span class="token punctuation">.</span>love<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">%</span><span class="token operator">></span> <span class="token operator"><</span>script type<span class="token operator">=</span><span class="token string">"text/javascript"</span> src<span class="token operator">=</span><span class="token string">"/js/love.js"</span><span class="token operator">></span><span class="token operator"><</span><span class="token operator">/</span>script<span class="token operator">></span><span class="token operator"><</span><span class="token operator">%</span> <span class="token punctuation">}</span> <span class="token operator">%</span><span class="token operator">></span></code></pre><ol start="4"><li>主题配置文件<code>MyBlog/_config.yml</code>中添加配置:</li></ol><pre class=" language-yml"><code class="language-yml"># 鼠标点击桃心效果love: true</code></pre><h3 id="四-博客字数时长统计插件"><a href="#四-博客字数时长统计插件" class="headerlink" title="四. 博客字数时长统计插件"></a>四. 博客字数时长统计插件</h3><p>在博客底部添加博客全站字数统计, 文章标题下方添加文章字数和阅读时长的统计。</p><h4 id="installation"><a href="#installation" class="headerlink" title="installation"></a>installation</h4><blockquote><p>npm i –save hexo-wordcount</p></blockquote><h4 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h4><p>在<code>themes/hexo-theme-miho/layout/_partial/post/title.ejs</code>相应位置添加:</p><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>%</span> <span class="token attr-name">if</span> <span class="token attr-name">(theme.wordcount.enable){</span> <span class="token attr-name">%</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ul</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>i</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>fa fa-file-word-o<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>i</span><span class="token punctuation">></span></span> 字数统计<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>post-count<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><%= wordcount(post.content) %><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span>字 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span><span class="token punctuation">></span></span> | <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>li</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>i</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>fa fa-clock-o<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>i</span><span class="token punctuation">></span></span> 阅读时长<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>span</span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>post-count<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><%= min2read(post.content) %><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>span</span><span class="token punctuation">></span></span>分钟 <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ul</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>%</span> <span class="token attr-name">}</span> <span class="token attr-name">%</span><span class="token punctuation">></span></span></code></pre><p>⚠️特别注意,博客主题的不同,可能添加的位置不同,找到合适的位置,使用的合适的样式,将代码添加进去即可。</p><h4 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h4><p>在根目录<code>MyBlog/_config.yml</code>主题配置文件中添加配置:</p><pre class=" language-yml"><code class="language-yml"># Post wordcount display settings字数统计插件# Dependencies: https://github.com/willin/hexo-wordcount# 打开之后,会同时打开文章文字统计, 阅读时长和全站文字统计wordcount: enable: true</code></pre><p>关于wordcount的详细说明<a href="https://github.com/willin/hexo-wordcount" target="_blank" rel="noopener">查看</a></p><h3 id="五-添加rss订阅"><a href="#五-添加rss订阅" class="headerlink" title="五. 添加rss订阅"></a>五. 添加rss订阅</h3><p>添加博客订阅功能。</p><h4 id="安装-1"><a href="#安装-1" class="headerlink" title="安装"></a>安装</h4><p>安装插件<a href="https://github.com/hexojs/hexo-generator-feed" target="_blank" rel="noopener">hexo-generator-feed</a></p><blockquote><p>$ npm install hexo-generator-feed –save</p></blockquote><h4 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h4><p>配置根目录下的<code>_config.yml</code>:</p><pre class=" language-yml"><code class="language-yml">## Plugins: http://hexo.io/plugins/#RSS订阅plugin:- hexo-generator-feed#Feed Atomfeed: type: atom path: atom.xml limit: 20</code></pre><p>配置主题目录下的<code>_config.yml</code>链接:</p><pre class=" language-yml"><code class="language-yml">rss: title: Rss url: /atom.xml</code></pre><h4 id="运行测试"><a href="#运行测试" class="headerlink" title="运行测试"></a>运行测试</h4><p>点击<a href="http://blog.willhappy.cn/atom.xml"><code>rss</code></a>图标测试。</p><h3 id="六-SEO优化"><a href="#六-SEO优化" class="headerlink" title="六. SEO优化"></a>六. SEO优化</h3><p>把个人网站站点地图交给搜索引擎,搜索引擎收录后就可以索引你的网站了。<br>可参考elem一小姐姐的文章,😍<a href="https://juejin.im/post/590b451a0ce46300588c43a0" target="_blank" rel="noopener">hexo高阶教程</a>, 前端妹子奥。</p><h4 id="install"><a href="#install" class="headerlink" title="install"></a>install</h4><p>安装和配置和rss的安装配置方法类似,可参考:</p><blockquote><p>$ npm install hexo-generator-sitemap –save</p></blockquote><blockquote><p>$ npm install hexo-generator-baidu-sitemap –save #baidu</p></blockquote><p>更多插件相关可查看<a href="https://hexo.io/plugins/" target="_blank" rel="noopener">官网</a></p><h4 id="添加配置"><a href="#添加配置" class="headerlink" title="添加配置"></a>添加配置</h4><p>配置根目录下的<code>_config.yml</code>:</p><pre class=" language-yml"><code class="language-yml"># sitemap生成插件配置Plugins:- hexo-generator-baidu-sitemap- hexo-generator-sitemapbaidusitemap: path: baidusitemap.xmlsitemap: path: sitemap.xml</code></pre><p>配置好之后,<code>hexo d</code>就会生成相关的站点地图了。<br>关于插件可查看 <a href="https://hexo.io/plugins/" target="_blank" rel="noopener">https://hexo.io/plugins/</a></p><h4 id="站点收录"><a href="#站点收录" class="headerlink" title="站点收录"></a>站点收录</h4><p>好了,上面一节我们可以生成站点地图了,那如何让我们的站点地图被搜索引擎收录呢?那么,百度<br>提供给我们3种方式,google好像只提供了一种即提交<code>sitemap.xml</code>的方式。</p><p>那么,关于百度链接提交的三种方式和google的链接提交,在这里不再重复写了,参考<a href="https://juejin.im/post/590b451a0ce46300588c43a0" target="_blank" rel="noopener">文章1</a>,<a href="https://www.jianshu.com/p/9c2d6db2f855" target="_blank" rel="noopener">文章二</a></p><p>这里重点说一些在配置链接提交方式时踩过的坑。</p><p><strong>坑一:</strong><br>在链接提交之前,我们都要在相应的搜索引擎的管理平台去验证一下我们的网站,都采用的是下载html文件的方式验证。如果我们是每次都把验证文件放在编译好的目录下,那倒是没有问题,但是,每次编译好博客,还要把这两个验证文件放进去,就太麻烦了,我们要的效果是,把验证文件放在用户资源目录下,编译生成后,就直接出现在博客的目录下,这样就不用每次去copy再粘贴进去了。但是,这样问题又来了,把验证文件放在源码包里,<code>hexo g</code>编译生成好了之后,我们会发现我们的html验证文件改变了,那是因为hexo编译时,对html文件也进行了渲染, 这就导致了验证无法通过,因为验证文件改变了。</p><p>上面其实描述太复杂,简单总结一点: <strong>直接copy到public目录下(每次生成都copy,太麻烦)–>直接放在source目录下(生成输出后被渲染,文件改变,验证不通过)</strong></p><p><em>说明一下hexo目录结构</em></p><pre class=" language-shell"><code class="language-shell">|-- node_modules|-- public #hexo g之后生成的目录,也是我们的网站源码,hexo clean会清楚该目录|-- scaffolds #脚手架|-- source #用户资源目录,除 _posts 文件夹之外,开头命名为 _ (下划线)的文件 / 文件夹和隐藏的文件将会 被忽略。Markdown 和 HTML 文件会被解析并放到 public 文件夹,而其他文件会被拷贝过去。 |-- _data #数据文件 |-- _posts #markdown文章存放目录,会被编译成html文件,放到 public|-- themes #主题|-- _config.yml #全局配置文件,网站的很多信息都在这里配置,诸如网站名称,副标题,描述,作者,语言,主题,部署等等参数|-- package.json #hexo框架的参数和所依赖插件</code></pre><p>关于目录的更多介绍,可以查看<a href="https://hexo.io/zh-cn/docs/setup.html" target="_blank" rel="noopener">官方文档</a></p><p>好了,其实上面的问题描述的解决思路已经很清晰,也就是配置hexo不让其渲染验证的html文件,其实找到思路了,解决就很简单了。凡事都是一样。</p><pre class=" language-yml"><code class="language-yml"># hexo渲染排除 | 路径是相对于source目录的路径skip_render: '*.html'</code></pre><p>更多配置方法<a href="https://www.maoxuner.cn/2017/03/10/hexo-skip-render.html" target="_blank" rel="noopener">查看</a></p><p><strong>坑二:</strong><br>百度链接提交,使用<a href="https://github.com/huiwang/hexo-baidu-url-submit" target="_blank" rel="noopener">hexo-baidu-url-submit</a>来进行百度链接的主动推送, 使用这个插件,是要在使用<code>hexo d</code>部署时进行推送的,但是,由于之前使用了travisCI的自动化构建工具,就用不到了<code>hexo d</code>对博客进行部署到github了,travisCI配置的构建流程是:<strong>hexo生成网站源码后,由travis直接使用git推送到github</strong>。那么,既然baidu_url_submit又使用到了<code>hexo d</code>进行推送,所以,我们还要更改一下travisCI的构建流程。<br>生成源码之后,不使用git进行推送,继续使用<code>hexo d</code>进行推送部署。具体可查看<a href="https://github.com/williamHappy/williamHappy.github.io/tree/blog_source" target="_blank" rel="noopener">我的配置</a>. 也可以参考<a href="https://juejin.im/post/5a1fa30c6fb9a045263b5d2a" target="_blank" rel="noopener">文章</a>。</p><p>至于我踩到的坑呢,可能就是<code>.travis.yml</code>文件的配置问题,经过不断的搜索比对,发现可能是因为该配置文件的注释中出现了特殊的字符,导致的travisCI无法去解析配置文件。去掉特殊字符后,构建成功。</p><h3 id="more"><a href="#more" class="headerlink" title="more"></a>more</h3><p>参考<a href="https://segmentfault.com/a/1190000009544924#articleHeader24" target="_blank" rel="noopener">文章</a>,插件还是配置了比较多的。</p><p><strong>更多配置优化持续更新中…</strong></p><h3 id="番外篇(TravisCI自动化构建)"><a href="#番外篇(TravisCI自动化构建)" class="headerlink" title="番外篇(TravisCI自动化构建)"></a>番外篇(TravisCI自动化构建)</h3><p>关于博客配置TravisCI自动化构建工具,可参考<a href="https://segmentfault.com/a/1190000009054888" target="_blank" rel="noopener">文章</a>, 非常方便,我们只需要写完md文件,提交到相应的分支,travisCi会帮我们构建部署到github的。travisCI完整学习,关注<a href="https://www.travis-ci.org/" target="_blank" rel="noopener">官方网站</a>.</p><p>travisCI自动化构建工具的使用学习,这也是个重点,也挺有意思的,有机会的话,以后可能也会出一篇文章记录一下,欢迎<strong>关注</strong>:D</p>]]></content>
<categories>
<category> 通用 </category>
</categories>
<tags>
<tag> Github </tag>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>私人定制--mac配置篇</title>
<link href="/2018/05/04/26-2018-05-04-si-ren-ding-zhi-mac-pei-zhi-pian/"/>
<url>/2018/05/04/26-2018-05-04-si-ren-ding-zhi-mac-pei-zhi-pian/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为什么讲是私人定制呢? 因为mac从入手, 大部分的软件和环境等都需要自己不断的去更新配置, 可以看到的是, 我们可能后面的环境配置会更新掉前面的环境配置,像本节接下来要说的关于原装vim的配置, 会在后面安装了macvim后, 环境配置得到了重新的配置, 当前的配置永远不可能固定下来, 可能后面配置就会颠覆之前的配置, 以得到功能更大的升华, 就是这样不断的去颠覆之前, 才能更好的为自己所用, 才能达到私人化的定制。 所以, 本章只是做一个指导, 并不完全要这个套路来做, 可以有更多私人化的定制在里面,才能更适合自己。</p><a id="more"></a><p>[toc]</p><h3 id="一-mac关于环境变量初探"><a href="#一-mac关于环境变量初探" class="headerlink" title="一. mac关于环境变量初探"></a>一. mac关于环境变量初探</h3><p>先简单了解下macOS系统额目录结构, <a href="https://blog.csdn.net/smstong/article/details/15499661" target="_blank" rel="noopener">文章参考</a></p><p>关于mac环境变量详细介绍,参考文章:<a href="http://blog.csdn.net/u010416101/article/details/54618621" target="_blank" rel="noopener">传送门</a></p><p><strong>🏁勾画重点</strong></p><h5 id="查看环境变量"><a href="#查看环境变量" class="headerlink" title="查看环境变量"></a>查看环境变量</h5><p>命令:</p><blockquote><p>[root@localhost u-boot-sh4]#echo $PATH<br>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</p></blockquote><p><strong>说明:</strong><br>PATH的格式为:<br>PATH=$PATH::::——: ,中间用冒号隔开。</p><h5 id="添加PATH环境变量"><a href="#添加PATH环境变量" class="headerlink" title="添加PATH环境变量"></a>添加PATH环境变量</h5><blockquote><p>[root@localhost u-boot-sh4]#export PATH=/opt/STM/STLinux-2.3/devkit/sh4/bin:$PATH</p></blockquote><h5 id="环境变量文件的优先级"><a href="#环境变量文件的优先级" class="headerlink" title="环境变量文件的优先级"></a>环境变量文件的优先级</h5><blockquote><p>/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc</p></blockquote><p><strong>说明:</strong><br><code>/etc/profile</code>: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.<br>并从/etc/profile.d目录的配置文件中搜集shell的设置.<br><code>/etc/bashrc</code>: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.<br><code>~/.bash_profile</code>: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该<br>文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.<br><code>~/.bashrc</code>: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该<br>该文件被读取.<br><code>~/.bash_logout</code>: 当每次退出系统(退出bash shell)时,执行该文件.</p><p>另外,<code>/etc/profile</code>中设定的变量(全局)的可以作用于任何用户,而<code>~/.bashrc</code>等中设定的变量(局部)只能继承<code>/etc/profile</code>中的变量,他们是”父子”关系.</p><p><code>~/.bash_profile</code> 是交互式、login 方式进入 bash 运行的<br><code>~/.bashrcv</code> 是交互式 non-login 方式进入 bash 运行的<br>通常二者设置大致相同,所以通常前者会调用后者。</p><h5 id="Mac配置环境变量"><a href="#Mac配置环境变量" class="headerlink" title="Mac配置环境变量"></a>Mac配置环境变量</h5><ol><li>/etc/profile (建议不修改这个文件 ) 全局(公有)配置,不管是哪个用户,登录时都会读取该文件。</li><li>/etc/bashrc (一般在这个文件中添加系统级环境变量) 全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件。</li><li>~/.bash_profile (一般在这个文件中添加用户级环境变量) 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!</li></ol><h5 id="查看-MacOS使用的shell类型"><a href="#查看-MacOS使用的shell类型" class="headerlink" title="查看 MacOS使用的shell类型"></a>查看 MacOS使用的shell类型</h5><p>命令:</p><blockquote><p>echo $SHELL</p></blockquote><p><strong>说明:</strong></p><ol><li>如果输出的是:csh或者是tcsh,那么你用的就是C Shell。</li><li>如果输出的是:bash,sh,zsh,那么你的用的可能就是Bourne Shell的一个变种。 Mac OS X 10.2之前默认的是C Shell。 Mac OS X 10.3之后默认的是Bourne Shell。</li><li>那么你可以把你要添加的环境变量添加到你主目录下面的.profile或者.bash_profile,如果存在没有关系添加进去即可,如果没有生成一个。</li></ol><p>mac默认的shell为bash,切换命令:</p><blockquote><p>chsh -s /bin/bash #切换默认终端bash<br> chsh -s /bin/zsh #切换终端shell为zsh</p></blockquote><p><strong>⚠️注意</strong><br>当mac机器上安装了zsh后 .bash_profile 文件中的环境变量就无法起到作用。<br> 解决方案:<br> (1) cd ~<br> (2) open .zshrc<br> (3) 在.zshrc文件末尾增加.bash_profile的引用: source ~/.bash_profile</p><p>原因:linux和macOS默认的shell为<code>bash</code>,加载的环境变量配置文件为<code>~/.bash_profile</code>,使用zsh的shell时,默认加载的环境变量配置文件为<code>~/.zshrc</code>,所以造成<code>.bash_profile</code> 文件中的环境变量就无法起到作用,解决只需在将<code>.bash_profile</code>文件加到<code>.zshrc</code>文件中即可。</p><h3 id="二-mac必备软件安装配置"><a href="#二-mac必备软件安装配置" class="headerlink" title="二. mac必备软件安装配置"></a>二. mac必备软件安装配置</h3><h4 id="homebrew安装"><a href="#homebrew安装" class="headerlink" title="homebrew安装"></a>homebrew安装</h4><p>为什么先安装homebrew呢? 因为后面很多安装软件都使用到了homebrew去安装,所以先来安装homebrew为好。<br>非常简单,参考文章:<br><a href="https://blog.csdn.net/h643342713/article/details/52936905" target="_blank" rel="noopener">官方网站</a><br><a href="https://brew.sh/index_zh-cn" target="_blank" rel="noopener">文章</a></p><h4 id="终端神器–iterm2安装配置"><a href="#终端神器–iterm2安装配置" class="headerlink" title="终端神器–iterm2安装配置"></a>终端神器–iterm2安装配置</h4><p>其中包括brew安装iterm2, 配置solarized, 配置oh my zsh,还有配置一些字体,插件等等。<br>详细,请参考文章: <a href="https://www.cnblogs.com/xishuai/p/mac-iterm2.html" target="_blank" rel="noopener">传送门</a></p><h4 id="命令行工具–Oh-My-Zsh"><a href="#命令行工具–Oh-My-Zsh" class="headerlink" title="命令行工具–Oh My Zsh"></a>命令行工具–Oh My Zsh</h4><p>上面安装iterm2时, 安装了oh my zsh。关于更多oh my zsh的使用配置, 请关注以下文档:<br><a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noopener">官方仓库</a><br><a href="https://blog.csdn.net/czg13548930186/article/details/72858289" target="_blank" rel="noopener">文章</a></p><p><strong>🏁勾画重点</strong><br><code>lib</code> 提供了核心功能的脚本库<br><code>tools</code> 提供安装、升级等功能的快捷工具<br><code>plugins</code> 自带插件的存在放位置<br><code>templates</code> 自带模板的存在放位置<br><code>themes</code> 自带主题文件的存在放位置<br><code>custom</code> 个性化配置目录,自安装的插件和主题可放这里</p><p><strong>zsh配置代理</strong><br>终端使用git、brew等安装软件或者clone代码,会出现速度慢,或者<code>443</code>等情况,采用设置代理处理。<br>使用不同的科学上网工具设置的代理端口不同,看具体配置。</p><pre class=" language-shell"><code class="language-shell"># 查看代理$ env | grep -I proxyhttps_proxy=http://127.0.0.1:7890http_proxy=http://127.0.0.1:7890all_proxy=socks5://127.0.0.1:7890# 取消代理$ unset http_proxy$ unset https_proxy$ unset all_proxy</code></pre><p>也可以配置环境变量,灵活开启管理代理, 在<code>.zshrc</code>文件中添加以下内容</p><pre class=" language-vim"><code class="language-vim">proxyon <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> export http_proxy<span class="token operator">=</span>Socks5<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token number">127.0</span><span class="token operator">.</span><span class="token number">0.1</span><span class="token punctuation">:</span><span class="token number">1086</span> export https_proxy<span class="token operator">=</span>Socks5<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span><span class="token number">127.0</span><span class="token operator">.</span><span class="token number">0.1</span><span class="token punctuation">:</span><span class="token number">1086</span> echo <span class="token string">"http/https proxy on."</span> curl ip<span class="token operator">.</span>gs<span class="token punctuation">}</span>proxyoff <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> unset http_proxy unset https_proxy echo <span class="token string">"http/https proxy off."</span> curl ip<span class="token operator">.</span>gs<span class="token punctuation">}</span></code></pre><p>执行<code>source ~/.zshrc</code>生效,即可以使用命令<code>proxyon</code>和<code>proxyoff</code>即可在当前终端开启和关闭代理。</p><h4 id="终端vim配色"><a href="#终端vim配色" class="headerlink" title="终端vim配色"></a>终端vim配色</h4><p>上面,安装iterm2时,我们配置了solarized主题,那么,在终端或者iterm2中vim的配色方案,我们也使用solarized的配色方案,保持一致,美观。<br>参考文章:<br><a href="http://ethanschoonover.com/solarized" target="_blank" rel="noopener">solarized官方网站</a><br><a href="https://github.com/altercation/solarized" target="_blank" rel="noopener">solarized官方仓库</a><br><a href="https://www.vpsee.com/2013/09/use-the-solarized-color-theme-on-mac-os-x-terminal/" target="_blank" rel="noopener">vim使用solarized配色1</a><br><a href="https://blog.csdn.net/hu_fubin/article/details/46573343" target="_blank" rel="noopener">vim使用solarized配色2</a></p><p><strong>⚠️注意</strong><br>预警: vim使用solarized配色, 要配置文件<code>.vimrc</code>, 而后面安装macvim的完整配置方案<code>.vim_runtime</code>时,会覆盖该配置文件,导致失效, 如何解决, 请查看<a href="https://blog.willhappy.cn/2018/05/02/24-2018-05-02-bian-ji-qi-ide-vim">编辑器IDE–vim</a>的第五节 <code>mac of vim</code>。</p><h4 id="macVim编辑器"><a href="#macVim编辑器" class="headerlink" title="macVim编辑器"></a>macVim编辑器</h4><p>请移步我的另一篇文章<a href="https://blog.willhappy.cn/2018/05/02/24-2018-05-02-bian-ji-qi-ide-vim">编辑器IDE–vim</a>的第五节 <code>mac of vim</code>, 里面有详细的介绍, 不再做赘述。</p><h4 id="效率神器–alfred"><a href="#效率神器–alfred" class="headerlink" title="效率神器–alfred"></a>效率神器–alfred</h4><p>安装使用参考: <a href="https://www.jianshu.com/p/e9f3352c785f" target="_blank" rel="noopener">文章</a></p><h4 id="python3安装"><a href="#python3安装" class="headerlink" title="python3安装"></a>python3安装</h4><p>mac系统自带python2.7, 现在安装python3版本。<br>参考: <a href="https://stringpiggy.hpd.io/mac-osx-python3-dual-install/#step2" target="_blank" rel="noopener">文章</a></p><p><strong>⚠️注意</strong><br>文章中提到为避免系统的python和brew中安装的python打架,所以要修改环境变量, 我们在这就没有修改, 应为我们安装python3的版本,他适合python版本独立的, 我们使用<code>python -v</code>, 读到的就是系统原装的python, 使用<code>python3 -v</code>, 读到的就是brew安装的python3, 互不影响,也就不做更改了。当然,这是我自己的观点, 如要了解更多, 还请自己google之。</p><h4 id="git安装"><a href="#git安装" class="headerlink" title="git安装"></a>git安装</h4><p>因为之前安装xcode, 自动安装了git,但是版本不是最新的, 而下面文章介绍了使用brew安装或者更新git版本。<br>参考:<a href="https://blog.csdn.net/xuping901022xp/article/details/51730778" target="_blank" rel="noopener">文章</a></p><h4 id="tomcat,-maven等安装"><a href="#tomcat,-maven等安装" class="headerlink" title="tomcat, maven等安装"></a>tomcat, maven等安装</h4><p>web环境的搭建, 都使用到homebrew来安装, 比较简单, 不做赘述。自行学会homebrew, 软件安装管理起来就很方便了。</p><p><strong>定制化持续更新中…</strong></p><h3 id="三-操作技巧"><a href="#三-操作技巧" class="headerlink" title="三. 操作技巧"></a>三. 操作技巧</h3><p>查看应用安装路径命令:</p><blockquote><p>which git</p></blockquote>]]></content>
<categories>
<category> tools </category>
</categories>
<tags>
<tag> mac </tag>
</tags>
</entry>
<entry>
<title>征途之路--linux</title>
<link href="/2018/05/03/25-2018-05-03-zheng-tu-zhi-lu-linux/"/>
<url>/2018/05/03/25-2018-05-03-zheng-tu-zhi-lu-linux/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>可能作为coder这么一类人, 总会有多少接触Linux, 并且有一份想拿下它,并凌驾于它之上的野心, 但是, 现实的骨感的, 从入门到放弃的, 也是比比皆是, 那如何才能有章程由规划的一步步进行呢, 那是需要我们有方向, 并有持之以恒的决心, 才能有所建树。 本文便是作为自己方向指导, 有侧重点的去涉猎学习积累, 慢慢构筑linux基础城墙。:D</p><a id="more"></a><p>[toc]</p><h3 id="一-linux阶段规划"><a href="#一-linux阶段规划" class="headerlink" title="一. linux阶段规划"></a>一. linux阶段规划</h3><p>要学习一门知识,就要清楚哪个阶段,该学什么,不该学什么,稳扎稳打,才能把底层建设稳固。<br><img src="http://oss.willhappy.cn/18-5-3/21919749.jpg" alt="path"><br>附带了解在了解下操作系统的概念<br><img src="http://oss.willhappy.cn/18-5-3/9701327.jpg" alt="sys"></p><h3 id="二-FHS-文件系统目录标准"><a href="#二-FHS-文件系统目录标准" class="headerlink" title="二. FHS(文件系统目录标准)"></a>二. FHS(文件系统目录标准)</h3><p>了解linux各目录文件的结构含义,有利于自己的合理规划和使用。<br><img src="http://oss.willhappy.cn/18-5-3/85730642.jpg" alt="directory"></p><p>我们需要特别关注的目录:<br><img src="http://oss.willhappy.cn/18-5-3/60936515.jpg" alt="dir"></p><h3 id="三-linux-内核学习路线"><a href="#三-linux-内核学习路线" class="headerlink" title="三. linux 内核学习路线"></a>三. linux 内核学习路线</h3><p>这个属于难点知识,可以了解下:<br><img src="http://oss.willhappy.cn/18-5-3/58290541.jpg" alt="core"></p><h3 id="四-Linux-Security-Coaching"><a href="#四-Linux-Security-Coaching" class="headerlink" title="四. Linux Security Coaching"></a>四. Linux Security Coaching</h3><p>此模块也属于了解内容,不做重点学习。<br><img src="http://oss.willhappy.cn/18-5-3/76490803.jpg" alt="security"></p><h3 id="五-linux命令使用"><a href="#五-linux命令使用" class="headerlink" title="五. linux命令使用*"></a>五. linux命令使用<strong>*</strong></h3><p>这节是一个重点内容, 使用linux, 更多的是使用命令操作linux, 所以,应多加练习,切勿死记硬背。以下重点在于辅助理解使用。<br><img src="http://oss.willhappy.cn/18-5-3/80662389.jpg" alt="cmd1"></p><p>重点来了, 好看又好用的脑图来了。<strong>理解辅助记忆,理解辅助记忆,理解辅助记忆</strong>,重要的事情说三遍。重点多家练习。<br><img src="http://oss.willhappy.cn/18-5-3/29756857.jpg" alt="cmd2"></p><p>还不过瘾? 那就再来一张。源文件<a href="http://oss.willhappy.cn/xmind/18-5-3/Linux-Cmd.xmind" target="_blank" rel="noopener">下载</a><br><img src="http://oss.willhappy.cn/18-5-3/84592572.jpg" alt="cmd3"></p><p>当然,也可以通过<a href="http://man.linuxde.net/" target="_blank" rel="noopener">命令大全</a>查看。</p>]]></content>
<categories>
<category> System </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>编辑器IDE--vim</title>
<link href="/2018/05/02/24-2018-05-02-bian-ji-qi-ide-vim/"/>
<url>/2018/05/02/24-2018-05-02-bian-ji-qi-ide-vim/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-Emacs-or-vim"><a href="#一-Emacs-or-vim" class="headerlink" title="一. Emacs or vim?"></a>一. Emacs or vim?</h3><p>素有的两大编辑器之争vim、emacs, 我们也就不再多说了,各具千秋,都值得我们学习,或许融入到他们之中,才能体会到他们的独特。说融入他们是容易, 可为什么平时我们还是很少的使用他们呢? 这可能是他们两个的学习曲线,实在让人难啄, 大多数人是有学习的那份心, 却难在了坚持使用他们上面,一起来看看他们的学习曲线。(请允许我盗一张图)<br><img src="http://oss.willhappy.cn/hexo/img/18-5-2/41682203.jpg" alt="41682203"></p><p>另外,关于更多这两大编辑器学习曲线的介绍, 请关注这篇文章 <a href="http://blog.jobbole.com/87872/" target="_blank" rel="noopener">传送门</a></p><p>介于我们文章的主题, 下面我们主要学习了解vim。</p><h3 id="二-why-vim"><a href="#二-why-vim" class="headerlink" title="二. why vim?"></a>二. why vim?</h3><p>因为vim在我们初学者当中,其应用范围还是蛮广的,包括在一些类unix系统中默认的编辑器,都是vim,所以笔者先来学习vim。关于其他的vim的一些好处和特点,和为什么使用vim更多,请关注此贴的why vim <a href="https://zilongshanren.com/blog/2014-06-19-make-your-vim-weapon.html" target="_blank" rel="noopener">传送门</a>,感谢作者,通过他的blog,学到很多东西,支持原创。 :D</p><p>重点总结下, vim的好处:</p><ul><li>扩展性</li><li>通用性</li><li>可定制化</li></ul><h3 id="三-How-to-do"><a href="#三-How-to-do" class="headerlink" title="三. How to do?"></a>三. How to do?</h3><p>关于vim的一些插件或者个性化配置,同样的也请移步此文章 <a href="https://zilongshanren.com/blog/2014-06-19-make-your-vim-weapon.html" target="_blank" rel="noopener">传送门</a></p><h3 id="四-vim相关操作"><a href="#四-vim相关操作" class="headerlink" title="四. vim相关操作"></a>四. vim相关操作</h3><p>关于vim的一些相关的操作,可以参考:<br><a href="https://github.com/ruanyf/articles/blob/master/dev/vim/operation.md" target="_blank" rel="noopener">传送1</a><br><a href="https://blog.csdn.net/flexman09/article/details/51802005" target="_blank" rel="noopener">传送2</a></p><h3 id="五-mac-of-vim"><a href="#五-mac-of-vim" class="headerlink" title="五. mac of vim"></a>五. mac of vim</h3><p>在mac中,我们选择安装macVim,不使用mac原装的vim,安装macVim, 参考<a href="https://blog.csdn.net/weixin_40539892/article/details/79252927" target="_blank" rel="noopener">文章</a>.</p><p><strong>⚠️注意</strong></p><ol><li>使用homebrew安装完macVim之后, 可能会自动添加到环境变量中, 参考文章中提到的建立软连接什么的, 我认为作者的意图是在终端使用<code>vim</code>命令时,是直接调用macvim.app, 也可不用配置, 仍让原装vim可使用, 两者互不干扰, 即<code>vim</code>命令仍然调用原装vim, 而<code>mvim</code>命令调用macvim。</li><li>安装完成之后, 可能需要为macvim配置各种插件或者主题样式,这里我们为了方便, 使用github上一个比较完整且开源的配置仓库<code>.vim_runtime</code>, 安装配置,参考<a href="https://github.com/amix/vimrc" target="_blank" rel="noopener">.vim_runtime的api</a></li><li>安装完<code>.vim_runtime</code>之后, 安装生效后,会返现原来的vim主题样式(solarized配色, 原来的配置可参考我的<a href="https://blog.willhappy.cn/2018/05/04/26-2018-05-04-si-ren-ding-zhi-mac-pei-zhi-pian/">私人定制–mac配置篇</a>)变了,不是我们喜欢的配色了,是因为安装<code>.vim_runtime</code>会重写<code>.vimrc</code>文件,将原来的配置覆盖掉了,所以样式vim主题样式会变。所以将原来配置在<code>.vimrc</code>中的样式重新写到自己的配置文件<code>~/.vim_runtime/my_configs.vim</code>中,没有该文件的话, 创建一个即。<code>.vim_runtime</code>会通过<code>.vimrc</code>读取<code>my_configs.vim</code>配置文件,就会重新生效。</li><li>自此,macvim安装完毕了,我们可以尽情的享受了。</li></ol><h3 id="六-ideaVim-应用"><a href="#六-ideaVim-应用" class="headerlink" title="六. ideaVim 应用"></a>六. ideaVim 应用</h3><p>可能我们更多的实在<code>idea</code>中开发代码, 那么,我们可以不断的练习使用vim的常用操作了,安装插件ideaVim, 关于ideaVim的应用技巧, 我们也不再重复造轮子了, 参考这篇文章, 介绍详细 <a href="http://kidneyball.iteye.com/blog/1828427" target="_blank" rel="noopener">传送门</a> .</p><p>特别注意: 就是在使用vim剪切板和系统剪切板之间的复制粘贴操作,系统剪切板上的内容可在任意程序中<code>ctrl+v</code>粘贴。<br><code>"+yy</code> 复制当前行到系统剪切板<br><code>"+p</code> 粘贴系统剪切板内容到vim<br><code>"ayy</code> 复制当前行到寄存器 a<br><code>"ap</code> 将寄存器 a 中的内容粘贴到光标后面</p><h3 id="七-vim之于新同学建议"><a href="#七-vim之于新同学建议" class="headerlink" title="七. vim之于新同学建议"></a>七. vim之于新同学建议</h3><p>可能有新同学下定决心学习vim, 并开始的初级阶段, 但是学着学着就产生的迷惑, 像我, 那我到底如何继续下去, 那么同样给出新同学学习中的建议和学习习惯养成 <a href="https://zilongshanren.com/blog/2014-06-07-make-your-own-vim-supert-weapon.html" target="_blank" rel="noopener">传送门</a> 再次感谢这位大神。</p><h3 id="八-vim命令脑图记忆"><a href="#八-vim命令脑图记忆" class="headerlink" title="八. vim命令脑图记忆"></a>八. vim命令脑图记忆</h3><p>脑图并不代表死记硬背, 关键在于多加练习。源文件<a href="http://oss.willhappy.cn/xmind/18-5-2/VIM-Key.xmind" target="_blank" rel="noopener">下载地址</a><br><img src="http://oss.willhappy.cn/18-5-2/91577548.jpg" alt="91577548"></p><p>vim键盘图:<br><img src="http://oss.willhappy.cn/hexo/img/18-5-2/32079775.jpg" alt="32079775"></p>]]></content>
<categories>
<category> tools </category>
</categories>
<tags>
<tag> vim </tag>
</tags>
</entry>
<entry>
<title>java对象初始化问题--阿里🐮刨析</title>
<link href="/2018/05/02/23-2018-05-02-java-dui-xiang-chu-shi-hua-wen-ti-a-li-bao-xi/"/>
<url>/2018/05/02/23-2018-05-02-java-dui-xiang-chu-shi-hua-wen-ti-a-li-bao-xi/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-why引入"><a href="#一-why引入" class="headerlink" title="一. why引入"></a>一. why引入</h3><p>因为java对象初始化问题是比较基础的java知识点,同时,也是众多面试中百问不厌的问题,所以,我们通过阿里工程师的例子和刨析来好好理解他。</p><h3 id="二-引发问题"><a href="#二-引发问题" class="headerlink" title="二. 引发问题"></a>二. 引发问题</h3><p>会触发Java object initialization order 问题,这种问题比较少见。</p><h3 id="三-举例"><a href="#三-举例" class="headerlink" title="三. 举例"></a>三. 举例</h3><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>xn<span class="token punctuation">.</span>web<span class="token punctuation">.</span>budget<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test2</span> <span class="token keyword">extends</span> <span class="token class-name">Test</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">Test2</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">super</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> a <span class="token operator">=</span> <span class="token number">200</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Test2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">package</span> com<span class="token punctuation">.</span>xn<span class="token punctuation">.</span>web<span class="token punctuation">.</span>budget<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token function">Test</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">(</span>Test2<span class="token punctuation">)</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">.</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>结果输出:</p><pre><code>0100200</code></pre><p>解析对象的初始化顺序:</p><ol><li>为A类分配内存空间,初始化所有成员变量为默认值,包括primitive类型(int=0,boolean=false,…)和Reference类型。</li><li>调用A类构造函数。</li><li>调用B类构造函数。</li><li>调用Object空构造函数。(java编译器会默认加此构造函数,且object构造函数是个空函数,所以立即返回)</li><li><strong>初始化B类成员变量,因为B类没有成员变量,跳过。</strong></li><li>执行sysout输出子类A的成员变量小a。// 此时为0</li><li><strong>初始化A类成员变量,将A类成员变量小a赋值100。</strong></li><li>执行sysout输出当前A类的成员变量小a。// 此时为100</li><li>赋值当前A类的成员变量小a为200。</li><li>main函数中执行sysout,输出A类实例的成员变量小a。// 此时为200</li></ol><p>加粗的那两行描述是重点,结论是<strong>成员变量初始化是在父类构造函数调用完后,在此之前,成员变量的值均是默认值</strong>。</p><p>其实这类问题,熟悉原理是一方面,本质上只要不在构造函数中插入过多的业务逻辑,出问题的概率也会低很多。</p><p>最后,我们再来看看JLS中给出的Java类对象初始化顺序定义,这是一个带条件分支的流程描述:</p><ol><li>Assign the arguments for the constructor to newly created parameter variables for this constructor invocation.</li><li>If this constructor begins with an explicit constructor invocation of another constructor in the same class (using this), then evaluate the arguments and process that constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason; otherwise, continue with step 5.</li><li>This constructor does not begin with an explicit constructor invocation of another constructor in the same class (using this). If this constructor is for a class other than Object, then this constructor will begin with an explicit or implicit invocation of a superclass constructor (using super). Evaluate the arguments and process that superclass constructor invocation recursively using these same five steps. If that constructor invocation completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, continue with step 4.</li><li>Execute the instance initializers and instance variable initializers for this class, assigning the values of instance variable initializers to the corresponding instance variables, in the left-to-right order in which they appear textually in the source code for the class. If execution of any of these initializers results in an exception, then no further initializers are processed and this procedure completes abruptly with that same exception. Otherwise, continue with step 5. (In some early implementations, the compiler incorrectly omitted the code to initialize a field if the field initializer expression was a constant expression whose value was equal to the default initialization value for its type.)</li><li>Execute the rest of the body of this constructor. If that execution completes abruptly, then this procedure completes abruptly for the same reason. Otherwise, this procedure completes normally.</li></ol><p>引用自:<a href="http://jm.taobao.org/page/40/" target="_blank" rel="noopener">传送</a></p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 基础 </tag>
</tags>
</entry>
<entry>
<title>git养成日记</title>
<link href="/2018/04/26/22-2018-04-26-git-yang-cheng-ri-ji/"/>
<url>/2018/04/26/22-2018-04-26-git-yang-cheng-ri-ji/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>基础入门,参考<a href="https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000" target="_blank" rel="noopener">廖雪峰老师的git教程</a></p><h3 id="一-git日常操作"><a href="#一-git日常操作" class="headerlink" title="一. git日常操作"></a>一. git日常操作</h3><blockquote><p>git add fileName;<br>git commit -m ‘提交说明’;<br>git push -u;//提交到github<br>git status -s//查看文件状态</p></blockquote><p>git提交文件到github示意图:<br><img src="http://oss.willhappy.cn/18-5-3/92985784.jpg" alt="GitCommitFile"></p><h3 id="二-git提交tag"><a href="#二-git提交tag" class="headerlink" title="二. git提交tag"></a>二. git提交tag</h3><p><code>标签</code>可以针对某一时间点的版本做标记,常用于版本发布。 也可以是某个重要版本的标识,可标识里程碑版本,可回溯可参考亦可纪念,哈哈。</p><blockquote><p>git tag -a v1.0 -m “Release version 1.0″</p></blockquote><p>详解:</p><blockquote><p>git tag 是命令<br>-a v1.0是增加 名为v1.0的标签<br>-m 后面跟着的是标签的注释</p></blockquote><p><code>git tag</code>的操作发生在我们commit修改到本地仓库之后。</p><h4 id="完整操作流程"><a href="#完整操作流程" class="headerlink" title="完整操作流程"></a>完整操作流程</h4><ol><li>提交</li></ol><blockquote><p>git add .<br>git commit -m ‘add tags’<br>git tag -a v1.0 -m ‘Release version 1.0’</p></blockquote><ol start="2"><li>推送标签到远程服务器上</li></ol><p>默认情况下,<code>git push</code> 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 <code>git push origin [tagname]</code> 即可:</p><blockquote><p>git push origin master<br>git push origin v1.0</p></blockquote><p>如果要一次推送所有本地新增的标签上去,可以使用 –tags 选项:<code>git push origin --tags</code></p><h4 id="后期追加标签"><a href="#后期追加标签" class="headerlink" title="后期追加标签"></a>后期追加标签</h4><p>你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:</p><pre class=" language-shell"><code class="language-shell">$ git log --pretty=oneline15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support0d52aaab4479697da7686c15f77a3d64d9165190 one more thing</code></pre><p>我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:</p><blockquote><p>$ git tag -a v1.2 a6b4c97</p></blockquote><h4 id="切换已有tag"><a href="#切换已有tag" class="headerlink" title="切换已有tag"></a>切换已有tag</h4><blockquote><p>git tag –list // 查看已有tag列表<br>git checkout [tag/branch/commit] // 切换到指定tag/branch/commit都是此命令</p></blockquote><h4 id="删除tag"><a href="#删除tag" class="headerlink" title="删除tag"></a>删除tag</h4><blockquote><p>git tag -d v1.0</p></blockquote><h4 id="删除远端服务器的标签"><a href="#删除远端服务器的标签" class="headerlink" title="删除远端服务器的标签"></a>删除远端服务器的标签</h4><blockquote><p>git push origin :refs/tags/v1.0</p></blockquote><h3 id="三-git分支"><a href="#三-git分支" class="headerlink" title="三. git分支"></a>三. git分支</h3><p><code>分支</code>意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。git可以在工作流程中频繁的使用分支与合并。<br>关于<code>分支</code>的更多概念理解,参考<a href="https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E4%BD%95%E8%B0%93%E5%88%86%E6%94%AF" target="_blank" rel="noopener">git api</a>, 这里我只关注常用操作。</p><h4 id="创建分支"><a href="#创建分支" class="headerlink" title="创建分支"></a>创建分支</h4><p>那么,Git 又是如何创建一个新的分支的呢?答案很简单,创建一个新的分支指针。比如新建一个 testing 分支,可以使用 git branch 命令:</p><blockquote><p>git branch testing</p></blockquote><h4 id="切换分支"><a href="#切换分支" class="headerlink" title="切换分支"></a>切换分支</h4><p>要切换到其他分支,可以执行 git checkout 命令。我们现在转换到新建的 testing 分支:</p><blockquote><p>git checkout testing</p></blockquote><p>当然,我们也可以新建并切换到该分支,运行 <code>git checkout</code> 并加上 <code>-b</code> 参数:</p><blockquote><p>$ git checkout -b iss53<br>Switched to a new branch ‘iss53’</p></blockquote><h4 id="分支的合并"><a href="#分支的合并" class="headerlink" title="分支的合并"></a>分支的合并</h4><p>在问题 #53 相关的工作完成之后,可以合并回 <code>master</code> 分支。实际操作同前面合并 <code>hotfix</code> 分支差不多,只需回到 <code>master</code> 分支,运行 <code>git merge</code> 命令指定要合并进来的分支:</p><pre class=" language-shell"><code class="language-shell">$ git checkout master$ git merge iss53Auto-merging READMEMerge made by the 'recursive' strategy.README | 1 +1 file changed, 1 insertion(+)</code></pre><p>查看分支合并情况:</p><pre class=" language-shell"><code class="language-shell">git log --graph --pretty=oneline --abbrev-commit</code></pre><h4 id="分支删除"><a href="#分支删除" class="headerlink" title="分支删除"></a>分支删除</h4><p>既然之前的工作成果已经合并到 <code>master</code> 了,那么 <code>iss53</code> 也就没用了。你可以就此删除它,并在问题追踪系统里关闭该问题。</p><blockquote><p>$ git branch -d iss53</p></blockquote><h4 id="遇到冲突时的分支合并"><a href="#遇到冲突时的分支合并" class="headerlink" title="遇到冲突时的分支合并"></a>遇到冲突时的分支合并</h4><p>有时候合并操作并不会如此顺利。如果在不同的分支中都修改了同一个文件的同一部分,Git 就无法干净地把两者合到一起(译注:逻辑上说,这种问题只能由人来裁决。)。如果你在解决问题 #53 的过程中修改了 <code>hotfix</code> 中修改的部分,将得到类似下面的结果:</p><pre class=" language-shell"><code class="language-shell">$ git merge iss53Auto-merging index.htmlCONFLICT (content): Merge conflict in index.htmlAutomatic merge failed; fix conflicts and then commit the result.</code></pre><p>Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 <code>git status</code> 查阅:</p><pre class=" language-shell"><code class="language-shell">$ git statusOn branch masterYou have unmerged paths.(fix conflicts and run "git commit")\Unmerged paths:(use "git add <file>..." to mark resolution)both modified: index.htmlno changes added to commit (use "git add" and/or "git commit -a")</code></pre><p>任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:</p><pre class=" language-shell"><code class="language-shell"><<<<<<< HEAD<div id="footer">contact : [email protected]</div>=======<div id="footer"> please contact us at [email protected]</div>>>>>>>> iss53</code></pre><p>可以看到 <code>=======</code> 隔开的上半部分,是 <code>HEAD</code>(即 <code>master</code> 分支,在运行 <code>merge</code> 命令时所切换到的分支)中的内容,下半部分是在 <code>iss53</code> 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:</p><pre class=" language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>div</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>footer<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>please contact us at [email protected]<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>div</span><span class="token punctuation">></span></span></code></pre><p>这个解决方案各采纳了两个分支中的一部分内容,而且我还删除了 <code><<<<<<<</code>,<code>=======</code> 和 <code>>>>>>>></code> 这些行。在解决了所有文件里的所有冲突后,运行 <code>git add</code> 将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)。因为一旦暂存,就表示冲突已经解决。</p><h4 id="利用分支进行开发的工作流程"><a href="#利用分支进行开发的工作流程" class="headerlink" title="利用分支进行开发的工作流程"></a>利用分支进行开发的工作流程</h4><p>参考: <a href="https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%A9%E7%94%A8%E5%88%86%E6%94%AF%E8%BF%9B%E8%A1%8C%E5%BC%80%E5%8F%91%E7%9A%84%E5%B7%A5%E4%BD%9C%E6%B5%81%E7%A8%8B" target="_blank" rel="noopener">git api</a></p><h4 id="远程分支"><a href="#远程分支" class="headerlink" title="远程分支"></a>远程分支</h4><p>查看远程分支:</p><blockquote><p>git branch -a</p></blockquote><p>**查看本地分支关联(跟踪)的远程分支之间的对应关系:</p><blockquote><p>git branch -vv</p></blockquote><p>git关联本地与远程分支:</p><blockquote><p>git branch –set-upstream-to origin/devtest devtest</p></blockquote><p>注意:<code>git pull</code>和<code>git merge</code> 区别?<br><code>git pull</code> = <code>git fetch</code> + <code>git merge</code>,<br><code>fetch</code>和<code>push</code>命令可以分别对远程分支进行<code>fetch</code>和<code>push</code>操作,而<code>pull</code>不是直接跟远程分支对话的。<br><code>fetch</code>同<code>pull</code>的区别在于:<code>git fetch</code>:是从远程获取最新版本到本地,不会自动<code>merge</code>,而<code>git pull</code>是从远程获取最新版本并<code>merge</code>到本地仓库。<br>从安全角度出发,<code>git fetch</code>比<code>git pull</code>更安全,因为我们可以先比较本地与远程的区别后,选择性的合并。<br><code>git push</code> 默认推送到<code>master</code>,如果有多个分支,则多个分支一起推送到远程。</p><p>更多远程操作,查看<a href="http://www.ruanyifeng.com/blog/2014/06/git_remote.html" target="_blank" rel="noopener">文章</a></p><h3 id="四-git开发一般流程"><a href="#四-git开发一般流程" class="headerlink" title="四. git开发一般流程"></a>四. git开发一般流程</h3><p>上面说的是git的基本操作,那实际项目开发应用实例,我们的做法大致如下(<a href="https://www.zhihu.com/question/21995370/answer/19975870" target="_blank" rel="noopener">转载</a>,继续完善):</p><h4 id="情况一-远程仓库有master和dev分支"><a href="#情况一-远程仓库有master和dev分支" class="headerlink" title="情况一: 远程仓库有master和dev分支"></a>情况一: 远程仓库有master和dev分支</h4><p>1.克隆代码</p><pre class=" language-shell"><code class="language-shell">> git clone https://github.com/master-dev.git# 这个git路径是无效的,示例而已</code></pre><p>2.查看所有分支</p><pre class=" language-shell"><code class="language-shell">> git branch --all# 默认有了dev和master分支,所以会看到如下三个分支# master[本地主分支] origin/master[远程主分支] origin/dev[远程开发分支]# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步# 但是origin/dev分支在本地没有任何的关联,所以我们无法在那里开发</code></pre><p>3.创建本地关联origin/dev的分支</p><pre class=" language-shell"><code class="language-shell">> git checkout dev origin/dev# 创建本地分支dev,并且和远程origin/dev分支关联,本地dev分支的初始代码和远程的dev分支代码一样</code></pre><p>4.切换到dev分支进行开发</p><pre class=" language-shell"><code class="language-shell">> git checkout dev # 这个是切换到dev分支,然后就是常规的开发</code></pre><h4 id="情况二-假设远程仓库只有mater分支"><a href="#情况二-假设远程仓库只有mater分支" class="headerlink" title="情况二: 假设远程仓库只有mater分支"></a>情况二: 假设远程仓库只有mater分支</h4><p>1.克隆代码</p><pre class=" language-shell"><code class="language-shell">> git clone https://github.com/master-dev.git# 这个git路径是无效的,示例而已</code></pre><p>2.查看所有分支</p><pre class=" language-shell"><code class="language-shell">> git branch --all# 默认只有master分支,所以会看到如下两个分支# master[本地主分支] origin/master[远程主分支]# 新克隆下来的代码默认master和origin/master是关联的,也就是他们的代码保持同步</code></pre><p>3.创建本地新的dev分支</p><pre class=" language-shell"><code class="language-shell">> git branch dev # 创建本地分支> git branch # 查看分支# 这是会看到master和dev,而且master上会有一个星号# 这个时候dev是一个本地分支,远程仓库不知道它的存在# 本地分支可以不同步到远程仓库,我们可以在dev开发,然后merge到master,使用master同步代码,当然也可以同步</code></pre><p>4.发布dev分支发布dev分支指的是同步dev分支的代码到远程服务器</p><pre class=" language-shell"><code class="language-shell">> git push origin dev:dev # 这样远程仓库也有一个dev分支了</code></pre><p>5.在dev分支开发代码</p><pre class=" language-shell"><code class="language-shell">> git checkout dev # 切换到dev分支进行开发# 开发代码之后,我们有两个选择# 第一个:如果功能开发完成了,可以合并主分支git checkout master # 切换到主分支git merge dev # 把dev分支的更改和master合并git push # 提交主分支代码远程git checkout dev # 切换到dev远程分支git push # 提交dev分支到远程# 第二个:如果功能没有完成,可以直接推送git push # 提交到dev远程分支# 注意:在分支切换之前最好先commit全部的改变,除非你真的知道自己在做什么</code></pre><p>6.删除分支</p><pre class=" language-shell"><code class="language-shell">> git push origin :dev # 删除远程dev分支,危险命令哦# 下面两条是删除本地分支git checkout master # 切换到master分支git branch -d dev # 删除本地dev分支</code></pre><h3 id="五-git命令脑图记忆"><a href="#五-git命令脑图记忆" class="headerlink" title="五. git命令脑图记忆"></a>五. git命令脑图记忆</h3><p><img src="http://oss.willhappy.cn/18-4-27/98991932.jpg" alt="git_xmind"></p>]]></content>
<categories>
<category> cvs </category>
</categories>
<tags>
<tag> git </tag>
</tags>
</entry>
<entry>
<title>小绿🔒https的web容器配置</title>
<link href="/2018/04/25/21-2018-04-25-xiao-lu-suo-https-de-web-rong-qi-pei-zhi/"/>
<url>/2018/04/25/21-2018-04-25-xiao-lu-suo-https-de-web-rong-qi-pei-zhi/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>学习配置https,以及一些服务器安装部署流程,在tomcat和nginx中安装配置https。</p><a id="more"></a><p>[toc]</p><h3 id="一-阿里云免费证书的申请下载"><a href="#一-阿里云免费证书的申请下载" class="headerlink" title="一. 阿里云免费证书的申请下载"></a>一. 阿里云免费证书的申请下载</h3><p>参考:<code>https://common-buy.aliyun.com/?spm=5176.2020520163.cas.85.3b102b7arJW2wy&commodityCode=cas#/buy</code> <a href="https://common-buy.aliyun.com/?spm=5176.2020520163.cas.85.3b102b7arJW2wy&commodityCode=cas#/buy" target="_blank" rel="noopener">传送门</a><br>购买成功后,按照对应流程下载配置。<br>相关配置参考:<code>https://help.aliyun.com/video_detail/54217.html?spm=5176.2020520163.cas.80.3b102b7arJW2wy</code> <a href="https://help.aliyun.com/video_detail/54217.html?spm=5176.2020520163.cas.80.3b102b7arJW2wy" target="_blank" rel="noopener">传送门</a></p><h3 id="二-配置注意问题"><a href="#二-配置注意问题" class="headerlink" title="二. 配置注意问题"></a>二. 配置注意问题</h3><ol><li>端口号的更改,https默认的端口号为443.</li><li>证书路径的修改</li><li>协议的修改</li><li>证书密码的修改</li></ol><p>blog相关参考: <code>http://imtianx.cn/2017/09/22/tomcat_set_https/</code> <a href="http://imtianx.cn/2017/09/22/tomcat_set_https/" target="_blank" rel="noopener">传送门</a></p><h3 id="三-防火墙端口的开放"><a href="#三-防火墙端口的开放" class="headerlink" title="三. 防火墙端口的开放"></a>三. 防火墙端口的开放</h3><pre><code>vim /etc/sysconfig/iptables</code></pre><p>在文件中添加:</p><blockquote><p>-A INPUT -p tcp -m state –state NEW -m tcp –dport 443 -j ACCEPT</p></blockquote><p>当然,也可以在阿里云的后台管理系统,去设置安全组策略来开放端口。</p><h3 id="四-测试"><a href="#四-测试" class="headerlink" title="四. 测试"></a>四. 测试</h3><p>重启tomcat,使用<code>https://willhappy.cn</code>测试。</p><h3 id="五-番外-nginx-tomcat-https"><a href="#五-番外-nginx-tomcat-https" class="headerlink" title="五. 番外(nginx + tomcat + https)"></a>五. 番外(nginx + tomcat + https)</h3><blockquote><p>上面说了关于web项目单独在tomcat容器中配置https, 但是,现在现在大部企业都是采用nginx作为反向代理服务器,tomcat只做数据服务的提供者,所以,简单再说下关于nginx的https证书安装和配置。</p></blockquote><h4 id="1-关于nginx安装"><a href="#1-关于nginx安装" class="headerlink" title="1. 关于nginx安装"></a>1. 关于nginx安装</h4><p>网上已经相当多了,可参考<a href="http://blog.willhappy.cn/2017/06/14/19_2017-06-14_%E5%9C%A8Linux%E4%B8%8A%E6%90%AD%E5%BB%BANginx%E6%9C%8D%E5%8A%A1%E5%99%A8/">传送门</a>.</p><h4 id="2-nginx配置https证书"><a href="#2-nginx配置https证书" class="headerlink" title="2. nginx配置https证书"></a>2. nginx配置https证书</h4><p>类似与tomcat的https配置,参考<a href="https://yundun.console.aliyun.com/?spm=5176.2020520001.aliyun_sidebar.15.x8wSsv&p=cas#/cas/download/214404469580275?regionId=" target="_blank" rel="noopener">传送门</a>, 视频参考<a href="https://help.aliyun.com/video_detail/54216.html?spm=5176.2020520163.cas.44.1ea12b7a93Ji91" target="_blank" rel="noopener">传送门</a>.<br>我的配置文件<code>nginx.conf</code>:</p><pre class=" language-yml"><code class="language-yml">server { listen 443; server_name willhappy.cn; #拦截的域名 ssl on; root html; index index.html index.htm; ssl_certificate cert/XX.pem; #你自己申请的证书文件 ssl_certificate_key cert/XX.key; #私钥文件 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://whome; #提供数据服务的服务器 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}upstream whome{ server localhost:8080;}</code></pre><blockquote><p>配置tomcat的server.xml可直接通过ip进行项目的访问</p></blockquote><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Host</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>localhost<span class="token punctuation">"</span></span> <span class="token attr-name">appBase</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>webapps<span class="token punctuation">"</span></span> <span class="token attr-name">unpackWARs</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">autoDeploy</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token attr-name">xmlValidation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span> <span class="token attr-name">xmlNamespaceAware</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>false<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>Context</span> <span class="token attr-name">path</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span><span class="token punctuation">"</span></span> <span class="token attr-name">docBase</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>/usr/local/tomcat/webapps/whome<span class="token punctuation">"</span></span> <span class="token attr-name">reloadable</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>true<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>Host</span><span class="token punctuation">></span></span></code></pre><h4 id="3-启动测试"><a href="#3-启动测试" class="headerlink" title="3. 启动测试"></a>3. 启动测试</h4><p>启动nginx,可能会出现错误:</p><blockquote><p>[emerg] 10464#0: unknown directive “ssl” in /usr/local/nginx-0.6.32/conf/nginx.conf:74</p></blockquote><p>这是因为没有将ssl模块编译进nginx,在configure的时候加上“–with-http_ssl_module”即可</p><pre class=" language-shell"><code class="language-shell">[root@localhost nginx-1.4.4]# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module</code></pre><p>nginx安装包中重新配置,编译。<br>再次通过<code>https://willhappy.cn</code>,访问测试,配置成功。</p><blockquote><p>注意:我们只能通过<a href="https://willhappy.cn" target="_blank" rel="noopener">https://willhappy.cn</a> 方式访问才是安全访问,通过willhappy.cn还是普通的http访问,所以,要通过两种方式都可以安全访问,还需要配置一下。</p></blockquote><p>参考<a href="https://blog.csdn.net/will5451/article/details/79132093" target="_blank" rel="noopener">传送门</a>,未做测试。可以自己尝试一下,嘻嘻</p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>centos7.0搭建web环境的坎</title>
<link href="/2017/12/23/20-2017-12-23-centos7.0-da-jian-web-huan-jing-de-kan/"/>
<url>/2017/12/23/20-2017-12-23-centos7.0-da-jian-web-huan-jing-de-kan/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为了接下来能活的更好,再次埋头扎下了技术坑,一步一步来了,先从搭建生产环境走起,centos7.0 + tomcat8.5 + jdk1.8 + mysql5.7吧,简单的走流程的东西就不写了,只写一下在安装过程中走的坑,haha。</p><a id="more"></a><p>[toc]</p><h3 id="一-阿里云ECS服务器"><a href="#一-阿里云ECS服务器" class="headerlink" title="一. 阿里云ECS服务器"></a>一. 阿里云ECS服务器</h3><h3 id="二-mysql安装"><a href="#二-mysql安装" class="headerlink" title="二. mysql安装"></a>二. mysql安装</h3><ol><li>官网下载,安装到/usr/local/mysql目录下<br>官方地址:<code>https://dev.mysql.com/downloads/mysql/</code><br>选择要下载的版本,上传到服务器即可,然后进行一系列的安装操作,下面具体说遇到的问题。</li><li>启动服务服务时出错</li></ol><pre class=" language-shell"><code class="language-shell">service mysqld start</code></pre><p>错误及解决方案:<br><img src="http://oss.willhappy.cn/18-5-3/54368256.jpg" alt="mysql_error"></p><p>应该是缺少库,所以yum安装一下即可。</p><h3 id="三-java环境安装配置"><a href="#三-java环境安装配置" class="headerlink" title="三. java环境安装配置"></a>三. java环境安装配置</h3><ol><li>环境变量的配置<br>安装过程不多说,环境变量配置如下:</li></ol><pre class=" language-shell"><code class="language-shell">[root@will ~]# vim /etc/profile# 在export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL下添加export JAVA_HOME=/usr/local/javaexport JRE_HOME=$JAVA_HOME/jreexport PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar#保存后,执行source /etc/profile使其生效</code></pre><p>安装配置完成,验证是否配置成功。</p><pre class=" language-shell"><code class="language-shell">[root@will ~]# java -versionjava version "1.8.0_151"Java(TM) SE Runtime Environment (build 1.8.0_151-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)</code></pre><p>成功,java环境配置完成。</p><h3 id="四-tomcat安装配置"><a href="#四-tomcat安装配置" class="headerlink" title="四. tomcat安装配置"></a>四. tomcat安装配置</h3><ol><li>端口号开放<br>使用<code>iptables</code>进行端口号的开放。详情如下:</li></ol><pre class=" language-shell"><code class="language-shell"># 安装yum install iptables-services#配置防火墙vim /etc/sysconfig/iptables# 在 22端口号线面添加 如下端口,然后保存并退出 (:wq)-A INPUT -p tcp -m state --state NEW -m tcp --dport 8080 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT#重启防火墙systemctl restart iptables.service#查看 开放端口iptables -L -n</code></pre><blockquote><p>注:这里必须要在 22端口号下面添加,不能添加到最后.</p></blockquote><ol start="2"><li>设置tomcat服务,开机自启<br>具体实现命令如下:</li></ol><pre class=" language-shell"><code class="language-shell">[root@will ~]# vim /usr/lib/systemd/system/tomcat.service#添加如下内容[unit]Description=TomcatAfter=syslog.target network.target remote-fs.target nss-lookup.target[Service]Type=forkingPIDFile=/usr/local/tomcat/tomcat.pidExecStart=/usr/local/tomcat/bin/startup.shExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true[Install]WantedBy=multi-user.target#添加完成,:wq保存</code></pre><p>然后,cd到<code>/usr/local/tomcat/bin/</code>目录下,添加<code>setenv.sh</code>文件,具体操作如下:</p><pre class=" language-shell"><code class="language-shell">[root@will bin]# cd /usr/local/tomcat/bin/[root@will bin]# vim setenv.sh#setenv.sh文件添加内容如下#add tomcat pidCATALINA_PID="$CATALINA_BASE/tomcat.pid"#add java optsJAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m"#添加完成,:wq保存完成</code></pre><p>设置开机自启,重启tomcat服务:</p><pre class=" language-shell"><code class="language-shell">[root@will bin]# systemctl enable tomcatCreated symlink from /etc/systemd/system/multi-user.target.wants/tomcat.service to /usr/lib/systemd/system/tomcat.service.[root@will bin]# systemctl restart tomcat</code></pre><blockquote><p>注:自己在设置tomcat开机启动时,还是遇到挺多问题的,不过写blog时,忘记了,以后有机会遇见还会再补充上的!</p></blockquote><p> <code>systemctl</code>相关命令,操作服务相关指令如下:</p><pre class=" language-shell"><code class="language-shell"># 启动服务,stop停止systemctl start tomcat# 查看服务状态systemctl status name# 设置开机自启,disable删除systemctl enable tomcat# 重启服务systemctl restart tomcat</code></pre><h3 id="五-测试访问"><a href="#五-测试访问" class="headerlink" title="五. 测试访问"></a>五. 测试访问</h3><p>至此,centos7web环境搭建完成,测试访问。<br>浏览器访问:</p><blockquote><p><a href="http://ip:8080/" target="_blank" rel="noopener">http://ip:8080/</a></p></blockquote><p>出现tomcat欢迎页面即搭建成功。<br>如有其他问题,也可备注添加^_^.</p><blockquote><p>基本安装参考blog地址:<a href="https://www.cnblogs.com/ystq/articles/5919114.html" target="_blank" rel="noopener">https://www.cnblogs.com/ystq/articles/5919114.html</a></p></blockquote>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>在Linux上搭建Nginx服务器</title>
<link href="/2017/06/14/19-2017-06-14-zai-linux-shang-da-jian-nginx-fu-wu-qi/"/>
<url>/2017/06/14/19-2017-06-14-zai-linux-shang-da-jian-nginx-fu-wu-qi/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>同样是分布式系统中,需要使用nginx服务器,关于nginx的相关概念知识,百度google吧,就不多说了,主要说一下自己Linxu上搭建nginx服务器是遇到的问题,并且在此项目中,是使用虚拟机搭建一个专门的服务器来存放图片,在此服务器上安装一个nginx来提供http服务,安装一个ftp服务器来提供图片的上传服务。</p><a id="more"></a><p>[toc]</p><h3 id="一-环境准备"><a href="#一-环境准备" class="headerlink" title="一. 环境准备"></a>一. 环境准备</h3><p>我自己的环境(可以自己选择版本):</p><ol><li>安装了CentOS7的VM虚拟机(如何安装,参考<a href="http://willhappy.cn/2017/01/08/Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E5%88%9D%E7%BA%A7%EF%BC%89/" target="_blank" rel="noopener">Linux学习</a> )</li><li>Xshell5安全终端模拟软件(下载地址:<a href="http://www.netsarang.com/download/free_license.html" target="_blank" rel="noopener">http://www.netsarang.com/download/free_license.html</a> )</li></ol><p><em>在这多说一点,关于xshell连接CentOS时的问题,如果你的xshell可以连接到Linux,那直接跳到第三节,没有连接好,看第二节,当然你也可以直接登录centos,在终端进行操作,使用xshell主要是方便可以再Windows界面下访问不同系统下的服务器,从而较好的达到远端控制终端的目的。</em></p><h3 id="二-Xshell连接CentOS"><a href="#二-Xshell连接CentOS" class="headerlink" title="二. Xshell连接CentOS"></a>二. Xshell连接CentOS</h3><p>下载好xshell,安装完成后,启动,首先,要保证centos,可以连接上网。不能上网的话,参考博客:<a href="http://www.linuxidc.com/Linux/2013-05/83803.htm" target="_blank" rel="noopener">http://www.linuxidc.com/Linux/2013-05/83803.htm</a><br>然后就是使用xshell连接centos,参考:<a href="http://jingyan.baidu.com/article/36d6ed1f7520991bcf4883e6.html" target="_blank" rel="noopener">http://jingyan.baidu.com/article/36d6ed1f7520991bcf4883e6.html</a></p><p>关于Xshell连接Centos就说这么多了。以后多使用,应该就熟练了。</p><h3 id="三-安装Nginx"><a href="#三-安装Nginx" class="headerlink" title="三. 安装Nginx"></a>三. 安装Nginx</h3><ol><li>nginx安装环境<br>nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境。</li></ol><ul><li>gcc<br>安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没有gcc环境,需要安装gcc:</li></ul><pre class=" language-shell"><code class="language-shell">yum install gcc-c++</code></pre><ul><li>PCRE<br>PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库。</li></ul><pre class=" language-shell"><code class="language-shell">yum install -y pcre pcre-devel</code></pre><p>注:pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。</p><ul><li>zlib<br>zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。</li></ul><pre class=" language-shell"><code class="language-shell">yum install -y zlib zlib-devel</code></pre><ul><li>openssl<br>OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。<br>nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。</li></ul><pre class=" language-shell"><code class="language-shell">yum install -y openssl openssl-devel</code></pre><ol start="2"><li>编译安装</li></ol><ul><li>首先进入/usr/local</li></ul><pre class=" language-shell"><code class="language-shell">cd /usr/local</code></pre><ul><li>从官网下载nginx(版本自己选择)</li></ul><pre class=" language-shell"><code class="language-shell">wget http://nginx.org/download/nginx-1.9.8.tar.gz</code></pre><ul><li>解压nginx压缩包</li></ul><pre class=" language-shell"><code class="language-shell">tar -zxvf nginx-1.9.8.tar.gz</code></pre><ul><li>会产生一个nginx-1.9.8目录,进入这个目录</li></ul><pre class=" language-shell"><code class="language-shell">cd nginx-1.9.8</code></pre><ul><li>接下来安装,使用–prefix参数指定nginx安装目录</li><li>./configure –help查询详细参数</li></ul><pre class=" language-shell"><code class="language-shell">./configure \--prefix=/usr/local/nginx \--pid-path=/var/run/nginx/nginx.pid \--lock-path=/var/lock/nginx.lock \--error-log-path=/var/log/nginx/error.log \--http-log-path=/var/log/nginx/access.log \--with-http_gzip_static_module \--http-client-body-temp-path=/var/temp/nginx/client \--http-proxy-temp-path=/var/temp/nginx/proxy \--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \--http-scgi-temp-path=/var/temp/nginx/scgi</code></pre><p style="color:red;">注意:上边将临时文件目录指定为/var/temp/nginx,需要在/var下创建temp及nginx目录</p><ul><li>编译安装</li></ul><pre class=" language-shell"><code class="language-shell">makemake install</code></pre><p>安装成功查看安装目录:<br><img src="http://oss.willhappy.cn/18-5-3/18094233.jpg" alt="nginxDir"></p><h3 id="三-启动Nginx"><a href="#三-启动Nginx" class="headerlink" title="三. 启动Nginx"></a>三. 启动Nginx</h3><ol><li>进入nginx安装目录,启动nginx</li></ol><pre class=" language-shell"><code class="language-shell">cd /usr/local/nginx/sbin/./nginx</code></pre><p>查看nginx进程:<br><img src="http://oss.willhappy.cn/18-5-3/44864765.jpg" alt="nginxProcess"></p><ol start="2"><li>停止nginx<br>方式1,快速停止:</li></ol><pre class=" language-shell"><code class="language-shell">cd /usr/local/nginx/sbin./nginx -s stop</code></pre><p>此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。</p><p>方式2,完整停止(建议使用):</p><pre class=" language-shell"><code class="language-shell">cd /usr/local/nginx/sbin./nginx -s quit</code></pre><p>此方式停止步骤是待nginx进程处理任务完毕进行停止。</p><ol start="3"><li>重启nginx</li></ol><p>方式1,先停止再启动(建议使用):<br>对nginx进行重启相当于先停止nginx再启动nginx,即先执行停止命令再执行启动命令。<br>如下:</p><pre class=" language-shell"><code class="language-shell">./nginx -s quit./nginx</code></pre><p>方式2,重新加载配置文件:<br>当nginx的配置文件nginx.conf修改后,要想让配置生效需要重启nginx,使用-s reload不用先停止nginx再启动nginx即可将配置信息在nginx中生效,如下:</p><pre class=" language-shell"><code class="language-shell">./nginx -s reload</code></pre><h3 id="四-测试"><a href="#四-测试" class="headerlink" title="四. 测试"></a>四. 测试</h3><p>nginx安装成功,启动nginx,即可访问虚拟机上的nginx:<br><img src="http://oss.willhappy.cn/18-5-3/37609210.jpg" alt="nginxRunSuccess"><br>到这说明nginx上安装成功。</p><blockquote><p>注:安装方法二:<a href="http://blog.csdn.net/oldguncm/article/details/78855000" target="_blank" rel="noopener">http://blog.csdn.net/oldguncm/article/details/78855000</a></p></blockquote>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> Nginx </tag>
</tags>
</entry>
<entry>
<title>安装Nginx和vsftpd的坑</title>
<link href="/2017/06/13/18-2017-06-13-an-zhuang-nginx-he-vsftpd-de-keng/"/>
<url>/2017/06/13/18-2017-06-13-an-zhuang-nginx-he-vsftpd-de-keng/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>为了搭个图片服务器,在centos上安装配置Nginx和vsftpd服务,简直折腾了我一天的时间,最终得出结论,还是要好好学习Linux,不然真是折腾死个人!</p><a id="more"></a><p>[toc]</p><h3 id="一-Nginx访问问题"><a href="#一-Nginx访问问题" class="headerlink" title="一. Nginx访问问题"></a>一. Nginx访问问题</h3><ol><li><p>nginx安装完成之后,启动起来了,发现在物理机中访问不到,这可能的原因是Linux防火墙的问题。<br>解决方案:<a href="http://www.cnblogs.com/yomho/p/6074815.html" target="_blank" rel="noopener">http://www.cnblogs.com/yomho/p/6074815.html</a><br>谢谢博主,我就不写了//呲牙。</p></li><li><p>前一天装好了,第二天起来,再次启动,发现起不来了Nginx,错误信息如下:<br><img src="http://oss.willhappy.cn/18-5-3/78920160.jpg" alt="startNginxErr"></p></li></ol><p>实在没找到什么原因,怀疑是由于nginx停止的方式不对,因为前一天晚上因为机子卡,vm非正常关闭,导致了无法启动,果断重装了。以后再遇到就再说了,要不进行不下去了。</p><p>后来找到解决方案:</p><pre class=" language-shell"><code class="language-shell">[root@localhost var]# cd /var/run ###先cd到/var/run目录下[root@localhost run]# mkdir nginx ###然后创建nginx目录[root@TEST sbin]# sudo ./nginx -c /usr/local/nginx/conf/nginx.conf ###重新配置nginx配置文件[root@TEST sbin]# ./nginx -s reload ###重新加载配置文件虚拟机重启,需要重新配置文件即可</code></pre><p>方案二:参考<br><a href="https://jingyan.baidu.com/article/f00622281858e2fbd3f0c81b.html" target="_blank" rel="noopener">https://jingyan.baidu.com/article/f00622281858e2fbd3f0c81b.html</a></p><blockquote><p>每次重启比较麻烦,可以设置nginx开机自启,<a href="https://www.cnblogs.com/piscesLoveCc/p/5867900.html" target="_blank" rel="noopener">https://www.cnblogs.com/piscesLoveCc/p/5867900.html</a></p></blockquote><p>访问url: ip/images/123.jpg,正常访问</p><ol start="3"><li>关于Nginx的配置文件访问路径问题。<br>当使用vsftpd上传到相应目录文件后,怎么取访问呢?<br>需要我们在nginx的安装目录中找到nginx.conf文件,我的配置文件所在目录:/usr/local/nginx/conf/nginx.conf,打开该文件修改:</li></ol><pre class=" language-yml"><code class="language-yml"> #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { # root html;之前的配置 # 现在的配置在下面:访问路径:/home/ftpuser/wwww; root /home/ftpuser/www; index index.html index.htm; }</code></pre><p>修改完成后,重新加载ngnix:</p><pre class=" language-shell"><code class="language-shell">[root@localhost sbin]# ./nginx -s reload</code></pre><ol start="4"><li>通过上面的一步,或许还会出现403 Forbidden的错误<br>原因分析:权限问题<br>解决方案:同样在<code>nginx.conf</code>的头部加入一行:</li></ol><pre class=" language-shell"><code class="language-shell">user root;</code></pre><p>同样的,重新加载配置文件,启动nginx,此时我们就可以正常访问了。</p><h3 id="二-vsftpd的配置问题"><a href="#二-vsftpd的配置问题" class="headerlink" title="二. vsftpd的配置问题"></a>二. vsftpd的配置问题</h3><ol><li>需要注意的一个问题是,防火墙开启21端口,详细参考:<a href>前一章节</a></li><li>关于修改iptables和vsftpd.conf配置文件后,重启服务的命令,centos或者Fedora等高版本与其它版本有不通。</li></ol><pre class=" language-shell"><code class="language-shell"># /bin/systemctl start vsftpd.service</code></pre><p>否则会报:</p><pre class=" language-shell"><code class="language-shell">Redirecting to /bin/systemctl restart vsftpd.service</code></pre><ol start="3"><li>关于使用FileZilla上传文件出现553 Could not create file错误<br>原因分析:可能是linux文件的访问权限问题。<br>解决办法:进去linux,找到访问文件的目录,找到相应的文件,鼠标右键点击属性,权限,设置权限为可写,重启一下vsftpd服务即可。然后重新使用FileZilla重新上传一下文件,即可。</li></ol>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> vsftpd </tag>
<tag> Nginx </tag>
</tags>
</entry>
<entry>
<title>windows下安装使用Redis</title>
<link href="/2017/06/12/17-2017-06-12-windows-xia-an-zhuang-shi-yong-redis/"/>
<url>/2017/06/12/17-2017-06-12-windows-xia-an-zhuang-shi-yong-redis/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="1-redis介绍"><a href="#1-redis介绍" class="headerlink" title="1.redis介绍"></a>1.redis介绍</h3><p>Redis是一个Key-value存储系统。在学习慕课网java高并发秒杀的高并发优化是接触到redis,顺便记录学习过程。</p><h3 id="2-redis安装"><a href="#2-redis安装" class="headerlink" title="2.redis安装"></a>2.redis安装</h3><p>注:本文主要讲解在windows下安装</p><ul><li>linux下安装<br> 由于本人尚未学习linux,所以以后有机会可能会写,百度的意思是在linux环境下redis可以直接通过源码编译安装。</li><li>windows下安装<br> 自行百度,google之。<br>参考:<a href="http://jingyan.baidu.com/article/49ad8bce40174f5834d8fa24.html" target="_blank" rel="noopener">redis安装使用</a></li></ul><h3 id="3-启动redis"><a href="#3-启动redis" class="headerlink" title="3.启动redis"></a>3.启动redis</h3><p>进入redis安装目录后,执行命令开启服务(可能会出现port占用情况)</p><pre class=" language-shell"><code class="language-shell">redis-server.exe redis.conf</code></pre><p>同样在redis的安装目录下,执行命令链接redis进行测试</p><pre class=" language-shell"><code class="language-shell">redis-cli</code></pre><p>通过info命令查看redis的运行情况</p><pre class=" language-shell"><code class="language-shell">info</code></pre><h3 id="4-使用java访问本地redis做缓存"><a href="#4-使用java访问本地redis做缓存" class="headerlink" title="4.使用java访问本地redis做缓存"></a>4.使用java访问本地redis做缓存</h3><p>Jedis :<a href="http://www.oschina.net/p/jedis" target="_blank" rel="noopener">http://www.oschina.net/p/jedis</a> (Redis的官方首选Java开发包)</p><pre class=" language-shell"><code class="language-shell"><!--5:redis客户端:Jedis--><dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version></dependency></code></pre><p>测试例子原帖:<a href="http://flychao88.iteye.com/blog/1527163" target="_blank" rel="noopener">http://flychao88.iteye.com/blog/1527163</a></p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>lujianing<span class="token punctuation">.</span>utils<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>junit<span class="token punctuation">.</span>Before<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>junit<span class="token punctuation">.</span>Test<span class="token punctuation">;</span><span class="token keyword">import</span> redis<span class="token punctuation">.</span>clients<span class="token punctuation">.</span>jedis<span class="token punctuation">.</span>Jedis<span class="token punctuation">;</span><span class="token keyword">import</span> redis<span class="token punctuation">.</span>clients<span class="token punctuation">.</span>jedis<span class="token punctuation">.</span>JedisPool<span class="token punctuation">;</span><span class="token keyword">import</span> redis<span class="token punctuation">.</span>clients<span class="token punctuation">.</span>jedis<span class="token punctuation">.</span>JedisPoolConfig<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>HashMap<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>Iterator<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>List<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>Map<span class="token punctuation">;</span><span class="token comment" spellcheck="true">/** * Created by lujianing on 14-2-28. */</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">JedisUtilTest</span> <span class="token punctuation">{</span> JedisPool pool<span class="token punctuation">;</span> Jedis jedis<span class="token punctuation">;</span> <span class="token annotation punctuation">@Before</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setUp</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> pool <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">JedisPool</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">JedisPoolConfig</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"192.168.10.61"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis <span class="token operator">=</span> pool<span class="token punctuation">.</span><span class="token function">getResource</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// jedis.auth("password");</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testGet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"lu"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * Redis存储初级的字符串 * CRUD */</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testBasicString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//-----添加数据----------</span> jedis<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"minxr"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//向key-->name中放入了value-->minxr</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行结果:minxr</span> <span class="token comment" spellcheck="true">//-----修改数据-----------</span> <span class="token comment" spellcheck="true">//1、在原来基础上修改</span> jedis<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"jarorwar"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//很直观,类似map 将jarorwar append到已经有的value之后</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行结果:minxrjarorwar</span> <span class="token comment" spellcheck="true">//2、直接覆盖原来的数据</span> jedis<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"闵晓荣"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行结果:闵晓荣</span> <span class="token comment" spellcheck="true">//删除key对应的记录</span> jedis<span class="token punctuation">.</span><span class="token function">del</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//执行结果:null</span> <span class="token comment" spellcheck="true">/** * mset相当于 * jedis.set("name","minxr"); * jedis.set("jarorwar","闵晓荣"); */</span> jedis<span class="token punctuation">.</span><span class="token function">mset</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"minxr"</span><span class="token punctuation">,</span><span class="token string">"jarorwar"</span><span class="token punctuation">,</span><span class="token string">"闵晓荣"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">mget</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"jarorwar"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * jedis操作Map */</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testMap</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> Map<span class="token operator"><</span>String<span class="token punctuation">,</span>String<span class="token operator">></span> user<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">HashMap</span><span class="token operator"><</span>String<span class="token punctuation">,</span>String<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> user<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">,</span><span class="token string">"minxr"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> user<span class="token punctuation">.</span><span class="token function">put</span><span class="token punctuation">(</span><span class="token string">"pwd"</span><span class="token punctuation">,</span><span class="token string">"password"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">hmset</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">,</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List</span> <span class="token comment" spellcheck="true">//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数</span> List<span class="token operator"><</span>String<span class="token operator">></span> rsmap <span class="token operator">=</span> jedis<span class="token punctuation">.</span><span class="token function">hmget</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">,</span> <span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>rsmap<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//删除map中的某个键值</span><span class="token comment" spellcheck="true">// jedis.hdel("user","pwd");</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">hmget</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">,</span> <span class="token string">"pwd"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//因为删除了,所以返回的是null</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">hlen</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//返回key为user的键中存放的值的个数1</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//是否存在key为user的记录 返回true</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">hkeys</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回map对象中的所有key [pwd, name]</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">hvals</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回map对象中的所有value [minxr, password]</span> Iterator<span class="token operator"><</span>String<span class="token operator">></span> iter<span class="token operator">=</span>jedis<span class="token punctuation">.</span><span class="token function">hkeys</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">iterator</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>iter<span class="token punctuation">.</span><span class="token function">hasNext</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> String key <span class="token operator">=</span> iter<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>key<span class="token operator">+</span><span class="token string">":"</span><span class="token operator">+</span>jedis<span class="token punctuation">.</span><span class="token function">hmget</span><span class="token punctuation">(</span><span class="token string">"user"</span><span class="token punctuation">,</span>key<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * jedis操作List */</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//开始前,先移除所有的内容</span> jedis<span class="token punctuation">.</span><span class="token function">del</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">lrange</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//先向key java framework中存放三条数据</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">,</span><span class="token string">"spring"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">,</span><span class="token string">"struts"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">,</span><span class="token string">"hibernate"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//再取出所有数据jedis.lrange是按范围取出,</span> <span class="token comment" spellcheck="true">// 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">lrange</span><span class="token punctuation">(</span><span class="token string">"java framework"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * jedis操作Set */</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">testSet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//添加</span> jedis<span class="token punctuation">.</span><span class="token function">sadd</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">,</span><span class="token string">"minxr"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">sadd</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">,</span><span class="token string">"jarorwar"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">sadd</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">,</span><span class="token string">"闵晓荣"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">sadd</span><span class="token punctuation">(</span><span class="token string">"sanme"</span><span class="token punctuation">,</span><span class="token string">"noname"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//移除noname</span> jedis<span class="token punctuation">.</span><span class="token function">srem</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">,</span><span class="token string">"noname"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">smembers</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//获取所有加入的value</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">sismember</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">,</span> <span class="token string">"minxr"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//判断 minxr 是否是sname集合的元素</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">srandmember</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">scard</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回集合的元素个数</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">throws</span> InterruptedException <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//keys中传入的可以用通配符</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token string">"*"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//返回当前库中所有的key [sose, sanme, name, jarorwar, foo, sname, java framework, user, braand]</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">keys</span><span class="token punctuation">(</span><span class="token string">"*name"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回的sname [sname, name]</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">del</span><span class="token punctuation">(</span><span class="token string">"sanmdde"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//删除key为sanmdde的对象 删除成功返回1 删除失败(或者不存在)返回 0</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">ttl</span><span class="token punctuation">(</span><span class="token string">"sname"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回给定key的有效时间,如果是-1则表示永远有效</span> jedis<span class="token punctuation">.</span><span class="token function">setex</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token string">"min"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//通过此方法,可以指定key的存活(有效时间) 时间为秒</span> Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">5000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//睡眠5秒后,剩余时间将为<=5</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">ttl</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//输出结果为5</span> jedis<span class="token punctuation">.</span><span class="token function">setex</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token string">"min"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//设为1后,下面再看剩余时间就是1了</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">ttl</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//输出结果为1</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token string">"key"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//检查key是否存在</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">rename</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">,</span><span class="token string">"time"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"timekey"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//因为移除,返回为null</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"time"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//因为将timekey 重命名为time 所以可以取得值 min</span> <span class="token comment" spellcheck="true">//jedis 排序</span> <span class="token comment" spellcheck="true">//注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)</span> jedis<span class="token punctuation">.</span><span class="token function">del</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//先清除数据,再加入数据进行测试</span> jedis<span class="token punctuation">.</span><span class="token function">rpush</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span> <span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token string">"6"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token string">"3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> jedis<span class="token punctuation">.</span><span class="token function">lpush</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token string">"9"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">lrange</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// [9, 3, 6, 1]</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">sort</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//[1, 3, 6, 9] //输入排序后结果</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>jedis<span class="token punctuation">.</span><span class="token function">lrange</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>Redis会定时 保存数据到硬盘上<br>在redis安装目录下,通过命令链接redis</p><pre class=" language-shell"><code class="language-shell">redis-cli</code></pre><p>然后通过命令查看redis存储大小</p><pre class=" language-shell"><code class="language-shell">dbsize</code></pre><p>通过</p><pre class=" language-shell"><code class="language-shell">keys *</code></pre><p>查看存储的键值<br>通过</p><pre class=" language-shell"><code class="language-shell">get 键:值</code></pre><p>拿到存储的二进制数据。</p>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Redis </tag>
<tag> Database </tag>
</tags>
</entry>
<entry>
<title>Centos安装vsftpd组件</title>
<link href="/2017/06/11/16-2017-06-11-centos-an-zhuang-vsftpd-zu-jian/"/>
<url>/2017/06/11/16-2017-06-11-centos-an-zhuang-vsftpd-zu-jian/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>转载至vsftpd安装手册。。。</p><a id="more"></a><p>[toc]</p><h3 id="一-安装vsftpd组件"><a href="#一-安装vsftpd组件" class="headerlink" title="一. 安装vsftpd组件"></a>一. 安装vsftpd组件</h3><p>安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件。</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# yum -y install vsftpd</code></pre><h3 id="二-添加一个ftp用户"><a href="#二-添加一个ftp用户" class="headerlink" title="二. 添加一个ftp用户"></a>二. 添加一个ftp用户</h3><p>此用户就是用来登录ftp服务器用的。</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# useradd ftpuser</code></pre><p>这样一个用户建完,可以用这个登录,记得用普通登录不要用匿名了。登录后默认的路径为 /home/ftpuser.</p><h3 id="三-给ftp用户添加密码"><a href="#三-给ftp用户添加密码" class="headerlink" title="三. 给ftp用户添加密码"></a>三. 给ftp用户添加密码</h3><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# passwd ftpuser</code></pre><p>输入两次密码后修改密码。</p><h3 id="四-防火墙开启21端口"><a href="#四-防火墙开启21端口" class="headerlink" title="四. 防火墙开启21端口"></a>四. 防火墙开启21端口</h3><p>因为ftp默认的端口为21,而centos默认是没有开启的,所以要修改iptables文件</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# vim /etc/sysconfig/iptables</code></pre><p>在行上面有22 -j ACCEPT 下面另起一行输入跟那行差不多的,只是把22换成21,然后:wq保存。</p><pre class=" language-shell"><code class="language-shell">-A INPUT -p tcp -m multiport --dport 20,21 -m state --state NEW -j ACCEPT --开启20,21端口-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT --开启21主动端口-A INPUT -p tcp --dport 30000:31000 -j ACCEPT --开启被动端口</code></pre><p>还要运行下,重启iptables</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# service iptables restart</code></pre><h3 id="五-修改selinux"><a href="#五-修改selinux" class="headerlink" title="五. 修改selinux"></a>五. 修改selinux</h3><p>外网是可以访问上去了,可是发现没法返回目录(使用ftp的主动模式,被动模式还是无法访问),也上传不了,因为selinux作怪了。<br>修改selinux:<br>执行以下命令查看状态:</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# getsebool -a | grep ftp allow_ftpd_anon_write --> offallow_ftpd_full_access --> offallow_ftpd_use_cifs --> offallow_ftpd_use_nfs --> offftp_home_dir --> offftpd_connect_db --> offftpd_use_passive_mode --> offhttpd_enable_ftp_server --> offtftp_anon_write --> off[root@bogon ~]#</code></pre><p>执行上面命令,再返回的结果看到两行都是off,代表,没有开启外网的访问</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# setsebool -P allow_ftpd_full_access on[root@bogon ~]# setsebool -P ftp_home_dir on</code></pre><h3 id="六-关闭匿名访问"><a href="#六-关闭匿名访问" class="headerlink" title="六. 关闭匿名访问"></a>六. 关闭匿名访问</h3><p>修改/etc/vsftpd/vsftpd.conf文件:</p><pre class=" language-shell"><code class="language-shell">anonymous_enable=NO</code></pre><p>重启ftp服务:</p><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# service vsftpd restart</code></pre><h3 id="七-开启被动模式"><a href="#七-开启被动模式" class="headerlink" title="七. 开启被动模式"></a>七. 开启被动模式</h3><p>默认是开启的,但是要指定一个端口范围,打开vsftpd.conf文件,在后面加上</p><blockquote><p>pasv_min_port=30000<br>pasv_max_port=30999</p></blockquote><p>表示端口范围为30000~30999,这个可以随意改。改完重启一下vsftpd<br>由于指定这段端口范围,iptables也要相应的开启这个范围,所以像上面那样打开iptables文件。<br>也是在21上下面另起一行,更那行差不多,只是把21 改为30000:30999,然后:wq保存,重启下iptables。这样就搞定了。</p><h3 id="八-设置开机启动vsftpd-ftp服务"><a href="#八-设置开机启动vsftpd-ftp服务" class="headerlink" title="八. 设置开机启动vsftpd ftp服务"></a>八. 设置开机启动vsftpd ftp服务</h3><pre class=" language-shell"><code class="language-shell">[root@bogon ~]# chkconfig vsftpd on</code></pre><blockquote><p>相关问题和踩过的坑,查看<a href="http://willhappy.cn/2017/06/11/%E5%AE%89%E8%A3%85Nginx%E5%92%8Cvsftpd%E7%9A%84%E5%9D%91/" target="_blank" rel="noopener">下一章节</a>。</p></blockquote>]]></content>
<categories>
<category> 运维 </category>
</categories>
<tags>
<tag> Linux </tag>
<tag> vsftpd </tag>
</tags>
</entry>
<entry>
<title>使用Nexus搭建Maven私服</title>
<link href="/2017/01/09/15-2017-01-09-shi-yong-nexus-da-jian-maven-si-fu/"/>
<url>/2017/01/09/15-2017-01-09-shi-yong-nexus-da-jian-maven-si-fu/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>最近使用IDEA基于Maven开发项目,有些jar包在本地仓库找不到,要到中央仓库去下载,很慢,一天搞不成个啥事,想着可以搭建一个Maven私服。一来通过私服管理jar包插件,同时将自己的一些jar包放上去,供自己以后使用。二来就是能够加开一些自己的开发效率,要不真是弄不成个事。<br>同时,也从网上了解到Maven私服,在公司内部同样非常实用,可以解决内网访问问题,jar包闭源问题,重复下载问题等等,也增加了写找工作前,增加知识储备的动力,总之,一步步来吧,呲呲。。。</p><a id="more"></a><p>[toc]</p><h3 id="一-Nexus下载安装"><a href="#一-Nexus下载安装" class="headerlink" title="一. Nexus下载安装"></a>一. Nexus下载安装</h3><p>前提环境(我自己的):</p><ol><li>Win10系统</li><li>JDK1.8</li><li>Maven3</li></ol><p>哎,说来也头疼,网上关于私服搭建的知识,多的狠,可是,无奈,我下的最新版本<code>nexus-3.2.0-01-win64.zip</code>,他和网上介绍版本有所不同,网上大都是以Nexus1.x,Nexus2.x为例,而Nexus3.x和前两个版本的配置完全不同,其目录结构也不尽相同,这里以我下的版本为例,做介绍。</p><blockquote><p>下载地址:<a href="https://www.sonatype.com/download-oss-sonatype" target="_blank" rel="noopener">https://www.sonatype.com/download-oss-sonatype</a></p></blockquote><p>下载完,解压即可得到两个目录结构:<code>nexus-3.2.0-01</code>和<code>sonatype-work</code></p><p><code>nexus-3.2.0-01</code>为Nexus的安装文件目录,<code>sonatype-work</code>为Nexus的工作(数据)目录,和以往版本的Nexus不同,nexus的启动文件不是通过nexus2.x/bin/nexus.bat来运行,现在nexus.bat文件压根就不存在,取而代之的是<code>nexus.exe</code>,所以真是折腾了半天都不知道怎么玩的。</p><h3 id="二-Nexus的配置"><a href="#二-Nexus的配置" class="headerlink" title="二. Nexus的配置"></a>二. Nexus的配置</h3><ol><li><p>修改数据存储的路径,文件目录为:<code>\nexus-3.2.0-01\bin\nexus.vmoptions</code><br><img src="http://oss.willhappy.cn/18-5-3/82143841.jpg" alt="nexusVM"></p></li><li><p>修改IP,端口,访问根目录,文件目录为:<code>\nexus-3.2.0-01\etc\nexus-default.properties</code><br><img src="http://oss.willhappy.cn/18-5-3/76009019.jpg" alt="nexusDefault"><br>修改之后重新启动,即可。</p></li></ol><blockquote><p>这一步注意几点,一是要注意各个配置文件的目录所在位置,二是,其实都可以实用默认的配置,直接运行,即可访问,嘻嘻,何必多次一举呢,对不对,但是毕竟是学习,可以搞下玩玩。</p></blockquote><h3 id="三-Nexus运行"><a href="#三-Nexus运行" class="headerlink" title="三. Nexus运行"></a>三. Nexus运行</h3><p>这里注意一下,关于Nexus3.x的运行和其它版本有所不同,<br>首先,我们要进入命令行,通过命令来执行,<br><img src="http://oss.willhappy.cn/18-5-3/18684870.jpg" alt="nexusRun"></p><blockquote><p>如果嫌一层层进入目录麻烦,可以直接粘贴nexus.exe所在目录,cd 到这个目录即可,也可以先进入nexus.exe所在目录,按住Shift,点鼠标右键,点击在此处打开命令窗口,可直接进入此目录。</p></blockquote><p>出现下面的message,即表示nexus已运行,<br><img src="http://oss.willhappy.cn/18-5-3/36501013.jpg" alt="nexusRunMsg"></p><p>启动后,可以使用浏览器通过<a href="http://localhost:8088/进行访问了(我自己修改的端口为8088,默认为8081" target="_blank" rel="noopener">http://localhost:8088/进行访问了(我自己修改的端口为8088,默认为8081</a>),界面如下:<br><img src="http://oss.willhappy.cn/18-5-3/21550891.jpg" alt="nexusRunSuccess"></p><p>可以通过右上方的<code>Sign in</code>进行登录,默认的用户名admin,密码admin123</p><h3 id="四-Nexus服务安装"><a href="#四-Nexus服务安装" class="headerlink" title="四. Nexus服务安装"></a>四. Nexus服务安装</h3><p>这个比较坑爹,搞了半天,要将Nexus安装成windows服务,首先要安装,嘻嘻,不是废话吗,这一步同样要使用<code>nexus.exe</code>这个可执行文件,所以首先要进入到这个文件的所在目录。这一步,你可能会出现下面的错误:<br><img src="http://oss.willhappy.cn/18-5-3/24542909.jpg" alt="nexusInstallErr"></p><p>呵呵,那是因为我们没有使用管理员的身份进入命令行,我也犯错了,window安装服务可能是要用管理员的身份的,所以会出现错误。但是,运行nexus是没问题的。</p><p>好了下面我们正式以管理员的身份进入命令行执行nexus服务的安装:<br><img src="http://oss.willhappy.cn/18-5-3/96087556.jpg" alt="nexusInstall"><br>上面表示安装成功。<br>可以查看一下我们电脑的所有服务当中,就有了Nexus服务。<br><img src="http://oss.willhappy.cn/18-5-3/21636262.jpg" alt="nexusService"></p><p>说明一下Nexus关于服务的几个命令:</p><pre class=" language-shell"><code class="language-shell">nexus.exe /install <optional-service-name> //nexus服务的安装nexus.exe /start <optional-service-name> //启动nexus服务nexus.exe /stop <optional-service-name> //停止nexus服务nexus.exe /uninstall <optional-service-name> //卸载nexus服务</code></pre><p><code><optional-service-name></code>自己取服务的名字,我取的是Nexus,默认的官网上说好像是nexus。</p><p>对于start,stop这两个命令,如果嫌命令行麻烦的话,就手动上windows服务中去设置。</p><p>至此,关于Nexus的安装下载配置,就完成了。喜欢的加个关注。。</p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> Maven </tag>
<tag> Nexus </tag>
</tags>
</entry>
<entry>
<title>Linux学习笔记(初级)</title>
<link href="/2017/01/08/14-2017-01-08-linux-xue-xi-bi-ji-chu-ji/"/>
<url>/2017/01/08/14-2017-01-08-linux-xue-xi-bi-ji-chu-ji/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><blockquote><p>学习之路参考:<a href="http://www.oschina.net/question/587367_156024" target="_blank" rel="noopener">http://www.oschina.net/question/587367_156024</a><br>文章参考:<a href="http://wiki.jikexueyuan.com/project/linux-in-eye-of-java/" target="_blank" rel="noopener">http://wiki.jikexueyuan.com/project/linux-in-eye-of-java/</a><br>书籍参考:《Linux就是这个范儿》阿里巴巴Linux技术大拿赵鑫磊、支付宝高级专家Jie Zhang 著<br>在此感谢以上技术贡献者。。。</p></blockquote><h3 id="一-学习工具准备"><a href="#一-学习工具准备" class="headerlink" title="一. 学习工具准备"></a>一. 学习工具准备</h3><ul><li>VM ware workstation12虚拟机(百度下载)</li><li>Linux系统镜像文件,iso文件</li></ul><p>注:因为Linux为开源系统,所以版本众多,作为小白的我,刚开始都不知道去选择哪个版本比较好,当遇到选择障碍症的时候,我们可以百度,可以google啊。<br>借鉴了百度的经验:<a href="http://jingyan.baidu.com/article/95c9d20da1045dec4e7561ee.html" target="_blank" rel="noopener">http://jingyan.baidu.com/article/95c9d20da1045dec4e7561ee.html</a></p><hr><h3 id="二-虚拟机和Linux的安装"><a href="#二-虚拟机和Linux的安装" class="headerlink" title="二. 虚拟机和Linux的安装"></a>二. 虚拟机和Linux的安装</h3><ol><li>百度,google一大堆了,也不想说了,自己也是照这上边操做,一步一步来吧。<br>VMware workstation pro12安装详细参考:</li></ol><ul><li><a href="http://jingyan.baidu.com/article/215817f78879c21edb142379.html?qq-pf-to=pcqq.group" target="_blank" rel="noopener">http://jingyan.baidu.com/article/215817f78879c21edb142379.html?qq-pf-to=pcqq.group</a></li></ul><ol start="2"><li>Linux安装详细参考:<br> Ubuntu安装:<ul><li><a href="http://jingyan.baidu.com/article/4f7d5712d20a1b1a21192760.html" target="_blank" rel="noopener">http://jingyan.baidu.com/article/4f7d5712d20a1b1a21192760.html</a><br>Elementary OS安装:</li><li><a href="http://jingyan.baidu.com/album/f3e34a12df6eddf5ea65357d.html?picindex=10" target="_blank" rel="noopener">http://jingyan.baidu.com/album/f3e34a12df6eddf5ea65357d.html?picindex=10</a><br>CentOS安装:</li><li><a href="http://blog.csdn.net/alex_my/article/details/38142229" target="_blank" rel="noopener">http://blog.csdn.net/alex_my/article/details/38142229</a></li></ul></li></ol><blockquote><p>注:创建好虚拟机后,启动是“出现Intel VT-x 处于禁用状态”,通过进入blos进行设置Intel VT-x为Enabled状态,详细解决办法见:<br>百度经验:<a href="http://jingyan.baidu.com/article/fc07f98976710e12ffe519de.html" target="_blank" rel="noopener">http://jingyan.baidu.com/article/fc07f98976710e12ffe519de.html</a></p></blockquote><hr><h3 id="三-Linux介绍"><a href="#三-Linux介绍" class="headerlink" title="三.Linux介绍"></a>三.Linux介绍</h3><ul><li>以后关于Linux相关知识是基于CentOS的Linux的发行版,可能各个版本的Linux版本有细微的差别,但是并不影响我们学习linux,因为毕竟他们都是基于Linux内核的,都属于类Unix。<br> 关于这个介绍比较好的,引用:</li></ul><blockquote><p>Linux 本质来源不是 Unix,但是它借鉴了 Unix 的设计思想,所以在系统业界上把这种和 Unix 是一致设计思想的系统归为:类 Unix 系统。<br>类 Unix 系统的介绍:<a href="https://zh.wikipedia.org/wiki/%E7%B1%BBUnix%E7%B3%BB%E7%BB%9F" target="_blank" rel="noopener">https://zh.wikipedia.org/wiki/%E7%B1%BBUnix%E7%B3%BB%E7%BB%9F</a><br>类 Unix 系统,除了我们今天要讲的 Linux,还有大家熟知的 Mac OS X、FreeBSD(这两个是直接从 Unix 系发展过来的,所以相对 Linux 是比较地道的类 Unix 系统)</p></blockquote><ul><li>Linux 和 Mac OS X 都是类 Unix 系统,所以这篇文章中基本上的理由都可以用到 Linux 上的。 为什么国外程序员爱用 Mac?<a href="http://www.vpsee.com/2009/06/why-programmers-love-mac/" target="_blank" rel="noopener">http://www.vpsee.com/2009/06/why-programmers-love-mac/</a></li></ul><hr><p><strong><em>哎,废话不多说了,下面就开始进入主题,我是按照书的内容进行,做好相应的笔记,查阅相应的资料</em></strong></p><h3 id="四-返朴归真的命令行"><a href="#四-返朴归真的命令行" class="headerlink" title="四. 返朴归真的命令行"></a>四. 返朴归真的命令行</h3><blockquote><p>别叹气,存在另一个世界,那就是命令行,让你暂时远离鼠标。对于那些苦哈哈的程序猿来讲,这也许是另一种情调的工作放肆。 —《Linux就是这个范儿》</p></blockquote><ol><li>介绍</li></ol><ul><li>用户和系统不是直接打交道的,他们中间有个名字叫shell的联系人,我们从键盘中输入命令给shell,shell再把它交给操作系统去执行。</li><li>shell就是Linux系统提供的一个叫终端模拟器的程序。</li><li>打开终端,我们可以看到shell的命令提示符是$,这意味你是普通用户,而root用户的提示符则为#。</li></ul><ol start="2"><li>文本和图形的切换<br>Crtl+Alt+F1快捷键是代表图形界面,Ctrl+Alt+F2-F6对应5个不同的文本终端。</li><li><p>基本的命令操作<br>看图片吧,:),从书上拍的,也可以上网查,多的狠。。。<br><img src="http://oss.willhappy.cn/18-5-3/95255230.jpg" alt="shell1"><br><img src="http://oss.willhappy.cn/18-5-3/95255232.jpg" alt="shell2"><br><img src="http://oss.willhappy.cn/18-5-3/95973981.jpg" alt="shell3"></p></li><li><p>快捷键<br>废话不多说,上图!<br><img src="http://oss.willhappy.cn/18-5-3/82951264.jpg" alt="QuickKey"></p></li></ol><p><br></p><ol start="5"><li>联机帮助—man狠靠谱<br> 终端输入:<pre><code>$ man 命令名</code></pre>便可以查看帮助手册,但是你的英文要通关奥,反正我不怎么能看懂,我很内疚。:(</li></ol><h3 id="五-融于心而表与行"><a href="#五-融于心而表与行" class="headerlink" title="五. 融于心而表与行"></a>五. 融于心而表与行</h3><ol><li><p>用户身份(澡堂子模型)<br>作者把Linux的用户管理方式比喻成一个澡堂子模型,我感觉,还是相当形象的,毕竟我们可以想象一下的,对吧。<br>所有非root用户,都是这个澡堂子的顾客;root用户则是这个澡堂的服务生;Linux系统就是个大澡堂了。</p><p style="color:blue;">具体的描述,看书的作者的形象描述,写的非常活泼:)</p></li><li><p>理解用户角色<br> 还是以书中的介绍为主,Linux中用到的是用户组的概念,可以生动的把他理解为用户的职业,比如澡堂子里,除了客人之外,还有搓澡的,搓背的,烧水的等好多职业。在Linux中,也是一样,一个用户组就相当于一个职业,当然一个用户可以属于多个用户组,相当于身兼多职吗,并且也要注意,一个用户至少应该属于一个用户组。</p></li><li><p>/etc/passwd文件查看用户</p></li></ol><pre class=" language-shell"><code class="language-shell">cat /etc/passwd</code></pre><p>终端输出:</p><pre class=" language-shell"><code class="language-shell">root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologin</code></pre><p>其基本机构如下:</p><p style="font-size:20px;color:#8edda4;">用户名:密码:UID:GID:用户全名:home 目录:shell</p><ul><li>同样的,还有/etc/group文件查看组,其机构如下:</li></ul><p style="font-size:20px;color:#8edda4;">祖名:用户组密码:GID:用户组内的用户名</p><p><em>注:详细的解释,去看书吧,再写下来,太多了,好累,所以要看的自己去书上看吧。。。《Linux就是这个范儿》</em><br><br></p><ol start="4"><li>管理用户和组</li></ol><pre class=" language-shell"><code class="language-shell"># useradd william</code></pre><p><em>注:adduser是一个脚本,而useradd是一个二进制程序,前者对后者进行了封装,更加智能!</em><br>类似的命令还有用户的删除,userdel,用户的修改,usermod<br>至于对用户组的管理,就是相应的将“user”的这个前缀换成“group”,即groupadd,groupmod和groupdel。<br><br></p><ol start="5"><li>利用sudo假借身份<br> 比如/etc/shadow文件,由于其特殊性,普通用户是不被允许查看其内容的,但是拥有sudo特权的用户,可以执行以下命令:</li></ol><pre class=" language-shell"><code class="language-shell">sudo cat/etc/shadow</code></pre><p>那么如何获得sudo特权呢,起始就是修改/etc/sudoers的文件中内容,</p><pre class=" language-shell"><code class="language-shell">## Allow root to run any commands anywhereroot ALL=(ALL) ALL## Allows members of the 'sys' group to run networking, software,## service management apps and more.# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS## Allows people in group wheel to run all commands%wheel ALL=(ALL) ALL## Same thing without a password# %wheel ALL=(ALL) NOPASSWD: ALL## Allows members of the users group to mount and unmount the## cdrom as root# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom## Allows members of the users group to shutdown this system# %users localhost=/sbin/shutdown -h now## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)#includedir /etc/sudoers.d</code></pre><p>照着葫芦,画个瓢,在:</p><pre class=" language-shell"><code class="language-shell">root ALL=(ALL) ALL</code></pre><p>后面,添加一行:</p><pre class=" language-shell"><code class="language-shell">william ALL=(ALL) ALL</code></pre><p><br></p><ol start="6"><li>我是谁?</li></ol><pre class=" language-shell"><code class="language-shell">[root@localhost will]# whoamiroot[root@localhost will]# who am iwill pts/0 2016-11-23 11:03 (:0)[root@localhost will]# whowill :0 2016-11-23 10:59 (:0)will pts/0 2016-11-23 11:03 (:0)will tty2 2016-11-23 12:14</code></pre><p><em>注意:仔细观察他们上面的不同点。</em><br><br></p><ol start="7"><li>文件和目录<br>和window不同,Linux是使用颜色来区分文件和目录,也适用于区分不同种类的文件,蓝色代表目录,其他颜色代表文件,如:绿色代表可执行文件,青色代表符号连接等。了解详细,可:</li></ol><pre class=" language-shell"><code class="language-shell">man dir_colors</code></pre><p>还要了解几个特殊的目录标记:</p><ul><li>.代表当前目录,比如cd .或者cd ./都是工作目录变更到当前目录,等于没变。</li><li>..代表上级目录</li><li>~代表用户的home目录</li><li>/代表系统的根目录</li><li>pwd命令用户显示当前目录的绝对路径</li><li>-代表前一目录</li><li>更多特殊符号含义,请看:<a href="http://www.jb51.net/article/51342.htm" target="_blank" rel="noopener">http://www.jb51.net/article/51342.htm</a></li></ul><p><br></p><ol start="8"><li>文件的属性和权限</li></ol><pre class=" language-shell"><code class="language-shell">drwxr-xr-x. 2 will will 6 11月 20 14:36 公共drwxr-xr-x. 2 will will 6 11月 20 14:36 模板drwxr-xr-x. 2 will will 6 11月 20 14:36 视频drwxr-xr-x. 2 will will 6 11月 20 14:36 图片drwxr-xr-x. 2 will will 6 11月 20 14:36 文档drwxr-xr-x. 2 will will 6 11月 20 14:36 下载drwxr-xr-x. 2 will will 6 11月 20 14:36 音乐drwxr-xr-x. 2 will will 6 11月 20 14:36 桌面</code></pre><p>文件属性的展现结构:</p><p></p><p style="font-size:20px;color:#8edda4;">drwxr-xr-x. 2 will will 6 11月 20 14:36 桌面</p><br>对应解释为:<p></p><p></p><p style="font-size:20px;color:#8edda4;">文件类型和权限/连接数/拥有者/所属用户组/文件大小/最后修改时间/文件名</p><br>对于文件的类型和权限属性单独来说:<p></p><p></p><p style="font-size:20px;color:#8edda4;">drwxr-xr-x.</p><br>第一个字符描述文件的类型,取值有:-、d、l、b、c、s和p,具体代表啥,自己去查吧,太多了。<br>r代表读,w代表写,x代表执行,r-x代表所属用户组的权限,最后一个r-x代表其他。<br>通过命令:<p></p><pre class=" language-shell"><code class="language-shell">ls-al</code></pre><p>输出:</p><pre class=" language-shell"><code class="language-shell">-rw-r--r--. 1 will will 193 11月 20 2015 .bash_profile-rw-r--r--. 1 will will 231 11月 20 2015 .bashrcdrwx------. 17 will will 4096 11月 20 15:10 .cache</code></pre><p>可以查看全部的属性和权限信息,包含所有隐藏的文件。<br>其中文件名前边带“.”,的即为隐藏文件,而实际上文件的隐藏属性就是在文件的前边添加“.”。<br>更多文档说明可查看:<a href="https://www.shiyanlou.com/courses/1/labs/3/document" target="_blank" rel="noopener">https://www.shiyanlou.com/courses/1/labs/3/document</a><br><br></p><ol start="9"><li>文件链接</li></ol><p>关于硬链接和软连接的不同,得出如下推断:(具体的概念问题,自己翻书)</p><ul><li>输入删除文件连接的目标文件,则软连接会失效,而硬链接则仅是“连接数”-1.</li><li>软连接可以创建在任何位置,包括网络,而硬链接则不行,目标文件与连接文件必须在同一磁盘分区内。</li><li>软硬连接在使用的时候区别不大,都相当于是一个文件具有不同的路径和文件名。</li></ul><p><em>注:软连接,跟window中的快捷方式是一样的东西,而硬链接则是可以使得同一个文件能够拥有不同的路径,还能防止恶意被删除</em><br><br></p><ol start="10"><li>修改文件的属性和权限<br>使用命令:</li></ol><pre class=" language-shell"><code class="language-shell">chmod a-r test.txt //给所有用户减去读权限chmod ugo-w test.txt //给所属用户,所属组,其他减去写权限chmod +x test.txt //默认的给所有用户加上执行权限(默认的操作对象,根据自己的亲自体验,去记,不一定准确)</code></pre><ul><li>深入文件权限,起始Linux的文件权限不只是r,w和x,还包括s和t这两个特殊的,他们与系统的账号和系统的进程相关,详情请参考范儿P52 :)。</li></ul><p><br></p><ol start="11"><li>文件的基本操作<br>常用命令ls、cd、cp、rm和mv,详情,网上自己查看。。。<br>推荐几篇博客文章,感谢博主,我可以不用写了,:)<br><a href="http://blog.csdn.net/yiliumu/article/details/20405505" target="_blank" rel="noopener">http://blog.csdn.net/yiliumu/article/details/20405505</a><br><a href="http://www.centoscn.com/CentOS/2015/0325/5014.html" target="_blank" rel="noopener">http://www.centoscn.com/CentOS/2015/0325/5014.html</a><br><a href="http://www.cnblogs.com/zf2011/archive/2011/05/17/2049155.html" target="_blank" rel="noopener">http://www.cnblogs.com/zf2011/archive/2011/05/17/2049155.html</a></li></ol><p><br></p><ol start="12"><li>搜索文件<br>五个命令,因地制宜,不同需求使用不同命令,作者想让我们称为那少数人,感觉好难,:》</li></ol><pre class=" language-shell"><code class="language-shell">whereis lslocate ls //或locate -b "\ls"which gcc //一般用来确认系统是否安装了指定的软件,常用type -p gcc //type -p相当于which,type其本身是判断一个命令是否属于shell内置的,作者告诉我的,他不让我告诉别人。find /-mtime -1 -exec ls -1 {} \; //find相当叼的一个搜索命令,具体怎么叼,去看作者吹的吧,比我吹好。P56</code></pre><p><br></p><ol start="13"><li>对文件的打包压缩</li></ol><pre class=" language-shell"><code class="language-shell">tar -zcvf filename.tar.gz FILES //打包成gz格式的压缩包,j代表bz2,J代表xztar -vxf filename //解压缩</code></pre><p><br></p><ol><li>程序的执行问题<br>这一小节,对于我这个门外汉来说,有点难,什么多任务协调机制啊,计划任务啊,守护进程等等,没大看懂,也不敢做过多总结,就这些吧,以后有能力了再细看,哈哈。P58</li><li>Linux软件安装</li></ol><ul><li>①源码安装<br>相对麻烦的方法,具体做法参考作者的P71,也可以参考博客文章,感谢:<br><a href="http://www.centoscn.com/CentOS/2012/1226/96.html" target="_blank" rel="noopener">http://www.centoscn.com/CentOS/2012/1226/96.html</a><br>这种方式的弊端,作者也分析了,就是说这样安装会因为没有做软件相关性检查会导致它依赖的其他软件不存在或者版本不正确,从而导致无法正常运行。</li><li><p>②利用软件管理工具rpm和dpkg<br>不说了上图:<br>![RPM][5]<br>![DPKG][6]</p></li><li><p>③线上升级工具apt和yum<br>还是上图:<br>![yum][7]<br>![apt][8]</p></li></ul><p><br></p><ol start="16"><li>磁盘管理<br>这节感觉也好难理解,决定跳过。。。以后有能力了再搞:)</li><li>解决上网问题<br>这一章后面,不想看了,没什么兴致都下去了,以后有机会再细看:(</li></ol>]]></content>
<categories>
<category> System </category>
</categories>
<tags>
<tag> Linux </tag>
</tags>
</entry>
<entry>
<title>基于maven使用IDEA创建多模块项目</title>
<link href="/2017/01/07/13-2017-01-07-ji-yu-maven-shi-yong-idea-chuang-jian-duo-mo-kuai-xiang-mu/"/>
<url>/2017/01/07/13-2017-01-07-ji-yu-maven-shi-yong-idea-chuang-jian-duo-mo-kuai-xiang-mu/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>鉴于最近学习一个分布式项目的开发,讲一下关于使用IntelliJ IDEA基于Maven创建多模块项目的实际开发,可能有不合适的地方,但是项目是可以跑通的,也请有不足之处,都提出来,一起讨论下。</p><a id="more"></a><p>[toc]</p><h3 id="一-项目工程目录"><a href="#一-项目工程目录" class="headerlink" title="一. 项目工程目录"></a>一. 项目工程目录</h3><p>首先展示一下,最终整个项目的工程目录:</p><p><img src="http://oss.willhappy.cn/18-5-3/9751035.jpg" alt="projectTree"></p><p>简单介绍一下目录结构:<br><code>common-parent</code>为所有项目的父项目,主要用来管理所有项目使用的jar包及其版本。<br><code>common-utils</code>为公共的工具类项目,继承父项目,它会被打成jar包供其它项目使用。<br><code>taotao-manager</code>为我们自己的项目,继承与我们的父项目。<br><code>taotao-manager-pojo</code>为我们自己项目的一个子模块,依赖与taotao-manager,打成jar包<br><code>taotao-manager-mapper</code>为我们自己项目的一个子模块,依赖与taotao-manager-pojo,打成jar包<br><code>taotao-manager-service</code>为我们自己项目的一个子模块,依赖与taotao-manager-mapper,打成jar包<br><code>taotao-manager-web</code>为我们自己项目的一个子模块,依赖与taotao-manager-service,打成war包</p><h3 id="二-创建父工程"><a href="#二-创建父工程" class="headerlink" title="二. 创建父工程"></a>二. 创建父工程</h3><p>下面为具体操作:</p><ol><li>首先打开IntelliJ IDEA,按下面步骤来:<br><img src="http://oss.willhappy.cn/18-5-3/1782308.jpg" alt="createParent1"><br>或者第一次打开IDEA,<br><img src="http://oss.willhappy.cn/18-5-3/9181464.jpg" alt="createParent2"></li><li>来到创建目录,选择Empty project,next<br><img src="http://oss.willhappy.cn/18-5-3/36704729.jpg" alt="createParent3"></li><li>来到New Project页面,填写project name,选择Project location,点Finish<br><img src="http://oss.willhappy.cn/18-5-3/99964035.jpg" alt="createParent4"><br>等待IDEA加载完成,进行下一步</li><li>选择File–>New–>Module,进入New Module页面:<br><img src="http://oss.willhappy.cn/18-5-3/3772535.jpg" alt="createParent5"></li><li>在New Module页面,按如下步骤操作:<br><img src="http://oss.willhappy.cn/18-5-3/88248794.jpg" alt="createParent6"></li><li>填写组织名称和项目名称,以及版本号<br><img src="http://oss.willhappy.cn/18-5-3/35038512.jpg" alt="createParent7"></li><li>配置本地maven目录及maven仓库配置文件<br><img src="http://oss.willhappy.cn/18-5-3/57175041.jpg" alt="createParent8"></li><li>创建父工程最后一步,给Module取名,及选择工作目录,选择完成<br><img src="http://oss.willhappy.cn/18-5-3/29776299.jpg" alt="createParent9"></li></ol><p>等待生成pom文件,注意修改打包方式为pom,修改pom文件如下:(由于pom文件较长,只给出部分,获取所有,请关注<a href>github</a>)</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>common-parent<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>pom<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span><span class="token comment" spellcheck="true"><!--修改打包方式--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>common-parent<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!--集中定义依赖版本号--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>junit.version</span><span class="token punctuation">></span></span>4.12<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>junit.version</span><span class="token punctuation">></span></span> ...(省略) <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencyManagement</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 时间操作组件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>joda-time<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>joda-time<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>${joda-time.version}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> ...(省略) <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencyManagement</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>build</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>finalName</span><span class="token punctuation">></span></span>${project.artifactId}<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>finalName</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugins</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 资源文件拷贝插件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.maven.plugins<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>maven-resources-plugin<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>2.7<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>encoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>encoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugin</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- java编译插件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.maven.plugins<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>maven-compiler-plugin<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>3.5.1<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>source</span><span class="token punctuation">></span></span>1.8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>source</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>target</span><span class="token punctuation">></span></span>1.8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>target</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>encoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>encoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugins</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>build</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><h3 id="三-创建公共工具类"><a href="#三-创建公共工具类" class="headerlink" title="三. 创建公共工具类"></a>三. 创建公共工具类</h3><p>首先,公共工具类是继承自父项目common-parent的。<br>需要注意的一点是一点,为了项目看起来为分模块的形式(类似在eclipse中开发),在创建common-utils中有一步需要注意:<br><img src="http://oss.willhappy.cn/18-5-3/73278379.jpg" alt="createUtils1"><br><img src="http://oss.willhappy.cn/18-5-3/67268723.jpg" alt="createUtils2"><br>下一步特别注意,这一步会影响目录结构,<br><img src="http://oss.willhappy.cn/18-5-3/89469928.jpg" alt="createUtils3"><br><img src="http://oss.willhappy.cn/18-5-3/50706271.jpg" alt="createUtils4"><br><img src="http://oss.willhappy.cn/18-5-3/65221428.jpg" alt="createUtils5"><br><img src="http://oss.willhappy.cn/18-5-3/77654219.jpg" alt="createUtils6"></p><p>同样注意项目的打包方式为jar,和父项目有所不同。</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>common-parent<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>relativePath</span><span class="token punctuation">></span></span>../common-parent/pom.xml<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>relativePath</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>common-utils<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>jar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span><span class="token comment" spellcheck="true"><!-- 打成jar包 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>common-utils<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- jar包的依赖 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 时间操作组件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>joda-time<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>joda-time<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> ...(省略) <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><h3 id="三-创建开发项目"><a href="#三-创建开发项目" class="headerlink" title="三. 创建开发项目"></a>三. 创建开发项目</h3><p>创建开发项目taotao-manager,其创建步骤同上,同样是继承common-parent,同样修改其pom文件,详细如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>common-parent<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>relativePath</span><span class="token punctuation">></span></span>../common-parent/pom.xml<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>relativePath</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>pom<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modules</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>module</span><span class="token punctuation">></span></span>taotao-manager-pojo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>module</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>module</span><span class="token punctuation">></span></span>taotao-manager-mapper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>module</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>module</span><span class="token punctuation">></span></span>taotao-manager-service<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>module</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>module</span><span class="token punctuation">></span></span>taotao-manager-web<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>module</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modules</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 依赖管理 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>common-utils<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>build</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 配置插件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugins</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.tomcat.maven<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>tomcat7-maven-plugin<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>port</span><span class="token punctuation">></span></span>8080<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>port</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>path</span><span class="token punctuation">></span></span>/<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>path</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugins</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>build</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><h3 id="四-创建开发项目子模块"><a href="#四-创建开发项目子模块" class="headerlink" title="四. 创建开发项目子模块"></a>四. 创建开发项目子模块</h3><p>创建taotao-manager-pojo,mapper,service,web等子模块,详细如下:</p><ol><li><p>右键点击taotao-manager,选择New,Module,<br><img src="http://oss.willhappy.cn/18-5-3/21025116.jpg" alt="createSon1"><br><img src="http://oss.willhappy.cn/18-5-3/99362897.jpg" alt="createSon2"><br>这一步注意,与创建common-utils时不同,是将其子模块添加到taotao-manager目录下的:<br><img src="http://oss.willhappy.cn/18-5-3/18535566.jpg" alt="createSon3"><br>maven的相关配置,保持默认:<br><img src="http://oss.willhappy.cn/18-5-3/75975048.jpg" alt="createSon4"><br>注意子模块所在目录就好:<br><img src="http://oss.willhappy.cn/18-5-3/87316109.jpg" alt="createSon5"></p></li><li><p>创建taotao-manager下其它子模块<br>上面说的时创建taotao-manager-pojo子模块,另外三个子模块的创建方式与其类似,有一点不同时,在创建taotao-manager-web子模块时,maven项目的类型选择如下:<br><img src="http://oss.willhappy.cn/18-5-3/30875671.jpg" alt="createSon6"></p></li><li><p>修改子模块的pom文件</p></li></ol><p>子模块pojo,mapper,service的打包方式全为jar,只有web子模块打包为war包。</p><p>pojo子模块,pom.xml详细如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-pojo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>jar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>taotao-manager-pojo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><p>mapper子模块依赖与pojo子模块,pom.xml详细如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-mapper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>jar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>taotao-manager-mapper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 依赖与pojo子模块 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-pojo<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- Mybatis --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.mybatis<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mybatis<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.mybatis<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mybatis-spring<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>com.github.miemiedev<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mybatis-paginator<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>com.github.pagehelper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>pagehelper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- MySql --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>mysql<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>mysql-connector-java<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 连接池 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>com.alibaba<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>druid<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><p>service子模块依赖与mapper子模块,pom.xml详细如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-service<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>jar<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>taotao-manager-service<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span>UTF-8<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project.build.sourceEncoding</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>properties</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 依赖与mapper子模块 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-mapper<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- Spring --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.springframework<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>spring-context<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.springframework<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>spring-beans<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> ...(省略) <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><p>web子模块依赖与service子模块,pom.xml详细如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>project</span> <span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xmlns:</span>xsi</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://www.w3.org/2001/XMLSchema-instance<span class="token punctuation">"</span></span> <span class="token attr-name"><span class="token namespace">xsi:</span>schemaLocation</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>parent</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>modelVersion</span><span class="token punctuation">></span></span>4.0.0<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>modelVersion</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-web<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>packaging</span><span class="token punctuation">></span></span>war<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>packaging</span><span class="token punctuation">></span></span><span class="token comment" spellcheck="true"><!--打成war包--></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>taotao-manager-web Maven Webapp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url</span><span class="token punctuation">></span></span>http://maven.apache.org<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependencies</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 依赖于service --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>dependency</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>cn.william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>taotao-manager-service<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>version</span><span class="token punctuation">></span></span>1.0-SNAPSHOT<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>version</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependency</span><span class="token punctuation">></span></span> ...(省略) <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>dependencies</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>build</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>finalName</span><span class="token punctuation">></span></span>taotao-manager-web<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>finalName</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>build</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>project</span><span class="token punctuation">></span></span></code></pre><blockquote><p>关于上面省略的部分,可查看github完整项目,地址:</p></blockquote><h3 id="五-运行项目"><a href="#五-运行项目" class="headerlink" title="五. 运行项目"></a>五. 运行项目</h3><ol><li><p>创建index.jsp<br>至此,项目创建已经完成,我们可以在taotao-manager-web的webapp目录下创建index.jsp,详情如下:<br><img src="http://oss.willhappy.cn/18-5-3/84575839.jpg" alt="createIndex"></p></li><li><p>使用tomcat插件<br>我们使用maven的tomcat插件来运行项目,在此之前,确保在taotao-manager的pom文件中配置了tomcat的插件:</p></li></ol><pre class=" language-xml"><code class="language-xml">...(省略)<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>build</span><span class="token punctuation">></span></span> <span class="token comment" spellcheck="true"><!-- 配置插件 --></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugins</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>groupId</span><span class="token punctuation">></span></span>org.apache.tomcat.maven<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>groupId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>artifactId</span><span class="token punctuation">></span></span>tomcat7-maven-plugin<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>artifactId</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>port</span><span class="token punctuation">></span></span>8080<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>port</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>path</span><span class="token punctuation">></span></span>/<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>path</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>configuration</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugin</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>plugins</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>build</span><span class="token punctuation">></span></span>...(省略)</code></pre><ol start="3"><li>配置Maven Tomcat Plugin运行web项目</li></ol><p>(1) 添加新配置<br><img src="http://oss.willhappy.cn/18-5-3/1929278.jpg" alt="mavenTomcatPlugin"></p><p><img src="http://oss.willhappy.cn/18-5-3/68155237.jpg" alt="addPlugin"></p><p>(2) 点击运行,或者点击旁边的debug<br><img src="http://oss.willhappy.cn/18-5-3/22139825.jpg" alt="tomcatRun"></p><p>(3) 出项错误<br>出现错误,可能是common-parent和common-utils没有安装到本地仓库,出现的错误是找不到common-utils的jar包,那就需要我们安装一下。<br><img src="http://oss.willhappy.cn/18-5-3/10231101.jpg" alt="mavenInstall"></p><p>等待将jar包安装到本地仓库,稍微有点慢可能,耐心等。。。</p><p>安装完成之后,再次运行,出现下面的信息,证明运行成功:<br><img src="http://oss.willhappy.cn/18-5-3/27916866.jpg" alt="runSuccess"></p><p>通过浏览器访问:<br><img src="http://oss.willhappy.cn/18-5-3/89588801.jpg" alt="browserSuccess"></p><p>至此,我们的项目环境搭建成功,接下来就是实际的项目开发了。</p><blockquote><p>声明:<br>① 关于上面代码中出现的省略的部分,是由于内容偏长,所以省略,想要查看完成项目,请查看本人的github,地址:<br><a href="https://github.com/williamHappy/tao-shopping-mall" target="_blank" rel="noopener">https://github.com/williamHappy/tao-shopping-mall</a><br>② 关于上面有任何不足之处,敬请各位谅解,毕竟本人技术有限,也在学习阶段,也可以给出合理意见,共同改进。<br>③ 黑黑,喜欢的,加个关注白,哈哈哈</p></blockquote>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> Maven </tag>
<tag> java </tag>
</tags>
</entry>
<entry>
<title>HttpClient实现网络请求</title>
<link href="/2017/01/05/12-2017-01-05-httpclient-shi-xian-wang-luo-qing-qiu/"/>
<url>/2017/01/05/12-2017-01-05-httpclient-shi-xian-wang-luo-qing-qiu/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>转自:<a href="http://blog.csdn.net/wangpeng047/article/details/19624529" target="_blank" rel="noopener">文章</a></p><a id="more"></a><p>[toc]</p><h3 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h3><p>HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。<br>下载地址: <a href="http://hc.apache.org/downloads.cgi" target="_blank" rel="noopener">http://hc.apache.org/downloads.cgi</a></p><h3 id="2-特性"><a href="#2-特性" class="headerlink" title="2.特性"></a>2.特性</h3><ol><li>基于标准、纯净的Java语言。实现了Http1.0和Http1.1</li><li>以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。</li><li>支持HTTPS协议。</li><li>通过Http代理建立透明的连接。</li><li>利用CONNECT方法通过Http代理建立隧道的https连接。</li><li>Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。</li><li>插件式的自定义认证方案。</li><li>便携可靠的套接字工厂使它更容易的使用第三方解决方案。</li><li>连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。</li><li>自动处理Set-Cookie中的Cookie。</li><li>插件式的自定义Cookie策略。</li><li>Request的输出流可以避免流中内容直接缓冲到socket服务器。</li><li>Response的输入流可以有效的从socket服务器直接读取相应内容。</li><li>在http1.0和http1.1中利用KeepAlive保持持久连接。</li><li>直接获取服务器发送的response code和 headers。</li><li>设置连接超时的能力。</li><li>实验性的支持http1.1 response caching。</li><li>源代码基于Apache License 可免费获取。<br>【真心看不大懂】</li></ol><h3 id="3-使用方法"><a href="#3-使用方法" class="headerlink" title="3.使用方法"></a>3.使用方法</h3><p>使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。</p><ol><li>创建HttpClient对象。</li><li>创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。</li><li>如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。</li><li>调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。</li><li>调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。</li><li>释放连接。无论执行方法是否成功,都必须释放连接</li></ol><h3 id="4-实例"><a href="#4-实例" class="headerlink" title="4.实例"></a>4.实例</h3><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>test<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>File<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>FileInputStream<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>IOException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>UnsupportedEncodingException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>security<span class="token punctuation">.</span>KeyManagementException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>security<span class="token punctuation">.</span>KeyStore<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>security<span class="token punctuation">.</span>KeyStoreException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>security<span class="token punctuation">.</span>NoSuchAlgorithmException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>security<span class="token punctuation">.</span>cert<span class="token punctuation">.</span>CertificateException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>ArrayList<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>List<span class="token punctuation">;</span><span class="token keyword">import</span> javax<span class="token punctuation">.</span>net<span class="token punctuation">.</span>ssl<span class="token punctuation">.</span>SSLContext<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>HttpEntity<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>NameValuePair<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>ParseException<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>client<span class="token punctuation">.</span>ClientProtocolException<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>client<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>UrlEncodedFormEntity<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>client<span class="token punctuation">.</span>methods<span class="token punctuation">.</span>CloseableHttpResponse<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>client<span class="token punctuation">.</span>methods<span class="token punctuation">.</span>HttpGet<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>client<span class="token punctuation">.</span>methods<span class="token punctuation">.</span>HttpPost<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>conn<span class="token punctuation">.</span>ssl<span class="token punctuation">.</span>SSLConnectionSocketFactory<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>conn<span class="token punctuation">.</span>ssl<span class="token punctuation">.</span>SSLContexts<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>conn<span class="token punctuation">.</span>ssl<span class="token punctuation">.</span>TrustSelfSignedStrategy<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>ContentType<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>MultipartEntityBuilder<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>content<span class="token punctuation">.</span>FileBody<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>entity<span class="token punctuation">.</span>mime<span class="token punctuation">.</span>content<span class="token punctuation">.</span>StringBody<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>impl<span class="token punctuation">.</span>client<span class="token punctuation">.</span>CloseableHttpClient<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>impl<span class="token punctuation">.</span>client<span class="token punctuation">.</span>HttpClients<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>message<span class="token punctuation">.</span>BasicNameValuePair<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>apache<span class="token punctuation">.</span>http<span class="token punctuation">.</span>util<span class="token punctuation">.</span>EntityUtils<span class="token punctuation">;</span><span class="token keyword">import</span> org<span class="token punctuation">.</span>junit<span class="token punctuation">.</span>Test<span class="token punctuation">;</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">HttpClientTest</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Test</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">jUnitTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * HttpClient连接SSL */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">ssl</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> CloseableHttpClient httpclient <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> KeyStore trustStore <span class="token operator">=</span> KeyStore<span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span>KeyStore<span class="token punctuation">.</span><span class="token function">getDefaultType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FileInputStream instream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"d:\\tomcat.keystore"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 加载keyStore d:\\tomcat.keystore</span> trustStore<span class="token punctuation">.</span><span class="token function">load</span><span class="token punctuation">(</span>instream<span class="token punctuation">,</span> <span class="token string">"123456"</span><span class="token punctuation">.</span><span class="token function">toCharArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">CertificateException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> instream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> ignore<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">// 相信自己的CA和所有自签名的证书</span> SSLContext sslcontext <span class="token operator">=</span> SSLContexts<span class="token punctuation">.</span><span class="token function">custom</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">loadTrustMaterial</span><span class="token punctuation">(</span>trustStore<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">TrustSelfSignedStrategy</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 只允许使用TLSv1协议</span> SSLConnectionSocketFactory sslsf <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SSLConnectionSocketFactory</span><span class="token punctuation">(</span>sslcontext<span class="token punctuation">,</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span> <span class="token string">"TLSv1"</span> <span class="token punctuation">}</span><span class="token punctuation">,</span> null<span class="token punctuation">,</span> SSLConnectionSocketFactory<span class="token punctuation">.</span>BROWSER_COMPATIBLE_HOSTNAME_VERIFIER<span class="token punctuation">)</span><span class="token punctuation">;</span> httpclient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">custom</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">setSSLSocketFactory</span><span class="token punctuation">(</span>sslsf<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 创建http请求(get方式)</span> HttpGet httpget <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpGet</span><span class="token punctuation">(</span><span class="token string">"https://localhost:8443/myDemo/Ajax/serivceJ.action"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request"</span> <span class="token operator">+</span> httpget<span class="token punctuation">.</span><span class="token function">getRequestLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> CloseableHttpResponse response <span class="token operator">=</span> httpclient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httpget<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> HttpEntity entity <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"----------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">getStatusLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>entity <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Response content length: "</span> <span class="token operator">+</span> entity<span class="token punctuation">.</span><span class="token function">getContentLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>EntityUtils<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>entity<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> EntityUtils<span class="token punctuation">.</span><span class="token function">consume</span><span class="token punctuation">(</span>entity<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> response<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ParseException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">KeyManagementException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">NoSuchAlgorithmException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">KeyStoreException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>httpclient <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpclient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * post方式提交表单(模拟用户登录请求) */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">postForm</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 创建默认的httpClient实例.</span> CloseableHttpClient httpclient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">createDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 创建httppost</span> HttpPost httppost <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpPost</span><span class="token punctuation">(</span><span class="token string">"http://localhost:8080/myDemo/Ajax/serivceJ.action"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 创建参数队列</span> List<span class="token operator"><</span>namevaluepair<span class="token operator">></span> formparams <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator"><</span>namevaluepair<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> formparams<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BasicNameValuePair</span><span class="token punctuation">(</span><span class="token string">"username"</span><span class="token punctuation">,</span> <span class="token string">"admin"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> formparams<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BasicNameValuePair</span><span class="token punctuation">(</span><span class="token string">"password"</span><span class="token punctuation">,</span> <span class="token string">"123456"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> UrlEncodedFormEntity uefEntity<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> uefEntity <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UrlEncodedFormEntity</span><span class="token punctuation">(</span>formparams<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> httppost<span class="token punctuation">.</span><span class="token function">setEntity</span><span class="token punctuation">(</span>uefEntity<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request "</span> <span class="token operator">+</span> httppost<span class="token punctuation">.</span><span class="token function">getURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> CloseableHttpResponse response <span class="token operator">=</span> httpclient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httppost<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> HttpEntity entity <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>entity <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Response content: "</span> <span class="token operator">+</span> EntityUtils<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>entity<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> response<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientProtocolException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e1<span class="token punctuation">)</span> <span class="token punctuation">{</span> e1<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 关闭连接,释放资源</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpclient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * 发送 post请求访问本地应用并根据传递参数不同返回不同结果 */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">post</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 创建默认的httpClient实例.</span> CloseableHttpClient httpclient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">createDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 创建httppost</span> HttpPost httppost <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpPost</span><span class="token punctuation">(</span><span class="token string">"http://localhost:8080/myDemo/Ajax/serivceJ.action"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 创建参数队列</span> List<span class="token operator"><</span>namevaluepair<span class="token operator">></span> formparams <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator"><</span>namevaluepair<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> formparams<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">BasicNameValuePair</span><span class="token punctuation">(</span><span class="token string">"type"</span><span class="token punctuation">,</span> <span class="token string">"house"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> UrlEncodedFormEntity uefEntity<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> uefEntity <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UrlEncodedFormEntity</span><span class="token punctuation">(</span>formparams<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> httppost<span class="token punctuation">.</span><span class="token function">setEntity</span><span class="token punctuation">(</span>uefEntity<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request "</span> <span class="token operator">+</span> httppost<span class="token punctuation">.</span><span class="token function">getURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> CloseableHttpResponse response <span class="token operator">=</span> httpclient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httppost<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> HttpEntity entity <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>entity <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span> <span class="token string">"Response content: "</span> <span class="token operator">+</span> EntityUtils<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>entity<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span> <span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> response<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientProtocolException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e1<span class="token punctuation">)</span> <span class="token punctuation">{</span> e1<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 关闭连接,释放资源</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpclient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * 发送 get请求 */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">get</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> CloseableHttpClient httpclient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">createDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 创建httpget.</span> HttpGet httpget <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpGet</span><span class="token punctuation">(</span><span class="token string">"http://www.baidu.com/"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request "</span> <span class="token operator">+</span> httpget<span class="token punctuation">.</span><span class="token function">getURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 执行get请求.</span> CloseableHttpResponse response <span class="token operator">=</span> httpclient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httpget<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 获取响应实体</span> HttpEntity entity <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"--------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 打印响应状态</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">getStatusLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>entity <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 打印响应内容长度</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Response content length: "</span> <span class="token operator">+</span> entity<span class="token punctuation">.</span><span class="token function">getContentLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 打印响应内容</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Response content: "</span> <span class="token operator">+</span> EntityUtils<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>entity<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> response<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientProtocolException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ParseException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">// 关闭连接,释放资源</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpclient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * 上传文件 */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">upload</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> CloseableHttpClient httpclient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">createDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> HttpPost httppost <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpPost</span><span class="token punctuation">(</span><span class="token string">"http://localhost:8080/myDemo/Ajax/serivceFile.action"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FileBody bin <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileBody</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"F:\\image\\sendpix0.jpg"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> StringBody comment <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBody</span><span class="token punctuation">(</span><span class="token string">"A binary file of some kind"</span><span class="token punctuation">,</span> ContentType<span class="token punctuation">.</span>TEXT_PLAIN<span class="token punctuation">)</span><span class="token punctuation">;</span> HttpEntity reqEntity <span class="token operator">=</span> MultipartEntityBuilder<span class="token punctuation">.</span><span class="token function">create</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addPart</span><span class="token punctuation">(</span><span class="token string">"bin"</span><span class="token punctuation">,</span> bin<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">addPart</span><span class="token punctuation">(</span><span class="token string">"comment"</span><span class="token punctuation">,</span> comment<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">build</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> httppost<span class="token punctuation">.</span><span class="token function">setEntity</span><span class="token punctuation">(</span>reqEntity<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request "</span> <span class="token operator">+</span> httppost<span class="token punctuation">.</span><span class="token function">getRequestLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> CloseableHttpResponse response <span class="token operator">=</span> httpclient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httppost<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"----------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>response<span class="token punctuation">.</span><span class="token function">getStatusLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> HttpEntity resEntity <span class="token operator">=</span> response<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>resEntity <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Response content length: "</span> <span class="token operator">+</span> resEntity<span class="token punctuation">.</span><span class="token function">getContentLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> EntityUtils<span class="token punctuation">.</span><span class="token function">consume</span><span class="token punctuation">(</span>resEntity<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> response<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientProtocolException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpclient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>将post方法进行重载,传入的参数包含url和请求字符串,实例如下:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> String <span class="token function">POST</span><span class="token punctuation">(</span>String url<span class="token punctuation">,</span>String str<span class="token punctuation">)</span><span class="token punctuation">{</span> String result <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//创建默认的httpClient实例</span> CloseableHttpClient httpClient <span class="token operator">=</span> HttpClients<span class="token punctuation">.</span><span class="token function">createDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//创建httppost</span> HttpPost httpPost <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpPost</span><span class="token punctuation">(</span>url<span class="token punctuation">)</span><span class="token punctuation">;</span> UrlEncodedFormEntity encodedFormEntity<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> HttpEntity httpEntity <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringEntity</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span> httpPost<span class="token punctuation">.</span><span class="token function">setEntity</span><span class="token punctuation">(</span>httpEntity<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"executing request "</span><span class="token operator">+</span> httpPost<span class="token punctuation">.</span><span class="token function">getURI</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> HttpResponse httpResponse<span class="token punctuation">;</span> httpResponse <span class="token operator">=</span> httpClient<span class="token punctuation">.</span><span class="token function">execute</span><span class="token punctuation">(</span>httpPost<span class="token punctuation">)</span><span class="token punctuation">;</span> HttpEntity responseEntity <span class="token operator">=</span> httpResponse<span class="token punctuation">.</span><span class="token function">getEntity</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>responseEntity<span class="token operator">!=</span>null<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"-------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> result <span class="token operator">=</span> EntityUtils<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>responseEntity<span class="token punctuation">,</span><span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"-------------------------------------"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClientProtocolException</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">finally</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//关闭链接,释放资源</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> httpClient<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> result<span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre><blockquote><p>HttpEntity httpEntity = new StringEntity(str);<br>httpPost.setEntity(httpEntity);</p></blockquote>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> HttpClient </tag>
</tags>
</entry>
<entry>
<title>java之反射技术及其应用</title>
<link href="/2017/01/03/11-2017-01-03-java-zhi-fan-she-ji-zhu-ji-qi-ying-yong-java005/"/>
<url>/2017/01/03/11-2017-01-03-java-zhi-fan-she-ji-zhu-ji-qi-ying-yong-java005/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>翻阅了很多资料想查看一个比较通俗易懂的关于java反射机制的理解,但是想要从概念中去理解一项技术,可能有点困难,所以先将理论型知识贴出来,后面,慢慢来理解。</p><a id="more"></a><blockquote><p>反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。—-《百度百科》</p></blockquote><p><code>注意</code>:要理解java的反射机制,先要了解以下基本概念:<br><code>运行时</code>,<code>编译时</code>,<code>编译型</code>,<code>解释型</code>,<code>类加载器</code>,<code>动态加载类</code>等相关概念。</p><p>[toc]</p><h3 id="一-Class类的使用"><a href="#一-Class类的使用" class="headerlink" title="一. Class类的使用"></a>一. Class类的使用</h3><ol><li>概念理解<br>在Java中,每个class都有一个相应的Class对象。也就是说,当我们编写一个类,编译完成后,在生成的.class文件中,就会产生一个Class对象,用于表示这个类的类型信息。</li><li>获取Class实例的方式<br>不能直接创建Class的实例对象,因为Class类的构造方法是私有的,只有jvm可以去创建。<br>(1) 利用对象调用getClass()方法获取该对象的Class实例;<br>(2) 使用Class类的静态方法forName(),用类的名字获取一个Class实例,源码如下;</li></ol><pre class=" language-java"><code class="language-java"> <span class="token annotation punctuation">@CallerSensitive</span> <span class="token keyword">public</span> <span class="token keyword">static</span> Class<span class="token operator"><</span><span class="token operator">?</span><span class="token operator">></span> <span class="token function">forName</span><span class="token punctuation">(</span>String className<span class="token punctuation">)</span> <span class="token keyword">throws</span> ClassNotFoundException <span class="token punctuation">{</span> Class<span class="token operator"><</span><span class="token operator">?</span><span class="token operator">></span> caller <span class="token operator">=</span> Reflection<span class="token punctuation">.</span><span class="token function">getCallerClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">forName0</span><span class="token punctuation">(</span>className<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> ClassLoader<span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span>caller<span class="token punctuation">)</span><span class="token punctuation">,</span> caller<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre><p>(3)运用.class的方式获取Class实例,对于基本数据类型的封装类,还可以采用TYPE来获取对应的基本数据类型的Class实例</p><p style="color:red;">综上所述,其实我们代码中创建的每一个类都是一个对象,只不过她是Class类的实例对象,这个对象我们称为该类的类类型。并且一个类只可能是Class类的一个实例对象,即获取的类类型是相同的</p><p>那么,如何去创建Class的实例呢?<br>首先,过程要理解,源文件经过编译(javac.exe)以后,得到一个或多个.class文件。.class文件经过运行(java.exe)这步,就需要进行类的加载(通过JVM的类的加载器),记载到内存中的缓存。每一个放入缓存中的.class文件就是一个Class的实例!下面是创建Class实例的三种方法。</p><p>实例如下:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ReflectTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">display</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello World!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> ReflectTest reflectTest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ReflectTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Class <span class="token class-name">clazz1</span> <span class="token operator">=</span> reflectTest<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Class <span class="token class-name">clazz2</span> <span class="token operator">=</span> ReflectTest<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">;</span> Class <span class="token class-name">clazz3</span> <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> clazz3 <span class="token operator">=</span> Class<span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"com.william.test.ReflectTest"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClassNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>clazz1<span class="token operator">==</span>clazz2<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>clazz1<span class="token operator">==</span>clazz3<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>clazz2<span class="token operator">==</span>clazz3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token boolean">true</span><span class="token boolean">true</span><span class="token boolean">true</span></code></pre><p>其实,还有一种创建Class实例的方法,是通过类的加载器,如下:</p><pre class=" language-java"><code class="language-java"><span class="token annotation punctuation">@Test</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">LoadClassTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> ClassLoader loader <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Class <span class="token class-name">clazz4</span> <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> clazz4 <span class="token operator">=</span> loader<span class="token punctuation">.</span><span class="token function">loadClass</span><span class="token punctuation">(</span><span class="token string">"com.william.test.ReflectTest"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ClassNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>clazz4<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token keyword">class</span> <span class="token class-name">com<span class="token punctuation">.</span>william<span class="token punctuation">.</span>test<span class="token punctuation">.</span>ReflectTest</span></code></pre><ul><li>如何根据类类型去创建类的实例呢?</li></ul><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//通过类的类型创建该类的实例对象</span>ReflectTest reflectTest1 <span class="token operator">=</span> null<span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span> reflectTest1 <span class="token operator">=</span> <span class="token punctuation">(</span>ReflectTest<span class="token punctuation">)</span> clazz1<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//需要类有无参的构造方法</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InstantiationException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IllegalAccessException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>reflectTest<span class="token punctuation">.</span><span class="token function">display</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>output<span class="token operator">:</span>Hello World<span class="token operator">!</span></code></pre><ol start="3"><li>动态加载类<br><code>Class.forName("类的全称")</code></li></ol><ul><li>表示类的类类型,还代表了动态加载类</li><li>区分上面所说的编译,运行</li><li>编译时刻加载类是静态加载类,运行时刻加载类是动态加载类<br>关于动态加载类的实例代码请参考:<a href="http://www.imooc.com/video/3733" target="_blank" rel="noopener">http://www.imooc.com/video/3733</a></li></ul><ol start="4"><li>java获取方法信息</li></ol><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">/** *打印类的信息,包括类的成员函数,成员变量 */</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ClassUtil</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 获取成员函数 * object 该对象所属类的信息 * * @param object */</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printMethodMessage</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//要获取类的信息,首先要获取类的类类型</span> Class <span class="token class-name">clazz</span> <span class="token operator">=</span> object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//传递的是哪个子类的对象, clazz就是该子类的类类型</span> <span class="token comment" spellcheck="true">//获取类的名称</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"类的名称是:"</span> <span class="token operator">+</span> clazz<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">/** * Method类,方法对象 * 一个成员方法就是一个Method对象 * getMethods()方法获取的是所有的public的函数,包括父类继承而来的 * getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限 */</span> Method<span class="token punctuation">[</span><span class="token punctuation">]</span> methods <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getDeclaredMethods</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> methods<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//1. 获取注解</span> Annotation<span class="token punctuation">[</span><span class="token punctuation">]</span> ann <span class="token operator">=</span> methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getAnnotations</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Annotation a <span class="token operator">:</span> ann<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//2. 获取权限修饰符</span> String str <span class="token operator">=</span> Modifier<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>str <span class="token operator">+</span> <span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//3. 得到方法的返回值类型的类类型</span> Class <span class="token class-name">returnType</span> <span class="token operator">=</span> methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getReturnType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>returnType<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//4. 得到方法的名称</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"("</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//5.获取参数类型-->得到的是参数列表的类型的类类型</span> Class<span class="token punctuation">[</span><span class="token punctuation">]</span> paramTypes <span class="token operator">=</span> methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getParameterTypes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//解析数组</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> paramTypes<span class="token punctuation">.</span>length<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>j <span class="token operator">==</span> <span class="token number">1</span> <span class="token operator">||</span> j <span class="token operator">==</span> paramTypes<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>paramTypes<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" args"</span> <span class="token operator">+</span> j<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>paramTypes<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" args"</span> <span class="token operator">+</span> j <span class="token operator">+</span> <span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">")"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//6.获取异常类型</span> Class<span class="token punctuation">[</span><span class="token punctuation">]</span> exps <span class="token operator">=</span> methods<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getExceptionTypes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>exps<span class="token punctuation">.</span>length <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">" throws "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k <span class="token operator"><</span> exps<span class="token punctuation">.</span>length<span class="token punctuation">;</span> k<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>exps<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">MethodTest</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//注解类型在java之注解开发章节讲解过的</span> <span class="token annotation punctuation">@MyAnnotation</span><span class="token punctuation">(</span>wd <span class="token operator">=</span> WeekDay<span class="token punctuation">.</span>MON<span class="token punctuation">,</span>id <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token keyword">static</span> String desc <span class="token operator">=</span> <span class="token string">"这是一个人"</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">MethodTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token function">MethodTest</span><span class="token punctuation">(</span>String name<span class="token punctuation">,</span> <span class="token keyword">int</span> age<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Deprecated</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token keyword">throws</span> Exception <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span>String a<span class="token punctuation">,</span> String b<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">","</span> <span class="token operator">+</span> b<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"MethodTest{"</span> <span class="token operator">+</span> <span class="token string">"name='"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">'\''</span> <span class="token operator">+</span> <span class="token string">", age="</span> <span class="token operator">+</span> age <span class="token operator">+</span> <span class="token string">'}'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">//调用</span>MethodTest methodTest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MethodTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>ClassUtil<span class="token punctuation">.</span><span class="token function">printMethodMessage</span><span class="token punctuation">(</span>methodTest<span class="token punctuation">)</span><span class="token punctuation">;</span>output<span class="token operator">:</span>类的名称是:com<span class="token punctuation">.</span>william<span class="token punctuation">.</span>test<span class="token punctuation">.</span>MethodTest<span class="token keyword">public</span> java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token annotation punctuation">@java</span><span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">Deprecated</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">int</span> args0<span class="token punctuation">,</span><span class="token keyword">int</span> args1<span class="token punctuation">)</span> <span class="token keyword">throws</span> java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>Exception<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String args0<span class="token punctuation">,</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String args1<span class="token punctuation">)</span></code></pre><p>获取方法的信息,主要通过Method类数组来接受getMethods()方法的返回值,然后进行遍历解析。</p><ol start="5"><li>获取成员变量信息<br>获取成员变量的信息,同获取方法的信息类似,只不过使用Field类数组来接收getFieldss()方法的返回值,然后进行解析。代码如下:</li></ol><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">/** * 获取成员变量 */</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printFieldMessage</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//要获取类的信息,首先要获取类的类类型</span> Class <span class="token class-name">clazz</span> <span class="token operator">=</span> object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//传递的是哪个子类的对象, clazz就是该子类的类类型</span> <span class="token comment" spellcheck="true">//获取类的名称</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"类的名称是:"</span> <span class="token operator">+</span> clazz<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">/** * 成员变量也是对象 * java.lang.reflect.Field * Field类封装了关于成员变量的操作 * getFields()方法获取的是所有的public的成员变量的信息 * getDeclaredFields获取的是该类自己声明的成员变量的信息 */</span> Field<span class="token punctuation">[</span><span class="token punctuation">]</span> fields <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getDeclaredFields</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Field field <span class="token operator">:</span> fields<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//获取每个属性的权限修饰符</span> <span class="token keyword">int</span> i <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">getModifiers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> String str <span class="token operator">=</span> Modifier<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//得到成员变量的类型的类类型</span> Class <span class="token class-name">fieldType</span> <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">getType</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> String typeName <span class="token operator">=</span> fieldType<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//得到成员变量的名称</span> String fieldName <span class="token operator">=</span> field<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>str <span class="token operator">+</span> <span class="token string">" "</span><span class="token operator">+</span> typeName <span class="token operator">+</span> <span class="token string">" "</span> <span class="token operator">+</span> fieldName<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//调用</span>String str <span class="token operator">=</span> <span class="token string">"Hello World!"</span><span class="token punctuation">;</span>ClassUtil<span class="token punctuation">.</span><span class="token function">printFieldMessage</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>output<span class="token operator">:</span>类的名称是:java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String类的名称是:java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String<span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token punctuation">[</span>C value<span class="token keyword">private</span> <span class="token keyword">int</span> hash<span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">long</span> serialVersionUID</code></pre><ol start="6"><li>获取构造函数</li></ol><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">/** * 获取对象的构造函数的信息 * * @param object */</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printConMessage</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//要获取类的信息,首先要获取类的类类型</span> Class <span class="token class-name">clazz</span> <span class="token operator">=</span> object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//传递的是哪个子类的对象, clazz就是该子类的类类型</span> <span class="token comment" spellcheck="true">//获取类的名称</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"类的名称是:"</span> <span class="token operator">+</span> clazz<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">/** * 构造函数也是对象 * java.lang.Constructor中封装了构造函数的信息 * getConstructors获取所有的public的构造函数 * getDeclaredConstructors得到所有的构造函数 */</span> Constructor<span class="token punctuation">[</span><span class="token punctuation">]</span> constructors <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getConstructors</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Constructor constructor <span class="token operator">:</span> constructors<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>constructor<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"("</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//获取构造函数的参数列表--->得到的是参数列表的类类型</span> Class<span class="token punctuation">[</span><span class="token punctuation">]</span> paramTypes <span class="token operator">=</span> constructor<span class="token punctuation">.</span><span class="token function">getParameterTypes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Class <span class="token class-name">clazz1</span> <span class="token operator">:</span> paramTypes<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>clazz1<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">")"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//调用</span>String str <span class="token operator">=</span> <span class="token string">"Hello World!"</span><span class="token punctuation">;</span>ClassUtil<span class="token punctuation">.</span><span class="token function">printConMessage</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span>output<span class="token operator">:</span>类的名称是:java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>Stringjava<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">[</span>B<span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">[</span>B<span class="token punctuation">,</span>java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span>charset<span class="token punctuation">.</span>Charset<span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">[</span>B<span class="token punctuation">,</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String<span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">[</span>B<span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span>java<span class="token punctuation">.</span>nio<span class="token punctuation">.</span>charset<span class="token punctuation">.</span>Charset<span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span><span class="token punctuation">[</span>B<span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">,</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>String<span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>StringBuilder<span class="token punctuation">,</span><span class="token punctuation">)</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span><span class="token function">String</span><span class="token punctuation">(</span>java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>StringBuffer<span class="token punctuation">,</span><span class="token punctuation">)</span></code></pre><h3 id="二-方法的反射"><a href="#二-方法的反射" class="headerlink" title="二. 方法的反射"></a>二. 方法的反射</h3><ol><li>方法的反射<br>1) 如何获取某个方法<br> 方法的名称和方法的参数里列表才能唯一决定某个方法<br>2) 方法反射的操作<br> method.invoke(对象,参数里列表)<br>示例代码:</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MethodReflect</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//要获取print(int,int)方法 1. 要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型</span> MethodTest methodTest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MethodTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Class <span class="token class-name">clazz</span> <span class="token operator">=</span> methodTest<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//Method method = clazz.getMethod("print",new Class[]{int.class,int.class});</span> Method method <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getMethod</span><span class="token punctuation">(</span><span class="token string">"print"</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//以前的方法的方法调用</span> <span class="token comment" spellcheck="true">//methodTest.print(10,20);</span> <span class="token comment" spellcheck="true">//方法的反射操作</span> <span class="token comment" spellcheck="true">//方法如果没有返回值返回null,有返回值返回具体的返回值</span> <span class="token comment" spellcheck="true">//method.invoke(methodTest,new Object[]{10,20});</span> Object o <span class="token operator">=</span> method<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>methodTest<span class="token punctuation">,</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"============================"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//获取方法print(String,String)</span> Method method1 <span class="token operator">=</span> clazz<span class="token punctuation">.</span><span class="token function">getMethod</span><span class="token punctuation">(</span><span class="token string">"print"</span><span class="token punctuation">,</span>String<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span>String<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//用方法进行反射操作</span> o <span class="token operator">=</span> method1<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>methodTest<span class="token punctuation">,</span><span class="token string">"hello"</span><span class="token punctuation">,</span><span class="token string">"WORLD!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">MethodTest</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span> <span class="token keyword">static</span> String desc <span class="token operator">=</span> <span class="token string">"这是一个人"</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">MethodTest</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token function">MethodTest</span><span class="token punctuation">(</span>String name<span class="token punctuation">,</span> <span class="token keyword">int</span> age<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>age <span class="token operator">=</span> age<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a <span class="token operator">+</span> b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span>String a<span class="token punctuation">,</span> String b<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">toUpperCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">","</span> <span class="token operator">+</span> b<span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token string">"MethodTest{"</span> <span class="token operator">+</span> <span class="token string">"name='"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">'\''</span> <span class="token operator">+</span> <span class="token string">", age="</span> <span class="token operator">+</span> age <span class="token operator">+</span> <span class="token string">'}'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token number">30</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span>HELLO<span class="token punctuation">,</span>world<span class="token operator">!</span></code></pre><h3 id="三-成员变量的反射"><a href="#三-成员变量的反射" class="headerlink" title="三. 成员变量的反射"></a>三. 成员变量的反射</h3><p>实例如下:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//成员变量的反射</span>Class <span class="token class-name">clazz1</span><span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span> clazz1 <span class="token operator">=</span> Class<span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"com.william.test.MethodTest"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Object object <span class="token operator">=</span> clazz1<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> MethodTest methodTest1 <span class="token operator">=</span> <span class="token punctuation">(</span>MethodTest<span class="token punctuation">)</span> object<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//调用private属性</span> Field field1 <span class="token operator">=</span> clazz1<span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> field1<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> field1<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>methodTest1<span class="token punctuation">,</span><span class="token string">"william"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>methodTest1<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//调用public的属性</span> Field field2 <span class="token operator">=</span> clazz1<span class="token punctuation">.</span><span class="token function">getField</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> field2<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>methodTest1<span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>methodTest1<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//调用static属性</span> Field field3 <span class="token operator">=</span> clazz1<span class="token punctuation">.</span><span class="token function">getDeclaredField</span><span class="token punctuation">(</span><span class="token string">"desc"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>field3<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span>MethodTest<span class="token punctuation">.</span>desc<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//System.out.println(field3.get(null));</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>output<span class="token operator">:</span>MethodTest<span class="token punctuation">{</span>name<span class="token operator">=</span><span class="token string">'william'</span><span class="token punctuation">,</span> age<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">}</span>MethodTest<span class="token punctuation">{</span>name<span class="token operator">=</span><span class="token string">'william'</span><span class="token punctuation">,</span> age<span class="token operator">=</span><span class="token number">9</span><span class="token punctuation">}</span>这是一个人</code></pre><h3 id="四-构造函数的反射"><a href="#四-构造函数的反射" class="headerlink" title="四. 构造函数的反射"></a>四. 构造函数的反射</h3><p>实例如下:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//构造函数的反射</span>Class <span class="token class-name">clazz3</span> <span class="token operator">=</span> MethodTest<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">;</span><span class="token keyword">try</span> <span class="token punctuation">{</span> Constructor constructor <span class="token operator">=</span> clazz3<span class="token punctuation">.</span><span class="token function">getDeclaredConstructor</span><span class="token punctuation">(</span>String<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> constructor<span class="token punctuation">.</span><span class="token function">setAccessible</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> MethodTest methodTest2 <span class="token operator">=</span> <span class="token punctuation">(</span>MethodTest<span class="token punctuation">)</span> constructor<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token string">"will"</span><span class="token punctuation">,</span><span class="token number">99</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>methodTest2<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>output<span class="token operator">:</span>MethodTest<span class="token punctuation">{</span>name<span class="token operator">=</span><span class="token string">'will'</span><span class="token punctuation">,</span> age<span class="token operator">=</span><span class="token number">99</span><span class="token punctuation">}</span></code></pre><h3 id="五-认识泛型的本质"><a href="#五-认识泛型的本质" class="headerlink" title="五. 认识泛型的本质"></a>五. 认识泛型的本质</h3><p>先来看一个实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">FanXingTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> ArrayList list <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> ArrayList<span class="token operator"><</span>String<span class="token operator">></span> list1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator"><</span>String<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> list1<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//list1.add(20);编译错误</span> Class <span class="token class-name">c1</span> <span class="token operator">=</span> list<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Class <span class="token class-name">c2</span> <span class="token operator">=</span> list1<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>c1 <span class="token operator">==</span> c2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//反射的操作都是编译之后的操作</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Method m <span class="token operator">=</span> c2<span class="token punctuation">.</span><span class="token function">getMethod</span><span class="token punctuation">(</span><span class="token string">"add"</span><span class="token punctuation">,</span>Object<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> m<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>list1<span class="token punctuation">,</span><span class="token number">20</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//绕过编译操作就绕过了泛型</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>list1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>list1<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token boolean">true</span><span class="token number">2</span><span class="token punctuation">[</span>hello<span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">]</span></code></pre><p>通过返回结果,我们可以看到在编译之后集合的泛型是去泛型化的,java中集合类型的泛型,是防止错误输入的,只在编译阶段有效,绕过编译就无效了,所以我们通过方法的反射来操作,可以绕过编译。</p><h3 id="六-反射应用之动态代理"><a href="#六-反射应用之动态代理" class="headerlink" title="六. 反射应用之动态代理"></a>六. 反射应用之动态代理</h3><p><code>动态代理</code>是指客户通过代理类来调用其他对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。<br>实例代码:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//动态代理的使用</span><span class="token keyword">interface</span> <span class="token class-name">Subject</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//被代理类</span><span class="token keyword">class</span> <span class="token class-name">RealSubject</span> <span class="token keyword">implements</span> <span class="token class-name">Subject</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"我是被代理类,记得要执行我奥,么么~~~"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">MyInvocationHandler</span> <span class="token keyword">implements</span> <span class="token class-name">InvocationHandler</span> <span class="token punctuation">{</span> Object object<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//实现了接口的被代理类的对象的声明</span> <span class="token comment" spellcheck="true">//①给被代理的对象实例化 ②返回一个代理类的对象</span> <span class="token keyword">public</span> Object <span class="token function">blind</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>object <span class="token operator">=</span> object<span class="token punctuation">;</span> <span class="token keyword">return</span> Proxy<span class="token punctuation">.</span><span class="token function">newProxyInstance</span><span class="token punctuation">(</span>object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getInterfaces</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//当通过代理类的对象发起对被重写的方法的调用时,都会转化为对如下的invoke方法的调用</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> Object <span class="token function">invoke</span><span class="token punctuation">(</span>Object proxy<span class="token punctuation">,</span> Method method<span class="token punctuation">,</span> Object<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> Throwable <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//method方法的返回值是returnVal</span> Object returnVal <span class="token operator">=</span> method<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>object<span class="token punctuation">,</span>args<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> returnVal<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ProxyTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//1. 创建被代理类对象</span> RealSubject realSubject <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RealSubject</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//2. 创建一个实现了InvocationHandler接口的类的对象</span> MyInvocationHandler handler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyInvocationHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//3. 调用blind()方法,冬天的返回一个同样实现了real所在类实现的接口Subject的代理类的对象。</span> Object object <span class="token operator">=</span> handler<span class="token punctuation">.</span><span class="token function">blind</span><span class="token punctuation">(</span>realSubject<span class="token punctuation">)</span><span class="token punctuation">;</span> Subject subject <span class="token operator">=</span> <span class="token punctuation">(</span>Subject<span class="token punctuation">)</span> object<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//此时sub就是代理类的对象</span> subject<span class="token punctuation">.</span><span class="token function">action</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//转到对InvacationHandler接口的实现类的invoke()方法的调用</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span>我是被代理类,记得要执行我奥,么么<span class="token operator">~</span><span class="token operator">~</span><span class="token operator">~</span></code></pre><p>说明,了解动态代理和静态代理的区别,所谓的<code>静态代理</code>,其代理类和目标对象的类在编译期间就确定下来,不利于程序的扩展。即,每一个代理类只能为一个接口服务,也就是说程序开发中会产生很多代理类。</p><h3 id="七-动态代理与AOP"><a href="#七-动态代理与AOP" class="headerlink" title="七. 动态代理与AOP"></a>七. 动态代理与AOP</h3><p>由:<br><img src="http://oss.willhappy.cn/18-5-3/46467199.jpg" alt="ctProxy"><br>转换为:<br><img src="http://oss.willhappy.cn/18-5-3/85959154.jpg" alt="xyProxy"></p><p>实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">interface</span> <span class="token class-name">Human</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">info</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">SuperMan</span> <span class="token keyword">implements</span> <span class="token class-name">Human</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">info</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"我是超人!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"I believe I can fly!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">HumanUtil</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">method1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=============方法一============"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">method2</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=============方法二============"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">MyInvocationHandler</span> <span class="token keyword">implements</span> <span class="token class-name">InvocationHandler</span> <span class="token punctuation">{</span> Object object<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//被代理类对象的声明</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setObject</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>object <span class="token operator">=</span> object<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> Object <span class="token function">invoke</span><span class="token punctuation">(</span>Object proxy<span class="token punctuation">,</span> Method method<span class="token punctuation">,</span> Object<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> Throwable <span class="token punctuation">{</span> HumanUtil h <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HumanUtil</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> h<span class="token punctuation">.</span><span class="token function">method1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Object returnVal <span class="token operator">=</span> method<span class="token punctuation">.</span><span class="token function">invoke</span><span class="token punctuation">(</span>object<span class="token punctuation">,</span> args<span class="token punctuation">)</span><span class="token punctuation">;</span> h<span class="token punctuation">.</span><span class="token function">method2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> returnVal<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//动态的创建一个代理类的对象</span><span class="token keyword">class</span> <span class="token class-name">MyProxy</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> Object <span class="token function">getProxyInstance</span><span class="token punctuation">(</span>Object object<span class="token punctuation">)</span> <span class="token punctuation">{</span> MyInvocationHandler handler <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyInvocationHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> handler<span class="token punctuation">.</span><span class="token function">setObject</span><span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> Proxy<span class="token punctuation">.</span><span class="token function">newProxyInstance</span><span class="token punctuation">(</span>object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getClassLoader</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> object<span class="token punctuation">.</span><span class="token function">getClass</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getInterfaces</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> handler<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TestAOP</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> SuperMan man <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SuperMan</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//创建一个被代理类的对象</span> Human human <span class="token operator">=</span> <span class="token punctuation">(</span>Human<span class="token punctuation">)</span> MyProxy<span class="token punctuation">.</span><span class="token function">getProxyInstance</span><span class="token punctuation">(</span>man<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//返回一个代理类的对象</span> human<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//通过代理类的对象嗲用重写的抽象的方法</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> human<span class="token punctuation">.</span><span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>方法一<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span>我是超人!<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>方法二<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>方法一<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span>I believe I can fly<span class="token operator">!</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>方法二<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span></code></pre><p>AOP代理的方法:<br><img src="http://oss.willhappy.cn/18-5-3/59036354.jpg" alt="AOPMethod"></p><p style="color:blue;">相关概念</p><p><strong>什么是编译?</strong></p><blockquote><p>答:将原程序翻译成计算机语言,就是二进制代码,在java中是将.java文件也就是源程序翻译成.class的字节码</p></blockquote><p><strong>什么是编译时?</strong></p><blockquote><p>答:将原程序翻译成计算机语言的过程中,将.java翻译为.class文件的过程</p></blockquote><p><strong>什么是运行时?</strong></p><blockquote><p>答:就是在启动这个程序的时候,在java中是,类加载器加载.class文件,并交给jvm处理</p></blockquote><p><strong>什么是编译型语言?</strong></p><blockquote><p>答:将原程序一次性全部转换为二进制代码,然后执行程序</p></blockquote><p><strong>什么是解释型语言?</strong></p><blockquote><p>答:转换一句,执行一句,java是既编译又解释的语言</p></blockquote><p><strong>编译型语言和解释型语言的区别:</strong></p><blockquote><p>答:编译型语言效率高,依赖于编译器,但是跨平台差,解释型的效率低,依赖于解释器,但跨平台强</p></blockquote><p><strong>什么是类加载器?</strong></p><blockquote><p>答:类加载器就是JVM中的类装载器,作用就是将编译好的.class字节码运到检查器进行安全检查的,检查通过后开始解释执行</p></blockquote><p><strong>什么是运行时动态加载类?</strong></p><blockquote><p>答:反射就是可以将一个程序(类)在运行的时候获得该程序(类)的信息的机制,也就是获得在编译期不可能获得的类的信息,因为这些信息是保存在Class对象中的,而这个Class对象是在程序运行时动态加载的<br>它就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。类在运行的时候,可以得到该类的信息,并且 可以动态的修改这些信息,自己能看到自己,跟照镜子一样,class对象是在运行的时候产生的,通过class对象操作类的信息是在运行时进行的,当运行 程序的时候,类加载器会加载真正需要的类,什么是真正需要的呢?就是该类真正起作用,如:有该类的对象实例,或该类调用了静态方法属性等</p></blockquote>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
<tag> Reflect </tag>
</tags>
</entry>
<entry>
<title>java多线程开发应用</title>
<link href="/2017/01/01/10-2017-01-01-java-duo-xian-cheng/"/>
<url>/2017/01/01/10-2017-01-01-java-duo-xian-cheng/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>在之前的博客 <a href="http://willhappy.cn/2016/11/25/Java%E9%AB%98%E7%BA%A7%E7%9F%A5%E8%AF%86(java003" target="_blank" rel="noopener">java提升2相关章节</a>/) 介绍了关于多线程的基础知识,可以翻阅查看,本章节深入了解一下多线程的应用。</p><a id="more"></a><p>[toc]</p><h3 id="一-线程安全"><a href="#一-线程安全" class="headerlink" title="一. 线程安全"></a>一. 线程安全</h3><p>对于线程安全问题,首先举个例子:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//窗口售票问题</span><span class="token keyword">class</span> <span class="token class-name">MyThreadDemo</span> <span class="token keyword">implements</span> <span class="token class-name">Runnable</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> ticket <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ticket<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"售票,票号为:"</span><span class="token operator">+</span>ticket<span class="token operator">--</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ThreadTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> MyThreadDemo m <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyThreadDemo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> t1<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t3<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>问题描述:<br>上面的多线程售票出现了一下错误现象<br>重票:<br><img src="http://oss.willhappy.cn/18-5-3/88895938.jpg" alt="threadError01"></p><p>错票:<br><img src="http://oss.willhappy.cn/18-5-3/37537584.jpg" alt="threadError02"></p><p>首先,我们分析一下为什么出现这种问题呢?<br>我们所期望的理想状态为:<br><img src="http://oss.willhappy.cn/18-5-3/80802454.jpg" alt="threadDream"></p><p>但是,会出现一个极端状态:<br><img src="http://oss.willhappy.cn/18-5-3/79778261.jpg" alt="threadWorry"></p><p><strong>这是由于一个线程在操作共享数据过程中,未执行完毕的情况下,例外的线程参与进来,导致了共享数据存在了安全问题,本实例的共享数据为ticket。</strong></p><p>那么,如何处理程序的线程安全问题呢?<br><strong>必须让一个线程操作共享数据完毕以后,其它线程才有机会参与共享数据的操作。</strong></p><p>原理我们也理解了,那java如何去实现线程的安全呢?<br><strong>使用线程的同步机制</strong><br>实现方式有两种:</p><ul><li>同步代码块</li></ul><p><code>synchronized(同步监视器){//需要被同步的代码块(即操作共享数据的代码)}</code></p><ol><li>共享数据:多个线程共同操作的同一个数据(变量)</li><li>同步监视器:由任何一个类的对象来充当,哪个线程获取此监视器,谁就执行大括号里被同步的代码。俗称:锁。</li></ol><p>代码实现:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">MyThreadDemo</span> <span class="token keyword">implements</span> <span class="token class-name">Runnable</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> ticket <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> Object object <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Object</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//Object object = new Object();//不行,由成员变量变为局部变量,每创建一个线程,都会创建一个对象</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>object<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token comment" spellcheck="true">//同步监视器(锁)可以由任何一个类的对象来充当,也可以使用this,表示当前对象,只new了一次。但是在继承的方式中,一定要注意使用this,可能创建了多个线程对象,要求是多个线程使用同一个锁,即使用同一个对象。</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ticket<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">"售票,票号为:"</span><span class="token operator">+</span>ticket<span class="token operator">--</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><img src="http://oss.willhappy.cn/18-5-3/75561552.jpg" alt="threadTheory"></p><ul><li>同步方法</li></ul><p>同步的方法实现在<a href="http://willhappy.cn/2016/11/25/Java%E9%AB%98%E7%BA%A7%E7%9F%A5%E8%AF%86(java003" target="_blank" rel="noopener">java提升2相关章节</a>/)已经给出,可以前去查看。</p><p>它是将操作共享数据的方法声明为<code>synchronized</code>,即此方法为同步方法,能够保证当其中一个线程执行此方法时,其它线程在外等待直至此线程执行完此方法。</p><blockquote><p>那么同步方法有没有锁呢,答案是有的,锁为this。但是同样要注意,在使用继承创建的线程的方式中,同样要慎用同步方法的方式,因为它的锁为this。必须保证多个线程共用一把锁。</p></blockquote><ul><li>使用锁的方式(了解)</li></ul><h3 id="二-互斥锁之单例模式之懒汉式的线程安全问题"><a href="#二-互斥锁之单例模式之懒汉式的线程安全问题" class="headerlink" title="二. 互斥锁之单例模式之懒汉式的线程安全问题"></a>二. 互斥锁之单例模式之懒汉式的线程安全问题</h3><p><code>互斥锁</code>指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 关键字<code>synchronized</code>来与对象的互斥锁联系。当某个对象用<code>synchronized</code>修饰时,表明该对象在任一时刻只能由一个线程访问。</p><ul><li>同步的局限性:导致程序的执行效率要降低</li><li>同步方法(非静态的)的锁为this。</li><li>同步方法(静态的)的锁为当前类本身。</li></ul><p>单例模式懒汉式实现:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">Singleton</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token function">Singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token keyword">static</span> Singleton instance <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> Singleton <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> instance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> instance<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TestSingleton</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> Singleton s1 <span class="token operator">=</span> Singleton<span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Singleton s2 <span class="token operator">=</span> Singleton<span class="token punctuation">.</span><span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>s1 <span class="token operator">==</span> s2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token boolean">true</span></code></pre><p>会出现线程安全问题,多个线程同时执行时,第一个线程调用<code>getInstance()</code>进入if语句内,还未实例化,出现线程挂起,后面的线程也会进入会再创建一个对象,最终导致可能返回了不同Singleton对象。</p><p>解决线程安全问题实现:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> Singleton <span class="token function">getInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//如果第一个线程获取了单例的实例对象,后面的线程再获取实例的时候就不需要进入同步代码块了</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//多线程执行时,会先判断对象是否为null,如果为null,直接返回,无需等待进去同步代码块线程执行完毕,然后再去执行,提高了效率</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>Singleton<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">//对于静态方法,使用但钱勒本身充当锁</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>instance <span class="token operator">==</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span> instance <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Singleton</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> instance<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>综上,用这种方式解决了懒汉式的线程安全问题,也提高了效率,但是在实际开发中还是用饿汉式的比较多,因为这种方式,相对复杂,不适合应用。</p><h3 id="三-线程的死锁问题"><a href="#三-线程的死锁问题" class="headerlink" title="三. 线程的死锁问题"></a>三. 线程的死锁问题</h3><p><code>死锁</code>,是指不同的线程分别占用对方需要的同步资源不放弃,都再等待对方放弃自己需要的同步资源,就形成了线程的死锁。</p><p>死锁的实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TestDeadLock</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> StringBuffer sb1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuffer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">static</span> StringBuffer sb2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuffer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>sb1<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> sb1<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>sb2<span class="token punctuation">)</span><span class="token punctuation">{</span> sb2<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"B"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb1<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>sb2<span class="token punctuation">)</span><span class="token punctuation">{</span> sb1<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"C"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span>sb1<span class="token punctuation">)</span><span class="token punctuation">{</span> sb2<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"D"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb1<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>sb2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="四-线程通信"><a href="#四-线程通信" class="headerlink" title="四. 线程通信"></a>四. 线程通信</h3><ol><li>三个方法</li></ol><ul><li>wait(): 令当前线程挂起并放弃CPU,同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问</li><li>notify(): 唤醒正在排队等待同步资源的线程中优先级最高者结束等待</li><li>notifyAll(): 唤醒正在排队等待资源的所有线程结束等待。</li></ul><blockquote><p>注:Java.lang.Object提供的这三个方法只有再synchronized方法或synchronized代码块中才能使用,否则会报java.lang.lllegalMonitorStateException异常。</p></blockquote><p>实例:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">/** * 线程通信 * 使用两个线程打印1-100,线程1,线程2,交替打印 */</span><span class="token keyword">class</span> <span class="token class-name">PrintNum</span> <span class="token keyword">implements</span> <span class="token class-name">Runnable</span> <span class="token punctuation">{</span> <span class="token keyword">int</span> num <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">synchronized</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">notify</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>num <span class="token operator"><=</span> <span class="token number">100</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>Thread<span class="token punctuation">.</span><span class="token function">currentThread</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">":"</span> <span class="token operator">+</span> num<span class="token punctuation">)</span><span class="token punctuation">;</span> num<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token function">wait</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TestCommunication</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> PrintNum p <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PrintNum</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>p<span class="token punctuation">)</span><span class="token punctuation">;</span> t1<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"甲"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t2<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"乙"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t1<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span>甲<span class="token operator">:</span><span class="token number">1</span>乙<span class="token operator">:</span><span class="token number">2</span>甲<span class="token operator">:</span><span class="token number">3</span>乙<span class="token operator">:</span><span class="token number">4</span>甲<span class="token operator">:</span><span class="token number">5</span>乙<span class="token operator">:</span><span class="token number">6</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>甲<span class="token operator">:</span><span class="token number">97</span>乙<span class="token operator">:</span><span class="token number">98</span>甲<span class="token operator">:</span><span class="token number">99</span>乙<span class="token operator">:</span><span class="token number">100</span></code></pre><p>关于多线程的相关知识,暂时先到这,后续有学习的内容,会持续更新,喜欢的,加个关注白////呲牙。</p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
<tag> Thread </tag>
</tags>
</entry>
<entry>
<title>java之注解开发应用</title>
<link href="/2016/12/31/9-2016-12-31-java-zhi-zhu-jie-kai-fa/"/>
<url>/2016/12/31/9-2016-12-31-java-zhi-zhu-jie-kai-fa/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-注解概念知识"><a href="#一-注解概念知识" class="headerlink" title="一. 注解概念知识"></a>一. 注解概念知识</h3><p><code>注解(Annotation)</code>,也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释,这些信息被保存在Annotation的”name=value”对中。</p><h3 id="二-基本的Annotation"><a href="#二-基本的Annotation" class="headerlink" title="二. 基本的Annotation"></a>二. 基本的Annotation</h3><p>使用Annotation时要在其前面加上<code>@</code>符号,并把该Annotation当成一个修饰符使用,用于修饰它支持的程序元素。</p><p>三个基本的Annotation:</p><ul><li>@Override:限定重写父类方法,该注释只能用于方法</li><li>@Deprecated:用于表示某个程序元素(类,方法等)已过时</li><li>@SupperessWarnings: 抑制编译器警告</li></ul><h3 id="三-元注解"><a href="#三-元注解" class="headerlink" title="三. 元注解"></a>三. 元注解</h3><p>JDK的元注解是用来修饰其他Annotation定义。<br>JDK1.5提供了专门在注解上的注解类型,分别为以下四种:</p><ul><li>@Retention</li><li>@Target</li><li>@Documented</li><li>@Inherited</li></ul><p>分别来说明以下:<br><code>@Retention</code>,只能用于修饰一个Annotation定义,用于指定该Annotation可以保留多长时间,@Retention包含了一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:</p><ul><li>RetentionPolicy.SOURCE: 编译器直接丢弃这种策略的注释</li><li>RetentionPolicy.ClASS: 编译器将把注释记录在class文件中,当运行java程序时,JVM不会保留注解,这是默认值。</li><li>RetentionPolicy.RUNTIME: 编译器将把注释记录在class文件中,当运行java程序时,JVM会保留注释,程序可以通过反射获取该注释</li></ul><p><code>@Target</code>,用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为Value的成员变量。@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。<br><strong>取值(ElementType)有:</strong><br>1.CONSTRUCTOR:用于描述构造器<br>2.FIELD:用于描述域<br>3.LOCAL_VARIABLE:用于描述局部变量<br>4.METHOD:用于描述方法<br>5.PACKAGE:用于描述包<br>6.PARAMETER:用于描述参数<br>7.TYPE:用于描述类、接口(包括注解类型) 或enum声明</p><p><code>@Documented</code>,用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。定义为Documented的注解必须设置Retention值为RUNTIME。</p><p><code>@Inherited</code>,被它修饰的Annotation将具有继承性,如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解(实际应用中,使用较少)。</p><h3 id="四-自定义注解"><a href="#四-自定义注解" class="headerlink" title="四. 自定义注解"></a>四. 自定义注解</h3><p>使用<code>@interface</code>自定义注解,会自动继承java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。<code>@interface</code>用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值只能是基本类型、Class、String、enum),可以通过default来声明参数的默认值。</p><p><strong>定义注解格式:</strong></p><blockquote><p>public @interface 注解名{定义体}</p></blockquote><p>实例代码:</p><pre class=" language-java"><code class="language-java"><span class="token annotation punctuation">@Target</span><span class="token punctuation">(</span>ElementType<span class="token punctuation">.</span>FIELD<span class="token punctuation">)</span><span class="token comment" spellcheck="true">//作用范围在属性上</span><span class="token annotation punctuation">@Retention</span><span class="token punctuation">(</span>RetentionPolicy<span class="token punctuation">.</span>RUNTIME<span class="token punctuation">)</span><span class="token annotation punctuation">@Documented</span><span class="token keyword">public</span> @<span class="token keyword">interface</span> <span class="token class-name">MyAnnotation</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">enum</span> WeekDay<span class="token punctuation">{</span>SUN<span class="token punctuation">,</span>MON<span class="token punctuation">,</span>TUE<span class="token punctuation">,</span>WED<span class="token punctuation">,</span>THU<span class="token punctuation">,</span>FRI<span class="token punctuation">,</span>SAT<span class="token punctuation">}</span><span class="token punctuation">;</span> WeekDay <span class="token function">wd</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">default</span> WeekDay<span class="token punctuation">.</span>SUN<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">id</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">default</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">public</span> String <span class="token function">name</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">default</span> <span class="token string">""</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>自定义注释的使用:</p><pre class=" language-java"><code class="language-java"><span class="token annotation punctuation">@MyAnnotation</span><span class="token punctuation">(</span>wd <span class="token operator">=</span> WeekDay<span class="token punctuation">.</span>MON<span class="token punctuation">)</span><span class="token keyword">public</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span></code></pre><p><strong>注解元素默认值:</strong><br>注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。因此, 使用空字符串或0作为默认值是一种常用的做法。这个约束使得处理器很难表现一个元素的存在或缺失的状态,因为每个注解的声明中,所有元素都存在,并且都具有相应的值,为了绕开这个约束,我们只能定义一些特殊的值,例如空字符串或者负数,一次表示某个元素不存在,在定义注解时,这已经成为一个习惯用法。<br>如果在定义注解中没有指定默认值,或者在使用时,没有指定值,会报以下错误:<br><img src="http://oss.willhappy.cn/18-5-3/85953175.jpg" alt="annotationException"></p><blockquote><p>关于注解的更过知识,请查看博客:<a href="http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html" target="_blank" rel="noopener">http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html</a><br>博主写的狠详细,也很好,采摘了博主部分内容,望博主见谅,也帮他宣传下,知识共享。。。</p></blockquote><p>上面博主的一张脑图,很好,分享一下:<br><img src="http://oss.willhappy.cn/18-5-3/44695442.jpg" alt="javaAnnotation"></p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
<tag> Annotation </tag>
</tags>
</entry>
<entry>
<title>java之枚举类型应用</title>
<link href="/2016/12/30/8-2016-12-30-java-zhi-mei-ju-lei-xing/"/>
<url>/2016/12/30/8-2016-12-30-java-zhi-mei-ju-lei-xing/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-前言"><a href="#一-前言" class="headerlink" title="一. 前言"></a>一. 前言</h3><blockquote><p>为什么使用枚举类型?</p></blockquote><p>在此之前,我们需要创建一个整形常量集,但是这些整型常量集并不会必然地将其自身的取值限制在这个常量集的范围之内,因此他们更有风险,且更难以使用。但是,枚举类型消除了这一缺陷,显得更加使用,下面实例说明。</p><p>使用<code>public final static</code>的方法定义如下常量集:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">WeekDay</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> SUN <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> MON <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> TUE <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>通过下面的方法,传入不同类型的参数:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">private</span> <span class="token keyword">static</span> String <span class="token function">getToday</span><span class="token punctuation">(</span><span class="token keyword">int</span> weekDay<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>weekDay<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">case</span> ConstantTest<span class="token punctuation">.</span>MON<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"MON"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> ConstantTest<span class="token punctuation">.</span>SUN<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"SUN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> ConstantTest<span class="token punctuation">.</span>TUE<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"TUE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> null<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//调用上面的方法</span><span class="token function">getToday</span><span class="token punctuation">(</span>ConstantTest<span class="token punctuation">.</span>MON<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//正常的场景</span><span class="token function">getToday</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//错误的场景,产生类型不安全的问题,因为取值没有在常量集范围之内</span></code></pre><p>通过上面的方法,<code>getToday(5)</code>传入的参数,虽然编译时通过,但是在运行时出现什么情况,我们就不得而知了,但是这显然是不符合java程序的类型安全。</p><h3 id="二-枚举定义"><a href="#二-枚举定义" class="headerlink" title="二. 枚举定义"></a>二. 枚举定义</h3><p><code>枚举类型</code>是指由一组固定的常量组成合法的类型,定义方法如下:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> WeekDay<span class="token punctuation">{</span> SUN<span class="token punctuation">,</span> MON<span class="token punctuation">,</span> TUE<span class="token punctuation">,</span> WED<span class="token punctuation">,</span> THT<span class="token punctuation">,</span> FRI<span class="token punctuation">,</span> SAT<span class="token punctuation">}</span></code></pre><blockquote><p>在创建enum时,编译器会自动添加一些有用的特性,他会创建toString()方法,以便你可以方便的显示某个enum实例的名字,编译器还会创建ordinal()方法,用来表示某个特定enum常量的声明顺序,以及static values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组:</p></blockquote><pre class=" language-java"><code class="language-java"><span class="token keyword">for</span> <span class="token punctuation">(</span>WeekDay wd <span class="token operator">:</span> WeekDay<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>wd <span class="token operator">+</span> <span class="token string">",ordinal"</span> <span class="token operator">+</span> wd<span class="token punctuation">.</span><span class="token function">ordinal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span>output<span class="token operator">:</span>SUN<span class="token punctuation">,</span>ordinal:<span class="token number">0</span>MON<span class="token punctuation">,</span>ordinal:<span class="token number">1</span>TUE<span class="token punctuation">,</span>ordinal:<span class="token number">2</span>WED<span class="token punctuation">,</span>ordinal:<span class="token number">3</span>THT<span class="token punctuation">,</span>ordinal:<span class="token number">4</span>FRI<span class="token punctuation">,</span>ordinal:<span class="token number">5</span>SAT<span class="token punctuation">,</span>ordinal:<span class="token number">6</span></code></pre><p>改写上面的例子:</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//定义枚举</span><span class="token keyword">public</span> <span class="token keyword">enum</span> WeekDay <span class="token punctuation">{</span> SUN<span class="token punctuation">,</span> MON<span class="token punctuation">,</span> TUE<span class="token punctuation">,</span> WED<span class="token punctuation">,</span> THT<span class="token punctuation">,</span> FRI<span class="token punctuation">,</span> SAT<span class="token punctuation">}</span><span class="token keyword">private</span> <span class="token keyword">static</span> String <span class="token function">getToday</span><span class="token punctuation">(</span>WeekDay weekDay<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span>weekDay<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">case</span> MON<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"MON"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> SUN<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"SUN"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token keyword">case</span> TUE<span class="token operator">:</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"TUE"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> null<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">getToday</span><span class="token punctuation">(</span>WeekDay<span class="token punctuation">.</span>MON<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//正常的场景</span> <span class="token comment" spellcheck="true">//getToday(5);//编译时出错,超出了enum的类型范围。</span><span class="token punctuation">}</span></code></pre><h3 id="三-枚举的用法"><a href="#三-枚举的用法" class="headerlink" title="三. 枚举的用法"></a>三. 枚举的用法</h3><ol><li>常量定义</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> WeekDay <span class="token punctuation">{</span> SUN<span class="token punctuation">,</span> MON<span class="token punctuation">,</span> TUE<span class="token punctuation">,</span> WED<span class="token punctuation">,</span> THT<span class="token punctuation">,</span> FRI<span class="token punctuation">,</span> SAT<span class="token punctuation">}</span></code></pre><ol start="2"><li>switch</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> WeekDay <span class="token punctuation">{</span> SUN<span class="token punctuation">,</span> MON<span class="token punctuation">,</span> TUE<span class="token punctuation">,</span> WED<span class="token punctuation">,</span> THT<span class="token punctuation">,</span> FRI<span class="token punctuation">,</span> SAT<span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">SelectDay</span><span class="token punctuation">{</span> WeekDay weekday <span class="token operator">=</span> WeekDay<span class="token punctuation">.</span>SUN<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">select</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">switch</span><span class="token punctuation">(</span>weekday<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">case</span> SUN<span class="token operator">:</span> weekday <span class="token operator">=</span> WeekDay<span class="token punctuation">.</span>SUN<span class="token punctuation">;</span> bread<span class="token punctuation">;</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><ol start="3"><li>向枚举中添加新方法</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> Color <span class="token punctuation">{</span> <span class="token function">RED</span><span class="token punctuation">(</span><span class="token string">"红色"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">GREEN</span><span class="token punctuation">(</span><span class="token string">"绿色"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">BLANK</span><span class="token punctuation">(</span><span class="token string">"白色"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">YELLO</span><span class="token punctuation">(</span><span class="token string">"黄色"</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 成员变量 </span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> index<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 构造方法 </span> <span class="token keyword">private</span> <span class="token function">Color</span><span class="token punctuation">(</span>String name<span class="token punctuation">,</span> <span class="token keyword">int</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index <span class="token operator">=</span> index<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">// 普通方法 </span> <span class="token keyword">public</span> <span class="token keyword">static</span> String <span class="token function">getName</span><span class="token punctuation">(</span><span class="token keyword">int</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>Color c <span class="token operator">:</span> Color<span class="token punctuation">.</span><span class="token function">values</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token punctuation">.</span><span class="token function">getIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> c<span class="token punctuation">.</span>name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> null<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">// get set 方法 </span> <span class="token keyword">public</span> String <span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setName</span><span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">int</span> <span class="token function">getIndex</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> index<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">setIndex</span><span class="token punctuation">(</span><span class="token keyword">int</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index <span class="token operator">=</span> index<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre><ol start="4"><li>覆盖枚举的方法</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">enum</span> Color <span class="token punctuation">{</span> <span class="token function">RED</span><span class="token punctuation">(</span><span class="token string">"红色"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">GREEN</span><span class="token punctuation">(</span><span class="token string">"绿色"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">BLANK</span><span class="token punctuation">(</span><span class="token string">"白色"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">YELLO</span><span class="token punctuation">(</span><span class="token string">"黄色"</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 成员变量</span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> index<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 构造方法</span> <span class="token keyword">private</span> <span class="token function">Color</span><span class="token punctuation">(</span>String name<span class="token punctuation">,</span> <span class="token keyword">int</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index <span class="token operator">=</span> index<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//覆盖方法</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> String <span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token operator">+</span><span class="token string">"_"</span><span class="token operator">+</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><ol start="5"><li>实现接口</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">interface</span> <span class="token class-name">Behaviour</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> String <span class="token function">getInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">enum</span> Color <span class="token keyword">implements</span> <span class="token class-name">Behaviour</span><span class="token punctuation">{</span> <span class="token function">RED</span><span class="token punctuation">(</span><span class="token string">"红色"</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">GREEN</span><span class="token punctuation">(</span><span class="token string">"绿色"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">BLANK</span><span class="token punctuation">(</span><span class="token string">"白色"</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">YELLO</span><span class="token punctuation">(</span><span class="token string">"黄色"</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 成员变量</span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">int</span> index<span class="token punctuation">;</span> <span class="token comment" spellcheck="true">// 构造方法</span> <span class="token keyword">private</span> <span class="token function">Color</span><span class="token punctuation">(</span>String name<span class="token punctuation">,</span> <span class="token keyword">int</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index <span class="token operator">=</span> index<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//接口方法</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> String <span class="token function">getInfo</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">//接口方法</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">print</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token operator">+</span><span class="token string">":"</span><span class="token operator">+</span><span class="token keyword">this</span><span class="token punctuation">.</span>name<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><ol start="6"><li>使用接口组织枚举</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">interface</span> <span class="token class-name">Food</span> <span class="token punctuation">{</span> <span class="token keyword">enum</span> Coffee <span class="token keyword">implements</span> <span class="token class-name">Food</span><span class="token punctuation">{</span> BLACK_COFFEE<span class="token punctuation">,</span>DECAF_COFFEE<span class="token punctuation">,</span>LATTE<span class="token punctuation">,</span>CAPPUCCINO <span class="token punctuation">}</span> <span class="token keyword">enum</span> Dessert <span class="token keyword">implements</span> <span class="token class-name">Food</span><span class="token punctuation">{</span> FRUIT<span class="token punctuation">,</span> CAKE<span class="token punctuation">,</span> GELATO <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><blockquote><p>实例参考至:<a href="http://www.imooc.com/article/3924" target="_blank" rel="noopener">http://www.imooc.com/article/3924</a></p></blockquote>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
<tag> enum </tag>
</tags>
</entry>
<entry>
<title>Java之自动拆装箱及享元模式应用</title>
<link href="/2016/12/29/7-2016-12-29-java-zhi-zi-dong-chai-zhuang-xiang-ji-xiang-yuan-mo-shi-ying-yong-java004/"/>
<url>/2016/12/29/7-2016-12-29-java-zhi-zi-dong-chai-zhuang-xiang-ji-xiang-yuan-mo-shi-ying-yong-java004/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>首先,来说一下关于编译器蜜糖(compiler suger)的问题,它给我们带来便利的同时,也埋下了一些陷阱,像foreach的增强,自动拆装箱等,本节<br>一起来学习一下蜜糖之一的自动拆装箱机制。</p><a id="more"></a><p>[toc]</p><h3 id="一-静态导入"><a href="#一-静态导入" class="headerlink" title="一. 静态导入"></a>一. 静态导入</h3><ol><li>静态导入</li></ol><ul><li>import语句可以导入一个类或某个包中的所有类</li><li>import static语句导入一个类中的某个静态方法或所有静态方法</li></ul><ol start="2"><li>举例</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">import</span> <span class="token keyword">static</span> java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>Math<span class="token punctuation">.</span>max<span class="token punctuation">;</span><span class="token keyword">import</span> <span class="token keyword">static</span> java<span class="token punctuation">.</span>lang<span class="token punctuation">.</span>Math<span class="token punctuation">.</span>*<span class="token punctuation">;</span></code></pre><h3 id="二-可变参数"><a href="#二-可变参数" class="headerlink" title="二. 可变参数"></a>二. 可变参数</h3><ol><li>特点</li></ol><ul><li>只能出现在参数泪飙的最后;</li><li>…位于变量类型和变量名之间,前后有无空格都可以;</li><li>调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。</li></ul><ol start="2"><li>举例</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">,</span><span class="token keyword">int</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">int</span> sum <span class="token operator">=</span> x<span class="token punctuation">;</span><span class="token comment" spellcheck="true">// for (int i = 0; i < args.length; i++) {</span><span class="token comment" spellcheck="true">// sum = sum + args[i];</span><span class="token comment" spellcheck="true">// }</span> <span class="token comment" spellcheck="true">//使用for循环增强</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> arg <span class="token operator">:</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> sum <span class="token operator">+=</span> arg<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> sum<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ol start="2"><li>overload和override区别<br><a href="http://developer.51cto.com/art/201106/266705.htm" target="_blank" rel="noopener">http://developer.51cto.com/art/201106/266705.htm</a><br><a href="http://www.cnblogs.com/whgw/archive/2011/10/01/2197083.html" target="_blank" rel="noopener">http://www.cnblogs.com/whgw/archive/2011/10/01/2197083.html</a><br>重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。很重要的一点就是,Overloaded的方法是可以改变返回值的类型。</li></ol><h3 id="三-自动拆装箱及享元模式及其应用"><a href="#三-自动拆装箱及享元模式及其应用" class="headerlink" title="三. 自动拆装箱及享元模式及其应用"></a>三. 自动拆装箱及享元模式及其应用</h3><ol><li>前言<br>介绍自动拆装箱前,要先理解基本数据类型(Primitive)和对象(Object)的相关概念,在java中,所要处理的东西几乎都是对象,但是基本数据类型不是对象,向我们使用的<code>int</code>、<code>double</code>、<code>boolean</code>、<code>byte</code>、<code>long</code>等等,而他们都对应了一个引用的类型,称为装箱基本类型,也称为包装类。</li></ol><p><img src="http://oss.willhappy.cn/18-5-3/43792261.jpg" alt="autoboxing"></p><ol start="2"><li>自动拆装箱<p style="color:blue;">装箱:根据数据创建对应的包装对象</p></li></ol><pre class=" language-java"><code class="language-java">Integer i <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Integer</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>Integer j <span class="token operator">=</span> <span class="token number">4</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//jdk1.5之后可以通过这种方式自动装箱</span></code></pre><p style="color:blue;">装箱:根据数据创建对应的包装对象</p><pre class=" language-java"><code class="language-java"><span class="token keyword">int</span> index2 <span class="token operator">=</span> j<span class="token punctuation">.</span><span class="token function">intValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token keyword">int</span> index1 <span class="token operator">=</span> i<span class="token punctuation">;</span><span class="token comment" spellcheck="true">//自动拆箱</span></code></pre><p>而自动拆装箱的功能事实上是编译器帮的忙,编译器在编译时期依您所编写的语法,来决定是否进行拆装箱操作。</p><p>JDK1.5 为Integer 增加了一个全新的方法:public static Integer valueOf(int i) 在自动装箱过程时,编译器调用的是static Integer valueOf(int i)这个方法 于是:<br><code>Integer a=3; ==> Integer a=Integer.valueOf(3);</code></p><blockquote><p>此方法与new Integer(i)的不同处在于:<br>方法一调用类方法返回一个表示 指定的 int 值的 Integer 实例。方法二产生一个新的Integer 对象。</p></blockquote><ol start="3"><li><p>缓冲机制的原理<br>关于自动拆装箱的缓冲机制原理的详细解释,看下面的blog,博主很解释的很给力勒!<br><a href="http://blog.csdn.net/u010293702/article/details/44621675" target="_blank" rel="noopener">http://blog.csdn.net/u010293702/article/details/44621675</a><br>还有其他的一些包装类详情,也可以关注这篇blog,下面举例举实例加深理解</p></li><li><p>举例</p></li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>william<span class="token punctuation">.</span>test<span class="token punctuation">;</span><span class="token comment" spellcheck="true">/** * Created by william on 2016/12/25. */</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">AutoBoxTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> Integer integer <span class="token operator">=</span> <span class="token number">3</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//数据装箱</span> <span class="token comment" spellcheck="true">//实际的操作为:Integer iObj = new Integer(3);</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>integer<span class="token operator">+</span><span class="token number">12</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//自动拆箱做加法</span> String str1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span><span class="token string">"abc"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> String str2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span><span class="token string">"abc"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> String str4 <span class="token operator">=</span> <span class="token string">"abc"</span><span class="token punctuation">;</span> String str5 <span class="token operator">=</span> <span class="token string">"abc"</span><span class="token punctuation">;</span> Integer i1 <span class="token operator">=</span> <span class="token number">120</span><span class="token punctuation">;</span> Integer i2 <span class="token operator">=</span> <span class="token number">120</span><span class="token punctuation">;</span> Integer i3 <span class="token operator">=</span> <span class="token number">130</span><span class="token punctuation">;</span> Integer i4 <span class="token operator">=</span> <span class="token number">130</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"str1==str2:"</span><span class="token operator">+</span><span class="token punctuation">(</span>str1<span class="token operator">==</span>str2<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"str4==str5:"</span><span class="token operator">+</span><span class="token punctuation">(</span>str4<span class="token operator">==</span>str5<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//串常量所生成的变量,其中所存放的内存地址是相等的</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"str1.equals(str2):"</span><span class="token operator">+</span>str1<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//String中重写equals()方法,比较其内容</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"str1.equals(str4):"</span><span class="token operator">+</span>str1<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>str4<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"i1==i2:"</span><span class="token operator">+</span><span class="token punctuation">(</span>i1<span class="token operator">==</span>i2<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"i3==i4:"</span><span class="token operator">+</span><span class="token punctuation">(</span>i3<span class="token operator">==</span>i4<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//至于i3==i4返回false的原因就是因为Integer的缓冲机制导致的</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"i3.equals(i4):"</span><span class="token operator">+</span>i3<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>i4<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//Integer中重写equals()方法,使其比较其值,而不是用来比较两个引用变量是否指向同一个对象</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>output<span class="token operator">:</span><span class="token number">15</span>str1<span class="token operator">==</span>str2<span class="token operator">:</span><span class="token boolean">false</span>str4<span class="token operator">==</span>str5<span class="token operator">:</span><span class="token boolean">true</span>str1<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>str2<span class="token punctuation">)</span><span class="token operator">:</span><span class="token boolean">true</span>str1<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>str4<span class="token punctuation">)</span><span class="token operator">:</span><span class="token boolean">true</span>i1<span class="token operator">==</span>i2<span class="token operator">:</span><span class="token boolean">true</span>i3<span class="token operator">==</span>i4<span class="token operator">:</span><span class="token boolean">false</span>i3<span class="token punctuation">.</span><span class="token function">equals</span><span class="token punctuation">(</span>i4<span class="token punctuation">)</span><span class="token operator">:</span><span class="token boolean">true</span></code></pre><p>对于上面用到的<code>equals()</code>,<code>==</code>另外还有像<code>hashcode</code>,<code>instanceof</code>,<code>compareTo</code>等比较方法的区别,感兴趣的可以自己查阅学习,这里只说一下<code>equals()</code>和<code>==</code>的区别。</p><ul><li>“==”比较两个变量本身的值,即两个对象在内存中的首地址。</li><li>equals()在Object类中同样是用来比较‘地址’的,但是在String,Integer等包装类中重写了equals()方法,使其比较的是内容,这也就是上面的实例中,使用equals比较返回true的原因。</li></ul><p>对于其详细解释:<br><a href="http://blog.csdn.net/t12x3456/article/details/7341515" target="_blank" rel="noopener">http://blog.csdn.net/t12x3456/article/details/7341515</a></p><ol start="5"><li>享元模式与Integer类<br>举个简单的例子:<br><em>天天跟MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上 MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,MM的名字就是提取出来的外部特征,根据上下文情况使用。</em></li></ol><blockquote><p>这里说到的享元模式和Integer类,在上面的例子中,我们学习到了Integer会把常用的-128~127之间的数字在装箱后会被缓存起来,当下次对同样的数字装箱时,两个Interger对象是相等的,因为他们指向的是同一块内存,即是使用同一个对象,而不再这个范围中的数字,在自动装箱时,是不会被缓存的,即重新创建一个对象,所以当数字大于127时,他们用‘==’比较,返回的是false,即他们在内存中的首地址是不一样的。</p></blockquote><p>通过以上所属,享元模式,是对于哪些非常小但又需要在系统的很多地方都需要到他的时候,我们可以把它缓存起来,以便在诗词再次使用,减少了创建对象的开销。</p><p>备注:感谢引用的以上各位博主的博客,让我学习到了很多。。。</p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> autoboxing </tag>
<tag> 提升 </tag>
</tags>
</entry>
<entry>
<title>Java提升2</title>
<link href="/2016/11/25/6-2016-11-25-java-gao-ji-zhi-shi-java003/"/>
<url>/2016/11/25/6-2016-11-25-java-gao-ji-zhi-shi-java003/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-Java集合类详解"><a href="#一-Java集合类详解" class="headerlink" title="一. Java集合类详解"></a>一. Java集合类详解</h3><ol><li>Connection接口</li><li>集合可以理解为一个动态的对象数组,不同的是集合中的对象内容可以任意扩充</li><li>集合的特点:<br> 性能高<br> 容易扩展和修改</li><li>Collection的常用子类<br> List<br> Set<br> Queue</li><li><p>List接口</p><ol><li>List接口可以存放任意的数据,而且在List接口中内容是可以重复的</li><li>List接口常用子类:<br> ArrayList<br> Vector</li><li>常用操作:<br>判断集合是否为空:boolean isEmpty()<br>查找指定的对象是否存在:int indexOf(Object o)<br>|比较|ArrayList|Vector|<br>|-|-|-|<br>|推出时间|JDK1.2之后推出|JDK1.0推出|<br>|性能|采用异步处理方式,性能高|采用同步处理方式,性能低|<br>|线程安全|属于非线程安全|属于线程安全|</li></ol></li><li><p>Set接口</p><ol><li>Set接口中不能加入重复元素,但是可以排序</li><li>Set接口常用子类<br> 散列存放:HashSet<br> 有序存放:TreeSet</li></ol></li><li>Iterator接口<ol><li>集合输出的标准操作:<br> 标准做法,使用Iterator接口</li><li>操作原理:<br> Iterator是专门的迭代输出接口,迭代输出就是将元素一个个进行判断,判断其是否有内容,如果有内容则把内容取出。</li></ol></li><li>Map接口<ol><li>保存形式:<br> Key—>value的方式保存</li><li>常用子类:<br> HashMap:无序存放,key不允许重复(非线程安全的)<br> Hashtable:无序存放,key不允许重复(线程安全的)</li></ol></li></ol><hr><h3 id="二-Java中的IO操作"><a href="#二-Java中的IO操作" class="headerlink" title="二. Java中的IO操作"></a>二. Java中的IO操作</h3><ol><li><p>作用:<br> IO也写作“I/O”,可理解为In和Out,即输入与输出。所以,IO体系的基本功能就是:读和写。</p></li><li><p>IO流</p><ul><li>作用:读写设备上的数据,硬盘文件、内存、键盘、网络…</li><li>根据数据的走向,可分为:输入流、输出流</li><li>根据处理的数据类型,可分为:字节流、字符流</li></ul></li><li><p>字节流和字符流</p><ul><li><strong>字节流</strong>可以处理所有类型的数据,如MP3,图片、文字、视频等。在读取时,读到一个字节就返回一个字节。</li><li><p style="color:red;">在java中对应的类都以“Stream”结尾。</p></li><li><p><strong>字符流</strong>仅能处理纯文本数据,如txt文本等。在读取时,读到一个或者多个字节,先查找指定的编码表,然后将查到的字符返回。</p></li><li><p style="color:red;">在Java中对应的类都以“Reader”或“Writer” 结尾</p></li></ul></li><li><p>字符、字节和编码</p></li></ol><p><strong>字节(Byte)</strong></p><ul><li>字节是通过网络传输信息或再硬盘或内存中存储信息的单位,是计算机信息技术用于计量存储容量和传输容量的一种计量单位。</li><li>1个字节等于8位二进制,即一个8位二进制数,是一个狠具体的存储空间。<br> 如0x01,0x45,0xFA,…</li></ul><p><strong>字符(Char)</strong></p><ul><li>字符是人们使用的几号,抽象意义上的一个符号。<br> 如’1’,’中’,’a’,’¥’,’$’,…</li></ul><p><strong>字符集(Charset)</strong></p><p>“字符集”也称为“编码”。</p><p>三者的区别,请看下表:<br><img src="http://oss.willhappy.cn/18-5-3/20518701.jpg" alt="javaByteCharDif"></p><ol start="5"><li>使用字节流读写数据</li></ol><ul><li>使用fileInputStream和fileOutputStream来进行文件的拷贝</li></ul><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> FileInputStream fileInputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span><span class="token string">"Java01/text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FileOutputStream fileOutputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileOutputStream</span><span class="token punctuation">(</span><span class="token string">"Java01/newText.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">byte</span> input<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">50</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>fileInputStream<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> fileOutputStream<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> fileInputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fileOutputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><br></p><ol start="6"><li>使用带缓冲的字节流读写数据</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> FileInputStream fileInputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span><span class="token string">"Java01/text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> BufferedInputStream bufferedInputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedInputStream</span><span class="token punctuation">(</span>fileInputStream<span class="token punctuation">,</span><span class="token number">1000000</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//设置缓冲区的大小</span> <span class="token comment" spellcheck="true">//大型文件对应的数组可以大一些,小文件对应的数组小一些</span> <span class="token keyword">byte</span> input<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">100000</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">int</span> count <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">long</span> before <span class="token operator">=</span> System<span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//读取之前的时间</span> <span class="token keyword">while</span> <span class="token punctuation">(</span>bufferedInputStream<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token operator">!=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span> count<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> bufferedInputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fileInputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>System<span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">-</span>before<span class="token operator">+</span><span class="token string">"ms"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//读取之后和之前的差值</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"都去了"</span><span class="token operator">+</span> count <span class="token operator">+</span><span class="token string">"次"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><em>说明:通过多次调试缓冲区和字节数组的大小,来寻找文件读取效率最高的数据。</em></p><ol start="7"><li>使用字符流读写数据<br>同样是,进行文件拷贝,现在使用字符流来读写数据,实例如下:</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> FileInputStream fileInputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span><span class="token string">"Java01/text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FileOutputStream fileOutputStream <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileOutputStream</span><span class="token punctuation">(</span><span class="token string">"Java01/newText.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> InputStreamReader inputStreamReader <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InputStreamReader</span><span class="token punctuation">(</span>fileInputStream<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//InputStreamReader使用指定的 charset 读取字节并将其解码为字符。</span> OutputStreamWriter outputStreamWriter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OutputStreamWriter</span><span class="token punctuation">(</span>fileOutputStream<span class="token punctuation">,</span> <span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">char</span> input<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">char</span><span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">int</span> l <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>l <span class="token operator">=</span> inputStreamReader<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> outputStreamWriter<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>input<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> l<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//将字符读入数组中的某一部分。</span> <span class="token punctuation">}</span><span class="token comment" spellcheck="true">// while (inputStreamReader.read(input) != -1) { //读入数组的的字符会存在偏移,即多读出字符</span><span class="token comment" spellcheck="true">// outputStreamWriter.write(input);</span><span class="token comment" spellcheck="true">// }</span> outputStreamWriter<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> inputStreamReader<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fileOutputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fileInputStream<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><p><br></p><ol start="8"><li>使用带有缓冲的字符流读写数据</li></ol><p>即添加BufferedReader和BufferedWriter,会出现一个问题,就是写入文件的时候会丢弃换行符,可使用PrintWriter<br>PrintWriter实例化:</p><pre class=" language-java"><code class="language-java">PrintWriter pw <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PrintWriter</span><span class="token punctuation">(</span>outputStreamWriter<span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//实例化并强制自动刷新缓冲区数据</span></code></pre><p><br></p><ol start="9"><li>FileReader与FileWriter</li></ol><ul><li>使用FileReader和FileWriter来读写一些纯文本文件,读写以字符为基准的文件。用法同上述几种文件读出方式类似,不做赘述。</li></ul><p><br></p><ol start="10"><li>RandomAccessFile随机文件读写</li></ol><p>实例代码:<br>MultiwriterFile.java</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>william<span class="token punctuation">.</span>RandomAccessFileTest<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>File<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>FileNotFoundException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>IOException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>RandomAccessFile<span class="token punctuation">;</span><span class="token comment" spellcheck="true">/** * Created by william on 2016/11/25. */</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MultiwriterFile</span> <span class="token punctuation">{</span> <span class="token keyword">static</span> File file <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"Java01/text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment" spellcheck="true">// if (file.exists()) {</span><span class="token comment" spellcheck="true">// file.delete();</span><span class="token comment" spellcheck="true">// }</span><span class="token comment" spellcheck="true">// new WriteFile(file,1).start();</span><span class="token comment" spellcheck="true">// new WriteFile(file,2).start();</span><span class="token comment" spellcheck="true">// new WriteFile(file,3).start();</span><span class="token comment" spellcheck="true">// new WriteFile(file,4).start();</span><span class="token comment" spellcheck="true">// new WriteFile(file,5).start();</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> RandomAccessFile randomAccessFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RandomAccessFile</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">seek</span><span class="token punctuation">(</span><span class="token number">300</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">byte</span> input<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">byte</span><span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span><span class="token punctuation">;</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">;</span> String str <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">String</span><span class="token punctuation">(</span>input<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>WriteFile.java</p><pre class=" language-java"><code class="language-java"><span class="token keyword">package</span> com<span class="token punctuation">.</span>william<span class="token punctuation">.</span>RandomAccessFileTest<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>File<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>FileNotFoundException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>IOException<span class="token punctuation">;</span><span class="token keyword">import</span> java<span class="token punctuation">.</span>io<span class="token punctuation">.</span>RandomAccessFile<span class="token punctuation">;</span><span class="token comment" spellcheck="true">/** * Created by william on 2016/11/25. */</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">WriteFile</span> <span class="token keyword">extends</span> <span class="token class-name">Thread</span> <span class="token punctuation">{</span> File file<span class="token punctuation">;</span> <span class="token keyword">int</span> block<span class="token punctuation">;</span> <span class="token keyword">int</span> L <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">WriteFile</span><span class="token punctuation">(</span>File file<span class="token punctuation">,</span> <span class="token keyword">int</span> block<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>file <span class="token operator">=</span> file<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>block <span class="token operator">=</span> block<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * 文件随机读取示意图: * 1 2(100) 3 4(300) 5 * |-----------------|-----------------|-----------------|-----------------|-------- * 0xL<-----100----->1xL */</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> RandomAccessFile randomAccessFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RandomAccessFile</span><span class="token punctuation">(</span>file<span class="token punctuation">,</span> <span class="token string">"rw"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">seek</span><span class="token punctuation">(</span><span class="token punctuation">(</span>block <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token operator">*</span> L<span class="token punctuation">)</span><span class="token punctuation">;</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">writeBytes</span><span class="token punctuation">(</span><span class="token string">"This is block"</span> <span class="token operator">+</span> block<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span>i<span class="token operator"><</span><span class="token number">20</span><span class="token punctuation">;</span>i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">writeBytes</span><span class="token punctuation">(</span><span class="token string">"-"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> randomAccessFile<span class="token punctuation">.</span><span class="token function">writeBytes</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>执行写操作,输出结果:</p><blockquote><p>This is block1——————–<br> This is block2——————–<br> This is block3——————–<br> This is block4——————–<br> This is block5——————–</p></blockquote><p>执行读操作输出结果:<br>输出:输出20个字节长度</p><blockquote><p>This is block4——</p></blockquote><p><br></p><ol start="11"><li>使用Apache IO库操作IO与文件</li></ol><p>对原始java对文件的操作做了封装,使用起来更加的方便,详细请看Apache的官方API文档。</p><hr><h3 id="三-Java多线程编程"><a href="#三-Java多线程编程" class="headerlink" title="三. Java多线程编程"></a>三. Java多线程编程</h3><ol><li>线程与进程</li></ol><p><strong>线程:</strong></p><ul><li>程序中的单独顺序的控制流</li><li>新城本身依靠程序进行运行</li><li>线程是程序中的顺序控制流,只能使用分配给程序的资源和环境</li></ul><p><strong>进程:</strong></p><ul><li>执行中的程序</li><li>一个进程可以包含一个或多个线程</li><li>一个进程至少要包含一个线程</li></ul><p><strong>单线程:</strong></p><ul><li>程序中只存在一个线程,实际上主方法就是一个主线程</li></ul><p><strong>多线程:</strong></p><ul><li>多线程是在一个程序中运行多个任务</li><li>多线程的目的是更好的利用cpu资源</li></ul><p><br></p><ol start="2"><li>线程的实现</li></ol><ul><li>在java中,线程的实现有两种:<br>①. 继承Thread类<br>②. 实现Runnable接口</li><li>Thread类:<br>Thread类是在java.lang包中定义的,继承Thread类必须重写run()方法<br>定义格式:</li></ul><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">className</span> <span class="token keyword">extends</span> <span class="token class-name">Thread</span><span class="token punctuation">{</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MyThread</span> <span class="token keyword">extends</span> <span class="token class-name">Thread</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> String name<span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">MyThread</span><span class="token punctuation">(</span>String name<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>name <span class="token operator">=</span> name<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>name <span class="token operator">+</span> <span class="token string">":"</span> <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">super</span><span class="token punctuation">.</span><span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><em>说明:当在主方法中使用Start启动线程时,我们可以看到两个线程时并行执行的,即谁先拿到cpu的资源,谁就执行,并不是顺序执行的。</em></p><p>看部分输出结果:</p><blockquote><p>…<br>B:25<br>B:26<br>B:27<br>B:28<br>B:29<br>A:0<br>B:30<br>A:1<br>A:2<br>A:3<br>…</p></blockquote><ul><li>Runnable接口</li></ul><p>实现Runnable接口中的run方法,与Thread的run方法一样,在主方法中调用时,如下调用:</p><pre class=" language-java"><code class="language-java">MyRunnable r <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyRunnable</span><span class="token punctuation">(</span><span class="token string">"A"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>Thread t <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>r<span class="token punctuation">)</span><span class="token punctuation">;</span>t<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><br></p><ol start="3"><li>线程的状态</li></ol><p><strong>线程也有固定的操作状态:</strong></p><ul><li>创建状态:准备好了一个多线程的对象</li><li>就绪状态:调用了start()方法,等待cpu进行调度</li><li>运行状态:执行run()方法</li><li>阻塞状态:暂时停止执行,可能将资源交给其他线程使用</li><li>终止状态(死亡状态):线程销毁</li></ul><p><br></p><ol start="4"><li>线程的常用方法</li></ol><ul><li>取得线程名称<br>getName()</li><li>取得当前线程对象<br>currentThread()</li><li>判断线程是否启动<br>isAlive()</li><li>线程的强行运行<br>join()</li><li>线程的休眠<br>sleep()</li><li>礼让<br>yield()</li></ul><p><br></p><ol start="5"><li>线程的优先级</li></ol><p><strong>优先级顺序设置:</strong></p><ul><li>1-MIN_PRIORITY</li><li>10-MAX_PRIORITY</li><li>5-NORM_PRIORITY<br>如果什么都不设置默认值是5</li></ul><p><br></p><ol start="6"><li>同步与死锁</li></ol><ul><li>同步代码块<br>在代码块上加上“synchronized”关键字,则此代码块就称为同步代码块</li><li>同步代码块格式:<br>synachronized(同步对象){<br> 需要同步的代码块;<br>}</li><li>同步方法<br>除了代码块可以同步,方法也是可以同步的</li><li>方法同步格式:<br>synchronized void 方法名称(){}<br>同步实例:</li></ul><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">MyThreadDemo</span> <span class="token keyword">implements</span> <span class="token class-name">Runnable</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">int</span> ticket <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">run</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">tell</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">synchronized</span> <span class="token keyword">void</span> <span class="token function">tell</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ticket <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Thread<span class="token punctuation">.</span><span class="token function">sleep</span><span class="token punctuation">(</span><span class="token number">500</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">InterruptedException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"车票:"</span> <span class="token operator">+</span> ticket<span class="token operator">--</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">synchronizedtest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> MyThreadDemo m <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">MyThreadDemo</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> Thread t3 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Thread</span><span class="token punctuation">(</span>m<span class="token punctuation">)</span><span class="token punctuation">;</span> t1<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t2<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> t3<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>而死锁,就相当与两个人耍赖皮,比如说:张三有十块钱,李四有一本书,张三说,你先把书给我,我就给你钱,李四说你先给我钱,我就给你书,两个人互不想让,就会陷入等待,就会出现死锁的状况。<br><br></p><ol start="7"><li>线程的生命周期<br>不解释,上图:<br><img src="http://oss.willhappy.cn/18-5-3/94707289.jpg" alt="threadLife"></li></ol><hr><h3 id="四-Java中的HTTP通信"><a href="#四-Java中的HTTP通信" class="headerlink" title="四. Java中的HTTP通信"></a>四. Java中的HTTP通信</h3><ol><li>使用Http的Get方法读取网络数据</li></ol><p>看下面博客吧,视频上讲的挺散,但是要感谢视频的老师,同时感谢博客的博主。:)<br><a href="http://blog.csdn.net/luckyzhoustar/article/details/50259209" target="_blank" rel="noopener">http://blog.csdn.net/luckyzhoustar/article/details/50259209</a></p><ol start="2"><li>使用Http的Post方式与网络交互通信</li></ol><p>啥都不说了,还是博客文章:<br><a href="http://blog.csdn.net/thl331860203/article/details/51783434" target="_blank" rel="noopener">http://blog.csdn.net/thl331860203/article/details/51783434</a></p><ol start="3"><li>使用HttpClient进行Get方式通信</li></ol><p>使用Apache的HttpClient的jar包,具体的操作,自己网上查去吧,不像写了。</p><ol start="4"><li>使用HttpClient进行Post方式通信</li></ol><p>使用Apache的HttpClient的jar包,具体的操作,自己网上查去吧,不像写了。<br>做参考吧:<br><a href="https://www.oschina.net/code/snippet_1591393_46723" target="_blank" rel="noopener">https://www.oschina.net/code/snippet_1591393_46723</a></p><hr><h3 id="五-Java中内部类,匿名内部类理解"><a href="#五-Java中内部类,匿名内部类理解" class="headerlink" title="五. Java中内部类,匿名内部类理解"></a>五. Java中内部类,匿名内部类理解</h3><p><a href="http://blog.csdn.net/zzjjiandan/article/details/9189943" target="_blank" rel="noopener">http://blog.csdn.net/zzjjiandan/article/details/9189943</a></p><p>一般来说,有4种内部类:常规内部类、静态内部类、局部内部类、匿名内部类。</p><ul><li><p>常规内部类<br>常规内部类和普通类最大的不同就是,它能访问(这里,访问的意思包括读和写)外部类的私有实例域。<br>具体参考博客:<br><a href="http://blog.csdn.net/l294265421/article/details/46574009" target="_blank" rel="noopener">http://blog.csdn.net/l294265421/article/details/46574009</a></p></li><li><p>静态内部类<br>静态内部类和普通类的对比使用,讲的很好,感谢博主:<br><a href="http://kenby.iteye.com/blog/1603803" target="_blank" rel="noopener">http://kenby.iteye.com/blog/1603803</a></p></li><li><p>局部内部类</p></li></ul><ol><li>在局部内部类前不能用修饰符public和private,protected.</li><li><p>可以定义与外部类同名的变量<br> 如果内部类没有与外部类同名的变量,在内部类中可以直接访问外部类的实例变量</p><p> 如果内部类中有与外部类同名的变量,直接用变量名访问的是内部类的变量,用this.变量名访问的也是内部类变量.</p><p> 用外部类名.this.内部类变量名访问的是外部类变量</p></li><li>不可以定义静态变量和方法</li><li>可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的</li><li>可以访问外部类的所有成员</li></ol><p>实例:<br><a href="http://blog.csdn.net/l294265421/article/details/46583475" target="_blank" rel="noopener">http://blog.csdn.net/l294265421/article/details/46583475</a></p><ul><li>匿名内部类<br>如果只需要创建一个内部类的一个对象,就没必要给这个类一个名字。这个没有名字的内部类叫做匿名内部类。<br>实例:<br><a href="http://blog.csdn.net/l294265421/article/details/46583759" target="_blank" rel="noopener">http://blog.csdn.net/l294265421/article/details/46583759</a></li></ul><p><strong>小插曲:关于类的实例化顺序</strong></p><p>1.在实例化一个类的对象时,先要实例化该类的成员变量,再执行该类的构造函数。</p><ol start="2"><li>在实例化一个类的成员变量时,先要实例化静态成员变量,再实例化非静态成员变量。</li><li>一个类的静态成员变量只实例化一次,即只有一个拷贝,在该类的所有对象中共享。</li><li>执行一个类的静态成员函数时,该类的对象并没有生成,因此,只会实例化该类的静态成员变量,而不会实例化非静态成员变量,也不会执行构造函数。</li></ol><p><em>最好自己写一个小的实例,然后自己debugger一下,这样更容易理解上述的总结,可以用下面的小实例:</em></p><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">A</span><span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">static</span> <span class="token keyword">int</span> AA <span class="token operator">=</span> <span class="token number">100</span><span class="token punctuation">;</span> <span class="token keyword">public</span> <span class="token function">A</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>a <span class="token operator">=</span> a<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">printA</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"this is A"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"come here!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">newclasstest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> A<span class="token punctuation">.</span><span class="token function">printText</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> A a <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">A</span><span class="token punctuation">(</span><span class="token number">22</span><span class="token punctuation">)</span><span class="token punctuation">;</span> a<span class="token punctuation">.</span><span class="token function">printA</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
</tags>
</entry>
<entry>
<title>Java提升1</title>
<link href="/2016/11/24/5-2016-11-24-java-zhong-ji-zhi-shi-java002/"/>
<url>/2016/11/24/5-2016-11-24-java-zhong-ji-zhi-shi-java002/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-WebService入门"><a href="#一-WebService入门" class="headerlink" title="一.WebService入门"></a>一.WebService入门</h3><ol><li><p>Java中的xml操作</p><ul><li>XML和HTML区别</li></ul><ol><li>XML被设计为传输和存储数据,其焦点是数据的内容</li><li>HTML被设计用来显示数据,起焦点是数据的外观</li><li>HTML旨在显示信息,而XML旨在传输信息</li></ol><ul><li>使用java读取XML文件<br>实例:</li></ul></li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">ReadXML</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//dom解析xml文件</span> DocumentBuilderFactory factory <span class="token operator">=</span> DocumentBuilderFactory<span class="token punctuation">.</span><span class="token function">newInstance</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> DocumentBuilder builder <span class="token operator">=</span> factory<span class="token punctuation">.</span><span class="token function">newDocumentBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Document document <span class="token operator">=</span> builder<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"Java01/languages.xml"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Element root <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">getDocumentElement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"cat="</span> <span class="token operator">+</span> root<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">"cat"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> NodeList list <span class="token operator">=</span> root<span class="token punctuation">.</span><span class="token function">getElementsByTagName</span><span class="token punctuation">(</span><span class="token string">"lan"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> list<span class="token punctuation">.</span><span class="token function">getLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Element lan <span class="token operator">=</span> <span class="token punctuation">(</span>Element<span class="token punctuation">)</span> list<span class="token punctuation">.</span><span class="token function">item</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"==============="</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"id="</span> <span class="token operator">+</span> lan<span class="token punctuation">.</span><span class="token function">getAttribute</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">// Element name = (Element) lan.getElementsByTagName("name").item(0);</span><span class="token comment" spellcheck="true">// System.out.println("name="+name.getTextContent());</span> NodeList cList <span class="token operator">=</span> lan<span class="token punctuation">.</span><span class="token function">getChildNodes</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> cList<span class="token punctuation">.</span><span class="token function">getLength</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> Node c <span class="token operator">=</span> cList<span class="token punctuation">.</span><span class="token function">item</span><span class="token punctuation">(</span>j<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token keyword">instanceof</span> <span class="token class-name">Element</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>c<span class="token punctuation">.</span><span class="token function">getNodeName</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"="</span> <span class="token operator">+</span> c<span class="token punctuation">.</span><span class="token function">getTextContent</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">ParserConfigurationException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SAXException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>languages.xml文件:</p><pre class=" language-xml"><code class="language-xml"><span class="token prolog"><?xml version="1.0" encoding="utf-8" ?></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>languages</span> <span class="token attr-name">cat</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>it<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>lan</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>1<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>java<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ide</span><span class="token punctuation">></span></span>IntelliJ IDEA<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ide</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>lan</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>lan</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>2<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>swift<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ide</span><span class="token punctuation">></span></span>Xcode<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ide</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>lan</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>lan</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>3<span class="token punctuation">"</span></span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>name</span><span class="token punctuation">></span></span>C#<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ide</span><span class="token punctuation">></span></span>Visual Studio<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ide</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>lan</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>languages</span><span class="token punctuation">></span></span></code></pre><ul><li>使用java创建xml数据</li><li>使用dom4j操作xml数据</li></ul><p><br></p><ol start="2"><li>java中的JSON操作</li></ol><ul><li><p>JSON数据格式简介</p><p> json是存储和交换文本信息的语法。</p><ol><li>json是轻量级的文本数据交换格式</li><li>json独立于语言和平台</li><li>json具有自我描述性,更易理解</li></ol></li><li><p>使用java读取json数据</p></li></ul><p>使用gson的jar包来读取json</p><ul><li>使用java创建json数据</li></ul><h3 id="二-Spring"><a href="#二-Spring" class="headerlink" title="二. Spring"></a>二. Spring</h3><ol><li><p>spring入门<br> a. 简介:spring是一个轻量级控制反转(ioc)和面向切面(aop)的容器框架,它主要是为了解解决企业应用开发的复杂性而诞生的<br> b. 优势:</p><ul><li>它定位的领域是许多其他流行的framework没有的</li><li>spring是全面的和模块化的</li><li>他的设计从底部帮助你编写易于测试的代码</li><li><p>spring是潜在的一站式解决方案</p><p>c. 优点:</p></li><li>低侵入式设计,代码污染极低</li><li>write Once,Run Anywhere</li><li>DI有效的降低了耦合度</li><li>AOP提供了通用任务的集中管理</li><li>ORM和DAO简化了对数据库访问</li><li>高度开放性,并不强制</li></ul></li><li><p>spring之IOC</p></li></ol><p>a. 浅谈IOC<br>IOC(Inversion of Control,控制反转)是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系:</p><ul><li>传统开发模式:对象之间互相依赖(像找对象,自己需要什么样的对象,按自己的标准去找,完全由自己来做,来筛选)</li><li>IOC开发模式:IOC容器安排对象之间的依赖(像有一个婚姻介绍所,会收集所有的男女对象,你需要什么样的对象,只需要提交给他,他会帮你筛选,你只需要谈恋爱就行了,其他的交个婚介就可以了)</li></ul><p>b. IOC理论背景<br><img src="http://oss.willhappy.cn/18-5-3/73362040.jpg" alt="SpringIOC"></p><p>c. IOC通俗的理解如下:</p><ul><li>IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重原理</li><li>DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例,侧重于实现。</li><li>ioc比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象</li><li>把对象的创建不是通过new方式实现,而是交给spring配置创建类对象</li></ul><ol start="3"><li>spring之AOP<br> a. AOP图解</li></ol><p><img src="http://oss.willhappy.cn/18-5-3/47267701.jpg" alt="SpringAOP"></p><p>面向切面的编程,扩展功能不是修改源代码实现</p><ol start="4"><li><p>springIOC容器深入理解<br> a. IOC概念<br> b. Java反射机制</p><ul><li><p>ClassLoader工作机制</p><ol><li>装载:查找和导入Class文件</li><li>链接:执行校验,准备和解析步骤</li><li>初始化:对垒的静态变量、静态代码块执行初始化工作</li></ol><p>c. 资源访问工具类<br>d. BeanFactory和ApplicationContext的介绍<br>e. Bean的生命周期</p></li></ul></li><li><p>spring的配置文件<br> a. spring容器高层视图</p><ul><li>spring容器启动基本条件:</li></ul><ol><li>spring的框架类包</li><li>bean的配置文件</li><li>bean的实现类</li></ol><ul><li>bean的元数据信息:</li></ul><ol><li>bean的实现类</li><li>bean的属性信息</li><li>bean的依赖关系</li><li>bean的行为配置</li><li><p>bean的创建方式</p><p><img src="http://oss.willhappy.cn/18-5-3/64128309.jpg" alt="Spring高层视图"></p></li></ol></li></ol><hr><p>传智播客spring框架2016版 笔记记录</p><h3 id="一-Spring概念(传智播客笔记)"><a href="#一-Spring概念(传智播客笔记)" class="headerlink" title="一. Spring概念(传智播客笔记)"></a>一. Spring概念(传智播客笔记)</h3><ol><li>spring是开源的轻量级框架</li><li>spring核心主要两部分:</li></ol><ul><li>aop:面向切面编程,扩展功能不是修改源代码实现</li><li>ioc:控制反转<br>(1) 比如有一个类,在类里面有方法(不是静态的方法),调用类里面的方法,创建类的对象,使用对象调用方法,创建类对象的过程,需要new出来对象<br>(2) 把对象的创建不是通过new方式实现,而是交个spring配置创建类对象</li></ul><ol start="3"><li>spring是一站式框架</li></ol><ul><li>spring在javaee三层结构中,每一层都提供不同的解决技术<br>(1) web层:springMVC<br>(2) service层:spring的ioc<br>(3) dao层:spring的jdbcTemplate</li></ul><ol start="4"><li>spring版本</li></ol><ul><li>hivernate5.x</li><li>spring4.x</li></ul><h3 id="二-Spring的ioc操作"><a href="#二-Spring的ioc操作" class="headerlink" title="二. Spring的ioc操作"></a>二. Spring的ioc操作</h3><ol><li>把对象的创建交给spring进行管理</li><li>ioc操作两部分:</li></ol><ul><li>ioc的配置文件的方式</li><li>ioc的注解方式</li></ul><ol start="3"><li>ioc底层原理</li></ol><ul><li>xml配置文件</li><li>dom4J解决xml</li><li>工厂设计模式</li><li>java反射技术</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/14125156.jpg" alt="iocDevelop"></p><p><img src="http://oss.willhappy.cn/18-5-3/51646746.jpg" alt="iocDevelop"></p><ol start="4"><li>ioc入门案例</li></ol><ul><li>导入jar包<br>(1) 解压资料zip文件<br>jar特点:都有三个jar包<br>(2) 做spring最基本功能时候,导入四个核心的jar包就可以了<br>(3) 导入支持日志输出的jar包</li><li>创建类,在类里面创建方法</li><li>创建spring配置文件,配置创建类<br>(1) spring核心配置文件名称和位置不是固定的,建议放到src下面,官方建议applicationContext.xml<br>(2) 引入schema约束<br>(3) 配置对象的创建</li><li>写代码测试对象创建</li></ul><h3 id="三-Spring的bean管理(xml方式)"><a href="#三-Spring的bean管理(xml方式)" class="headerlink" title="三. Spring的bean管理(xml方式)"></a>三. Spring的bean管理(xml方式)</h3><ol><li>bean实例化的方式</li></ol><ul><li>在spring里面通过配置文件创建对象</li><li>bean实例化三种方式实现<br>(1) 使用类的无参数构造创建(重点)<br>注:如果类里面没有无参数的构造,会出现异常<br>(2) 使用静态工厂创建<br>① 创建静态的方法,返回类对象<br>(3) 使用实例工厂创建<br>① 创建不是静态的方法,返回类对象</li></ul><ol start="2"><li>Bean标签常用属性</li></ol><ul><li><p>id属性:起名称,id属性值名称任意命名<br>注:① id属性值,不能包含特殊符号<br>② 根据id值得到配置对象</p></li><li><p>class属性:创建对象所在类的全路径</p></li><li>name属性:功能和id属性一样的,id属性值布恩那个包含特殊符号,但是在name属性值里面可以包含特殊符号,name属性为了解决strus1遗留的问题。</li><li><p>scope属性<br>① singleton:默认值,单例的<br>② prototype:多例的<br>③ request:web项目中,spring创建一个bean的对象,将对象存入到session域中<br>④ session:web项目中,spring创建一个bean对象,将对象存入到session域中<br>⑤ globalSession:web项目中,应用到porlet环境,如果没有porlet环境那么globalSession相当于session。</p></li><li><p>属性的注入<br>① 创建对象的时候,向类里面属性里面设置值<br>② 属性注入的方式介绍<br>(1) 使用set方法注入<br>(2) 使用有参数构造注入<br>(3) 使用接口注入<br>③ 在spring框架里面,支持前两种方式</p></li><li><p>注入对象类型属性(重点)<br>①. 创建service类和dao类<br>(1) 在service中得到dao对象<br>②. 具体过程实现<br>(1) 在service里面把dao做为类型属性<br>(2) 生成dao类型属性的set方法<br>(3) 在配置文件中注入关系</p></li><li><p>P 名称空间的注入</p></li><li>注入复杂类型属性<br>① 数组<br>② list集合<br>③ map集合<br>④ properties类型</li></ul><ol start="3"><li>IOC和DI区别</li></ol><ul><li>IOC:控制反转,把对象创建交给spring进行配置</li><li>DI:依赖注入,向类里面的属性中设置值</li><li>关系:依赖注入不能单独存在,需要在ioc基础上完成操作</li></ul><ol start="4"><li>spring整合web项目原理</li></ol><ul><li>加载spring核心配置文件<br>① new对象,功能可以实现,效率很低</li><li>实现思想:吧加载配置文件和创建对象过程,在服务器启动时候完成</li><li>实现原理<br>① ServletContext对象<br>② 监听器<br>③ 具体使用:<br>在服务器启动的时候,为每个项目创建一个ServletContext对象<br>在servletContext对象创建时候,使用监听器可以具体盗ServletContext对象在什么时候创建<br>使用监听器监听到ServletContext对象创建时候<br>加载Spring配置文件,把配置文件配置对象创建<br>把创建出来的对象放到ServletContext域对象里面(setAttribute方法)<br>获取对象的时候,盗ServletContext域中得到(getAttribute方法)</li></ul><h3 id="四-Spring的bean管理(注解)"><a href="#四-Spring的bean管理(注解)" class="headerlink" title="四. Spring的bean管理(注解)"></a>四. Spring的bean管理(注解)</h3><ol><li>注解</li></ol><blockquote><ol><li>代码里面特殊标记,使用注解可以完成功能</li><li>注解写法@注解名称(属性名称=属性值)</li><li>注解使用在类上面,方法上面和属性上面</li></ol></blockquote><ol><li>spring注解开发准备</li></ol><ul><li>导入jar包(基本jar包和aop的jar包)</li><li>创建类,创建方法</li><li>创建spring配置文件,引入约束</li><li>开启注解扫描</li></ul><pre class=" language-xml"><code class="language-xml"><span class="token comment" spellcheck="true"><!-- 注解扫描包 到包里面扫描类、方法和属性上面是否有注释 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">context:</span>component-scan</span> <span class="token attr-name">base-package</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>com.seeknovel<span class="token punctuation">"</span></span><span class="token punctuation">/></span></span><span class="token comment" spellcheck="true"><!-- 扫描属性上面的注解 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">context:</span>annotation-config</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">context:</span>annotation-config</span><span class="token punctuation">></span></span></code></pre><ol start="3"><li>注解创建对象</li></ol><ul><li>在创建对象的类上面使用注解实现</li><li>创建对象有四个注解</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/54295144.jpg" alt="@component"></p><ol start="4"><li>创建对象单实例还是多实例</li><li>注解注入属性</li></ol><ul><li>创建service类,创建dao类,在service得到dao对象</li></ul><h3 id="五-AOP"><a href="#五-AOP" class="headerlink" title="五. AOP"></a>五. AOP</h3><ol><li>aop概述</li></ol><blockquote><p>aop:面向切面编程,扩展功能不修改源代码实现<br>aop采取横向抽取机制,取代了传统纵向继承体系重复性代码</p></blockquote><ol start="2"><li>aop原理<br>示意图如下:</li></ol><p><img src="http://oss.willhappy.cn/18-5-3/6805202.jpg" alt="aopDevelop"></p><p><img src="http://oss.willhappy.cn/18-5-3/75261754.jpg" alt="aopTheory"></p><ol start="3"><li>aop操作术语</li></ol><p><strong>Joinpoint(连接点)</strong>:所谓的连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。</p><p><strong>Pointcut(切入点)</strong>:所谓的切入点是指我们要对哪些Joinpoint进行拦截的定义。</p><p><strong>Advice(通知/增强)</strong>:所谓通知是指拦截到Joinpoint之后所要做的事情就是通知,通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)</p><p><strong>Introduction(引介)</strong>:引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态添加一些方法或Field。</p><p><strong>Target(目标对象)</strong>:代理的目标对象(要增强的类)<br><strong>Weaving(织入)</strong>:是把增强应用到目标的过程,把advice应用到target的过程<br><strong>Proxy(代理)</strong>:一个类被aop治入增强后,就产生一个结果代理类<br><strong>Aspect(切面)</strong>:是切入点和通知(引介)的结合</p><p>术语解读:</p><p><img src="http://oss.willhappy.cn/18-5-3/69405956.jpg" alt="aopName"></p><p>4.Spring的aop操作</p><ul><li>在spring里面进行aop操作,使用aspectj实现<br>① aspectj不是spring的一部分,和spring一起使用进行aop操作<br>② spring2.0以后增加了对AspectJ的支持</li><li>使用aspectj实现aop有两种方式<br>① 基于aspectj的xml配置<br>② 基于aspectj的注解方式</li></ul><ol start="5"><li>aop操作准备</li></ol><ul><li>除了导入基本的jar包之外,还需要导入aop相关的jar包</li><li>创建spring核心配置文件,导入aop的约束</li></ul><ol start="6"><li>使用表达式配置切入点</li></ol><ul><li>切入点:实际增强的方法</li><li>常用表达式<br>① execution(<em>cn.itcast.aop.Book.add(..))<br>② execution(</em> cn.itcast.aop.Book.<em>(..))<br>③ execution(</em> <em>.</em>(..))<br>④ 匹配所有save开头的方法 execution(<em>save</em>(..))<br>aop基于Aspectj配置实现:</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/81650325.jpg" alt="aopAchieve"></p><p>注:环绕通知的增强</p><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//环绕通知</span><span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">aroundTest</span><span class="token punctuation">(</span>ProceedingJoinPoint proceedingJoinPoint<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//方法之前</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"方法之前。。。"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//执行被增强的方法</span> proceedingJoinPoint<span class="token punctuation">.</span><span class="token function">proceed</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//方法之后</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"方法之后。。。"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><ol start="7"><li>log4J介绍</li></ol><ul><li>通过log4j可以看到程序运行过程中更详细的信息</li><li>使用log4j查看日志</li><li><p>使用<br>① 导入log4j的jar包<br>⑤ 复制log4j配置文件,复制到src下面</p></li><li><p>设置日志级别</p></li></ul><blockquote><p>log4j.rootLogger=info,stdout<br>① info:看到基本信息<br>② debug:看到更详细的信息</p></blockquote><h3 id="六-Spring整合web项目演示"><a href="#六-Spring整合web项目演示" class="headerlink" title="六. Spring整合web项目演示"></a>六. Spring整合web项目演示</h3><ol><li>演示为题<br>(1) action调用service,service调用dao<br>(2) 每次访问action时候,都会加载spring配置文件</li><li>解决方法:<br>(1) 在服务器启动时候,创建俺对象加载配置文件<br>(2) 底层使用监听器、ServletContext对象</li><li>在spring里面不需要我们自己写代码实现,spring已经封装好了<br>(1) 封装了一个监听器,只需要配置监听器就可以了<br>(2) 配置监听器之前做事情:导入spring整合web项目jar包<br>在web.xml中配置:</li></ol><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>listener</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>listener-class</span><span class="token punctuation">></span></span>org.springframework.web.context.ContextLoaderListener<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>listener-class</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>listener</span><span class="token punctuation">></span></span><span class="token comment" spellcheck="true"><!-- 指定加载spring配置文件位置 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>context-param</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-name</span><span class="token punctuation">></span></span>contextConfigLocation<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-value</span><span class="token punctuation">></span></span>classpath*:spring-context.xml<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-value</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>context-param</span><span class="token punctuation">></span></span></code></pre><ol start="3"><li>基于aspectj的注解aop</li></ol><ul><li>使用注解方式实现aop操作<br>① 创建对象</li></ul><pre class=" language-xml"><code class="language-xml"><span class="token comment" spellcheck="true"><!-- 创建对象 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>bean</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>book<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>cn.itcast.aop.Book<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>bean</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>bean</span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>myBook<span class="token punctuation">"</span></span> <span class="token attr-name">class</span><span class="token attr-value"><span class="token punctuation">=</span><span class="token punctuation">"</span>cn.itcast.aop.MyBook<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>bean</span><span class="token punctuation">></span></span></code></pre><p>② 在spring核心配置文件中,开启aop操作</p><pre class=" language-xml"><code class="language-xml"><span class="token comment" spellcheck="true"><!-- 开启aop操作 --></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span><span class="token namespace">aop:</span>aspectj-autoproxy</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span><span class="token namespace">aop:</span>aspectj-autoproxy</span><span class="token punctuation">></span></span></code></pre><p>③ 在增强类上面使用注解完成aop操作</p><p><img src="http://oss.willhappy.cn/18-5-3/35764246.jpg" alt="aopBefore"></p><h3 id="七-Spring的jdbcTemplate操作"><a href="#七-Spring的jdbcTemplate操作" class="headerlink" title="七. Spring的jdbcTemplate操作"></a>七. Spring的jdbcTemplate操作</h3><ol><li><p>spring框架一站式框架<br>(1) 针对javaee三层,每一层都有解决技术<br>(2) 在dao层,使用jdbcTemplate</p></li><li><p>spring对不同的持久化层技术都进行了封装<br>(1) jdbcTemplate对jdbc进行了封装</p></li><li>jdbcTemplate使用和dbutils使用很相似,都数据库进行crud操作</li></ol><ul><li>增加<br>① 导入jdbcTemplate的jar包<br>② 创建对象,设置数据库信息<br>③ 创建jdbcTemplate对象,设置数据源<br>④ 调用jdbcTemplate对象里面的方法实现操作</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/22949019.jpg" alt="springJdbc"></p><ul><li>修改,删除类似与增加,不做赘述</li><li>查找</li></ul><blockquote><p>查找区别与dbutils,返回结果集的处理类需要自己去实现,而dbutils则给出了不同的结果集处理类,而jdbcTemplate则需要自己去实现RowMapper()接口来处理结果。dbutils中也有类似于RowMapper()接口的接口为ResultSetHandler(),但是他也提供了不同的实现类,来处理不同的结果。</p></blockquote><h3 id="八-Spring事务管理"><a href="#八-Spring事务管理" class="headerlink" title="八. Spring事务管理"></a>八. Spring事务管理</h3><ol><li>Spring事物管理两种方式<br>(1) 编程式事务管理(不用)<br>(2) 声明式事务管理</li></ol><ul><li>基于xml配置文件实现</li><li>基于注解实现</li></ul><ol start="2"><li>spring事务管理的api介绍</li></ol><p><img src="http://oss.willhappy.cn/18-5-3/45395861.jpg" alt="springTx"></p><p>(1) spring针对不同的dao层框架,提供接口不同的实现类</p><p><img src="http://oss.willhappy.cn/18-5-3/36709263.jpg" alt="springTxSx"></p><p>(2) 配置事物管理器</p><ol start="3"><li>搭建转账环境<br>(1) 创建数据库表,添加数据<br>(2) 创建service和dao类,完成注入关系</li></ol><ul><li>service层又叫业务逻辑层</li><li>dao层,单独对数据库操作,在dao层不添加业务</li></ul><p>(3) 声明式事务管理(xml配置,麻烦不建议使用)</p><ul><li>配置文件方式使用aop思想配置</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/14916884.jpg" alt="pzTx"></p><p><img src="http://oss.willhappy.cn/18-5-3/65304479.jpg" alt="pzQm"></p><p>(4) 声明式事务管理(注解)</p><ul><li>配置事务管理器</li><li>配置事物注解</li><li>在要使用事务的方法所在类上面添加注解<br>图示:</li></ul><p><img src="http://oss.willhappy.cn/18-5-3/45372897.jpg" alt="zjTx"></p><h3 id="九-ssh框架的整合"><a href="#九-ssh框架的整合" class="headerlink" title="九. ssh框架的整合"></a>九. ssh框架的整合</h3><ol><li>ssh整合思想</li></ol><p><img src="http://oss.willhappy.cn/18-5-3/82192601.jpg" alt="sshThink"></p>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> java </tag>
<tag> 提升 </tag>
</tags>
</entry>
<entry>
<title>Java入门</title>
<link href="/2016/11/20/4-2016-11-20-java-chu-ji-zhi-shi-java001/"/>
<url>/2016/11/20/4-2016-11-20-java-chu-ji-zhi-shi-java001/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h3 id="一-什么是java"><a href="#一-什么是java" class="headerlink" title="一. 什么是java"></a>一. 什么是java</h3><blockquote><p>java编程语言是个简答/完全面向对象/分布式/解释性/健壮性/安全与系统无关/可移植性/高性能/多线程和动态得编程语言。</p></blockquote><h3 id="二-java体系"><a href="#二-java体系" class="headerlink" title="二. java体系"></a>二. java体系</h3><ol><li>java SE java平台标准版</li><li>java EE java平台企业版</li><li>java ME java平台微型版</li></ol><h3 id="三-java开发环境"><a href="#三-java开发环境" class="headerlink" title="三. java开发环境"></a>三. java开发环境</h3><ol><li>Eclipse</li><li>myEclipse</li><li>IntelliJ IDEA</li></ol><h3 id="四-java开发前提"><a href="#四-java开发前提" class="headerlink" title="四. java开发前提"></a>四. java开发前提</h3><blockquote><p>java源代码是<em>.java得纯文本文件,可以使用任何文本编辑气编写,单不可执行。<br>JDK是java语言得开发包,可以将</em>.java文件编译盛可执行得java程序<br>可执行java程序需要JVM猜可以运行<br>JRE包含了JVM<br>JDK包含了JRE</p></blockquote><p><em>注:JRE(java runtime environment,java运行环境),运行java程序所需要得环境得集合,包含JVM标准实现及java核心类库。仅能够完成java得运行,而无法对java进行编译/调试等。<br>JDK(java development kit)是java语言得软甲开发工具包(SDK),面向java开发者发布的java套件。JDK包含得基本组件包括:编译器/jar打包工具/javadoc文档生成器/debug调试器/头文件生成器/反汇编器/监控工具等。</em></p><h3 id="五-数据类型初阶"><a href="#五-数据类型初阶" class="headerlink" title="五. 数据类型初阶"></a>五. 数据类型初阶</h3><ol><li>java定义了基本数据类型、引用数据类型和自定义数据类型。<br><img src="http://oss.willhappy.cn/18-5-3/61655971.jpg" alt="java基本数据类型"></li><li>本主题将介绍java的八种基本数据类型和引用数据类型中String类型</li><li>栈空间:<br> a. 栈空间存取数据的效率搞。<br> b. 栈中的数据按“先进后出”的方式管理。<br> c. 栈空间存储空间较小,不能存放大量的数据。<br> d. JVM将基本类型的数据存放在栈空间。<br><img src="http://oss.willhappy.cn/18-5-3/61298771.jpg" alt="java栈空间"></li><li>堆空间:<br> a. 堆空间存取数据的效率最低;<br> b. 数据存放的位置随机分配;<br> c. 堆空间存储数据的空间大,能存放大容量的数据。<br><img src="http://oss.willhappy.cn/18-5-3/51931414.jpg" alt="java堆空间"></li></ol><h3 id="六-自动类型转换"><a href="#六-自动类型转换" class="headerlink" title="六. 自动类型转换"></a>六. 自动类型转换</h3><p>(1) byte->short->int->long->float->double<br>(2) int和char类型的数据在某种情况下可以自动相互转换。</p><h3 id="七-通过Scanner从控制台获取数据"><a href="#七-通过Scanner从控制台获取数据" class="headerlink" title="七. 通过Scanner从控制台获取数据"></a>七. 通过Scanner从控制台获取数据</h3><p>(1) String next();<br>作用:接受控制台输入的一个字符串,空格或回车作为一次输入数据的结束,所以不能将空格作为字符串接受。<br>(2) String nextLine();<br>作用:接受控制台输入的一个字符串,以回车作为输入数据的结束。<br>(3) int nexInt();<br>作用:接受控制台输入的一个int类型的数据。<br>(4) double nextDouble();<br>(5) boolean nextBoolean();<br>(6) 从控制台输入char类型的数据<br>Scanner类没有提供直接输入char类型的方法,可以通过charAt()方法从next()或nextLine()获取输入的字符。</p><p>char String.charAt(int index);<br>作用:从字符串中获取指定下表的字符,下标从0开始。</p><h3 id="八-数组学习(实例:冒泡排序)"><a href="#八-数组学习(实例:冒泡排序)" class="headerlink" title="八. 数组学习(实例:冒泡排序)"></a>八. 数组学习(实例:冒泡排序)</h3><pre class=" language-java"><code class="language-java"> <span class="token comment" spellcheck="true">/** * 正宗的冒泡排序 * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 * 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 * 3.针对所有的元素重复以上的步骤,除了最后一个。 * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 */</span> <span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">78</span><span class="token punctuation">,</span><span class="token number">34</span><span class="token punctuation">,</span><span class="token number">12</span><span class="token punctuation">,</span><span class="token number">64</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">int</span> temp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> a<span class="token punctuation">.</span>length<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> a<span class="token punctuation">.</span>length<span class="token operator">-</span><span class="token number">1</span><span class="token operator">-</span>i<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//第i轮排序过后,最大数都会相应的放到后面,所以次数相应的减少i+1次</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token operator">></span>a<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> temp <span class="token operator">=</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span><span class="token punctuation">;</span> a<span class="token punctuation">[</span>j<span class="token punctuation">]</span> <span class="token operator">=</span> a<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span> a<span class="token punctuation">[</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> temp<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> a<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></code></pre><h3 id="九-String字符串"><a href="#九-String字符串" class="headerlink" title="九. String字符串"></a>九. String字符串</h3><ol><li><p>实例化String对象<br> 1)直接赋值的方式;<br> 2)使用关键字new<br>推荐使用直接赋值的方式,因为使用关键字new,会在堆内存中开辟空间存储字符串本身,另外开辟空间存储栈空间指向堆空间的对象。(可能表达不大准确,可看图)。<br><img src="http://oss.willhappy.cn/18-5-3/55532878.jpg" alt="String的实例化"></p></li><li><p>字符串的比较<br> “==” 比较的是地址<br> “equals”比较的是内容</p></li><li><p>字符串常用方法<br> a. toCharArray();字符串转换成数组<br> b. charAt();从字符串中取出指定位置的字符<br> c. getBytes();字符串与byte数组的转换<br> d. indexOf();过滤字符串中存在的字符,返回字符的当前位置<br> e. trim();去掉字符串的前后空格<br> f. subString();从字符串中取出子字符串<br> g. toLowerCase(),toUpperCase();大小写转换<br> h. endsWith(),startWith();判断字符串的开头结尾字符<br> i. replace();替换String字符串中的一个字符</p></li></ol><h3 id="十-StringBuffer"><a href="#十-StringBuffer" class="headerlink" title="十. StringBuffer"></a>十. StringBuffer</h3><p>缓冲区,本身也是操作字符串的,但是与String不同,StringBuffer是可以更改的,而String内容是不可修改的。</p><pre class=" language-java"><code class="language-java"> StringBuffer stringBuffer <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuffer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> stringBuffer<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"hello world!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">100</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span> stringBuffer<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>stringBuffer<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>同样的如果用String添加</p><pre class=" language-java"><code class="language-java"> String str <span class="token operator">=</span> <span class="token string">"hello world!"</span><span class="token punctuation">;</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">100</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span> str <span class="token operator">=</span> str <span class="token operator">+</span> i<span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>str<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>说明:两种方法追加字符串输出的结果是相同的,但是执行的速度是不同的,相对来说,StringBuffer的执行速度更快一些,因为他只是在原先的字符位置进行修改,而String则需要每次改变都要开辟新的内存空间。</p><h3 id="十一-StringBuilder"><a href="#十一-StringBuilder" class="headerlink" title="十一. StringBuilder"></a>十一. StringBuilder</h3><ol><li>一个可变的字符序列,该类被设计作用StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。建议优先考虑该类,速度比StringBuffer要快。</li><li>但是如果涉及到线程安全方面,建议使用StringBuffer。</li><li>常用方法:<br> append()<br> insert()</li></ol><h3 id="十二-异常处理"><a href="#十二-异常处理" class="headerlink" title="十二. 异常处理"></a>十二. 异常处理</h3><ol><li>异常的格式</li></ol><pre class=" language-java"><code class="language-java"> <span class="token comment" spellcheck="true">//伪代码</span> <span class="token keyword">try</span><span class="token punctuation">{</span> 异常的语句; <span class="token punctuation">}</span><span class="token keyword">catch</span><span class="token punctuation">(</span>Exception e<span class="token punctuation">)</span><span class="token punctuation">{</span> 异常的处理; <span class="token punctuation">}</span><span class="token keyword">finally</span><span class="token punctuation">{</span> 一定会执行的代码; <span class="token punctuation">}</span></code></pre><p>实例:</p><pre class=" language-java"><code class="language-java"> <span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">10</span><span class="token punctuation">,</span> b <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">,</span> temp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> temp <span class="token operator">=</span> a<span class="token operator">/</span>b<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>temp<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>输出为:java.lang.ArithmeticException: / by zero<br> 0</p><ol start="2"><li>常见异常<br> a. 数组越界异常:ArrayIndexOutOfBoundsException<br> b. 数字格式化异常:NumberFormatException<br> c. 算数异常:ArithmeticException<br> d. 空指针异常:NullPointerException</li></ol><h3 id="十三-java面向对象中类和对象"><a href="#十三-java面向对象中类和对象" class="headerlink" title="十三. java面向对象中类和对象"></a>十三. java面向对象中类和对象</h3><ol><li>方法的定义<br> static(静态方法)就是没有this的方法。</li><li>方法的重载:方法名称相同,返回类型,但是参数的类型和个数不同,通过传递参数的个数和类型不同来完成不同的功能。每个重载方法都必须有独一无二的参数列表。</li><li>对象的创建,如下所示</li></ol><pre class=" language-java"><code class="language-java">Class <span class="token class-name">Person</span><span class="token punctuation">{</span> String name <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">int</span> age <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//声名并实例化对象</span>Person per <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Person</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>说明:Person per 创建栈内存per,使用new Person()开辟堆内存空间,栈内存的per指向对应的堆内存空间,堆内存空间存储name=null;age=0;<br>对象创建的内存划分,如图:<br><img src="http://oss.willhappy.cn/18-5-3/26533636.jpg" alt="java对象实例化"></p><p><br></p><ol start="4"><li>构造器</li></ol><p>构造器没有任何返回值,如果类中没有构造器,则编译器会自动帮你常见一个默认的构造器,如果已经定义了构造器(无论是否有参数),编译器都不会帮你自动创建默认的构造器。<br>a. 格式:</p><pre class=" language-java"><code class="language-java"> 访问修饰符 类名称()<span class="token punctuation">{</span> 程序语句 <span class="token punctuation">}</span></code></pre><p><br><br>b. 注意点:<br>(1)构造方法名称必须与类名一致<br>(2)构造方法没有返回值</p><p><br></p><ol><li>面向对象三大特征<br> a. 封装性<br>对外部不可见<br> b. 继承<br>扩展类的功能<br> c. 多态性<br>方法的重载<br>对象的多态</li></ol><p><br></p><ol start="6"><li>方法的递归调用 实例如下:</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 递归方法的调用 * 100+99+...+1 * 输出的值为5050 */</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token function">addNum</span><span class="token punctuation">(</span><span class="token number">100</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//静态方法</span><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">addNum</span><span class="token punctuation">(</span><span class="token keyword">int</span> num<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>num <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> num <span class="token operator">+</span> <span class="token function">addNum</span><span class="token punctuation">(</span>num <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><br></p><ol start="7"><li>static关键字</li></ol><ul><li>由static修饰的变量成为静态变量,也称为类变量。</li><li>静态变量定义的位置时在方法之外。</li><li>静态变量与静态方法都是在类从磁盘加载至内存后被创建的,与类同时存在,同时消亡。</li><li>静态变量又称类的成员变量,在类中时全局变量,可以别类中的所有方法调用。</li><li>静态变量的值由jvm自动初始化。</li><li>使用static声名全局属性</li><li>使用static是声名的方法可以直接通过类名进行调用</li><li>使用static方法的时候,只能访问static声名的属性和方法,而非static声名的属性和方法时不能访问的。</li></ul><p><br></p><ol start="8"><li>匿名对象<br> 匿名对象就是没有名字的对象,如果程序中只是用一次该对象,就可以使用匿名对象的方式。<br> 实例:</li></ol><pre class=" language-java"><code class="language-java"><span class="token comment" spellcheck="true">//学生类</span><span class="token keyword">class</span> <span class="token class-name">Student</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"Hello World!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">test</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 匿名对象的使用 * 输出:Hello world! */</span> <span class="token keyword">new</span> <span class="token class-name">Student</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">tell</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><br></p><ol start="9"><li>this关键字</li></ol><ul><li>表示类中的属性和调用方法</li><li>调用本类中的构造方法</li><li>表示当前对象</li></ul><h3 id="十四-java面向对象的基本特征:继承"><a href="#十四-java面向对象的基本特征:继承" class="headerlink" title="十四. java面向对象的基本特征:继承"></a>十四. java面向对象的基本特征:继承</h3><ol><li>继承的基本概念</li></ol><ul><li>扩展父类的功能</li></ul><ol start="2"><li>java中使用extends关键字完成继承</li></ol><ul><li>class 子类 extends 父类 {}</li></ul><ol start="3"><li>继承的限制</li></ol><ul><li>在java中只允许单继承</li><li>子类不能直接访问父类的私有成员</li></ul><ol start="4"><li>子类对象的实例化过程<br> a. 在子类对象实例化之前,必须先调用父类中的构造方法,之后调用子类构造方法<br>示例图如下:</li></ol><pre class=" language-graphLR"><code class="language-graphLR">A(实例化子类对象) -->|1.先调用父类构造| B(调用父类构造)A -->|2.再调用子类构造| C(调用子类构造)</code></pre><p><br></p><ol start="5"><li>java方法重写与super关键字</li></ol><ul><li>在继承中,也存在这重写的概念,起始就是子类定义了和父类同名的方法</li><li>定义:<br> 方法名称相同,返回值类型相同,参数也相同。</li><li>重写的限制:<br> 被子类重写的方法不能拥有比父类方法更加严格的访问权限</li><li>访问权限:<br> private<default<protected<public<br> private只能在当前类中进行访问,default在同一包下进行访问,public在整个工程下进行访问。</li><li>super关键字<br> 强行调用父类的方法的执行</li><li>重写与重载区别</li></ul><table><thead><tr><th>NO</th><th>区别点</th><th>重载</th><th>重写</th></tr></thead><tbody><tr><td>1</td><td>单词</td><td>Overloading</td><td>Overriding</td></tr><tr><td>2</td><td>定义</td><td>方法名称相同,参数的类型或个数不同</td><td>方法名称、参数的类型、返回值类型全部相同</td></tr><tr><td>3</td><td>访问权限</td><td>对权限没有要求</td><td>被重写的方法不能拥有比父类更加严格的权限</td></tr><tr><td>4</td><td>范围</td><td>发生在同一个类中</td><td>发生在继承中</td></tr></tbody></table><h3 id="十五-java面向对象-抽象类和接口"><a href="#十五-java面向对象-抽象类和接口" class="headerlink" title="十五. java面向对象-抽象类和接口"></a>十五. java面向对象-抽象类和接口</h3><ol><li>final关键字</li></ol><ul><li>final关键字在java中被称为完结器,表示最终的意思</li><li>final能声名类、方法、属性:<ol><li>使用final声名的类不能被继承</li><li>使用final声名的方法不能别重写</li><li>使用final声名的变量变成常量,常量是不可以别修改的</li></ol></li></ul><ol start="2"><li>抽象类</li></ol><ul><li>抽象类概念:<br> 包含一个抽象方法的类就是抽象类</li><li>抽象方法:<br> 声名而未被实现的方法,抽象方法必须使用abstract关键字声名</li><li>抽象类被子类继承,子类(如果不是抽象类,必须重写抽象类中的所有抽象方法)</li><li>定义格式:</li></ul><pre class=" language-java"><code class="language-java"> <span class="token keyword">abstract</span> <span class="token keyword">class</span> <span class="token class-name">className</span><span class="token punctuation">{</span> 属性 方法 抽象方法 <span class="token punctuation">}</span></code></pre><p><br></p><ul><li>抽象类不能直接实例化,要通过其子类进行实例化</li></ul><ol start="3"><li>接口</li></ol><ul><li>接口是java中最重要的概念,接口可以理解为一种特殊的类,里面全部是有全局常量和公共的抽象方法组成。</li><li>接口的格式:</li></ul><pre class=" language-java"><code class="language-java"> <span class="token keyword">interface</span> <span class="token class-name">interfaceName</span><span class="token punctuation">{</span> 全局常量 抽象方法 <span class="token punctuation">}</span></code></pre><p><br></p><ul><li>接口的实现也必须通过子类,使用关键字implements,而且接口是可以多实现的。</li><li>一个子类可以同时继承抽象类和实现接口</li><li>一个接口不能继承一个抽象类,但是却可以通过extends关键字同时继承多个接口,实现接口的多继承。<br>实例:<pre class=" language-java"><code class="language-java"><span class="token keyword">interface</span> <span class="token class-name">Inter3</span> <span class="token keyword">extends</span> <span class="token class-name">Inter1</span><span class="token punctuation">,</span>Inter2<span class="token punctuation">{</span><span class="token punctuation">}</span></code></pre><br></li></ul><ol start="4"><li>接口和抽象类的访问修饰符</li></ol><ul><li>接口可以使用public或者默认访问修饰符,接口的方法只能使用public,属性可以使用public、static、final;</li><li>抽象类可以使用public或者默认的访问修饰符,抽象类的方法可以使用public、protected、默认的或private,属性可以是public、static、final、protected、private。</li></ul><h3 id="十六-java面向对象多态性"><a href="#十六-java面向对象多态性" class="headerlink" title="十六. java面向对象多态性"></a>十六. java面向对象多态性</h3><ol><li><p>多态性<br> a. 多态性的体现:</p><ul><li>方法的重载和重写</li><li><p>对象的多态性</p><p>b. 对象的多态性:</p></li><li>向上转型:程序会自动完成<br> 父类 父类对象 = 子类实例</li><li>向下转型:强制类型转换<br> 子类 子类对象 = (子类)父类实例</li></ul></li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">A</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"A====tell1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell2</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"A====tell2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">B</span> <span class="token keyword">extends</span> <span class="token class-name">A</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell1</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"B====tell1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell3</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"B====tell3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test1</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 向上转型 * 输出:B====tell1 * A====tell2 */</span><span class="token comment" spellcheck="true">// B b = new B();</span><span class="token comment" spellcheck="true">// A a = b;</span><span class="token comment" spellcheck="true">// a.tell1();//tell1重写,调用被重写之后的方法</span><span class="token comment" spellcheck="true">// a.tell2();</span> <span class="token comment" spellcheck="true">/** * 向下转型 * 输出:B====tell1 * A====tell2 * B====tell3 */</span> A a <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">B</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//注意向下转型之前,先要向上转型</span> B b <span class="token operator">=</span> <span class="token punctuation">(</span>B<span class="token punctuation">)</span> a<span class="token punctuation">;</span> b<span class="token punctuation">.</span><span class="token function">tell1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> b<span class="token punctuation">.</span><span class="token function">tell2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> b<span class="token punctuation">.</span><span class="token function">tell3</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p> c. 对象的多态的应用</p><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">A1</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"A1====tell1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">B1</span> <span class="token keyword">extends</span> <span class="token class-name">A1</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell2</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"B1====tell2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">C1</span> <span class="token keyword">extends</span> <span class="token class-name">A1</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell3</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"C1====tell3"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">D1</span> <span class="token keyword">extends</span> <span class="token class-name">A1</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">tell4</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"D1====tell4"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test2</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 多态的应用 * 输出:A1====tell1 * A1====tell1 * A1====tell1 */</span> <span class="token function">say</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">B1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">say</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">C1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">say</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">D1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">say</span><span class="token punctuation">(</span>A1 a1<span class="token punctuation">)</span><span class="token punctuation">{</span> a1<span class="token punctuation">.</span><span class="token function">tell1</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><br></p><ol start="2"><li>instanceof关键字<br> 在java中可以使用instanceof关键字判断一个对象到底是不是一个类的实例</li><li>抽象类的应用</li><li>接口的应用</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">interface</span> <span class="token class-name">USB</span> <span class="token punctuation">{</span> <span class="token keyword">void</span> <span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">void</span> <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">C</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">work</span><span class="token punctuation">(</span>USB u<span class="token punctuation">)</span> <span class="token punctuation">{</span> u<span class="token punctuation">.</span><span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"工作中"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> u<span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">USBDisk</span> <span class="token keyword">implements</span> <span class="token class-name">USB</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"u盘开始工作"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"u盘停止工作"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">class</span> <span class="token class-name">Printer</span> <span class="token keyword">implements</span> <span class="token class-name">USB</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">start</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"打印机开始工作"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"打印机停止工作"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test3</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 接口的应用 * 输出:u盘开始工作 * 工作中 * u盘停止工作 * 打印机开始工作 * 工作中 * 打印机停止工作 */</span> C<span class="token punctuation">.</span><span class="token function">work</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">USBDisk</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> C<span class="token punctuation">.</span><span class="token function">work</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Printer</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="十七-java面向对象之泛型"><a href="#十七-java面向对象之泛型" class="headerlink" title="十七. java面向对象之泛型"></a>十七. java面向对象之泛型</h3><ol><li>知识泛型<br> a. 泛型是在JDK1.5之后增加的新功能,泛型(Generic)<br> b. 泛型可以解决数据类型的安全性问题,他主要的原理,是在类声名的时候通过一个标识标识类中某个属性的类型或者是某个方法的返回值及参数类型。<br> c. 格式:</li></ol><pre class=" language-java"><code class="language-java"> 访问权限 <span class="token keyword">class</span> 类名称<span class="token operator"><</span>泛型,泛型<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>><span class="token punctuation">{</span> 属性 方法 <span class="token punctuation">}</span></code></pre><p><br><br> d. 对象的创建</p><blockquote><p>类名称<具体类型> 对象名称 = new 类名称<具体类型>();</p></blockquote><ol start="2"><li><p>构造方法中使用泛型<br> 构造方法可以为类中的属性初始化,那么如果类中的属性通过泛型指定,而又需要通过构造方法设置属性内容的时候,那么构造方法的定义与之前并无不同,不需要向声名类那样指定泛型。</p></li><li><p>设置多个泛型</p></li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">class</span> <span class="token class-name">Gen</span><span class="token operator"><</span>T<span class="token punctuation">,</span>K<span class="token operator">></span><span class="token punctuation">{</span> <span class="token keyword">private</span> T take<span class="token punctuation">;</span> <span class="token keyword">private</span> K key<span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token comment" spellcheck="true">//实例化</span>Gen<span class="token operator"><</span>Integer<span class="token punctuation">,</span>String<span class="token operator">></span> g <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Gen</span><span class="token operator"><</span>Integer<span class="token punctuation">,</span>String<span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p><br></p><ol start="4"><li>通配符</li></ol><ul><li>可以使用?作为通配符</li></ul><p><br></p><ol start="5"><li>泛型接口</li></ol><ul><li>格式:<br>interface 接口名称<泛型标识>{}</li></ul><p><br></p><ol start="6"><li>泛型方法</li></ol><ul><li>泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型。</li><li>格式:<br> 访问权限 <泛型标识> 泛型标识 方法名称([泛型标识 参数名称])</li></ul><p><br></p><ol start="7"><li>泛型数组</li></ol><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test3</span><span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> Integer arr<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token function">tell</span><span class="token punctuation">(</span>arr<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token operator"><</span>T<span class="token operator">></span><span class="token keyword">void</span> <span class="token function">tell</span><span class="token punctuation">(</span>T arr<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> arr<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="十八-常用javaAPI详解"><a href="#十八-常用javaAPI详解" class="headerlink" title="十八. 常用javaAPI详解"></a>十八. 常用javaAPI详解</h3><ul><li>java本地文件操作<ol><li>文件和文件夹的创建、删除、重命名</li><li>文件属性的读取</li><li>文件属性的设置</li><li>遍历文件夹<br>实例如下:</li></ol></li></ul><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test5</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">printFiles</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"E:\\workspace\\interlIDEA\\JavaStudy"</span><span class="token punctuation">)</span><span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">printFiles</span><span class="token punctuation">(</span>File dir<span class="token punctuation">,</span><span class="token keyword">int</span> tab<span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span><span class="token punctuation">(</span>dir<span class="token punctuation">.</span><span class="token function">isDirectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> File next<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> dir<span class="token punctuation">.</span><span class="token function">listFiles</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> next<span class="token punctuation">.</span>length<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> j <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> j <span class="token operator"><</span> tab<span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span><span class="token string">"|--"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>next<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>next<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">isDirectory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">printFiles</span><span class="token punctuation">(</span>next<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span>tab <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p>文件的简单读取</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test6</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> File file <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"text.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">exists</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"exist"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> FileInputStream fis <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileInputStream</span><span class="token punctuation">(</span>file<span class="token punctuation">)</span><span class="token punctuation">;</span> InputStreamReader isr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">InputStreamReader</span><span class="token punctuation">(</span>fis<span class="token punctuation">,</span><span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> BufferedReader br <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedReader</span><span class="token punctuation">(</span>isr<span class="token punctuation">)</span><span class="token punctuation">;</span> String line<span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>line <span class="token operator">=</span> br<span class="token punctuation">.</span><span class="token function">readLine</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">!=</span>null<span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>line<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> br<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> isr<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fis<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> File newFile <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span><span class="token string">"newtext.txt"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> FileOutputStream fos <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileOutputStream</span><span class="token punctuation">(</span>newFile<span class="token punctuation">)</span><span class="token punctuation">;</span> OutputStreamWriter osw <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OutputStreamWriter</span><span class="token punctuation">(</span>fos<span class="token punctuation">,</span><span class="token string">"UTF-8"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> BufferedWriter bw <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">BufferedWriter</span><span class="token punctuation">(</span>osw<span class="token punctuation">)</span><span class="token punctuation">;</span> bw<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"我深爱这你\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> bw<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"我深深的爱着\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> bw<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> osw<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> fos<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"写入完成!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">UnsupportedEncodingException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">FileNotFoundException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="十九-java的日期与时间处理"><a href="#十九-java的日期与时间处理" class="headerlink" title="十九. java的日期与时间处理"></a>十九. java的日期与时间处理</h3><p>实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test8</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> ParseException <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">/** * 时间实例: * 设定女朋友的生日,并在提前2个星期的星期六提醒 */</span> <span class="token comment" spellcheck="true">//1.设定生日,String</span> String birthday <span class="token operator">=</span> <span class="token string">"2015-05-30"</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//2.将String类型转换为日期</span> SimpleDateFormat simpleDateFormat <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SimpleDateFormat</span><span class="token punctuation">(</span><span class="token string">"yyyy-MM-dd"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Date date <span class="token operator">=</span> simpleDateFormat<span class="token punctuation">.</span><span class="token function">parse</span><span class="token punctuation">(</span>birthday<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//3.对日期进行计算</span> Date spec <span class="token operator">=</span> <span class="token function">prepareBirthday</span><span class="token punctuation">(</span>date<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//4.将计算后的结果,转换为String类型,输出</span> String str2 <span class="token operator">=</span> simpleDateFormat<span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>spec<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>birthday <span class="token operator">+</span> <span class="token string">"提前2周的周六为:"</span> <span class="token operator">+</span> str2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment" spellcheck="true">/** * 传入一个日期,计算出该日期的2个星期前的周六的日期 * * @param birthdayDate * @return */</span> <span class="token keyword">public</span> <span class="token keyword">static</span> Date <span class="token function">prepareBirthday</span><span class="token punctuation">(</span>Date birthdayDate<span class="token punctuation">)</span> <span class="token punctuation">{</span> Calendar calendar <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">GregorianCalendar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> calendar<span class="token punctuation">.</span><span class="token function">setTime</span><span class="token punctuation">(</span>birthdayDate<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//传入的date日期,转换为calendar</span> calendar<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span>Calendar<span class="token punctuation">.</span>WEEK_OF_MONTH<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//提前2周</span> calendar<span class="token punctuation">.</span><span class="token function">set</span><span class="token punctuation">(</span>Calendar<span class="token punctuation">.</span>DAY_OF_WEEK<span class="token punctuation">,</span> Calendar<span class="token punctuation">.</span>SATURDAY<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment" spellcheck="true">//调整为当前星期的周六</span> <span class="token keyword">return</span> calendar<span class="token punctuation">.</span><span class="token function">getTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h3 id="二十-java工程结构管理"><a href="#二十-java工程结构管理" class="headerlink" title="二十. java工程结构管理"></a>二十. java工程结构管理</h3><ul><li>Build Path事指定java工程所包含的额资源属性集合,在一个成熟的java工程中,不仅仅有自己编写的源代码,还需要引用系统运行库(JRE),第三方的功能扩展库,工作空间中的其他工程,甚至外部的类文件,所有这些资源都是被这个工程所依赖的,并且背引用后,才能够将工程编译成功,而build path就是用来配置和管理对这些资源的引用的。<br>Build Path一般包括:</li></ul><ol><li>JRE运行时库</li><li>第三方功能扩展库(<code>*.jar</code>格式文件)</li><li>其他工程</li><li>其他的源代码或class文件</li></ol><h3 id="二十一-jsp基础"><a href="#二十一-jsp基础" class="headerlink" title="二十一. jsp基础"></a>二十一. jsp基础</h3><ol><li>基本介绍<ul><li>jsp起源</li><li>jsp是一门脚本语言</li><li>jsp拥有java语言的所有特性</li><li>jsp运行于jsp容器中(jsp容器有:Tomcat,jetty)</li><li>jsp会被转换成servlet</li></ul></li><li><p>web开发基础</p><ul><li>HTML<br> 1.HTML==HyperText Markup Language<br> 2.由服务器返回,由浏览器呈现</li><li><p>URI/URL/URN</p><ol><li>URL==Uniform Resource Locator</li><li>代表资源的地址信息</li><li><p><协议>//<主机>:<端口>/<路径></p></li><li><p>URN==Uniform Resource Name</p></li><li><p>代表某个资源独一无二的名称</p></li><li><p>URI==Uniform Resource Identifier</p></li><li>用于标识某一互联网资源名称的字符串</li></ol></li><li>HTTP协议简介<ol><li>HTTP==HyperText Transfer Protocol</li><li>1990年提出</li><li>特点:<ul><li>支持客户/服务器模式</li><li>灵活</li><li>无连接</li><li>无状态</li></ul></li><li>方法<br>|方法名|对应规范|<br>|-|-|<br>|GET|向特定的资源发出请求|<br>|POST|向指定资源提交数据进行处理请求|</li></ol></li></ul></li></ol><p><br></p><ol start="3"><li>jsp基本语法</li></ol><ul><li>jsp程序段定义</li></ul><pre class=" language-jsp"><code class="language-jsp"> <!--jsp表达式输出--> 输出:<%="hello woWorld!"%> <br/> <%! //jsp声名使用,相当于全局变量,可以再jsp的其他地方使用该变量。 String str2 = "Hello newWorld!"; %> <% //jsp程序段中定义的变量相当于局部变量,不同请求之间都会有一份独立的变量定义 String str1 = "Hello World"; out.println(str1);//jsp内置对象out %> <br/> <% out.println(str2); %></code></pre><p>jsp代码注释</p><pre class=" language-jsp"><code class="language-jsp"> <!-- 1.Html注释 说明:此注释会被发送到客户端,用户是可以看到的,不安全 --> <%-- 2.jsp代码段注释,不会发送到客户端,相对安全 --%> <% //3.java程序段中的注释如下 //java程序段中的单行注释 /** *多行注释,和在纯java代码中的注释相同 */ %></code></pre><p><br></p><ol start="4"><li>jsp编译指令和动作指令</li></ol><ul><li>说明:WEB-INF中的jsp就是无法通过地址栏访问的,所以安全。</li><li>访问web-inf下jsp资源的几种方式:</li></ul><p>方法一:<br>如果说你要访问这个文件夹中的jsp文件需要在项目的web.xml文件中去配置servlet格式差不多的配置就ok了 如下:</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>runtain<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>jsp-file</span><span class="token punctuation">></span></span>/WEB-INF/INF.jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>jsp-file</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-mapping</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>runtain<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url-pattern</span><span class="token punctuation">></span></span>/XXX<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url-pattern</span><span class="token punctuation">></span></span></code></pre><p>访问地址:<code>http://localhost:8080/runtain/xxx</code> 即可访问jsp页面内容</p><p>方法二:</p><pre class=" language-jsp"><code class="language-jsp"><jsp:forward page = "/WEB-INF/jsp/test/test.jsp" /></code></pre><p>方法三:</p><pre class=" language-jsp"><code class="language-jsp">request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request, response);</code></pre><p>怎么样让servlet访问web-inf下的网页或jsp文件呢?</p><blockquote><p>因为web-inf下,应用服务器把它指为禁访目录,即直接在浏览器里是不能访问到的。<br>因些,可以让servlet进行访问,如web-inf下有a.jsp,则可以用<code>request.getRequestDispatcher("/WEB-INF/a.jsp").forward(request,response)</code>;进行派遣访问<br>但如果web-inf下有a.htm,则用<code>request.getRequestDispatcher("/WEB-INF/a.htm").forward(request,response)</code>;则不能访问。<br>一开始想不通,觉得怪。后来想想,jsp其实也是servlet,会自动编译的,于是work目录下会有<code>/web-inf/a$jsp.class</code>类型,于是有头绪了,让应用服务器能够编译.htm,如<code>a$htm.class</code>.抱有这个想法,开始动手.</p></blockquote><p>在tomcat下的<code>conf/web.xml</code>,找到jsp的访问方式</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-mapping</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url-pattern</span><span class="token punctuation">></span></span>*.jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url-pattern</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-mapping</span><span class="token punctuation">></span></span></code></pre><p>于是在下面添加</p><pre class=" language-xml"><code class="language-xml"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-mapping</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url-pattern</span><span class="token punctuation">></span></span>*.htm<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url-pattern</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-mapping</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-mapping</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>url-pattern</span><span class="token punctuation">></span></span>*.html<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>url-pattern</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-mapping</span><span class="token punctuation">></span></span></code></pre><p>随后,一切OK,此时可访问a.htm。<br>a.html在work/web-inf/下者有<code>a\$htm.class</code>, <code>a\$html.class</code> 生成</p><p>编译指令:</p><pre class=" language-jsp"><code class="language-jsp"><%@ include file=""%></code></pre><p>动作指令:</p><pre class=" language-jsp"><code class="language-jsp"><jsp:forward page="login.jsp"></jsp:forward></code></pre><p>说明:forward指令下面的内容不会被执行</p><pre class=" language-jsp"><code class="language-jsp"><jsp:include page=""> <jsp:param value="red" name="bgcolor"/></jsp:include><jsp:useBean id="user" class="com.william.entity.User"></jsp:useBean><jsp:setProperty name="user" property="userName"/><jsp:setProperty name="user" property="passWord"/></code></pre><p>说明:注意区分编译指令的include和动作指令的include的区别<br> 对于静态包含,<%@include%>,中包含的文件,只是简单的嵌入到主文件中,就是在jsp页面转化成Servlet时才嵌入到主文件中,因为运行的结果是只生成了一个Servlet。<br>而对于动态包含<a href="jsp:incude" target="_blank" rel="noopener">jsp:incude</a>,如果被包含文件是动态的,那么就会生成两个Servlet,也就是被包含文件也要经过jsp引擎编译执行生成一个Servlet,两个Servlet通过request和reponse进行通信。如果被包含的文件是静态的,那么这种情况和<%@include>就很相似,只生成了一个Servlet,但是他们之间没有进行简单的嵌入,而依然是通过request和reponse进行的通信。</p><p><br></p><ol start="5"><li>jsp内置对象</li></ol><ul><li>out对象</li></ul><pre class=" language-jsp"><code class="language-jsp"> <% out.print("william"); out.newLine(); out.flush();//强制刷新服务器缓冲区中的数据 out.clearBuffer();//清空缓冲区数据 out.clear();// out.println("获取当前缓冲区大小:"+out.getBufferSize()); out.println("获取缓冲区剩余字节数目:"+out.getRemaining()); %></code></pre><ul><li>request对象</li></ul><pre class=" language-jsp"><code class="language-jsp"> <form action="" method="post"> <input type="text" name="userName"/> <input type="submit" value="提交"> </form> 请求的方法名:<%= request.getMethod() %><br/> 请求的资源:<%= request.getRequestURI() %><br/> 请求使用的协议:<%= request.getProtocol() %><br/> 请求的服务器IP:<%= request.getServerName() %><br/> 请求的服务器端口:<%= request.getServerPort() %><br/> 客户端IP地址:<%= request.getRemoteAddr() %><br/> 客户端主机名:<%= request.getRemoteHost() %><br/> 表单提交来的值:<%= request.getParameter("userName") %><br/> <!-- 输出: 请求的方法名:GET 请求的资源:/Web01/jsps/Test05/request.jsp 请求使用的协议:HTTP/1.1 请求的服务器IP:localhost 请求的服务器端口:8080 客户端IP地址:127.0.0.1 客户端主机名:127.0.0.1 表单提交来的值:null --></code></pre><ul><li>response对象</li></ul><pre class=" language-jsp"><code class="language-jsp"> <% response.setHeader("Cache-Control","no-cache"); response.setIntHeader("Refresh",2); out.println("date is" + new java.util.Date().toString() + "<br/>"); %> <% //response实例 Cookie myCookie = new Cookie("william","123456"); myCookie.setMaxAge(3600); response.addCookie(myCookie); %></code></pre><ul><li>exception对象</li></ul><pre class=" language-jsp"><code class="language-jsp"> 异常描述信息:<br/> <% out.println(exception.getMessage()); %> <br/> exception对象的字符串描述:<br/> <% out.println(exception.toString()); %> <br/> <% exception.printStackTrace(); %></code></pre><ul><li>config对象<br> 在web.xml中添加配置:</li></ul><pre class=" language-xml"><code class="language-xml"> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>servlet-name</span><span class="token punctuation">></span></span>config<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet-name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>jsp-file</span><span class="token punctuation">></span></span>/jsps/Test08/config.jsp<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>jsp-file</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>init-param</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-name</span><span class="token punctuation">></span></span>username<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-value</span><span class="token punctuation">></span></span>william<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-value</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>init-param</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>init-param</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-name</span><span class="token punctuation">></span></span>password<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-name</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>param-value</span><span class="token punctuation">></span></span>123456<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>param-value</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>init-param</span><span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span>servlet</span><span class="token punctuation">></span></span></code></pre><p>jsp中使用config获取:</p><pre class=" language-jsp"><code class="language-jsp">用户名:<%= config.getInitParameter("username")%><br/>密码:<%= config.getInitParameter("password")%><%-- 浏览器中输出:用户名:william 密码:123456--%></code></pre><ul><li>page对象</li></ul><pre class=" language-jsp"><code class="language-jsp"><% out.println("page对象字符串"+page.toString()); page.getClass(); page.hashCode(); //page.equals(obj);%></code></pre><ul><li>session对象</li></ul><pre class=" language-jsp"><code class="language-jsp"> sessionId:<%= session.getId()%><br/> session的创建时间:<%= new java.util.Date(session.getCreationTime())%><br/> session的最后访问时间:<%= new java.util.Date(session.getLastAccessedTime())%><br/> session的失效时间:<%= session.getMaxInactiveInterval()%><br/></code></pre><ul><li>application对象</li></ul><pre class=" language-jsp"><code class="language-jsp">服务器信息:<%= application.getServerInfo()%><br/>应用名称:<%= application.getServletContextName()%><br/>主机名称:<%= application.getVirtualServerName()%><br/><% //页面访问计数器实例 Object obj = application.getAttribute("counter"); if (obj == null) { application.setAttribute("counter",new Integer(1)); out.println("该页面被访问了1次<br/>"); }else{ int counterValue = Integer.parseInt(obj.toString()); counterValue++; out.println("该页面被访问了 " + counterValue + "次<br/>"); application.setAttribute("counter",counterValue); }%></code></pre><ul><li>pageContext对象</li></ul><pre class=" language-jsp"><code class="language-jsp"><% JspWriter myOut = pageContext.getOut(); myOut.println("Hello world!"); pageContext.setAttribute("userName","william",pageContext.SESSION_SCOPE); String value = session.getAttribute("userName").toString(); out.println(value); out.println("<br/>");%></code></pre><h3 id="二十二-JDBC相关知识"><a href="#二十二-JDBC相关知识" class="headerlink" title="二十二. JDBC相关知识"></a>二十二. JDBC相关知识</h3><ol><li><p>数据库基础知识</p><ul><li>数据库简介</li><li><p>关系数据模型<br> <strong>特点:</strong></p><ol><li>概念单一</li><li>规范化</li><li><p>二维表</p><p><strong>术语:</strong></p></li><li>关系</li><li>元祖</li><li>属性</li><li>属性域</li><li>主键</li><li>外键</li></ol></li><li>数据库范式<br> 1NF(原子性)<br> 2NF(唯一性)<br> 3NF(冗余行判断)</li></ul></li><li>mysql入门<br> sql功能:DDL、DML、DCL</li><li>JDBC编程</li></ol><ul><li>JDBC(Java Data Base Connectivity)</li><li>JDBC的组成:JDBC API/JDBC Driver API</li><li>JDBC API:DriverManager/Connection/Statement/PreparedStatement/ResultSet</li><li><p>JDBC Driver API;JDBC-ODBC bridge/部分java技术的本地API驱动程序/全部基于java技术的本地API驱动程序/全部基于java技术的本地协议驱动程序</p><p> JDBC程序编写步骤:</p></li></ul><pre class=" language-graphLR"><code class="language-graphLR">A(JDBC编程流程) -->B(1.加载驱动)A -->C(2.打开连接)A -->D(3.执行查询)A -->E(4.处理结果)A -->F(5.清理环境)</code></pre><p>实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> String sql <span class="token operator">=</span> <span class="token string">"select * from tbl_user"</span><span class="token punctuation">;</span> Connection conn <span class="token operator">=</span> null<span class="token punctuation">;</span> Statement st <span class="token operator">=</span> null<span class="token punctuation">;</span> ResultSet rs <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment" spellcheck="true">//获取数据库连接</span> Class<span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"com.mysql.jdbc.Driver"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> conn <span class="token operator">=</span> DriverManager<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token string">"jdbc:mysql://localhost:3306/jsp_db"</span><span class="token punctuation">,</span><span class="token string">"root"</span><span class="token punctuation">,</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> st <span class="token operator">=</span> conn<span class="token punctuation">.</span><span class="token function">createStatement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> rs <span class="token operator">=</span> st<span class="token punctuation">.</span><span class="token function">executeQuery</span><span class="token punctuation">(</span>sql<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">while</span><span class="token punctuation">(</span>rs<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>rs<span class="token punctuation">.</span><span class="token function">getInt</span><span class="token punctuation">(</span><span class="token string">"id"</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>rs<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">"name"</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>rs<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">"password"</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">print</span><span class="token punctuation">(</span>rs<span class="token punctuation">.</span><span class="token function">getString</span><span class="token punctuation">(</span><span class="token string">"email"</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">finally</span><span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> rs<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e2<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> st<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e3<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> conn<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e4<span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span></code></pre><p><br></p><ol start="4"><li>事务处理</li></ol><ul><li>事务的四个特性:原子性/一致性/隔离性/持久性</li></ul><p>事务实例:</p><pre class=" language-java"><code class="language-java"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">TransactionTest</span> <span class="token punctuation">{</span> <span class="token keyword">public</span> <span class="token keyword">static</span> Connection <span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> Connection conn <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> Class<span class="token punctuation">.</span><span class="token function">forName</span><span class="token punctuation">(</span><span class="token string">"com.mysql.jdbc.Driver"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> conn <span class="token operator">=</span> DriverManager<span class="token punctuation">.</span><span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token string">"jdbc:mysql://localhost:3306/jsp_db"</span><span class="token punctuation">,</span><span class="token string">"root"</span><span class="token punctuation">,</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e<span class="token punctuation">)</span><span class="token punctuation">{</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> conn<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">insertUserData</span><span class="token punctuation">(</span>Connection conn<span class="token punctuation">)</span> <span class="token keyword">throws</span> SQLException<span class="token punctuation">{</span> String sql <span class="token operator">=</span> <span class="token string">"insert into tbl_user(id,name,password,email) values (10,'Tom','123456','[email protected]')"</span><span class="token punctuation">;</span> Statement st <span class="token operator">=</span> conn<span class="token punctuation">.</span><span class="token function">createStatement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> count <span class="token operator">=</span> st<span class="token punctuation">.</span><span class="token function">executeUpdate</span><span class="token punctuation">(</span>sql<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"向用户表中插入了"</span> <span class="token operator">+</span> count <span class="token operator">+</span> <span class="token string">"条记录"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//conn.close();</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">insertAddressData</span><span class="token punctuation">(</span>Connection conn<span class="token punctuation">)</span> <span class="token keyword">throws</span> SQLException<span class="token punctuation">{</span> String sql <span class="token operator">=</span> <span class="token string">"insert into tbl_address(id,city,country,user_id) values (1,'shanghai','China','10')"</span><span class="token punctuation">;</span> Statement st <span class="token operator">=</span> conn<span class="token punctuation">.</span><span class="token function">createStatement</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">int</span> count <span class="token operator">=</span> st<span class="token punctuation">.</span><span class="token function">executeUpdate</span><span class="token punctuation">(</span>sql<span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"向地址表中插入了"</span> <span class="token operator">+</span> count <span class="token operator">+</span> <span class="token string">"条记录"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment" spellcheck="true">//conn.close();</span> <span class="token punctuation">}</span> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span>String<span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span><span class="token punctuation">{</span> Connection conn <span class="token operator">=</span> null<span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> conn <span class="token operator">=</span> <span class="token function">getConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> conn<span class="token punctuation">.</span><span class="token function">setAutoCommit</span><span class="token punctuation">(</span><span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">insertUserData</span><span class="token punctuation">(</span>conn<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">insertAddressData</span><span class="token punctuation">(</span>conn<span class="token punctuation">)</span><span class="token punctuation">;</span> conn<span class="token punctuation">.</span><span class="token function">commit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">SQLException</span> e<span class="token punctuation">)</span> <span class="token punctuation">{</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=========捕获到sql异常=========="</span><span class="token punctuation">)</span><span class="token punctuation">;</span> e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> conn<span class="token punctuation">.</span><span class="token function">rollback</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"=========事务回归=========="</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e1<span class="token punctuation">)</span> <span class="token punctuation">{</span> e1<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token keyword">finally</span><span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>conn<span class="token operator">!=</span>null<span class="token punctuation">)</span> <span class="token punctuation">{</span> conn<span class="token punctuation">.</span><span class="token function">close</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">Exception</span> e2<span class="token punctuation">)</span> <span class="token punctuation">{</span> e2<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><p><br></p><ol start="5"><li>JDBC编程优化</li></ol><h3 id="二十三-Servlet概述"><a href="#二十三-Servlet概述" class="headerlink" title="二十三. Servlet概述"></a>二十三. Servlet概述</h3><pre class=" language-graphLR"><code class="language-graphLR">A(Servlet) --> B(Server+Applet)A --> C(特殊的java类)A --> D(Servlet与HTTP)</code></pre><ul><li>servlet处理流程分析<ol><li>生命周期:加载类->调用init()方法初始化->处理请求->销毁</li><li>有关servlet的详细信息:<a href="http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.htm" target="_blank" rel="noopener">http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.htm</a></li></ol></li><li>servlet过滤器<ol><li>编码转换过滤器</li><li>权限校验过滤器</li></ol></li></ul><h3 id="二十四-java基础知识面试指导"><a href="#二十四-java基础知识面试指导" class="headerlink" title="二十四. java基础知识面试指导"></a>二十四. java基础知识面试指导</h3><p>本课时巩固知识点:</p><ul><li>java关键字及功能</li><li>java数据类型</li><li>java基本运算符</li><li>java基本程序控制语句</li><li>java数组</li></ul><ol><li><p>java关键字</p><ul><li>熟知java常用关键字的拼写及功能</li><li>所有的ajva关键字都是小写的</li><li>goto和const时保留关键字,在java中没有使用</li><li>true,false,null不是严格意义上的关键字,而是文字常量(literals)</li><li>程序遇到return语句将不会执行finally语句</li></ul></li><li><p>java数据类型</p><ul><li>8种数据类型:byte,short,int,long,float,double,char,boolean</li><li>8种基本数据类型占用的字节长度</li><li>3种引用数据类型:类,接口,数组</li><li>8种基本数据类型对应的包装类,被final修饰,不可被继承</li><li>String和StringBuffer类也是被final修饰</li></ul></li><li><p>java基本运算符</p><ul><li>java基本运算符的种类</li><li>java基本运算符的优先级</li><li>单目,双目,三目运算符的划分</li><li>运算符操作过程种的类型转换问题</li></ul></li><li><p>java程序流程控制语句</p><ul><li>三种执行方式:顺序结构,选择结构和循环结构</li><li>条件选择语句:if…else,switch…case</li><li>循环语句:while,do…while,for</li><li>注意while和do…while的区别,for的三个循环条件</li><li>switch支持的数据类型有:byte,short,char,int以及枚举类型</li></ul></li><li><p>java数组</p><ul><li>java数组的概念和特点</li><li>一维数组和二位数组的声名</li><li>数组初始化的两种方式:静态初始化和动态初始化</li><li>动态初始化数组必须给出长度,否则将报”缺少数组维数”的错误</li><li>动态初始化二维数组时,可以只指定第一位的长度而不指定第二维的</li><li>当数组包含的元素时引用数据类型时,必须为每个元素实例化,否则会出现空指针异常</li></ul></li></ol><p>常见java基础知识陷阱</p><ol><li>浮点数运算陷阱</li></ol><ul><li>float和double不能进行精确运算</li><li>不能简单的使用四舍五入的方法解决上述问题</li><li>可以使用BigDecimal类解决</li></ul><ol start="2"><li>自增、自减运算符陷阱</li></ol><ul><li>++和–运算符的规则</li><li>i++和++i的区别</li><li>进行增量或减量运算常见错误</li></ul><ol start="3"><li>字符和字符串陷阱</li></ol><ul><li>字符串与字符拼接规则</li><li>转义字符使用规则</li></ul><ol start="4"><li>返回与退出陷阱</li></ol><ul><li>return与try…catch语句</li><li>exit()函数与try…catch语句</li></ul><p>实例:<br>谈谈final,finally,finalize的区别?<br>答:final—修饰符(关键字)<br> finally—再异常处理时提供finally块来执行任何清除操作<br> finalize—方法名</p><h3 id="二十五-java面向对象面试指导"><a href="#二十五-java面向对象面试指导" class="headerlink" title="二十五. java面向对象面试指导"></a>二十五. java面向对象面试指导</h3><ul><li>java面向对象必会知识点<ol><li>面向对象的特点<ul><li>封装</li><li>继承</li><li>多态<br>面向对象程序涉及方法的优点:可重用性,可扩展性,可管理性</li></ul></li><li>类与对象知识点<ul><li>类与对象的概念</li><li>类方法的特点</li><li>匿名对象</li><li>构造函数与构造代码块</li><li>接口</li><li>Object</li></ul></li><li>变量相关知识点:<ul><li>成员变量与局部变量</li><li>实例变量与类变量</li><li>静态变量</li><li>变量的声名周期</li></ul></li></ol></li></ul><hr><ul><li>java面向对象知识点精华<ol><li>抽象、封装、继承、多态是面向对象程序设计中的四个特点。</li><li>面向对象的软件开发大体分为:面向对象的分析,面向对象的设计,面向对象的实现。</li><li>面向对象程序设计方法的优点是:可重用性,可扩展性,可管理性。</li><li>类的定义:class前的修饰符分为访问控制修饰符和非访问控制修饰符两大类。访问控制修饰符包括public和private,非访问控制符包括abstract(抽象),final(最终)。</li><li>final类是最终类,是不能有子类的类,abstract和final不能同时修饰一个类,因为抽象类本身是没有具体对象的,需要派生出子类后在创建子类对象,而最终类不可能有子类。</li><li>创建对象的格式:类名 对象名 = new 构造方法(参数);注意前面是类名后面是构造方法。</li><li>如果class前面由public修饰符,则默认的构造方法的前面也应该有public修饰符。</li><li>类中有static修饰的域或方法,可用类名或对象名访问,否则只能用对象名访问。</li><li>修饰域的访问控制符可以是:public,private,protected,private protected。非访问控制符可以是:static,final,volatile(易失域)。</li><li>类变量的最本质的特点是:他们是类的域,不属于任何一个类的具体对象实例。</li><li>局部变量是方法体内声名的,只有当方法被调用时他们才存在,因而只能在本方法内使用,不存在访问控制符,也不能声名为静态变量(static),但可以声名为final变量,局部变量必须初始化。</li><li>修饰方法的访问控制符可以是:public,private,protected,private protected;修饰方法的非访问控制符可以是:static,final,abstract,native(本地方法),synchronized(同步方法)。</li><li>用static修饰的变量或方法都为类成员,类成员可以用类名或实例访问,实例成员只能用实例名来访问。</li><li>如果一个类中含有抽象方法,则此类为抽象类,如果抽象类的子类不为抽象类,则子类必须实现父类的所有抽象方法。抽象方法不能用静态方法和最终方法。抽象方法只有函数头的声名,而用分号来替代方法体,没有大括号。如abstract void abstractmethod();</li><li>this变量用在一个方法内部,指向当前对象,当前对象值得是调用当前正在执行的方法的那个对象,super变量是直接指向父类的构造方法,用来引用父类中的变量和方法。</li><li>如果要引用一个保重的多个类,可以用星号来代替。使用星号只能标识本层次的所有类,而不包括子层次下的类。经常需要用两条语句来引入两个层次的类:import java.awt.<em>;improt java.awt.event.</em>;</li><li>关于访问修饰符:<ul><li>类中限定为public的成员可以被所有的类访问。</li><li>类中限定为private的成员只能被这个类本身访问。</li><li>类中限定为protected的成员可以被这类本身,他的子类,以及同一个包中的其他类访问。</li><li>用private protected修饰的成员可以被该类本身访问,也可以被类中的所有子类访问。</li><li>默认梵文控制符规定只能被同一个保重的类访问和引用,不能被其他包中的类访问。</li></ul></li><li>注意:<ul><li>abstract和private,static,final,native不能并列修饰同一个方法。</li><li>abstract类中不能有private修饰的域和方法。</li><li>static方法不能处理非static的域。</li></ul></li><li>重载方法的参数必须不同,或者是参数个数不同,或者是参数类型不同,重载的多个方法必须返回相同的数据类型。</li><li>在java中,一个类获取某个接口定义的功能并不是通过直接继承这个接口的属性和方法实现的,因为接口中的属性都是常量,接口的方法都是没有方法体的抽象方法,没有具体定义操作。</li></ol></li><li>java面向对象面试案例解析<br> 实例:接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?<br><strong>答:接口可以继承接口。抽象类可以实现接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。</strong></li></ul><h3 id="二十六-jsp和servlet面试指导"><a href="#二十六-jsp和servlet面试指导" class="headerlink" title="二十六. jsp和servlet面试指导"></a>二十六. jsp和servlet面试指导</h3><ol><li>jsp与servlet必会知识点<br> <a href="http://www.jikexueyuan.com/course/1340.html" target="_blank" rel="noopener">http://www.jikexueyuan.com/course/1340.html</a></li><li>jsp知识精华</li><li>Servlet知识点精华</li><li>jsp和servlet面试案例</li></ol><h3 id="二十七-mysql初级面试指导"><a href="#二十七-mysql初级面试指导" class="headerlink" title="二十七. mysql初级面试指导"></a>二十七. mysql初级面试指导</h3><p><a href="http://www.jikexueyuan.com/course/1362_3.html" target="_blank" rel="noopener">http://www.jikexueyuan.com/course/1362_3.html</a></p><ol><li>mysql初级必会知识</li></ol><ul><li>sql语句<ol><li>sql的增删查改基本操作</li><li>sql的条件查询</li><li>查询中的order by</li><li>查询中group by和having子句</li><li>子查询</li></ol></li></ul><ol start="2"><li>JDBC必会知识点</li><li>mysql与jdbc知识点精华</li><li>mysql与jdbc面试案例</li></ol>]]></content>
<categories>
<category> 后端 </category>
</categories>
<tags>
<tag> 基础 </tag>
<tag> Java </tag>
</tags>
</entry>
<entry>
<title>jQuery.form和jQuery.validate的使用</title>
<link href="/2015/11/20/3-2015-11-20-jquery.formandjquery.validate/"/>
<url>/2015/11/20/3-2015-11-20-jquery.formandjquery.validate/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><a id="more"></a><p>[toc]</p><h2 id="jquery-form的两种提交方式"><a href="#jquery-form的两种提交方式" class="headerlink" title="jquery.form的两种提交方式"></a>jquery.form的两种提交方式</h2><h3 id="方式1:ajaxForm"><a href="#方式1:ajaxForm" class="headerlink" title="方式1:ajaxForm"></a>方式1:ajaxForm</h3><p>ajaxForm方式必须先绑定表单,它一般在$(document).ready(function(){})中定义,他能让表单在不刷新页面的情况下post到目标,例:</p><pre class=" language-javascript"><code class="language-javascript"><span class="token function">$</span><span class="token punctuation">(</span>document<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ready</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#updateForm'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ajaxForm</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"ajaxForm提交完成"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h3 id="方式2:ajaxSubmit"><a href="#方式2:ajaxSubmit" class="headerlink" title="方式2:ajaxSubmit"></a>方式2:ajaxSubmit</h3><p>ajaxSubmit方式是以相应事件来通过ajax方式提交表单,比如单击某个按钮来触发该表单的提交,例:</p><pre class=" language-javascript"><code class="language-javascript"><span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#btnTest'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">on</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">$</span><span class="token punctuation">(</span><span class="token string">'#updateForm'</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ajaxSubmit</span><span class="token punctuation">(</span><span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token function">alert</span><span class="token punctuation">(</span><span class="token string">"ajaxForm提交完成!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><h2 id="jquery-validate-jquery-form提交的三种方式"><a href="#jquery-validate-jquery-form提交的三种方式" class="headerlink" title="jquery.validate + jquery.form提交的三种方式"></a>jquery.validate + jquery.form提交的三种方式</h2><h3 id="方式1"><a href="#方式1" class="headerlink" title="方式1"></a>方式1</h3><p>通过jquery.validate的submintHandler选项,即当表单通过验证时执行回调函数,在这个回调函数中通过jquery.form来提交表单;</p><hr><h3 id="方式2"><a href="#方式2" class="headerlink" title="方式2"></a>方式2</h3><p>通过jquery.form的beforeSubmit,即在提交表单前执行回调函数,这个函数如果返回true,则提交表单,如果返回false,则终止提交表单,根据jquery.validate插件的valid()方法,可以通过jquery.form提交表单时来对表单进行验证;</p><hr><h3 id="方式3"><a href="#方式3" class="headerlink" title="方式3"></a>方式3</h3><p>通过jquery.validate的validate()方法,这个方法的好处是对表单验证的控制更加自由。</p>]]></content>
<categories>
<category> 前端 </category>
</categories>
<tags>
<tag> jQuery </tag>
</tags>
</entry>
<entry>
<title>GitHub+Hexo搭建个人博客</title>
<link href="/2015/07/24/2-2015-07-24-hexocreate/"/>
<url>/2015/07/24/2-2015-07-24-hexocreate/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>看到同学使用github+hexo搭建了属于自己的博客,眼馋,弄了好久了,感觉有点眼高手低了,一直没来得及写一下自己搭建的流程,心血来潮,下边来简单介绍下搭建流程,也方便自己以后review,也可以和大家共享交流技术问题。<br>可以关注我的blog,</p><blockquote><p>地址:<a href="http://blog.willhappy.cn">http://blog.willhappy.cn</a></p></blockquote><a id="more"></a><p>[toc]</p><h3 id="1-hexo介绍"><a href="#1-hexo介绍" class="headerlink" title="1.hexo介绍"></a>1.hexo介绍</h3><p>Hexo简介:</p><blockquote><p>Hexo是一个基于node.js快速,简介且高效的博客框架,可以将Markdown文件快速的生成静态网页,托管到github pages上。–《摘自Judas的hexo博客》</p></blockquote><h3 id="2-搭建前准备"><a href="#2-搭建前准备" class="headerlink" title="2.搭建前准备"></a>2.搭建前准备</h3><p>所需软件</p><blockquote><ul><li>git: <a href="http://git-scm.com/" target="_blank" rel="noopener">http://git-scm.com/</a></li><li>node.js:<a href="http://nodejs.org/" target="_blank" rel="noopener">http://nodejs.org/</a></li></ul></blockquote><ul><li>运行 Git-2.7.0.2-64-bit.exe,安装完成后,验证git安装是否成功:</li></ul><pre class=" language-shell"><code class="language-shell">git --version</code></pre><p>若出现git的版本号级表示安装成功,即</p><blockquote><p>git version 2.7.0.windows.2</p></blockquote><ul><li>运行 node-v5.7.0-x64.msi,安装完成后,验证node.js是否安装成功,在git bash中执行:</li></ul><pre class=" language-shell"><code class="language-shell">npm -v</code></pre><p>若出现版本号,即代表成功,如:</p><blockquote><p>1.4.3</p></blockquote><h3 id="3-安装hexo"><a href="#3-安装hexo" class="headerlink" title="3.安装hexo"></a>3.安装hexo</h3><ul><li>可以先创建一个文件夹,命名随自己,这里假设命名为hexo,<br>在hexo目录下,打开git bash,执行:</li></ul><pre class=" language-shell"><code class="language-shell">npm install -g hexo //安装hexo</code></pre><ul><li>安装成功,继续执行命令进行hexo初始化:</li></ul><pre class=" language-shell"><code class="language-shell">hexo init //hexo初始化</code></pre><p>网速决定你的等待时间,可能需要几分钟,成功后会在hexo目录下生成相关目录。</p><ul><li><p>现在,我们就可以启动hexo本地服务,命令:</p><pre class=" language-shell"><code class="language-shell">hexo s</code></pre><p>注意(踩过的坑):</p><blockquote><p>ERROR Local hexo not found in E:\GitHub\hexo</p></blockquote><p>出现这个错误的原因可能是:仔细观察是hexo的生成目录中缺少了node_modules文件夹,所以这个文件夹没有更新上去,可以继续在git bash中执行:</p><pre class=" language-shell"><code class="language-shell">npm install</code></pre><p>重新安装以后,继续执行:hexo s 即可。</p><p>现在可以使用浏览器访问:<a href="http://localhost:4000/" target="_blank" rel="noopener">http://localhost:4000/</a>。<br>-在git bash中按Ctrl+C即可停止hexo服务。<br>现在,我们便完成了静态博客的搭建。</p></li></ul><h3 id="4-书写blog文章"><a href="#4-书写blog文章" class="headerlink" title="4.书写blog文章"></a>4.书写blog文章</h3><p> 可以在git bash中使用命令来新建文件</p><pre class=" language-shell"><code class="language-shell">hexo new "newBlog" //新建文章</code></pre><p>然后来写文章内容,但是这样过于麻烦,因为hexo 博客是支持markdown语法格式的,我们可以使用相关的编辑器编写好md文档后,将其放在hexo目录下的\source_posts文件夹下,此文件夹下已经有了一个hello-world.md文件。然后我们执行:</p><pre class=" language-shell"><code class="language-shell">hexo g //生成静态页面</code></pre><p>重新生成一下静态页面,然后执行hexo s启动服务。<br>通过<a href="http://localhost:4000/" target="_blank" rel="noopener">http://localhost:4000/</a>, 可以访问我们书写了新文章的博客了。</p><h3 id="5-配置到GitHub"><a href="#5-配置到GitHub" class="headerlink" title="5.配置到GitHub"></a>5.配置到GitHub</h3><p>到这里,我们只能通过自己启动本地服务去访问博客,别人访问不到我们的blog网站,下面介绍如何将hexo部署到github pages上,可实现任何人都可以访问自己的blog文章。</p><ul><li>首先,在github上创建一个特殊的仓库,仓库名称为:</li></ul><blockquote><p><strong>用户名</strong>.github.io</p></blockquote><p>然后在hexo目录下找到_config.yml文件,打开在最后修改如下代码:</p><pre class=" language-shell"><code class="language-shell">deploy: type: git repo: https://github.com/用户名/用户名.github.io.git branch: master</code></pre><p> 最后,在git bash中执行命令,提交到github:</p><blockquote><p>hexo d</p></blockquote><p>如果不出意外的话,在浏览器中可以通过<a href="http://用户名.github.io/" target="_blank" rel="noopener">http://用户名.github.io/</a> 来访问你的博客了。</p><p>hexo博客整体命令操作流程图:<br><img src="http://oss.willhappy.cn/18-5-3/78589442.jpg" alt="hexoBlogProces"></p><h3 id="6-主题修改"><a href="#6-主题修改" class="headerlink" title="6.主题修改"></a>6.主题修改</h3><ul><li>在这里 <a href="https://github.com/hexojs/hexo/wiki/Themes" target="_blank" rel="noopener">https://github.com/hexojs/hexo/wiki/Themes</a> 挑选好我们心动的主题。</li><li>在hexo目录下,使用git bash 执行命令:</li></ul><pre class=" language-shell"><code class="language-shell">git clone 主题地址</code></pre><ul><li>下载好主题后,同样在hexo目录下打开配置文件: <code>_config.yml</code>,把对应的主题目录名改下:</li></ul><blockquote><p>theme: 主题名称</p></blockquote><ul><li>更改好主题目录名后</li></ul><p>我们执行hexo g重新生成下静态页面,然后hexo s启动本地服务,重新访问:<code>http://localhost:4000/</code>,查看新主题的效果。</p><ul><li>确认无误后,我们执行</li></ul><pre class=" language-shell"><code class="language-shell">hexo d</code></pre><p>上传到github,最后通过 用户名.github.io访问查看最终效果。</p><h3 id="7-hexo-相关命令"><a href="#7-hexo-相关命令" class="headerlink" title="7.hexo 相关命令"></a>7.hexo 相关命令</h3><pre class=" language-shell"><code class="language-shell">hexo new page"pageName" 新建页面cls 清屏hexo clean 清理项目hexo g(generate) 生成静态页面至public目录hexo s(server) 开启预览访问端口hexo d(deploy) 将.deploy目录部署到GitHubhexo help 查看帮助hexo version 查看Hexo的版本</code></pre><h3 id="8-绑定域名"><a href="#8-绑定域名" class="headerlink" title="8.绑定域名"></a>8.绑定域名</h3><p>参考文章:<a href="https://blog.csdn.net/xiangzhihong8/article/details/53355036" target="_blank" rel="noopener">https://blog.csdn.net/xiangzhihong8/article/details/53355036</a><br>可以访问:<a href="http://blog.willhappy.cn">http://blog.willhappy.cn</a></p><h3 id="9-更多"><a href="#9-更多" class="headerlink" title="9.更多"></a>9.更多</h3><p>博客网站的主题优化,插件应用,博客文章书写技巧能相关内容敬请期待。。。<br>也可以关注hexo官方网站:hexo.io</p>]]></content>
<categories>
<category> 通用 </category>
</categories>
<tags>
<tag> Github </tag>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2015/05/23/1-2015-05-23-hello-world/"/>
<url>/2015/05/23/1-2015-05-23-hello-world/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="/assets/js/Meting.min.js"></script><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><a id="more"></a><p>[toc]</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><pre class=" language-bash"><code class="language-bash">hexo new <span class="token string">"My New Post"</span></code></pre><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><pre class=" language-bash"><code class="language-bash">hexo server</code></pre><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><pre class=" language-bash"><code class="language-bash">hexo generate</code></pre><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><pre class=" language-bash"><code class="language-bash">hexo deploy</code></pre><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>