-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
491 lines (289 loc) · 461 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>沙沙的博客</title>
<subtitle>你的努力,终将有所回报</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2019-01-16T08:41:22.091Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>wusha</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>spingboot整合Mybatis的web案例</title>
<link href="http://yoursite.com/2019/01/16/spingboot%E6%95%B4%E5%90%88Mybatis%E7%9A%84web%E6%A1%88%E4%BE%8B/"/>
<id>http://yoursite.com/2019/01/16/spingboot整合Mybatis的web案例/</id>
<published>2019-01-16T08:37:29.000Z</published>
<updated>2019-01-16T08:41:22.091Z</updated>
<content type="html"><![CDATA[<p><img src="/2019/01/16/spingboot整合Mybatis的web案例/1.jpeg" alt="在这里插入图片描述"><br><a id="more"></a></p><h3 id="还是再来了解一些springboot"><a href="#还是再来了解一些springboot" class="headerlink" title="还是再来了解一些springboot"></a>还是再来了解一些springboot</h3><blockquote><p>spring boot自述 spring boot<br>是用来简化spring应用的搭建到开发过程,应用开箱即用,只要通过“just-jar”或tomcat或maven插件run或shell脚本,就可以启动项目。二者,spring boot只要很少的spring配置文件,因为”习惯优于配置”原则,是的spring boot 在开发应用和微服务架构实践中得到广泛应用。</p></blockquote><h4 id="数据库准备"><a href="#数据库准备" class="headerlink" title="数据库准备"></a>数据库准备</h4><figure class="highlight n1ql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> springbootdb;<br></code></pre></td></tr></table></figure><h4 id="创建表"><a href="#创建表" class="headerlink" title="创建表"></a>创建表</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`city`</span>;<br><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`city`</span> (<br> <span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'城市编号'</span>,<br> <span class="hljs-string">`province_id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'省份编号'</span>,<br> <span class="hljs-string">`city_name`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'城市名称'</span>,<br> <span class="hljs-string">`description`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'描述'</span>,<br> PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)<br>) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">1</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;<br></code></pre></td></tr></table></figure><h4 id="项目结构介绍"><a href="#项目结构介绍" class="headerlink" title="项目结构介绍"></a>项目结构介绍</h4><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined">org<span class="hljs-selector-class">.spring</span><span class="hljs-selector-class">.springboot</span><span class="hljs-selector-class">.controller</span> - Controller 层<br>org<span class="hljs-selector-class">.spring</span><span class="hljs-selector-class">.springboot</span><span class="hljs-selector-class">.dao</span> - 数据操作层 DAO<br>org<span class="hljs-selector-class">.spring</span><span class="hljs-selector-class">.springboot</span><span class="hljs-selector-class">.domain</span> - 实体类<br>org<span class="hljs-selector-class">.spring</span><span class="hljs-selector-class">.springboot</span><span class="hljs-selector-class">.service</span> - 业务逻辑层<br>Application - 应用启动类<br>application<span class="hljs-selector-class">.properties</span> - 应用配置文件,应用启动会自动读取配置(数据库配置文件)<br></code></pre></td></tr></table></figure><p><img src="/2019/01/16/spingboot整合Mybatis的web案例/1.png" alt="如图"></p><h4 id="具体实现代码"><a href="#具体实现代码" class="headerlink" title="具体实现代码"></a>具体实现代码</h4><p>controller</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Controller</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CityController</span> </span>{<br><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> CityService cityService;<br><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/api/city/{id}"</span>, method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> String findOneCity(Model model, <span class="hljs-meta">@PathVariable(<span class="hljs-meta-string">"id"</span>)</span> <span class="hljs-built_in">Long</span> id) {<br> model.addAttribute(<span class="hljs-string">"city"</span>, cityService.findCityById(id));<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"city"</span>;<br> }<br><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/api/city"</span>, method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> String findAllCity(Model model) {<br> List<City> cityList = cityService.findAllCity();<br> model.addAttribute(<span class="hljs-string">"cityList"</span>,cityList);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"cityList"</span>;<br> }<br>}<br></code></pre></td></tr></table></figure><p>dao层</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Repository</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CityDao</span> </span>{<br><br> <span class="hljs-comment">/**<br> * 获取城市信息列表<br> *<br> * <span class="hljs-doctag">@return</span><br> */</span><br> List<City> findAllCity();<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,获取城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> City findById(<span class="hljs-meta">@Param(<span class="hljs-meta-string">"id"</span>)</span> <span class="hljs-built_in">Long</span> id);<br><br> <span class="hljs-built_in">Long</span> saveCity(City city);<br><br> <span class="hljs-built_in">Long</span> updateCity(City city);<br><br> <span class="hljs-built_in">Long</span> deleteCity(<span class="hljs-built_in">Long</span> id);<br>}<br></code></pre></td></tr></table></figure><p>实体类</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> City {<br><br> <span class="hljs-comment">/**<br> * 城市编号<br> */</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">Long</span> id;<br><br> <span class="hljs-comment">/**<br> * 省份编号<br> */</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">Long</span> provinceId;<br><br> <span class="hljs-comment">/**<br> * 城市名称<br> */</span><br> <span class="hljs-keyword">private</span> String cityName;<br><br> <span class="hljs-comment">/**<br> * 描述<br> */</span><br> <span class="hljs-keyword">private</span> String <span class="hljs-keyword">description</span>;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">Long</span> getId() {<br> <span class="hljs-keyword">return</span> id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setId(<span class="hljs-keyword">Long</span> id) {<br> <span class="hljs-keyword">this</span>.id = id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">Long</span> getProvinceId() {<br> <span class="hljs-keyword">return</span> provinceId;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setProvinceId(<span class="hljs-keyword">Long</span> provinceId) {<br> <span class="hljs-keyword">this</span>.provinceId = provinceId;<br> }<br><br> <span class="hljs-keyword">public</span> String getCityName() {<br> <span class="hljs-keyword">return</span> cityName;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setCityName(String cityName) {<br> <span class="hljs-keyword">this</span>.cityName = cityName;<br> }<br><br> <span class="hljs-keyword">public</span> String getDescription() {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">description</span>;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setDescription(String <span class="hljs-keyword">description</span>) {<br> <span class="hljs-keyword">this</span>.<span class="hljs-keyword">description</span> = <span class="hljs-keyword">description</span>;<br> }<br>}<br></code></pre></td></tr></table></figure><p>service业务逻辑层<br>业务接口<br><figure class="highlight zephir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CityService</span> </span>{<br><br> <span class="hljs-comment">/**<br> * 获取城市信息列表<br> *<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">List</span><City> findAllCity();<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,查询城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> City findCityById(<span class="hljs-keyword">Long</span> id);<br><br> <span class="hljs-comment">/**<br> * 新增城市信息<br> *<br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> saveCity(City city);<br><br> <span class="hljs-comment">/**<br> * 更新城市信息<br> *<br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> updateCity(City city);<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,删除城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> deleteCity(<span class="hljs-keyword">Long</span> id);<br>}<br></code></pre></td></tr></table></figure></p><p>业务实现</p><figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Service</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CityServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">CityService</span> </span>{<br><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> CityDao cityDao;<br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> List<City> findAllCity(){<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">findAllCity</span><span class="hljs-params">()</span></span>;<br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">City <span class="hljs-title">findCityById</span><span class="hljs-params">(Long id)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">findById</span><span class="hljs-params">(id)</span></span>;<br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">saveCity</span><span class="hljs-params">(City city)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">saveCity</span><span class="hljs-params">(city)</span></span>;<br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">updateCity</span><span class="hljs-params">(City city)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">updateCity</span><span class="hljs-params">(city)</span></span>;<br> }<br><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">deleteCity</span><span class="hljs-params">(Long id)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">deleteCity</span><span class="hljs-params">(id)</span></span>;<br> }<br><br>}<br></code></pre></td></tr></table></figure><p>pom文件</p><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="xml"><span class="hljs-comment"><!-- Spring Boot 启动父依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">parent</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-parent<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>1.5.1.RELEASE<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">parent</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">properties</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">mybatis-spring-boot</span>></span>1.2.0<span class="hljs-tag"></<span class="hljs-name">mybatis-spring-boot</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">mysql-connector</span>></span>5.1.39<span class="hljs-tag"></<span class="hljs-name">mysql-connector</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">properties</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">dependencies</span>></span><br> <span class="hljs-comment"><!-- Spring Boot Freemarker 依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-freemarker<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br> <span class="hljs-comment"><!-- Spring Boot Web 依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br> <span class="hljs-comment"><!-- Spring Boot Test 依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">scope</span>></span>test<span class="hljs-tag"></<span class="hljs-name">scope</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br> <span class="hljs-comment"><!-- Spring Boot Mybatis 依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>org.mybatis.spring.boot<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mybatis-spring-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{mybatis-spring-boot}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br> <span class="hljs-comment"><!-- MySQL 连接驱动依赖 --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>mysql<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>mysql-connector-java<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>$</span><span class="hljs-template-variable">{mysql-connector}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">version</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br><br><br> <span class="hljs-comment"><!-- Junit --></span><br> <span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>junit<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>junit<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>4.12<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">dependencies</span>></span></span><br></code></pre></td></tr></table></figure><p>application.properties</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">## 数据源配置</span><br>spring.datasource.<span class="hljs-attribute">url</span>=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8<br>spring.datasource.<span class="hljs-attribute">username</span>=root<br>spring.datasource.<span class="hljs-attribute">password</span>=123456<br>spring.datasource.<span class="hljs-attribute">driver-class-name</span>=com.mysql.jdbc.Driver<br>spring.jpa.properties.hibernate.hbm2ddl.<span class="hljs-attribute">auto</span>=create-drop<br><span class="hljs-comment">## Mybatis 配置</span><br>mybatis.<span class="hljs-attribute">typeAliasesPackage</span>=org.spring.springboot.domain<br>mybatis.<span class="hljs-attribute">mapperLocations</span>=classpath:mapper/*.xml<br><span class="hljs-comment">#</span><br><span class="hljs-comment">### Freemarker 配置</span><br><span class="hljs-comment">### 文件配置路径</span><br>spring.freemarker.<span class="hljs-attribute">template-loader-path</span>=classpath:/web/<br>spring.freemarker.<span class="hljs-attribute">cache</span>=<span class="hljs-literal">false</span><br>spring.freemarker.<span class="hljs-attribute">charset</span>=UTF-8<br>spring.freemarker.<span class="hljs-attribute">check-template-location</span>=<span class="hljs-literal">true</span><br>spring.freemarker.<span class="hljs-attribute">content-type</span>=text/html<br>spring.freemarker.<span class="hljs-attribute">expose-request-attributes</span>=<span class="hljs-literal">true</span><br>spring.freemarker.<span class="hljs-attribute">expose-session-attributes</span>=<span class="hljs-literal">true</span><br>spring.freemarker.<span class="hljs-attribute">request-context-attribute</span>=request<br>spring.freemarker.<span class="hljs-attribute">suffix</span>=.ftl<br></code></pre></td></tr></table></figure><h4 id="页面效果"><a href="#页面效果" class="headerlink" title="页面效果"></a>页面效果</h4><p>具体的页面可以结合前端框架<br><img src="/2019/01/16/spingboot整合Mybatis的web案例/2.png" alt="在这里插入图片描述"></p>]]></content>
<summary type="html">
<p><img src="/2019/01/16/spingboot整合Mybatis的web案例/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
</entry>
<entry>
<title>Spring Boot 使用Swagger2构建RESTful API</title>
<link href="http://yoursite.com/2018/12/27/spring-Boot-%E4%BD%BF%E7%94%A8Swagger2%E6%9E%84%E5%BB%BARESTful-API/"/>
<id>http://yoursite.com/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/</id>
<published>2018-12-27T08:32:00.000Z</published>
<updated>2018-12-27T08:40:19.902Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/1.jpeg" alt="在这里插入图片描述"><br><a id="more"></a></p><h3 id="Swagger2是什么?"><a href="#Swagger2是什么?" class="headerlink" title="Swagger2是什么?"></a>Swagger2是什么?</h3><p>Swagger2,它可以轻松的整合到Spring Boot中,并与Spring MVC程序配合组织出强大RESTful API文档。它既可以减少我们创建文档的工作量,同时说明内容又整合入实现代码中,让维护文档和修改代码整合为一体,可以让我们在修改代码逻辑的同时方便的修改文档说明。另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API。具体效果如下图所示:<br><img src="/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/1.png" alt="在这里插入图片描述"></p><h3 id="Spring-Boot开发"><a href="#Spring-Boot开发" class="headerlink" title="Spring Boot开发"></a>Spring Boot开发</h3><blockquote><p>由于Spring Boot能够快速开发、便捷部署等特性,相信有很大一部分Spring Boot的用户会用来构建RESTful<br>API。而我们构建RESTful API的目的通常都是由于多终端的原因,这些终端会共用很多底层业务逻辑,因此我们会抽象出这样一层来同时服务于多个移动端或者Web前端。</p></blockquote><p>这样一来,我们的RESTful API就有可能要面对多个开发人员或多个开发团队:IOS开发、Android开发或是Web开发等。为了减少与其他团队平时开发期间的频繁沟通成本,传统做法我们会创建一份RESTful API文档来记录所有接口细节,然而这样的做法有以下几个问题:</p><ul><li>由于接口众多,并且细节复杂(需要考虑不同的HTTP请求类型、HTTP头部信息、HTTP请求内容等),高质量地创建这份文档本身就是件非常吃力的事,下游的抱怨声不绝于耳。</li><li>随着时间推移,不断修改接口实现的时候都必须同步修改接口文档,而文档与代码又处于两个不同的媒介,除非有严格的管理机制,不然很容易导致不一致现象。</li></ul><h3 id="开发案例"><a href="#开发案例" class="headerlink" title="开发案例"></a>开发案例</h3><h4 id="项目结构"><a href="#项目结构" class="headerlink" title="项目结构"></a>项目结构</h4><p><img src="/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/2.png" alt="在这里插入图片描述"></p><h4 id="pojo类"><a href="#pojo类" class="headerlink" title="pojo类"></a>pojo类</h4><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User {<br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> id;<br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> name;<br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> age;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getId() {<br> <span class="hljs-keyword">return</span> id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setId(<span class="hljs-built_in">String</span> id) {<br> <span class="hljs-keyword">this</span>.id = id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getName() {<br> <span class="hljs-keyword">return</span> name;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setName(<span class="hljs-built_in">String</span> name) {<br> <span class="hljs-keyword">this</span>.name = name;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getAge() {<br> <span class="hljs-keyword">return</span> age;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setAge(<span class="hljs-built_in">String</span> age) {<br> <span class="hljs-keyword">this</span>.age = age;<br> }<br>}<br></code></pre></td></tr></table></figure><h4 id="添加Swagger2依赖"><a href="#添加Swagger2依赖" class="headerlink" title="添加Swagger2依赖"></a>添加Swagger2依赖</h4><p>在pom.xml中加入Swagger2的依赖</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>io.springfox<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>springfox-swagger2<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>2.2.2<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br><span class="hljs-tag"><<span class="hljs-name">dependency</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>io.springfox<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>springfox-swagger-ui<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>2.2.2<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br><span class="hljs-tag"></<span class="hljs-name">dependency</span>></span><br></code></pre></td></tr></table></figure><h4 id="创建Swagger2配置类"><a href="#创建Swagger2配置类" class="headerlink" title="创建Swagger2配置类"></a>创建Swagger2配置类</h4><p>在Application.java同级创建Swagger2的配置类Swagger2。</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@Configuration</span><br><span class="hljs-variable">@EnableSwagger2</span><span class="hljs-comment">/** 启用注解*/</span><br>public class Swagger2 {<br> <span class="hljs-variable">@Bean</span><br> public Docket createRestApi(){<br> <span class="hljs-selector-tag">return</span> <span class="hljs-selector-tag">new</span> <span class="hljs-selector-tag">Docket</span>(DocumentationType.SWAGGER_2)<br> <span class="hljs-selector-class">.apiInfo</span>(apiInfo())<br> <span class="hljs-selector-class">.select</span>()<br> <span class="hljs-selector-class">.apis</span>(RequestHandlerSelectors.basePackage(<span class="hljs-string">"com.example.demo.controller"</span>))<br> <span class="hljs-selector-class">.paths</span>(PathSelectors.any())<br> <span class="hljs-selector-class">.build</span>();<br> }<br><br> <span class="hljs-comment">/**<br> * 创建该Api的基本信息(这些信息会展示在页面中)<br> * @return<br> */</span><br> <span class="hljs-selector-tag">private</span> <span class="hljs-selector-tag">ApiInfo</span> <span class="hljs-selector-tag">apiInfo</span>() {<br> <span class="hljs-selector-tag">return</span> <span class="hljs-selector-tag">new</span> <span class="hljs-selector-tag">ApiInfoBuilder</span>()<br> <span class="hljs-selector-class">.title</span>(<span class="hljs-string">"Spring Boot中使用Swagger2构建RESTful APIs"</span>)<br> <span class="hljs-selector-class">.description</span>(<span class="hljs-string">"Spring Boot 中使用restful使用指南"</span>)<br> <span class="hljs-selector-class">.termsOfServiceUrl</span>(<span class="hljs-string">"http://wusha.github.io.com"</span>)<br> <span class="hljs-selector-class">.contact</span>(<span class="hljs-string">"ss"</span>)<br> <span class="hljs-selector-class">.version</span>(<span class="hljs-string">"1.0"</span>)<br> <span class="hljs-selector-class">.build</span>();<br> }<br>}<br></code></pre></td></tr></table></figure><p>如上代码所示,通过@Configuration注解,让Spring来加载该类配置。再通过@EnableSwagger2注解来启用Swagger2。</p><p>再通过createRestApi函数创建Docket的Bean之后,apiInfo()用来创建该Api的基本信息(这些基本信息会展现在文档页面中)。select()函数返回一个ApiSelectorBuilder实例用来控制哪些接口暴露给Swagger来展现,指定扫描的包路径来定义,Swagger会扫描该包下所有Controller定义的API,并产生文档内容(除了被@ApiIgnore指定的请求)。</p><h4 id="controller层"><a href="#controller层" class="headerlink" title="controller层"></a>controller层</h4><p>在完成了上述配置后,其实已经可以生产文档内容,但是这样的文档主要针对请求本身,而描述主要来源于函数等命名产生,对用户并不友好,我们通常需要自己增加一些说明来丰富文档内容。如下所示,我们通过@ApiOperation注解来给API增加说明、通过@ApiImplicitParams、@ApiImplicitParam注解来给参数增加说明。<br><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/users"</span>)</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserController</span> </span>{<br><br> static Map<String,User> users = Collections.synchronizedMap(new HashMap<String,User>());<br><br> <span class="hljs-meta">@ApiOperation(value = <span class="hljs-meta-string">"获取用户列表"</span>,notes = <span class="hljs-meta-string">""</span>)</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">""</span>,method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> List<User> findAll(){<br> List<User> list = new ArrayList<User>(users.values());<br> <span class="hljs-keyword">return</span> list;<br> }<br><br> <span class="hljs-meta">@ApiOperation(value = <span class="hljs-meta-string">"新增用户"</span>,notes = <span class="hljs-meta-string">""</span>)</span><br> <span class="hljs-meta">@ApiImplicitParam(name = <span class="hljs-meta-string">"user"</span>,value = <span class="hljs-meta-string">"用户实体"</span>,required = true,dataType = <span class="hljs-meta-string">"User"</span>)</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">""</span>,method = RequestMethod.POST)</span><br> <span class="hljs-keyword">public</span> String add(<span class="hljs-meta">@RequestBody</span> User user){<br> users.put(user.getId(),user);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br><br> <span class="hljs-comment">/**<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@ApiOperation(value = <span class="hljs-meta-string">"查询根据id"</span>,notes = <span class="hljs-meta-string">""</span>)</span><br> <span class="hljs-meta">@ApiImplicitParam(name = <span class="hljs-meta-string">"id"</span>,value = <span class="hljs-meta-string">"用户id"</span>,required = true,dataType = <span class="hljs-meta-string">"String"</span>,paramType = <span class="hljs-meta-string">"path"</span>)</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> User findById(<span class="hljs-meta">@PathVariable</span> String id){<br> <span class="hljs-keyword">return</span> users.<span class="hljs-keyword">get</span>(id);<br> }<br><br><br><br> <span class="hljs-meta">@ApiOperation(value = <span class="hljs-meta-string">"修改用户信息"</span>,notes = <span class="hljs-meta-string">""</span>)</span><br> <span class="hljs-meta">@ApiImplicitParam(name = <span class="hljs-meta-string">"user"</span>,value = <span class="hljs-meta-string">"用户实体"</span>,required = true,dataType = <span class="hljs-meta-string">"User"</span>)</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.PUT)</span><br> <span class="hljs-keyword">public</span> String update(<span class="hljs-meta">@PathVariable</span> String id,<span class="hljs-meta">@RequestBody</span> User user){<br> User user1 = users.<span class="hljs-keyword">get</span>(id);<br> user1.setAge(user.getAge());<br> user1.setName(user.getName());<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br><br> <span class="hljs-meta">@ApiOperation(value = <span class="hljs-meta-string">"根据id删除用户"</span>,notes = <span class="hljs-meta-string">""</span>)</span><br> <span class="hljs-meta">@ApiImplicitParam(name = <span class="hljs-meta-string">"id"</span>,value = <span class="hljs-meta-string">"用户id"</span>,required = true,dataType = <span class="hljs-meta-string">"String"</span>,paramType = <span class="hljs-meta-string">"path"</span>)</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.DELETE)</span><br> <span class="hljs-keyword">public</span> String delete(<span class="hljs-meta">@RequestBody</span> String id){<br> users.remove(id);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br>}<br></code></pre></td></tr></table></figure></p><p>完成上述代码添加上,启动Spring Boot程序,访问:<a href="http://localhost:8080/swagger-ui.html" target="_blank" rel="noopener">http://localhost:8080/swagger-ui.html</a><br>。就能看到前文所展示的RESTful API的页面。我们可以再点开具体的API请求,以POST类型的/users请求为例,可找到上述代码中我们配置的Notes信息以及参数user的描述信息,如下图所示。<br><img src="/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/3.png" alt="在这里插入图片描述"></p>]]></content>
<summary type="html">
<p><img src="/2018/12/27/spring-Boot-使用Swagger2构建RESTful-API/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="微服务" scheme="http://yoursite.com/categories/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="Spring Boot" scheme="http://yoursite.com/tags/Spring-Boot/"/>
<category term="Swagger2" scheme="http://yoursite.com/tags/Swagger2/"/>
<category term="RESTful API" scheme="http://yoursite.com/tags/RESTful-API/"/>
</entry>
<entry>
<title>SpringBoot实现Restful服务,基于HTTP-JSON传输</title>
<link href="http://yoursite.com/2018/12/19/SpringBoot%E5%AE%9E%E7%8E%B0Restful%E6%9C%8D%E5%8A%A1%EF%BC%8C%E5%9F%BA%E4%BA%8EHTTP-JSON%E4%BC%A0%E8%BE%93/"/>
<id>http://yoursite.com/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/</id>
<published>2018-12-19T09:04:00.000Z</published>
<updated>2018-12-20T01:42:17.260Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h3 id="一,数据库准备"><a href="#一,数据库准备" class="headerlink" title="一,数据库准备"></a>一,数据库准备</h3><p>1)创建数据库</p><figure class="highlight n1ql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">DATABASE</span> springbootdb;<br></code></pre></td></tr></table></figure><p>2)创建表</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">DROP</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-keyword">IF</span> <span class="hljs-keyword">EXISTS</span> <span class="hljs-string">`city`</span>;<br><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> <span class="hljs-string">`city`</span> (<br> <span class="hljs-string">`id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> AUTO_INCREMENT <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'城市编号'</span>,<br> <span class="hljs-string">`province_id`</span> <span class="hljs-built_in">int</span>(<span class="hljs-number">10</span>) <span class="hljs-keyword">unsigned</span> <span class="hljs-keyword">NOT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'省份编号'</span>,<br> <span class="hljs-string">`city_name`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'城市名称'</span>,<br> <span class="hljs-string">`description`</span> <span class="hljs-built_in">varchar</span>(<span class="hljs-number">25</span>) <span class="hljs-keyword">DEFAULT</span> <span class="hljs-literal">NULL</span> <span class="hljs-keyword">COMMENT</span> <span class="hljs-string">'描述'</span>,<br> PRIMARY <span class="hljs-keyword">KEY</span> (<span class="hljs-string">`id`</span>)<br>) <span class="hljs-keyword">ENGINE</span>=<span class="hljs-keyword">InnoDB</span> AUTO_INCREMENT=<span class="hljs-number">1</span> <span class="hljs-keyword">DEFAULT</span> <span class="hljs-keyword">CHARSET</span>=utf8;<br></code></pre></td></tr></table></figure><p>3)插入数据</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">INSERT</span> city <span class="hljs-keyword">VALUES</span> (<span class="hljs-number">1001</span> ,<span class="hljs-number">110</span>,<span class="hljs-string">'福建'</span>,<span class="hljs-string">'今天很开心'</span>);<br></code></pre></td></tr></table></figure><h3 id="二,项目结构"><a href="#二,项目结构" class="headerlink" title="二,项目结构"></a>二,项目结构</h3><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/1.png" alt="项目"></p><blockquote><p>项目结构解读</p></blockquote><ul><li>controller控制层</li><li>dao接口层</li><li>domain实体类</li><li>service业务逻辑接口类</li><li>service impl 业务逻辑实现类</li><li>application.properties 应用配置文件,应用启动会自动读取配置</li></ul><blockquote><p> 代码实现</p></blockquote><blockquote><p>实体层</p></blockquote><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">/**<br> * 城市实体类<br> *<br> * Created by ws on 10/12/2018.<br> * <br> */</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> City {<br><br> <span class="hljs-comment">/**<br> * 城市编号<br> */</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">Long</span> id;<br><br> <span class="hljs-comment">/**<br> * 省份编号<br> */</span><br> <span class="hljs-keyword">private</span> <span class="hljs-keyword">Long</span> provinceId;<br><br> <span class="hljs-comment">/**<br> * 城市名称<br> */</span><br> <span class="hljs-keyword">private</span> String cityName;<br><br> <span class="hljs-comment">/**<br> * 描述<br> */</span><br> <span class="hljs-keyword">private</span> String <span class="hljs-keyword">description</span>;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">Long</span> getId() {<br> <span class="hljs-keyword">return</span> id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setId(<span class="hljs-keyword">Long</span> id) {<br> <span class="hljs-keyword">this</span>.id = id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">Long</span> getProvinceId() {<br> <span class="hljs-keyword">return</span> provinceId;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setProvinceId(<span class="hljs-keyword">Long</span> provinceId) {<br> <span class="hljs-keyword">this</span>.provinceId = provinceId;<br> }<br><br> <span class="hljs-keyword">public</span> String getCityName() {<br> <span class="hljs-keyword">return</span> cityName;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setCityName(String cityName) {<br> <span class="hljs-keyword">this</span>.cityName = cityName;<br> }<br><br> <span class="hljs-keyword">public</span> String getDescription() {<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">description</span>;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> setDescription(String <span class="hljs-keyword">description</span>) {<br> <span class="hljs-keyword">this</span>.<span class="hljs-keyword">description</span> = <span class="hljs-keyword">description</span>;<br> }<br>}<br></code></pre></td></tr></table></figure><blockquote><p>接口层</p></blockquote><figure class="highlight zephir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">/**<br> * 城市 DAO 接口类<br> *<br> *Created by ws on 10/12/2018.<br> */</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CityDao</span> </span>{<br><br> <span class="hljs-comment">/**<br> * 获取城市信息列表<br> *<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">List</span><City> findAllCity();<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,获取城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> City findById(@Param(<span class="hljs-string">"id"</span>) <span class="hljs-keyword">Long</span> id);<br><br> <span class="hljs-keyword">Long</span> saveCity(City city);<br><br> <span class="hljs-keyword">Long</span> updateCity(City city);<br><br> <span class="hljs-keyword">Long</span> deleteCity(<span class="hljs-keyword">Long</span> id);<br>}<br></code></pre></td></tr></table></figure><blockquote><p>接口对应的mapper层</p></blockquote><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="xml"><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span> <span class="hljs-meta">?></span></span><br><span class="hljs-meta"><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ></span><br><span class="hljs-tag"><<span class="hljs-name">mapper</span> <span class="hljs-attr">namespace</span>=<span class="hljs-string">"org.spring.springboot.dao.CityDao"</span>></span><br><span class="hljs-tag"><<span class="hljs-name">resultMap</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"BaseResultMap"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"org.spring.springboot.domain.City"</span>></span><br><span class="hljs-tag"><<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"id"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"id"</span> /></span><br><span class="hljs-tag"><<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"province_id"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"provinceId"</span> /></span><br><span class="hljs-tag"><<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"city_name"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"cityName"</span> /></span><br><span class="hljs-tag"><<span class="hljs-name">result</span> <span class="hljs-attr">column</span>=<span class="hljs-string">"description"</span> <span class="hljs-attr">property</span>=<span class="hljs-string">"description"</span> /></span><br><span class="hljs-tag"></<span class="hljs-name">resultMap</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">parameterMap</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"City"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"org.spring.springboot.domain.City"</span>/></span><br><br><span class="hljs-tag"><<span class="hljs-name">sql</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"Base_Column_List"</span>></span><br>id, province_id, city_name, description<br><span class="hljs-tag"></<span class="hljs-name">sql</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">select</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"findById"</span> <span class="hljs-attr">resultMap</span>=<span class="hljs-string">"BaseResultMap"</span> <span class="hljs-attr">parameterType</span>=<span class="hljs-string">"java.lang.Long"</span>></span><br>select<br><span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">refid</span>=<span class="hljs-string">"Base_Column_List"</span> /></span><br>from city<br>where id = #</span><span class="hljs-template-variable">{id}</span><span class="xml"><br><span class="hljs-tag"></<span class="hljs-name">select</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">select</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"findAllCity"</span> <span class="hljs-attr">resultMap</span>=<span class="hljs-string">"BaseResultMap"</span> ></span><br>select<br><span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">refid</span>=<span class="hljs-string">"Base_Column_List"</span> /></span><br>from city<br><span class="hljs-tag"></<span class="hljs-name">select</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">insert</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"saveCity"</span> <span class="hljs-attr">parameterMap</span>=<span class="hljs-string">"City"</span> <span class="hljs-attr">useGeneratedKeys</span>=<span class="hljs-string">"true"</span> <span class="hljs-attr">keyProperty</span>=<span class="hljs-string">"id"</span>></span><br>insert into<br>city(id,province_id,city_name,description)<br>values<br>(#</span><span class="hljs-template-variable">{id}</span><span class="xml">,#</span><span class="hljs-template-variable">{provinceId}</span><span class="xml">,#</span><span class="hljs-template-variable">{cityName}</span><span class="xml">,#</span><span class="hljs-template-variable">{description}</span><span class="xml">)<br><span class="hljs-tag"></<span class="hljs-name">insert</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">update</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"updateCity"</span> <span class="hljs-attr">parameterMap</span>=<span class="hljs-string">"City"</span>></span><br>update<br>city<br>set<br><span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"provinceId!=null"</span>></span><br>province_id = #</span><span class="hljs-template-variable">{provinceId}</span><span class="xml">,<br><span class="hljs-tag"></<span class="hljs-name">if</span>></span><br><span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"cityName!=null"</span>></span><br>city_name = #</span><span class="hljs-template-variable">{cityName}</span><span class="xml">,<br><span class="hljs-tag"></<span class="hljs-name">if</span>></span><br><span class="hljs-tag"><<span class="hljs-name">if</span> <span class="hljs-attr">test</span>=<span class="hljs-string">"description!=null"</span>></span><br>description = #</span><span class="hljs-template-variable">{description}</span><span class="xml"><br><span class="hljs-tag"></<span class="hljs-name">if</span>></span><br>where<br>id = #</span><span class="hljs-template-variable">{id}</span><span class="xml"><br><span class="hljs-tag"></<span class="hljs-name">update</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">delete</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"deleteCity"</span> <span class="hljs-attr">parameterType</span>=<span class="hljs-string">"java.lang.Long"</span>></span><br>delete from<br>city<br>where<br>id = #</span><span class="hljs-template-variable">{id}</span><span class="xml"><br><span class="hljs-tag"></<span class="hljs-name">delete</span>></span><br><span class="hljs-tag"></<span class="hljs-name">mapper</span>></span></span><br></code></pre></td></tr></table></figure><blockquote><p>业务逻辑接口层</p></blockquote><figure class="highlight zephir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">/**<br> * 城市业务逻辑接口类<br> *<br> * Created by ws on 10/12/2018.<br> */</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">CityService</span> </span>{<br><br> <span class="hljs-comment">/**<br> * 获取城市信息列表<br> *<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">List</span><City> findAllCity();<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,查询城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> City findCityById(<span class="hljs-keyword">Long</span> id);<br><br> <span class="hljs-comment">/**<br> * 新增城市信息<br> *<br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> saveCity(City city);<br><br> <span class="hljs-comment">/**<br> * 更新城市信息<br> *<br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> updateCity(City city);<br><br> <span class="hljs-comment">/**<br> * 根据城市 ID,删除城市信息<br> *<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">Long</span> deleteCity(<span class="hljs-keyword">Long</span> id);<br>}<br></code></pre></td></tr></table></figure><blockquote><p>业务逻辑接口实现类</p></blockquote><figure class="highlight aspectj"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">/**<br> * 城市业务逻辑实现类<br> *<br> * Created by ws on 10/12/2018.<br> */</span><br><span class="hljs-meta">@Service</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CityServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">CityService</span> </span>{<br><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> CityDao cityDao;<br><br> <span class="hljs-comment">/**<br> * 查询所有<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">public</span> List<City> findAllCity(){<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">findAllCity</span><span class="hljs-params">()</span></span>;<br> }<br><br> <span class="hljs-comment">/**<br> * 根据id查找相关<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">City <span class="hljs-title">findCityById</span><span class="hljs-params">(Long id)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">findById</span><span class="hljs-params">(id)</span></span>;<br> }<br><br> <span class="hljs-comment">/**<br> * 新增<br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">saveCity</span><span class="hljs-params">(City city)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">saveCity</span><span class="hljs-params">(city)</span></span>;<br> }<br><br> <span class="hljs-comment">/**<br> *修改 <br> * <span class="hljs-doctag">@param</span> city<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">updateCity</span><span class="hljs-params">(City city)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">updateCity</span><span class="hljs-params">(city)</span></span>;<br> }<br><br> <span class="hljs-comment">/**<br> * 删除<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@Override</span><br> <span class="hljs-keyword">public</span> <span class="hljs-function">Long <span class="hljs-title">deleteCity</span><span class="hljs-params">(Long id)</span> </span>{<br> <span class="hljs-function"><span class="hljs-keyword">return</span> cityDao.<span class="hljs-title">deleteCity</span><span class="hljs-params">(id)</span></span>;<br> }<br><br>}<br></code></pre></td></tr></table></figure><blockquote><p>controller层代码</p></blockquote><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><code class="hljs undefined">**<br> * 城市 Controller 实现 Restful HTTP 服务<br> *<br> * Created <span class="hljs-keyword">by</span> ws on <span class="hljs-number">10</span>/<span class="hljs-number">12</span>/<span class="hljs-number">2018.</span><br> */<br><span class="hljs-meta">@RestController</span><br><span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/api/city"</span>)</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CityRestController</span> </span>{<br><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> CityService cityService;<br><br> <span class="hljs-comment">/**<br> * 根据id来查找<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>, method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> City findOneCity(<span class="hljs-meta">@PathVariable(<span class="hljs-meta-string">"id"</span>)</span> <span class="hljs-built_in">Long</span> id) {<br> <span class="hljs-keyword">return</span> cityService.findCityById(id);<br> }<br><br> <span class="hljs-comment">/**<br> * 查询所有<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/"</span>, method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> List<City> findAllCity() {<br> <span class="hljs-keyword">return</span> cityService.findAllCity();<br> }<br><br> <span class="hljs-comment">/**<br> * 新增<br> * <span class="hljs-doctag">@param</span> city<br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/"</span>, method = RequestMethod.POST)</span><br> <span class="hljs-keyword">public</span> void createCity(<span class="hljs-meta">@RequestBody</span> City city) {<br> cityService.saveCity(city);<br> }<br><br> <span class="hljs-comment">/**<br> * 修改<br> * <span class="hljs-doctag">@param</span> city<br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/"</span>, method = RequestMethod.PUT)</span><br> <span class="hljs-keyword">public</span> void modifyCity(<span class="hljs-meta">@RequestBody</span> City city) {<br> cityService.updateCity(city);<br> }<br><br> <span class="hljs-comment">/**<br> * 删除<br> * <span class="hljs-doctag">@param</span> id<br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>, method = RequestMethod.DELETE)</span><br> <span class="hljs-keyword">public</span> void modifyCity(<span class="hljs-meta">@PathVariable(<span class="hljs-meta-string">"id"</span>)</span> <span class="hljs-built_in">Long</span> id) {<br> cityService.deleteCity(id);<br> }<br>}<br></code></pre></td></tr></table></figure><blockquote><p>数据库配置文件</p></blockquote><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">## 数据源配置</span><br>spring.datasource.<span class="hljs-attribute">url</span>=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8<br>spring.datasource.<span class="hljs-attribute">username</span>=root<br>spring.datasource.<span class="hljs-attribute">password</span>=123456<br>spring.datasource.<span class="hljs-attribute">driver-class-name</span>=com.mysql.jdbc.Driver<br><br><span class="hljs-comment">## Mybatis 配置</span><br>mybatis.<span class="hljs-attribute">typeAliasesPackage</span>=org.spring.springboot.domain<br>mybatis.<span class="hljs-attribute">mapperLocations</span>=classpath:mapper/*.xml<br></code></pre></td></tr></table></figure><h3 id="三,利用postman进行前端请求"><a href="#三,利用postman进行前端请求" class="headerlink" title="三,利用postman进行前端请求"></a>三,利用postman进行前端请求</h3><blockquote><p>根据 ID,获取城市信息 GET <a href="http://127.0.0.1:8080/api/city/1" target="_blank" rel="noopener">http://127.0.0.1:8080/api/city/1</a></p></blockquote><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/2.png" alt="在这里插入图片描述"></p><blockquote><p>获取城市列表 GET <a href="http://127.0.0.1:8080/api/city" target="_blank" rel="noopener">http://127.0.0.1:8080/api/city</a></p></blockquote><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/3.png" alt="在这里插入图片描述"></p><blockquote><p>新增城市信息 POST <a href="http://127.0.0.1:8080/api/city" target="_blank" rel="noopener">http://127.0.0.1:8080/api/city</a></p></blockquote><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/4.png" alt="在这里插入图片描述"></p><blockquote><p>更新城市信息 PUT <a href="http://127.0.0.1:8080/api/city" target="_blank" rel="noopener">http://127.0.0.1:8080/api/city</a></p></blockquote><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/5.png" alt="在这里插入图片描述"></p><blockquote><p>删除城市信息<br>DELETE <a href="http://127.0.0.1:8080/api/city/2" target="_blank" rel="noopener">http://127.0.0.1:8080/api/city/2</a></p></blockquote><p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/6.png" alt="在这里插入图片描述"></p><h3 id="四,更多信息"><a href="#四,更多信息" class="headerlink" title="四,更多信息"></a>四,更多信息</h3><p><a href="http://www.spring4all.com/article/268" target="_blank" rel="noopener">springforall社区</a></p>]]></content>
<summary type="html">
<p><img src="/2018/12/19/SpringBoot实现Restful服务,基于HTTP-JSON传输/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="微服务" scheme="http://yoursite.com/categories/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="SpringBoot " scheme="http://yoursite.com/tags/SpringBoot/"/>
<category term="RestFul" scheme="http://yoursite.com/tags/RestFul/"/>
<category term="Http-Json" scheme="http://yoursite.com/tags/Http-Json/"/>
</entry>
<entry>
<title>SpringBoot快速入门之RESTful API以及单元测试</title>
<link href="http://yoursite.com/2018/12/19/springBoot%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8%E4%B9%8BRESTful-API%E4%BB%A5%E5%8F%8A%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/"/>
<id>http://yoursite.com/2018/12/19/springBoot快速入门之RESTful-API以及单元测试/</id>
<published>2018-12-19T08:36:00.000Z</published>
<updated>2018-12-20T01:41:31.759Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/12/19/springBoot快速入门之RESTful-API以及单元测试/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h4 id="首先我们来了解一下RESTful-API"><a href="#首先我们来了解一下RESTful-API" class="headerlink" title="首先我们来了解一下RESTful API"></a>首先我们来了解一下RESTful API</h4><table><thead><tr><th>请求类型</th><th>URL</th><th>功能说明</th></tr></thead><tbody><tr><td>GET</td><td>/users</td><td>查询用户列表</td></tr><tr><td>POST</td><td>/users</td><td>创建一个用户</td></tr><tr><td>PUT</td><td>/users/id</td><td>根据id修改一个用户</td></tr><tr><td>DELETE</td><td>/users/id</td><td>根据id删除一个用户</td></tr></tbody></table><p>主要是用Spring MVC来实现一组对User对象操作的RESTful API,配合注释详细说明在Spring MVC中如何映射HTTP请求、如何传参、如何编写单元测试。</p><h4 id="项目结构"><a href="#项目结构" class="headerlink" title="项目结构"></a>项目结构</h4><p><img src="https://img-blog.csdnimg.cn/20181217155700806.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=,size_16,color_FFFFFF,t_70" alt="在这里看我框起来的就可以了"></p><h4 id="User实体类"><a href="#User实体类" class="headerlink" title="User实体类"></a>User实体类</h4><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> UserPojo {<br><br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> id;<br><br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> name;<br><br> <span class="hljs-keyword">private</span> <span class="hljs-built_in">String</span> happay;<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getName() {<br> <span class="hljs-keyword">return</span> name;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setName(<span class="hljs-built_in">String</span> name) {<br> <span class="hljs-keyword">this</span>.name = name;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getHappay() {<br> <span class="hljs-keyword">return</span> happay;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setHappay(<span class="hljs-built_in">String</span> happay) {<br> <span class="hljs-keyword">this</span>.happay = happay;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">String</span> getId() {<br> <span class="hljs-keyword">return</span> id;<br> }<br><br> <span class="hljs-keyword">public</span> <span class="hljs-built_in">void</span> setId(<span class="hljs-built_in">String</span> id) {<br> <span class="hljs-keyword">this</span>.id = id;<br> }<br></code></pre></td></tr></table></figure><h4 id="Conntroller层类"><a href="#Conntroller层类" class="headerlink" title="Conntroller层类"></a>Conntroller层类</h4><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@RestController</span><span class="hljs-comment">/** 默认放回json数据格式,替换ReposeBody*/</span><br><span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/user"</span>)</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserController</span> </span>{<br><br> <span class="hljs-comment">//创建线程安全的map</span><br> static Map< String, UserPojo> map = Collections.synchronizedMap( new HashMap<String,UserPojo>());<br><br> <span class="hljs-comment">/**<br> * 处理”/user的get请求,用来获取用户列表<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/"</span>,method = RequestMethod.GET )</span><br> <span class="hljs-keyword">public</span> List<UserPojo> getUser(){<br> List<UserPojo> listUser = new ArrayList<UserPojo>(map.values());<br> <span class="hljs-keyword">return</span> listUser;<br> }<br><br> <span class="hljs-comment">/**<br> * 处理”/user的post请求,新增用户<br> * <span class="hljs-doctag">@param</span> userPojo<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/"</span>,method = RequestMethod.POST)</span><br> <span class="hljs-keyword">public</span> String postUser(<span class="hljs-meta">@ModelAttribute</span> UserPojo userPojo){<br> <span class="hljs-comment">//</span><br> <span class="hljs-comment">// 除了modelAttribute 绑定参数外还可以用@RequestParam从页面传递参数</span><br> map.put(userPojo.getId(),userPojo);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br><br> <span class="hljs-comment">/**<br> * 根据id来查询用户信息<br> * 处理"/users/{id}"的GET请求,用来获取url中id值的User信息<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.GET)</span><br> <span class="hljs-keyword">public</span> UserPojo getByUserId(<span class="hljs-meta">@PathVariable</span> String id){<br> <span class="hljs-comment">// url中的id可通过@PathVariable绑定到函数的参数中</span><br> <span class="hljs-keyword">return</span> map.<span class="hljs-keyword">get</span>(id);<br> }<br><br> <span class="hljs-comment">/**<br> * 根据id来修改用户信息<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@param</span> userPojo<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.PUT)</span><br> <span class="hljs-keyword">public</span> String putByIdUser(<span class="hljs-meta">@PathVariable</span> String id,<span class="hljs-meta">@ModelAttribute</span> UserPojo userPojo){<br> <span class="hljs-comment">// 处理"/users/{id}"的PUT请求,用来更新User信息</span><br> UserPojo userPojo1 = new UserPojo();<br> userPojo1.setName(userPojo.getName());<br> userPojo1.setHappay(userPojo.getHappay());<br> map.put(id,userPojo1);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br><br> <span class="hljs-comment">/**<br> * 处理"/users/{id}"的DELETE请求,用来删除User<br> * <span class="hljs-doctag">@param</span> id<br> * <span class="hljs-doctag">@return</span><br> */</span><br> <span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/{id}"</span>,method = RequestMethod.DELETE)</span><br> <span class="hljs-keyword">public</span> String deleteByIdUser(<span class="hljs-meta">@PathVariable</span> String id){<br> map.remove(id);<br> <span class="hljs-keyword">return</span> <span class="hljs-string">"success"</span>;<br> }<br><br><br>}<br></code></pre></td></tr></table></figure><h4 id="测试结果"><a href="#测试结果" class="headerlink" title="测试结果"></a>测试结果</h4><p>下面针对该Controller编写测试用例验证正确性,具体如下。当然也可以通过浏览器插件等进行请求提交验证。</p><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><code class="hljs undefined">@RunWith(SpringRunner.class)<br>@SpringBootTest<br>public class UserControllerTests {<br><br> private MockMvc mockMvc;<br><br> @Before<br> public void setUp() throws Exception {<br> mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();<br> }<br><br> @Test<br> public void testUserController() throws Exception {<br><br> RequestBuilder requestBuilder = null;<br> <span class="hljs-comment">//get用户列表应该为空</span><br> requestBuilder = get(<span class="hljs-string">"/user/"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(status().isOk())<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"[]"</span>)));<br><br> <span class="hljs-comment">//新增一个用户期待应该是success</span><br> requestBuilder = post(<span class="hljs-string">"/user/"</span>)<br> .param(<span class="hljs-string">"id"</span>,<span class="hljs-string">"1"</span>)<br> .param(<span class="hljs-string">"name"</span>,<span class="hljs-string">"wusha"</span>)<br> .param(<span class="hljs-string">"happay"</span>,<span class="hljs-string">"basketball"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"success"</span>)));<br><br> <span class="hljs-comment">//get用户列表刚刚新增的数据</span><br> requestBuilder = get(<span class="hljs-string">"/user/"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(status().isOk())<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"[{<span class="hljs-subst">\"</span>id<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>1<span class="hljs-subst">\"</span>,<span class="hljs-subst">\"</span>name<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>wusha<span class="hljs-subst">\"</span>,<span class="hljs-subst">\"</span>happay<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>basketball<span class="hljs-subst">\"</span>}]"</span>)));<br><br> <span class="hljs-comment">//根据id来查找用户信息</span><br> requestBuilder = get(<span class="hljs-string">"/user/1"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"{<span class="hljs-subst">\"</span>id<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>1<span class="hljs-subst">\"</span>,<span class="hljs-subst">\"</span>name<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>wusha<span class="hljs-subst">\"</span>,<span class="hljs-subst">\"</span>happay<span class="hljs-subst">\"</span>:<span class="hljs-subst">\"</span>basketball<span class="hljs-subst">\"</span>}"</span>)));<br><br> <span class="hljs-comment">//根据id来修改用户信息</span><br> requestBuilder = put(<span class="hljs-string">"/user/1"</span>)<br> .param(<span class="hljs-string">"name"</span>,<span class="hljs-string">"shasha"</span>)<br> .param(<span class="hljs-string">"happay"</span>,<span class="hljs-string">"football"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"success"</span>)));<br><br> <span class="hljs-comment">//根据id来删除用户信息</span><br> requestBuilder = delete(<span class="hljs-string">"/user/1"</span>);<br> mockMvc.perform(requestBuilder)<br> .andExpect(content().<span class="hljs-type">string</span>(equalTo(<span class="hljs-string">"success"</span>)));<br><br> }<br><br>}<br></code></pre></td></tr></table></figure><h4 id="注解"><a href="#注解" class="headerlink" title="注解"></a>注解</h4><p>最后再来复习一下springMVC的常用注解也就是我项目中用到的</p><ul><li>@Controller:修饰class,用来创建处理http请求的对象</li></ul><ul><li>@RestController:Spring4之后加入的注解,原来在@Controller中返回json需要@ResponseBody来配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默认返回json格式。</li><li>@RequestMapping:配置url映射</li></ul><p>参数绑定的注解</p><ul><li>@PathVariable是 映射 URL 绑定的占位符,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。</li><li>@ModelAttribute,运用在参数上,会将客户端传递过来的参数按名称注入到指定对象中,并且会将这个对象自动加入ModelMap中,便于View层使用;<br>运用在方法上,会在每一个@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中;</li><li>@RequestParam,主要用于将请求参数区域的数据映射到控制层方法的参数上</li></ul>]]></content>
<summary type="html">
<p><img src="/2018/12/19/springBoot快速入门之RESTful-API以及单元测试/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="微服务" scheme="http://yoursite.com/categories/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="SpringBoot" scheme="http://yoursite.com/tags/SpringBoot/"/>
<category term="RestFul " scheme="http://yoursite.com/tags/RestFul/"/>
<category term="单元测试" scheme="http://yoursite.com/tags/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/"/>
</entry>
<entry>
<title>String , StringBuffer , StringBuilder 之间的区别</title>
<link href="http://yoursite.com/2018/11/29/String-StringBuffer-StringBuilder-%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
<id>http://yoursite.com/2018/11/29/String-StringBuffer-StringBuilder-之间的区别/</id>
<published>2018-11-29T08:57:00.000Z</published>
<updated>2018-11-29T09:05:20.583Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/11/29/String-StringBuffer-StringBuilder-之间的区别/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h3 id="String-StringBuffer-StringBuilder-的区别"><a href="#String-StringBuffer-StringBuilder-的区别" class="headerlink" title="String , StringBuffer , StringBuilder 的区别"></a>String , StringBuffer , StringBuilder 的区别</h3><p>String 是Java语言基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的Imutable(不可变类) 被声明成为final class,所有属性也都是final。也由于他的不可变性,类似拼接,裁剪字符串等动作都会产生新的String 对象。</p><p>StringBuffer 是为解决上面提到的拼接产生太多中间对象的问题而提供的一个类,用append和add方法来添加字符串。StringBuffer本质上是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的情况,还是使用StringBuilder,实际上它的线程安全是通过把各种修改数据的方法都加上synchronized 关键字实现的</p><p>StringBulider是Java1.5中新增的,在能力上和StringBuffer没有本质区别,但是它去掉了吸纳从安全的部分,有效的减小了开销</p><p>StringBuffer 和 StringBuilder底层都是利用可修改的(char,JDK 9 以后是 byte)数组,二者都继承了 AbstractStringBuilder,里面包含了基本操作,区别仅在于最终的方法是否加了 synchronized</p><h3 id="字符串设计和实现考量"><a href="#字符串设计和实现考量" class="headerlink" title="字符串设计和实现考量"></a>字符串设计和实现考量</h3><p>首先我们要知道String是Immutable(不可变类)的,字符串操作不会产生大量临时变量,以及线程安全的问题。由于String是Immutable的原生的保护了基础线程的安全,因为你无法对内部数据进行任何修改。</p><p>StringBuffer实现细节,他的线程安全都是通过各种修改数据都加上synchronized关键字实现的,非常直白。<br>StringBuffer和StringBuild底层都是利用可修改的数组,二者都继承了AbstractStringBulider,区别在于是否加了synchronized关键字。</p>]]></content>
<summary type="html">
<p><img src="/2018/11/29/String-StringBuffer-StringBuilder-之间的区别/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="java" scheme="http://yoursite.com/categories/java/"/>
<category term="String" scheme="http://yoursite.com/tags/String/"/>
<category term="StringBuffer" scheme="http://yoursite.com/tags/StringBuffer/"/>
<category term="StringBuild" scheme="http://yoursite.com/tags/StringBuild/"/>
</entry>
<entry>
<title>对比Vector,ArrayList,LinkedList有何区别</title>
<link href="http://yoursite.com/2018/11/29/%E6%AF%94Vector-ArrayList-LinkedList%E6%9C%89%E4%BD%95%E5%8C%BA%E5%88%AB/"/>
<id>http://yoursite.com/2018/11/29/比Vector-ArrayList-LinkedList有何区别/</id>
<published>2018-11-29T08:54:00.000Z</published>
<updated>2018-11-29T09:05:45.391Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/11/29/比Vector-ArrayList-LinkedList有何区别/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h3 id="Vector-ArrayList-LinkedList相同点"><a href="#Vector-ArrayList-LinkedList相同点" class="headerlink" title="Vector,ArrayList,LinkedList相同点"></a>Vector,ArrayList,LinkedList相同点</h3><p>这三者都是实现集合框架中的List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位,添加或者删除的操作,都提供迭代器以遍历其内容。但因为具体的设计区别,在行为,性能,吸纳从安全等方面,表现又有很大的不同。</p><h3 id="Vector-ArrayList-LinkedList区别"><a href="#Vector-ArrayList-LinkedList区别" class="headerlink" title="Vector,ArrayList,LinkedList区别"></a>Vector,ArrayList,LinkedList区别</h3><p>ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以新能要好很多。与Vector近似,ArrayList也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vecor在扩容时会提高一倍,而ArrayList则是增加50%。</p><p>LinkedList顾名思义是Java提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。</p><h3 id="常用情况"><a href="#常用情况" class="headerlink" title="常用情况"></a>常用情况</h3><p>Vector和ArrayList作为动态数组,其内部元素以数组形式顺序存储的,所以非常适合随机访问的场合。除了尾部插入和删除元素,往往性能会相对较差,比如我们在中间位置插入一个元素,需要移动后续所有元素。</p><p>而Linked List进行节点插入,删除却要高效很多,但是随机访问性能则要比动态数组慢。</p><p>底层实现图片描述的很清楚<br><img src="/2018/11/29/比Vector-ArrayList-LinkedList有何区别/20181129154435716.png" alt="在这里插入图片描述"></p>]]></content>
<summary type="html">
<p><img src="/2018/11/29/比Vector-ArrayList-LinkedList有何区别/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="java" scheme="http://yoursite.com/categories/java/"/>
<category term="vector" scheme="http://yoursite.com/tags/vector/"/>
<category term="arrayList" scheme="http://yoursite.com/tags/arrayList/"/>
<category term="LinkedList" scheme="http://yoursite.com/tags/LinkedList/"/>
</entry>
<entry>
<title>HashTabe,HashMap,TreeMap底层原理</title>
<link href="http://yoursite.com/2018/11/29/HashTabe%EF%BC%8CHashMap-TreeMap%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86/"/>
<id>http://yoursite.com/2018/11/29/HashTabe,HashMap-TreeMap底层原理/</id>
<published>2018-11-29T08:47:00.000Z</published>
<updated>2018-11-29T09:06:22.090Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/11/29/HashTabe,HashMap-TreeMap底层原理/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><blockquote><p>Map是广义java集合框架中的另外一部分,HaspMap作为框架中使用频率最高类型之一,我们有必要去深入了解它。</p></blockquote><h3 id="对比-HashMap-HashTable-TreeMap"><a href="#对比-HashMap-HashTable-TreeMap" class="headerlink" title="对比 HashMap,HashTable,TreeMap"></a>对比 HashMap,HashTable,TreeMap</h3><h4 id="相同点"><a href="#相同点" class="headerlink" title="相同点"></a>相同点</h4><ul><li>HashMap,HashTable,TreeMap都是一些常见的map实现,是以键值对的形式存储和操作数据的容器类型。</li></ul><h4 id="不同点"><a href="#不同点" class="headerlink" title="不同点"></a>不同点</h4><ul><li>HashTable是早期的Java类库提供的的一个哈希表实现,本身是同步的,不支持null键和空值,由于同步导致的性能开销,使用相当较少。</li><li>HashMap是应用更加广泛的哈希表实现,行为上大致和haspTable大致相同,主要区别在于HashMap不是同步的,支持null键和空值。所以性能上更加优秀。</li><li>TreeMap是基于红黑树的一种提供顺序访问的Map,和HashMap不同,他的get,put,remove之类的操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。</li></ul><h4 id="HashMap常见问题"><a href="#HashMap常见问题" class="headerlink" title="HashMap常见问题"></a>HashMap常见问题</h4><p>haspMap明确声明不是线程安全的的数据结构,所以haspMap在并发环境可能出现无限循环占用cpu,size不准确的诡异问题。</p><h3 id="知识扩展"><a href="#知识扩展" class="headerlink" title="知识扩展"></a>知识扩展</h3><h5 id="map结构"><a href="#map结构" class="headerlink" title="map结构"></a>map结构</h5><p><img src="/2018/11/29/HashTabe,HashMap-TreeMap底层原理/20181129150813539.png" alt="hashTable和hashMap在类结构上由明显不同"></p><p>hashMap等其他map实现都hi扩展abstractMap,里面包含了通用的抽象方法,HashMap的性能表现非常依赖于哈希码的有效性。</p><ul><li>equals相等,hashcode一定要相等。</li><li>重写了hashCode也要重写equals。</li><li>hashCode需要保持一致性,状态改变的哈希值仍然要一致。</li><li>equals的对称,反射,传递。</li><li>LinkedHashMap 和 TreeMap 都可以保证某种顺序,但二者还是很不同的</li><li>linkedHashMap通常提供的是遍历顺序符合插入顺序,他的实现是通过条目维护一个双向链表。</li><li><p>对于TreeMap他的整体顺序是由键的顺序关系决定的,通过compartoar来决定。<br>HashMap源码分析</p></li><li><p>HashMap 内部实现基本点分析。</p></li><li>容量(capacity)和负载系数(load factor)。</li><li>树化<br>HashMap的内部结构,可以看作是数组和链表组成的复合结构,数组被分成一个个桶数组,通过哈希值在这个桶数组寻址,哈希值相同的键值对,则以链表形式存储。<br><img src="/2018/11/29/HashTabe,HashMap-TreeMap底层原理/20181129152323377.png" alt="在这里插入图片描述"><br>从非拷贝构造函数的实现来看,这个表格(数组)似乎并没有在最初就初始化好,仅仅设置了一些初始值而已。</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-title">HashMap</span><span class="hljs-params">(<span class="hljs-keyword">int</span> initialCapacity, <span class="hljs-keyword">float</span> loadFactor)</span></span>{ <br> <span class="hljs-comment">// ... </span><br> <span class="hljs-keyword">this</span>.loadFactor = loadFactor;<br> <span class="hljs-keyword">this</span>.threshold = tableSizeFor(initialCapacity);<br>}<br></code></pre></td></tr></table></figure><p>然后看put方法实现</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-function"><span class="hljs-keyword">public</span> V <span class="hljs-title">put</span>(<span class="hljs-params">K key, V <span class="hljs-keyword">value</span></span>) </span>{<br> <span class="hljs-keyword">return</span> putVal(hash(key), key, <span class="hljs-keyword">value</span>, <span class="hljs-literal">false</span>, <span class="hljs-literal">true</span>);<br>}<br></code></pre></td></tr></table></figure><p>put里面调用了putVal方法</p><figure class="highlight gauss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs undefined">final V putVal(int hash, K <span class="hljs-built_in">key</span>, V value, boolean onlyIfAbent,<br> boolean evit) {<br> Node<K,V>[] <span class="hljs-built_in">tab</span>; Node<K,V> p; int , i;<br> <span class="hljs-keyword">if</span> ((<span class="hljs-built_in">tab</span> = table) == <span class="hljs-built_in">null</span> || (n = <span class="hljs-built_in">tab</span>.length) = <span class="hljs-number">0</span>)<br> n = (<span class="hljs-built_in">tab</span> = resize()).length;<br> <span class="hljs-keyword">if</span> ((p = <span class="hljs-built_in">tab</span>[i = (n - <span class="hljs-number">1</span>) & hash]) == ull)<br> <span class="hljs-built_in">tab</span>[i] = newNode(hash, <span class="hljs-built_in">key</span>, value, nll);<br> <span class="hljs-keyword">else</span> {<br> <span class="hljs-comment">// ...</span><br> <span class="hljs-keyword">if</span> (binCount >= TREEIFY_THRESHOLD - <span class="hljs-number">1</span>) <span class="hljs-comment">// -1 for first </span><br> treeifyBin(<span class="hljs-built_in">tab</span>, hash);<br> <span class="hljs-comment">// ... </span><br> }<br>}<br></code></pre></td></tr></table></figure><p>从源码种可以看出<br>如果表格是null,resize会初始化它<br>resize方法兼顾两个职责,创建初始存储表格,或者在容量不满足需求的时候进行扩容<br>在放置新的键值对的时候,如果发生以下情况,就会发生扩容</p><figure class="highlight gcode"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">if</span> <span class="hljs-comment">(++size > threshold)</span><br> resize<span class="hljs-comment">()</span>;<br></code></pre></td></tr></table></figure><p>具体键值在哈希表种的位置取决于下面的运算</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-attr">i</span> = (n - <span class="hljs-number">1</span>) & hash<br></code></pre></td></tr></table></figure><p>最后hashMap为什么要树化,本质上是安全问题。因为在元素放置过程中,如果一个对象的哈希冲突,都被放置在一个桶中,会形成一个链表,链表查询是线性的会严重影响存取的性能。</p>]]></content>
<summary type="html">
<p><img src="/2018/11/29/HashTabe,HashMap-TreeMap底层原理/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="java" scheme="http://yoursite.com/categories/java/"/>
<category term="map" scheme="http://yoursite.com/tags/map/"/>
<category term="hashMap" scheme="http://yoursite.com/tags/hashMap/"/>
<category term="HashTable" scheme="http://yoursite.com/tags/HashTable/"/>
<category term="TreeMap" scheme="http://yoursite.com/tags/TreeMap/"/>
</entry>
<entry>
<title>深入浅出的学习微服务之架构</title>
<link href="http://yoursite.com/2018/10/22/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E7%9A%84%E5%AD%A6%E4%B9%A0%E5%BE%AE%E6%9C%8D%E5%8A%A1%E4%B9%8B%E6%9E%B6%E6%9E%84/"/>
<id>http://yoursite.com/2018/10/22/深入浅出的学习微服务之架构/</id>
<published>2018-10-22T09:03:00.000Z</published>
<updated>2018-10-23T09:08:00.339Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/10/22/深入浅出的学习微服务之架构/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a><br><img src="https://img-blog.csdn.net/20181022164938834?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="微服务架构"></p><h2 id="微服务架构到底是怎么样的?"><a href="#微服务架构到底是怎么样的?" class="headerlink" title="微服务架构到底是怎么样的?"></a>微服务架构到底是怎么样的?</h2><ul><li>服务提供者按照一定的格式的服务描述,向注册中心注册服务,声明自己能够提供哪些服务,以及服务地址是什么,完成服务发布。</li><li>服务消费者请求注册中心,查询所需要调用的服务地址,然后以约定的通信协议向服务提供者发起请求,得到请求结果后再按照约定的协议解析结果</li></ul><p>而且在服务调用过程中,服务的请求耗时,调用量,以及成功率等指标都会被记录下来用作监控,调用经过的链路信息会记录下来,用于故障定位和问题追踪。在这期间,如果调用失败,可以通过重试等服务治理手段来保证成功率。</p><h2 id="微服务架构下-服务调用主要依赖于下面几个组件"><a href="#微服务架构下-服务调用主要依赖于下面几个组件" class="headerlink" title="微服务架构下 服务调用主要依赖于下面几个组件"></a>微服务架构下 服务调用主要依赖于下面几个组件</h2><h3 id="服务描述"><a href="#服务描述" class="headerlink" title="服务描述"></a>服务描述</h3><p>服务调用首先要解决的问题就是服务如何对外描述。比如,你对外提供了一个服务,那么这个服务的服务名是什么?调用这个服务需要提供哪些信息?调用这个服务返回的结果是什么格式的?该如何解析?这些就是服务描述要解决的问题。</p><h4 id="常见的服务描述方式有RESTful-API-XML-配置以及IDL文件三种。"><a href="#常见的服务描述方式有RESTful-API-XML-配置以及IDL文件三种。" class="headerlink" title="常见的服务描述方式有RESTful API,XML 配置以及IDL文件三种。"></a>常见的服务描述方式有RESTful API,XML 配置以及IDL文件三种。</h4><p>RESTful API方式通常用于HTTP协议的服务描述,并且常用Wiki或者Swagger来进行管理。下面是一个RESTful API方式的服务描述的例子。</p><p><img src="https://img-blog.csdn.net/20181022165013524?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="在这里插入图片描述"><br>XML配置方式多用作RPC协议的服务描述,通过*.xml配置文件来定义接口名,参数以及返回值类型等。下面是XML配置方式的服务描述 的例子。<br><img src="https://img-blog.csdn.net/20181022165114742?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="在这里插入图片描述"></p><p>IDL 文件方式通常用作 Thrift 和 gRPC 这类跨语言服务调用框架中,比如gRPC就是通过Protobuf文件来定义服务的接口名,参数以及返回值的数据结构,实例如下:<br><img src="https://img-blog.csdn.net/20181022165436865?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="在这里插入图片描述"></p><h3 id="注册中心"><a href="#注册中心" class="headerlink" title="注册中心"></a>注册中心</h3><p>有了服务的接口描述,下一步要解决的问题就是服务的发布和订阅,就是说你提供一个服务,如何让外部想调用你的服务的人知道。这个时候就需要一个类似注册中心的角色,服务提供者将自己提供的服务以及地址登记到注册中心,服务消费者则从注册中心查询所需调用的服务的地址,然后发起请求。</p><h4 id="注册中心的工作流程是:"><a href="#注册中心的工作流程是:" class="headerlink" title="注册中心的工作流程是:"></a>注册中心的工作流程是:</h4><ul><li>服务提供者在启动时,根据服务发布文件中配置的发布信息向注册中心注册自己的服务。</li><li>服务消费者在启动时,根据消费者配置文件中配置的服务信息向注册中心订阅自己所需要的服务。</li><li>注册中心返回服务提供者地址列表给服务消费者。</li><li>当服务提供服务者发生变化,比如有节点新增或者销毁,注册中心将变更通知给服务消费者。</li></ul><p><img src="https://img-blog.csdn.net/2018102216551375?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="在这里插入图片描述"></p><h3 id="服务框架"><a href="#服务框架" class="headerlink" title="服务框架"></a>服务框架</h3><p>通过注册中心,服务消费者就可以获取到服务提供者的地址,有了地址就可以发起调用。但在发起调用之前你还需要解决以下几个问题。</p><p>服务通信采用什么协议?就是说服务提供者和服务消费者之间以什么样的协议进行网络通信,是采用四层TCP,UDP协议,还是采用七层HTTP协议,还是采用其他协议?</p><p>数据传输采用什么方式?就是说服务提供者和服务消费者之间的数据传输采用哪种方式,是同步还是异步,实在单连接传输,还是多路复用。</p><p>数据压缩采用什么格式?通常数据传输都会对数据进行压缩,来减少网络传输的数据量,从而减少带宽消耗和网络传输时间,比如常见的JSON序列化,Java对象序列化以及Protobuf序列化等。</p><h3 id="服务监控"><a href="#服务监控" class="headerlink" title="服务监控"></a>服务监控</h3><p>一旦服务消费者和服务提供者之间能够正常发起服务调用,你就需要对调用情况进行监控,以了解服务是否正常。通常来讲,服务监控主要包括三个流程。</p><p>指标收集。就是要吧每一次服务调用的请求耗时以及成功与否收集起来,并上传到集中的数据处理中心<br>数据处理。有了每次调用的请求耗时以及成功与否等i西南西,就可以计算每秒服务请求量,平均耗时以及成功率等指标。</p><h3 id="服务追踪"><a href="#服务追踪" class="headerlink" title="服务追踪"></a>服务追踪</h3><p>除了需要对服务调用情况进行监控之外,你还需要记录服务调用经过的每一层链路,以便进行问题追踪和故障定位。<br>服务追踪的工作原理大致如下:</p><ul><li>服务消费者发起调用前,会在本地按照一定的规则生成一个requestid,发起调用时,将requestid当作请求参数的一部分,传递给服务提供者。</li><li>服务提供者接收到请求后,记录下这次请求的requestid,然后处理请求。如果服务提供者继续请求其他服务,会在本地再生成一个自己的requestid,然后把这两个requestid都当作请求参数传递下去。</li></ul><p>以此类推,通过这种层层往下传递的方式,一次请求,无论最后依赖多少服务调用,经过多少服务节点,都可以通过最开始生成的requestid串联所有节点,从而达到服务追踪的目的。</p><h3 id="服务治理"><a href="#服务治理" class="headerlink" title="服务治理"></a>服务治理</h3><p>服务监控能够发现问题,服务追踪能够定位问题所在,而解决问题就的靠服务治理。服务治理就是通过一系列的手段来保证在各种意外情况下,服务调用仍然能够正常进行。</p><ul><li>单机故障。通常遇到单机故障,都是靠运维发现并重启服务或者从线上摘除故障节点。然而集群的规模越大,越是容易遇到单机故障,在机器规模超过一百台以上时,靠传统的人肉运维显然难以应对。而服务治理可以通过一定的策略,自动摘除故障节点,不需要认为干预,就能保证单机故障不会影响业务</li><li>单IDC故障。你应该经常听说某APP,因为施工挖断光缆导致大批量用户无法使用的严重故障。而服务治理可以通过自动化切换故障IDC的流量到其他正常IDC,可以避免因为单IDC故障引起的大批量业务受影响。</li><li>依赖服务不可用。比如你的服务依赖另一个服务,当另一个服务出现问题时,会拖慢甚至拖垮你的服务。而服务治理可以通过限流,在依赖服务异常的情况下,一段时间内停止发起调用而直接放回,这样一方面保证了服务消费者能够不被拖垮,另一方面也给服务提供者减少压力,使其能够尽快恢复。</li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>这几个基本组件共同组成了微服务架构,在生产环境下缺一不可,所以在引入微服务架构之前,你的团队必须掌握这些基本组件的原理并具备相应的开发能力。</p>]]></content>
<summary type="html">
<p><img src="/2018/10/22/深入浅出的学习微服务之架构/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="微服务" scheme="http://yoursite.com/categories/%E5%BE%AE%E6%9C%8D%E5%8A%A1/"/>
<category term="微服务架构" scheme="http://yoursite.com/tags/%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84/"/>
</entry>
<entry>
<title>版本控制SoEasy之Git-04</title>
<link href="http://yoursite.com/2018/10/16/%E6%9C%AC%E6%8E%A7%E5%88%B6SoEasy%E4%B9%8BGit-04/"/>
<id>http://yoursite.com/2018/10/16/本控制SoEasy之Git-04/</id>
<published>2018-10-16T07:28:00.000Z</published>
<updated>2018-10-16T08:14:48.669Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/10/16/本控制SoEasy之Git-04/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a><br>讲了那么多,那么问题来了,在IEDA中如何使用Git?<br>在这边我们先假定一些场景,然后根据这些场景来具体讲解在ieda中如何使用Git。<br>工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下:</p><p>假设小组中有两个人,组长盖茨,组员艾伦</p><p>场景一:盖茨创建项目并提交到远程Git仓库</p><p>场景二:艾伦从远程Git仓库上获取项目源码</p><p>场景三:艾伦修改了部分源码,提交到远程仓库</p><p>场景四:盖茨从远程仓库获取艾伦的提交</p><p>场景五:艾伦接受了一个新功能的任务,创建了一个分支并在分支上开发</p><p>场景六:艾伦把分支提交到远程Git仓库</p><p>场景七:盖茨获取艾伦提交的分支</p><p>场景八:盖茨把分支合并到主干</p><p>下面来看以上各场景在IDEA中对应的操作。</p><h3 id="场景一:盖茨创建项目并提交到远程Git仓库"><a href="#场景一:盖茨创建项目并提交到远程Git仓库" class="headerlink" title="场景一:盖茨创建项目并提交到远程Git仓库"></a>场景一:盖茨创建项目并提交到远程Git仓库</h3><p>在IDEA中配置Git<br>如果是IDEA,直接使用快捷键,CTRL+alt+s,打开设置窗口。<br><img src="/2018/10/16/本控制SoEasy之Git-04/2.png" alt="在这里插入图片描述"><br>然后创建一个项目</p><p>选择VCS - > Enable Version Control Integration,允许将项目集成到版本控制器中<br><img src="/2018/10/16/本控制SoEasy之Git-04/3.png" alt="在这里插入图片描述"><br>如果没有出现Enable Version Control Integration这个,说明你的项目已经集成了其他的版本控制,需要先删除其他的版本控制,加入git就可以了<br><img src="/2018/10/16/本控制SoEasy之Git-04/4.png" alt="在这里插入图片描述"><br>选择版本控制器类型<br><img src="/2018/10/16/本控制SoEasy之Git-04/5.png" alt="在这里插入图片描述"><br>完成后当前项目就变成一个Git项目,是工作空间</p><p>点击OK后创建完成本地仓库,注意,这里仅仅是本地的。下面把项目源码添加到本地仓库。</p><p>下图是Git与提交有关的三个命令对应的操作,Add命令是把文件从IDE的工作目录添加到本地仓库的stage区,Commit命令把stage区的暂存文件提交到当前分支的仓库,并清空stage区。Push命令把本地仓库的提交同步到远程仓库。</p><p>IDEA中对操作做了一定的简化,Commit和Push可以在一步中完成。</p><p>具体操作,在项目上点击右键,选择Git菜单,如果使用Add则将文件从工作空间提交到暂存库,Commit Directory则是同时完成提交到暂存与本地仓库。<br><img src="/2018/10/16/本控制SoEasy之Git-04/6.png" alt="在这里插入图片描述"><br> 选择要提交的文件,填写消息<br><img src="/2018/10/16/本控制SoEasy之Git-04/7.png" alt="在这里插入图片描述"><br>将本地仓库的内容提交到远程仓库<br><img src="/2018/10/16/本控制SoEasy之Git-04/8.png" alt="在这里插入图片描述"><br> 定义远程地址的别名,以及地址url,然后就出现下图<br> <img src="/2018/10/16/本控制SoEasy之Git-04/9.png" alt="在这里插入图片描述"><br> 提示Push Successful就成功了<br><img src="/2018/10/16/本控制SoEasy之Git-04/10.png" alt="在这里插入图片描述"><br><img src="/2018/10/16/本控制SoEasy之Git-04/11.png" alt="在这里插入图片描述"></p><h3 id="场景二:艾伦从远程Git仓库上获取项目源码"><a href="#场景二:艾伦从远程Git仓库上获取项目源码" class="headerlink" title="场景二:艾伦从远程Git仓库上获取项目源码"></a>场景二:艾伦从远程Git仓库上获取项目源码</h3><p>即克隆项目,操作如下<br><img src="/2018/10/16/本控制SoEasy之Git-04/12.png" alt="在这里插入图片描述"><br>输入盖茨Push时填写的远程仓库地址<br>填写仓库地址、要克隆到的父目录与项目目录</p><p>接下来按向导操作,即可把项目从远程仓艾伦隆到本地仓库和IDE工作区。</p><p>当提示签出成功点击打开就可以看到项目了</p><h3 id="场景三:艾伦修改了部分源码,提交到远程仓库"><a href="#场景三:艾伦修改了部分源码,提交到远程仓库" class="headerlink" title="场景三:艾伦修改了部分源码,提交到远程仓库"></a>场景三:艾伦修改了部分源码,提交到远程仓库</h3><p>这个操作和首次提交的流程基本一致,分别是 Add -> Commit -> Push。请参考场景一</p><p> 添加一个类,并提交<br><img src="/2018/10/16/本控制SoEasy之Git-04/13.png" alt="在这里插入图片描述"><br>提交到本地仓库<br><img src="/2018/10/16/本控制SoEasy之Git-04/14.png" alt="在这里插入图片描述"><br>提交到远程仓库<br><img src="/2018/10/16/本控制SoEasy之Git-04/15.png" alt="在这里插入图片描述"></p><h3 id="场景四:盖茨从远程仓库获取艾伦的提交"><a href="#场景四:盖茨从远程仓库获取艾伦的提交" class="headerlink" title="场景四:盖茨从远程仓库获取艾伦的提交"></a>场景四:盖茨从远程仓库获取艾伦的提交</h3><p>获取更新有两个命令:Fetch和Pull,Fetch是从远程仓库下载文件到本地的origin/master,然后可以手动对比修改决定是否合并到本地的master库。Pull则是直接下载并合并。如果各成员在工作中都执行修改前先更新的规范,则可以直接使用Pull方式以简化操作。<br><img src="/2018/10/16/本控制SoEasy之Git-04/16.png" alt="在这里插入图片描述"><br>选择分支<br><img src="/2018/10/16/本控制SoEasy之Git-04/17.png" alt="在这里插入图片描述"></p><h3 id="场景五:艾伦接受了一个新功能的任务,创建了一个分支并在分支上开发"><a href="#场景五:艾伦接受了一个新功能的任务,创建了一个分支并在分支上开发" class="headerlink" title="场景五:艾伦接受了一个新功能的任务,创建了一个分支并在分支上开发"></a>场景五:艾伦接受了一个新功能的任务,创建了一个分支并在分支上开发</h3><p>建分支也是一个常用的操作,例如临时修改bug、开发不确定是否加入的功能等,都可以创建一个分支,再等待合适的时机合并到主干。</p><p>创建流程如下:<br><img src="/2018/10/16/本控制SoEasy之Git-04/18.png" alt="在这里插入图片描述"><br>选择New Branch并输入一个分支的名称<br>创建完成后注意IDEA的右下角,如下图,Git: dev表示已经自动切换到dev分支,当前工作在这个分支上。</p><p>点击后弹出一个小窗口,在Local Branches中有其他可用的本地分支选项,点击后选择Checkout即可切换当前工作的分支(见场景7操作切换其他分支)。</p><p>如下图,点击Checkout,切换到分支</p><blockquote><p>注意,这里创建的分支仅仅在本地仓库,如果想让组长盖茨获取到这个分支,还需要提交到远程仓库。</p></blockquote><h3 id="场景六:艾伦把分支提交到远程Git仓库"><a href="#场景六:艾伦把分支提交到远程Git仓库" class="headerlink" title="场景六:艾伦把分支提交到远程Git仓库"></a>场景六:艾伦把分支提交到远程Git仓库</h3><p>切换到新建的分支,使用Push功能<br><img src="/2018/10/16/本控制SoEasy之Git-04/19.png" alt="在这里插入图片描述"><br>提交到远程<br><img src="/2018/10/16/本控制SoEasy之Git-04/20.png" alt="在这里插入图片描述"></p><p>艾伦将新开发的功能提交到远程<br><img src="/2018/10/16/本控制SoEasy之Git-04/21.png" alt="在这里插入图片描述"><br>提交到远程</p><h3 id="场景七:盖茨获取艾伦提交的分支"><a href="#场景七:盖茨获取艾伦提交的分支" class="headerlink" title="场景七:盖茨获取艾伦提交的分支"></a>场景七:盖茨获取艾伦提交的分支</h3><p>使用Pull功能打开更新窗口,点击Remote栏后面的刷新按钮,会在Branches to merge栏中刷新出新的分支。这里并不想做合并,所以不要选中任何分支,直接点击Pull按钮完成操作。<br><img src="/2018/10/16/本控制SoEasy之Git-04/22.png" alt="在这里插入图片描述"></p><p>更新后,再点击右下角,可以看到在Remote Branches区已经有了新的分支,点击后在弹出的子菜单中选择Checkout as new local branch,在本地仓库中创建该分支。完成后在Local Branches区也会出现该分支的选项,可以按上面的方法,点击后选择Checkout切换。</p><p>切换远程分支:(dev1是我自己创建的分支,点击可以切换分支)<br><img src="/2018/10/16/本控制SoEasy之Git-04/23.png" alt="在这里插入图片描述"></p><h3 id="场景八:盖茨把分支合并到主干"><a href="#场景八:盖茨把分支合并到主干" class="headerlink" title="场景八:盖茨把分支合并到主干"></a>场景八:盖茨把分支合并到主干</h3><p>新功能开发完成,体验很好,项目组决定把该功能合并到主干上。</p><p>切换到master分支,选择Merge Changes<br><img src="/2018/10/16/本控制SoEasy之Git-04/24.png" alt="在这里插入图片描述"><br>选择要合并的分支,点击Merge完成<br><img src="/2018/10/16/本控制SoEasy之Git-04/25.png" alt="在这里插入图片描述"></p><p>以上就是Git在项目中的基本应用,关于基本应用如有遇到问题,欢迎留言。</p>]]></content>
<summary type="html">
<p><img src="/2018/10/16/本控制SoEasy之Git-04/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="git" scheme="http://yoursite.com/categories/git/"/>
<category term="GitGui" scheme="http://yoursite.com/tags/GitGui/"/>
<category term="IDEA" scheme="http://yoursite.com/tags/IDEA/"/>
</entry>
<entry>
<title>版本控制SoEasy之Git-03</title>
<link href="http://yoursite.com/2018/10/16/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6SoEasy%E4%B9%8BGit-03/"/>
<id>http://yoursite.com/2018/10/16/版本控制SoEasy之Git-03/</id>
<published>2018-10-16T07:25:00.000Z</published>
<updated>2018-10-16T08:24:01.460Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/10/16/版本控制SoEasy之Git-03/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a><br>之前理解了Git分支,现在我们来学习远程仓库操作。</p><h3 id="远程仓库常用命令"><a href="#远程仓库常用命令" class="headerlink" title="远程仓库常用命令"></a>远程仓库常用命令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 下载远程仓库的所有变动</span><br><span class="hljs-meta">$</span><span class="bash"> git fetch [remote]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 显示所有远程仓库</span><br><span class="hljs-meta">$</span><span class="bash"> git remote -v</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 显示某个远程仓库的信息</span><br><span class="hljs-meta">$</span><span class="bash"> git remote show [remote]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 增加一个新的远程仓库,并命名</span><br><span class="hljs-meta">$</span><span class="bash"> git remote add [shortname] [url]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 取回远程仓库的变化,并与本地分支合并</span><br><span class="hljs-meta">$</span><span class="bash"> git pull [remote] [branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 上传本地指定分支到远程仓库</span><br><span class="hljs-meta">$</span><span class="bash"> git push [remote] [branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 强行推送当前分支到远程仓库,即使有冲突</span><br><span class="hljs-meta">$</span><span class="bash"> git push [remote] --force</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 推送所有分支到远程仓库</span><br><span class="hljs-meta">$</span><span class="bash"> git push [remote] --all</span><br><span class="hljs-meta"><br>#</span><span class="bash">简单查看远程---所有仓库</span><br>git remote (只能查看远程仓库的名字)<br><span class="hljs-meta">#</span><span class="bash">查看单个仓库</span><br>git remote show [remote-branch-name]<br><span class="hljs-meta"><br>#</span><span class="bash">新建远程仓库</span><br>git remote add [branchname] [url]<br><span class="hljs-meta"><br>#</span><span class="bash">修改远程仓库</span><br>git remote rename [oldname] [newname]<br><span class="hljs-meta"><br>#</span><span class="bash">删除远程仓库</span><br>git remote rm [remote-name]<br><span class="hljs-meta"><br>#</span><span class="bash">获取远程仓库数据</span><br>git fetch [remote-name] (获取仓库所有更新,但不自动合并当前分支)<br>git pull (获取仓库所有更新,并自动合并到当前分支)<br><span class="hljs-meta"><br>#</span><span class="bash">上传数据,如git push origin master</span><br>git push [remote-name] [branch]<br></code></pre></td></tr></table></figure><h4 id="git-clone-克隆"><a href="#git-clone-克隆" class="headerlink" title="git clone 克隆"></a>git clone 克隆</h4><p>远程操作的第一步,通常是从远程主机克隆一个版本库,这时就要用到git clone命令。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git <span class="hljs-built_in">clone</span> <版本库的网址></span><br></code></pre></td></tr></table></figure><h4 id="git-remote"><a href="#git-remote" class="headerlink" title="git remote"></a>git remote</h4><p>为了便于管理,Git要求每个远程主机都必须指定一个主机名。git remote命令就用于管理主机名。</p><p>不带选项的时候,git remote命令列出所有远程主机。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git remote</span><br></code></pre></td></tr></table></figure><p>使用-v选项,可以参看远程主机的网址。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git remote -v</span><br></code></pre></td></tr></table></figure><p>git remote add命令用于添加远程主机。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git remote add <span class="hljs-tag"><<span class="hljs-name">主机名</span>></span> <span class="hljs-tag"><<span class="hljs-name">网址</span>></span><br></code></pre></td></tr></table></figure><p>git remote rm命令用于删除远程主机。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git remote rm <主机名></span><br></code></pre></td></tr></table></figure><p>git remote rename命令用于远程主机的改名。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git remote rename <span class="hljs-tag"><<span class="hljs-name">原主机名</span>></span> <span class="hljs-tag"><<span class="hljs-name">新主机名</span>></span><br></code></pre></td></tr></table></figure><h4 id="git-fetch(同步)"><a href="#git-fetch(同步)" class="headerlink" title="git fetch(同步)"></a>git fetch(同步)</h4><p>一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git fetch <远程主机名></span><br></code></pre></td></tr></table></figure><p>上面命令将某个远程主机的更新,全部取回本地。</p><p>git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。</p><p>默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git fetch <span class="hljs-tag"><<span class="hljs-name">远程主机名</span>></span> <span class="hljs-tag"><<span class="hljs-name">分支名</span>></span><br></code></pre></td></tr></table></figure><p>比如,取回origin主机的master分支。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git fetch origin master</span><br></code></pre></td></tr></table></figure><p>所取回的更新,在本地主机上要用”远程主机名/分支名”的形式读取。比如origin主机的master,就要用origin/master读取。</p><h4 id="git-branch"><a href="#git-branch" class="headerlink" title="git branch"></a>git branch</h4><p>git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。</p><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git branch -r<br>origin/<span class="hljs-keyword">master</span><br><br><span class="hljs-title">$</span> git branch -a<br>* <span class="hljs-keyword">master</span><br> <span class="hljs-title">remotes</span>/origin/<span class="hljs-literal">master</span><br></code></pre></td></tr></table></figure><p>上面命令表示,本地主机的当前分支是master,远程分支是origin/master。</p><p>取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。</p><figure class="highlight haxe"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git checkout -b <span class="hljs-keyword">new</span><span class="hljs-type">Brach</span> origin/master<br></code></pre></td></tr></table></figure><p>上面命令表示,在origin/master的基础上,创建一个新分支。</p><p>此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。</p><pre><code>$ git merge origin/master#或者$ git rebase origin/master</code></pre><p>上面命令表示在当前分支上,合并origin/master。</p><h3 id="git-pull"><a href="#git-pull" class="headerlink" title="git pull"></a>git pull</h3><p>git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。</p><pre><code>$ git pull <远程主机名> <远程分支名>:<本地分支名></code></pre><p>比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。</p><pre><code>$ git pull origin next:master</code></pre><p>如果远程分支是与当前分支合并,则冒号后面的部分可以省略。</p><pre><code>$ git pull origin next</code></pre><p>上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。</p><pre><code>$ git fetch origin$ git merge origin/next</code></pre><p>在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动”追踪”origin/master分支。</p><p>Git也允许手动建立追踪关系。</p><pre><code>git branch --set-upstream master origin/next</code></pre><p>上面命令指定master分支追踪origin/next分支。</p><p>如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。</p><pre><code>$ git pull origin</code></pre><p>上面命令表示,本地的当前分支自动与对应的origin主机”追踪分支”(remote-tracking branch)进行合并。</p><p>如果当前分支只有一个追踪分支,连远程主机名都可以省略。</p><pre><code>$ git pull</code></pre><p>上面命令表示,当前分支自动与唯一一个追踪分支进行合并。</p><p>如果合并需要采用rebase模式,可以使用–rebase选项。</p><pre><code>$ git pull --rebase <远程主机名> <远程分支名>:<本地分支名></code></pre><p>如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。</p><p>但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。</p><pre><code>$ git pull -p#同于下面的命令$ git fetch --prune origin $ git fetch -p</code></pre><h3 id="git-push"><a href="#git-push" class="headerlink" title="git push"></a>git push</h3><p>git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。</p><pre><code>$ git push <远程主机名> <本地分支名>:<远程分支名></code></pre><blockquote><p>注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git<br>push是<本地分支>:<远程分支>。</p></blockquote><p>如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。</p><pre><code>$ git push origin master</code></pre><p>上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。</p><p>如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。</p><pre><code>$ git push origin :master#等同于$ git push origin --delete master</code></pre><p>上面命令表示删除origin主机的master分支。</p><p>如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。</p><pre><code>$ git push origin</code></pre><p>上面命令表示,将当前分支推送到origin主机的对应分支。<br>如果是新建分支第一次push,会提示: </p><pre><code>fatal: The current branch dev1 has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin dev1</code></pre><p> 输入这行命令,然后输入用户名和密码,就push成功了。</p><p> 以后的push就只需要输入git push origin</p><p>原因是:</p><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><code class="hljs undefined">#因为在git的全局配置中,有一个<span class="hljs-keyword">push</span>.default属性,其决定了git <span class="hljs-keyword">push</span>操作的默认行为。在Git <span class="hljs-number">2.0</span>之前,这个属性的默认被设为<span class="hljs-string">'matching'</span>,<span class="hljs-number">2.0</span>之后则被更改为了<span class="hljs-string">'simple'</span>。<br><br>#我们可以通过git version确定当前的git版本(如果小于<span class="hljs-number">2.0</span>,更新是个更好的选择),通过git config --<span class="hljs-meta">global</span> <span class="hljs-keyword">push</span>.default <span class="hljs-string">'option'</span>改变<span class="hljs-keyword">push</span>.default的默认行为(或者也可直接编辑~/.gitconfig文件)。<br><br><span class="hljs-keyword">push</span>.default 有以下几个可选值:<br>nothing, current, upstream, simple, matching<br><br>其用途分别为:<br>nothing - <span class="hljs-keyword">push</span>操作无效,除非显式指定远程分支,例如git <span class="hljs-keyword">push</span> origin develop(我觉得。。。可以给那些不愿学git的同事配上此项)。<br>current - <span class="hljs-keyword">push</span>当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支。<br>upstream - <span class="hljs-keyword">push</span>当前分支到它的upstream分支上(这一项其实用于经常从本地分支<span class="hljs-keyword">push</span>/pull到同一远程仓库的情景,这种模式叫做central workflow)。<br>simple - simple和upstream是相似的,只有一点不同,simple必须保证本地分支和它的远程<br>upstream分支同名,否则会拒绝<span class="hljs-keyword">push</span>操作。<br>matching - <span class="hljs-keyword">push</span>所有本地和远程两端都存在的同名分支。<br><br>因此如果我们使用了git2<span class="hljs-meta">.0</span>之前的版本,<span class="hljs-keyword">push</span>.default = matching,git <span class="hljs-keyword">push</span>后则会推送当前分支代码到远程分支,而<span class="hljs-number">2.0</span>之后,<span class="hljs-keyword">push</span>.default = simple,如果没有指定当前分支的upstream分支,就会收到上文的fatal提示。<br></code></pre></td></tr></table></figure><p>如果当前分支只有一个追踪分支,那么主机名都可以省略。</p><pre><code>$ git push</code></pre><p>如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。</p><pre><code>$ git push -u origin master</code></pre><p>上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。</p><p>不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。</p><pre><code>$ git config --global push.default matching#或者$ git config --global push.default simple</code></pre><p>还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all选项。</p><pre><code>$ git push --all origin</code></pre><p>上面命令表示,将所有本地分支都推送到origin主机。</p><p>如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用–force选项。</p><pre><code>$ git push --force origin </code></pre><p>上面命令使用–force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用–force选项。</p><p>最后,git push不会推送标签(tag),除非使用–tags选项。</p><pre><code>$ git push origin --tags</code></pre>]]></content>
<summary type="html">
<p><img src="/2018/10/16/版本控制SoEasy之Git-03/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="git" scheme="http://yoursite.com/categories/git/"/>
<category term="版本控制" scheme="http://yoursite.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
<category term="git常用命令" scheme="http://yoursite.com/tags/git%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4/"/>
</entry>
<entry>
<title>版本控制SoEasy之Git-02</title>
<link href="http://yoursite.com/2018/10/16/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6SoEasy%E4%B9%8BGit-02/"/>
<id>http://yoursite.com/2018/10/16/版本控制SoEasy之Git-02/</id>
<published>2018-10-16T07:18:00.000Z</published>
<updated>2018-10-16T08:08:44.768Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/10/16/版本控制SoEasy之Git-02/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><blockquote><p>Git的原理和基本操作,在我的上一篇博客里面已经有详细的说明了。这一篇我们来介绍git分支。</p></blockquote><p>分支对大部分开发人员来说并不陌生,Git的分支也不例外。</p><p>分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。</p><p>现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。</p><p>Git分支的速度非常快。</p><p>截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。直接看图清晰明了<br><img src="/2018/10/16/版本控制SoEasy之Git-02/2.png" alt="在这里插入图片描述"><br><img src="/2018/10/16/版本控制SoEasy之Git-02/3.jpg" alt="在这里插入图片描述"><br> <img src="/2018/10/16/版本控制SoEasy之Git-02/4.png" alt="在这里插入图片描述"></p><h3 id="git分支中常用指令"><a href="#git分支中常用指令" class="headerlink" title="git分支中常用指令"></a>git分支中常用指令</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 列出所有本地分支</span><br><span class="hljs-meta">$</span><span class="bash"> git branch</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 列出所有远程分支</span><br><span class="hljs-meta">$</span><span class="bash"> git branch -r</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 列出所有本地分支和远程分支</span><br><span class="hljs-meta">$</span><span class="bash"> git branch -a</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 新建一个分支,但依然停留在当前分支</span><br><span class="hljs-meta">$</span><span class="bash"> git branch [branch-name]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 新建一个分支,并切换到该分支</span><br><span class="hljs-meta">$</span><span class="bash"> git checkout -b [branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 新建一个分支,指向指定commit</span><br><span class="hljs-meta">$</span><span class="bash"> git branch [branch] [commit]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 新建一个分支,与指定的远程分支建立追踪关系</span><br><span class="hljs-meta">$</span><span class="bash"> git branch --track [branch] [remote-branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 切换到指定分支,并更新工作区</span><br><span class="hljs-meta">$</span><span class="bash"> git checkout [branch-name]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 切换到上一个分支</span><br><span class="hljs-meta">$</span><span class="bash"> git checkout -</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 建立追踪关系,在现有分支与指定的远程分支之间</span><br><span class="hljs-meta">$</span><span class="bash"> git branch --<span class="hljs-built_in">set</span>-upstream [branch] [remote-branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 合并指定分支到当前分支</span><br><span class="hljs-meta">$</span><span class="bash"> git merge [branch]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 选择一个commit,合并进当前分支</span><br><span class="hljs-meta">$</span><span class="bash"> git cherry-pick [commit]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 删除分支</span><br><span class="hljs-meta">$</span><span class="bash"> git branch -d [branch-name]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 删除远程分支</span><br><span class="hljs-meta">$</span><span class="bash"> git push origin --delete [branch-name]</span><br><span class="hljs-meta">$</span><span class="bash"> git branch -dr [remote/branch]</span><br></code></pre></td></tr></table></figure><h3 id="新建分支与分支切换"><a href="#新建分支与分支切换" class="headerlink" title="新建分支与分支切换"></a>新建分支与分支切换</h3><p>每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。<br>一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:<br><img src="/2018/10/16/版本控制SoEasy之Git-02/5.gif" alt="在这里插入图片描述"><br>每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:<br><img src="/2018/10/16/版本控制SoEasy之Git-02/5.png" alt="在这里插入图片描述"><br>默认是这样的,master是主分支<br><img src="/2018/10/16/版本控制SoEasy之Git-02/6.png" alt="在这里插入图片描述"><br>新建一个分支,但依然停留在当前分支,使用:$ git branch [branch-name]<br>当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:<br><img src="/2018/10/16/版本控制SoEasy之Git-02/7.png" alt="在这里插入图片描述"></p><p>所以Git合并分支也很快!就改改指针,工作区内容也不变!</p><p>合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:<br><img src="/2018/10/16/版本控制SoEasy之Git-02/8.png" alt="在这里插入图片描述"></p><ul><li>切换分支,git branch <name>,如果name为-则为上一个分支</name></li><li>新建一个分支,并切换到该分支,$ git checkout -b [branch]</li><li>新建一个分支,指向指定commit使用命令:$ git branch [branch] [commit]</li><li>新建一个分支,与指定的远程分支建立追踪关系使用命令:$ git branch –track [branch]<br>[remote-branch]</li></ul><h3 id="查看分支"><a href="#查看分支" class="headerlink" title="查看分支"></a>查看分支</h3><ol><li>列出所有本地分支使用$ git branch</li><li>列表所有远程分支使用$ git branch -r</li><li>列出所有本地分支和远程分支使用$ git branch -a<h3 id="分支合并"><a href="#分支合并" class="headerlink" title="分支合并"></a>分支合并</h3>合并指定分支到当前分支使用指令$ git merge [branch]<h3 id="解决冲突"><a href="#解决冲突" class="headerlink" title="解决冲突"></a>解决冲突</h3>如果同一个文件在合并分支时都被修改了则会引起冲突<br>分支策略</li></ol><p>master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。</p><h3 id="删除分支"><a href="#删除分支" class="headerlink" title="删除分支"></a>删除分支</h3><p>删除本地分支可以使用命令:$ git branch -d [branch-name],-D(大写)强制删除<br>删除远程分支可以使用如下指令:</p><pre><code>$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]</code></pre><blockquote><p>-d表示删除分支。分支必须完全合并在其上游分支,或者在HEAD上没有设置上游</p><p>-r表示远程的意思remotes,如果-dr则表示删除远程分支</p></blockquote><p>下一篇我们开始讲,git集成IEDA和GitHub的操作</p>]]></content>
<summary type="html">
<p><img src="/2018/10/16/版本控制SoEasy之Git-02/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="git" scheme="http://yoursite.com/categories/git/"/>
<category term="版本控制" scheme="http://yoursite.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
<category term="git分支" scheme="http://yoursite.com/tags/git%E5%88%86%E6%94%AF/"/>
</entry>
<entry>
<title>版本控制SoEasy之Git-01</title>
<link href="http://yoursite.com/2018/10/10/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6SoEasy%E4%B9%8BGit-01/"/>
<id>http://yoursite.com/2018/10/10/版本控制SoEasy之Git-01/</id>
<published>2018-10-10T01:21:00.000Z</published>
<updated>2018-10-16T07:17:11.083Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/10/10/版本控制SoEasy之Git-01/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h1 id="Git是什么?"><a href="#Git是什么?" class="headerlink" title="Git是什么?"></a>Git是什么?</h1><p>Git是一种常用的版本控制系统,我们常见的版本控制系统有git和svn。 要知道怎么使用首先要了解它的概念。</p><h3 id="什么是版本控制"><a href="#什么是版本控制" class="headerlink" title="什么是版本控制"></a>什么是版本控制</h3><p>版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。 </p><ul><li>实现跨区域多人协同开发</li><li>追踪和记载一个或者多个文件的历史记录</li><li>组织和保护你的源代码和文档</li><li>统计工作量</li><li>并行开发、提高开发效率</li><li>跟踪记录整个软件的开发过程</li><li>减轻开发人员的负担,节省时间,同时降低人为错误<h3 id="Git常用术语"><a href="#Git常用术语" class="headerlink" title="Git常用术语"></a>Git常用术语</h3></li></ul><blockquote><p>记住git的常用术语对后续理解git的基本操作有着至关重要的作用</p></blockquote><ul><li>仓库(Repository)<br>受版本控制的所有文件修订历史的共享数据库</li><li>工作空间(WorkSpace)<br>本地硬盘或Unix 用户帐户上编辑的文件副本</li><li><p>工作树/区(Working tree)<br>工作区包含了仓库的工作文件。您可以修改和提交更改然后提交到仓库。</p></li><li><p>暂存区(Staging area)<br>暂存区是工作区提交之后的地方。<br><img src="/2018/10/10/版本控制SoEasy之Git-01/2.png" alt="git提交到本地版本库的一个过程"></p></li><li>索引(index)<br>索引是暂存区的另一种术语</li><li>签入(Checkin)<br>将新版本签入回仓库</li><li>签出(checkout)</li><li>从仓库中将文件的最新修订版本复制到工作空间</li><li>提交(Commit)<br>对各自文件的工作副本做了更改,并将这些更改提交到仓库</li><li>冲突(Conflict)<br>多人对同一文件的工作副本进行更改,并将这些更改提交到仓库</li><li>合并(Merge)<br>将某分支上的更改联接到此主干或同为主干的另一个分支</li><li>分支(Branch)<br>从主线上分离开的副本,默认分支叫master</li><li>锁(Lock)<br>获得修改文件的专有权限。</li><li>头(HEAD)<br>头是一个象征性的参考,最常用以指向当前选择的分支。</li><li>修订(Revision)<br>表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。</li><li><p>标记(Tags)<br>标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。</p><h3 id="Git和SVN"><a href="#Git和SVN" class="headerlink" title="Git和SVN"></a>Git和SVN</h3><p>SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。<br><img src="/2018/10/10/版本控制SoEasy之Git-01/3.png" alt="在这里插入图片描述"><br>Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。<br> <img src="/2018/10/10/版本控制SoEasy之Git-01/4.png" alt="在这里插入图片描述"></p><h1 id="GitBash常用命令"><a href="#GitBash常用命令" class="headerlink" title="GitBash常用命令"></a>GitBash常用命令</h1><p> cd ~ 回home</p><p> cd ..回退到上一个目录,直接cd进入默认目录</p><p> pwd:显示当前所在目录路径</p><p> ls(ll): 都是列出当前目录中的所有文件,只不过ll列出的内容更为详细</p><p> touch: 新建一个文件 </p><p> rm :删除一个文件</p><p> mkdir:新建一个文件</p><p> rm -r :删除一个文件夹,rm -r src删除src目录</p><p> mv :移动文件,mv index.</p><p> reset: 清屏</p><p> history: 查看命令历史</p><p> help 帮助</p><p> exit 推出</p><p> #表示注释</p><p> 显示文件内容 cat</p></li></ul><h1 id="Git常用命令"><a href="#Git常用命令" class="headerlink" title="Git常用命令"></a>Git常用命令</h1><p>查看配置,可以查看现在git环境配置</p><pre><code>git config -l</code></pre><p>查看系统</p><pre><code>config git config --system --list</code></pre><p>查看当前用户global的配置</p><pre><code>git config --global --list</code></pre><p>查看当前仓库配置</p><pre><code>git config --local --list</code></pre><p>设置用户名和邮箱</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined">$ git<span class="hljs-built_in"> config </span>--global user.name <span class="hljs-string">"guogugo"</span> #名称<br>$ git<span class="hljs-built_in"> config </span>--global user.email [email protected] #邮箱<br></code></pre></td></tr></table></figure><blockquote><p> 总之–global为全局配置,不加则为某个项目的特定配置。</p></blockquote><p>添加配置项</p><pre><code>git config [--local|--global|--system] section.key value[--local|--global|--system] #可选的,对应本地,全局,系统不同级别的设置section.key #区域下的键value #对应的值</code></pre><p>删除配置项</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined">git<span class="hljs-built_in"> config </span>[--local|--global|--system] --unset section.key<br></code></pre></td></tr></table></figure><h1 id="git-理论基础"><a href="#git-理论基础" class="headerlink" title="git 理论基础"></a>git 理论基础</h1><h3 id="工作区域"><a href="#工作区域" class="headerlink" title="工作区域"></a>工作区域</h3><p>Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:<br><img src="/2018/10/10/版本控制SoEasy之Git-01/5.png" alt="在这里插入图片描述"></p><ul><li>Workspace:工作区,就是你平时存放项目代码的地方</li><li>Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息</li><li>Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本</li><li>Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换<br>下面这张图能更好的说明<br><img src="/2018/10/10/版本控制SoEasy之Git-01/6.png" alt="在这里插入图片描述"></li><li>Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。</li><li>WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。</li><li>.git:存放Git管理信息的目录,初始化仓库的时候自动创建。<br>Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。</li><li>Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。</li><li>Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。<h3 id="git-的工作流程"><a href="#git-的工作流程" class="headerlink" title="git 的工作流程"></a>git 的工作流程</h3></li></ul><p>Git基本git的工作流程一般是这样的:</p><ol><li>在工作目录中添加、修改文件;</li><li>将需要进行版本管理的文件放入暂存区域;</li><li>将暂存区域的文件提交到git仓库。(这里是本地仓库) </li></ol><p>因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)操作<br><img src="/2018/10/10/版本控制SoEasy之Git-01/7.png" alt="在这里插入图片描述"><br>图解教程<br>直接看图理解本地git的提交过程<br><img src="/2018/10/10/版本控制SoEasy之Git-01/8.png" alt="在这里插入图片描述"></p><h1 id="Git的基本操作"><a href="#Git的基本操作" class="headerlink" title="Git的基本操作"></a>Git的基本操作</h1><h3 id="创建工作目录与常用指令"><a href="#创建工作目录与常用指令" class="headerlink" title="创建工作目录与常用指令"></a>创建工作目录与常用指令</h3><p>工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。</p><p>日常使用只要记住下图6个命令:<br><img src="/2018/10/10/版本控制SoEasy之Git-01/9.png" alt="在这里插入图片描述"></p><h3 id="获得git仓库"><a href="#获得git仓库" class="headerlink" title="获得git仓库"></a>获得git仓库</h3><p>需要用GIT管理的项目的根目录执行(注意自己当前目录的位置):</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 在当前目录新建一个Git代码库</span><br><span class="hljs-meta">$</span><span class="bash"> git init</span><br></code></pre></td></tr></table></figure><p>执行后项目目录会多出一个.git文件夹,关于版本等信息都在这里面,如果没有看到可以百度怎么查看隐藏文件</p><p>使用如下命令,可以把创建目录与仓库一起完成</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 新建一个目录,将其初始化为Git代码库</span><br><span class="hljs-meta">$</span><span class="bash"> git init [project-name]</span><br></code></pre></td></tr></table></figure><h3 id="克隆远程仓库"><a href="#克隆远程仓库" class="headerlink" title="克隆远程仓库"></a>克隆远程仓库</h3><p>另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout,语法格式如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 克隆一个项目和它的整个代码历史(版本信息)</span><br><span class="hljs-meta">$</span><span class="bash"> git <span class="hljs-built_in">clone</span> [url]</span><br></code></pre></td></tr></table></figure><blockquote><p>注意url为https……的地址</p></blockquote><h2 id="git-文件操作"><a href="#git-文件操作" class="headerlink" title="git 文件操作"></a>git 文件操作</h2><p>版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。</p><h3 id="文件四种状态"><a href="#文件四种状态" class="headerlink" title="文件四种状态"></a>文件四种状态</h3><p><img src="/2018/10/10/版本控制SoEasy之Git-01/10.png" alt="在这里插入图片描述"></p><ul><li>Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.</li><li>Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改,<br>而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件</li><li>Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git<br>add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git<br>checkout即从库中取出文件, 覆盖当前修改</li><li>Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致,<br>文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified<br><img src="/2018/10/10/版本控制SoEasy之Git-01/11.png" alt="在这里插入图片描述"><h3 id="查看文件状态"><a href="#查看文件状态" class="headerlink" title="查看文件状态"></a>查看文件状态</h3></li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash">查看指定文件状态</span><br>git status [filename]<br><span class="hljs-meta"><br>#</span><span class="bash">查看所有文件状态</span><br>git status<br></code></pre></td></tr></table></figure><h3 id="添加文件和目录"><a href="#添加文件和目录" class="headerlink" title="添加文件和目录"></a>添加文件和目录</h3><p><img src="/2018/10/10/版本控制SoEasy之Git-01/12.png" alt="在这里插入图片描述"></p><ul><li>工作区(Working Directory)就是你在电脑里能看到的目录。</li><li>版本库(Repository)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。</li><li>Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。</li></ul><p>将untracked状态的文件添加到暂存区,语法格式如下:</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 添加指定文件到暂存区</span><br><span class="hljs-meta">$</span><span class="bash"> git add [file1] [file2] ...</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 添加指定目录到暂存区,包括子目录</span><br><span class="hljs-meta">$</span><span class="bash"> git add [dir]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 添加当前目录的所有文件到暂存区</span><br><span class="hljs-meta">$</span><span class="bash"> git add .</span><br></code></pre></td></tr></table></figure><h3 id="移除文件与目录"><a href="#移除文件与目录" class="headerlink" title="移除文件与目录"></a>移除文件与目录</h3><p><img src="/2018/10/10/版本控制SoEasy之Git-01/13.png" alt="在这里插入图片描述"></p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#直接从暂存区删除文件,工作区则不做出改变</span><br>git rm <span class="hljs-comment">--cached <file></span><br></code></pre></td></tr></table></figure><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#如果已经用add 命令把文件加入stage了,就先需要从stage中撤销</span><br>git reset HEAD <<span class="hljs-built_in">file</span>>...<br></code></pre></td></tr></table></figure><p>当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash">移除所有未跟踪文件</span><br><span class="hljs-meta">#</span><span class="bash">一般会加上参数-df,-d表示包含目录,-f表示强制清除。</span><br>git clean [options]<br></code></pre></td></tr></table></figure><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined">#只从stage中删除,保留物理文件<br>git rm --cached readme<span class="hljs-selector-class">.txt</span> <br><br>#不但从stage中删除,同时删除物理文件<br>git rm readme<span class="hljs-selector-class">.txt</span> <br><br>#把<span class="hljs-selector-tag">a</span>.txt改名为<span class="hljs-selector-tag">b</span><span class="hljs-selector-class">.txt</span><br>git mv <span class="hljs-selector-tag">a</span><span class="hljs-selector-class">.txt</span> <span class="hljs-selector-tag">b</span>.txt<br></code></pre></td></tr></table></figure><ul><li>当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master<br>指向的目录树就是提交时暂存区的目录树。</li><li>当执行 “git reset HEAD” 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。</li><li>当执行 “git rm –cached <file>” 命令时,会直接从暂存区删除文件,工作区则不做出改变。</file></li><li>当执行 “git checkout .” 或者 “git checkout — <file>”<br>命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。</file></li><li>当执行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令时,会用 HEAD指向的 master分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。<h3 id="查看文件修改后的差异"><a href="#查看文件修改后的差异" class="headerlink" title="查看文件修改后的差异"></a>查看文件修改后的差异</h3>git diff用于显示WorkSpace中的文件和暂存区文件的差异</file></li></ul><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#查看文件修改后的差异</span><br><span class="hljs-attribute">git</span> diff<span class="hljs-meta"> [files]</span><br></code></pre></td></tr></table></figure><p>-a表示修改之前的文件,+++b表示修改后的文件</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#比较暂存区的文件与之前已经提交过的文件</span><br>git diff <span class="hljs-comment">--cached</span><br></code></pre></td></tr></table></figure><p>也可以把WorkSpace中的状态和repo中的状态进行diff,命令如下:</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#比较repo与工作空间中的文件差异</span><br>git <span class="hljs-keyword">diff </span>HEAD~n<br></code></pre></td></tr></table></figure><p><img src="/2018/10/10/版本控制SoEasy之Git-01/14.png" alt="在这里插入图片描述"></p><h3 id="签出"><a href="#签出" class="headerlink" title="签出"></a>签出</h3><p>如果仓库中已经存在文件f4.txt,在工作区中对f4修改了,如果想撤销可以使用checkout,签出覆盖</p><p>检出命令git checkout是git最常用的命令之一,同时也是一个很危险的命令,因为这条命令会重写工作区</p><p>语法:</p><figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined">#用法一<br>git checkout [-q] <span class="hljs-meta">[<commit>]</span> [--] <paths>...<br>#用法二<br>git checkout <span class="hljs-meta">[<branch>]</span><br>#用法三<br>git checkout [-m] [[-b]--orphan] <new_branch>] <span class="hljs-meta">[<start_point>]</span><br></code></pre></td></tr></table></figure><p><img src="/2018/10/10/版本控制SoEasy之Git-01/15.png" alt="在这里插入图片描述"><br><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">$</span><span class="bash"> git checkout branch</span><br><span class="hljs-meta">#</span><span class="bash">检出branch分支。要完成图中的三个步骤,更新HEAD以指向branch分支,以及用branch 指向的树更新暂存区和工作区。</span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout</span><br><span class="hljs-meta">#</span><span class="bash">汇总显示工作区、暂存区与HEAD的差异。</span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout HEAD</span><br><span class="hljs-meta">#</span><span class="bash">同上</span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout -- filename</span><br><span class="hljs-meta">#</span><span class="bash">用暂存区中filename文件来覆盖工作区中的filename文件。相当于取消自上次执行git add filename以来(如果执行过)的本地修改。</span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout branch -- filename</span><br><span class="hljs-meta">#</span><span class="bash">维持HEAD的指向不变。用branch所指向的提交中filename替换暂存区和工作区中相 应的文件。注意会将暂存区和工作区中的filename文件直接覆盖。</span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout -- . 或写作 git checkout .</span><br><span class="hljs-meta">#</span><span class="bash">注意git checkout 命令后的参数为一个点(“.”)。这条命令最危险!会取消所有本地的 <span class="hljs-comment">#修改(相对于暂存区)。相当于用暂存区的所有文件直接覆盖本地文件,不给用户任何确认的机会!</span></span><br><span class="hljs-meta"><br>$</span><span class="bash"> git checkout commit_id -- file_name</span><br><span class="hljs-meta">#</span><span class="bash">如果不加commit_id,那么git checkout -- file_name 表示恢复文件到本地版本库中最新的状态。</span><br></code></pre></td></tr></table></figure></p><h3 id="提交"><a href="#提交" class="headerlink" title="提交"></a>提交</h3><p>通过add只是将文件或目录添加到了index暂存区,使用commit可以实现将暂存区的文件提交到本地仓库。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">#</span><span class="bash"> 提交暂存区到仓库区</span><br><span class="hljs-meta">$</span><span class="bash"> git commit -m [message]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 提交暂存区的指定文件到仓库区</span><br><span class="hljs-meta">$</span><span class="bash"> git commit [file1] [file2] ... -m [message]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 提交工作区自上次commit之后的变化,直接到仓库区,跳过了add,对新文件无效</span><br><span class="hljs-meta">$</span><span class="bash"> git commit -a</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 提交时显示所有diff信息</span><br><span class="hljs-meta">$</span><span class="bash"> git commit -v</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 使用一次新的commit,替代上一次提交</span><br><span class="hljs-meta">#</span><span class="bash"> 如果代码没有任何新变化,则用来改写上一次commit的提交信息</span><br><span class="hljs-meta">$</span><span class="bash"> git commit --amend -m [message]</span><br><span class="hljs-meta"><br>#</span><span class="bash"> 重做上一次commit,并包括指定文件的新变化</span><br><span class="hljs-meta">$</span><span class="bash"> git commit --amend [file1] [file2] ...</span><br></code></pre></td></tr></table></figure><h3 id="修订提交"><a href="#修订提交" class="headerlink" title="修订提交"></a>修订提交</h3><p>如果我们提交过后发现有个文件改错了,或者只是想修改提交说明,这时可以对相应文件做出修改,将修改过的文件通过”git add”添加到暂存区,然后执行以下命令:</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment"># 修订提交</span><br>git commit <span class="hljs-comment">--amend</span><br></code></pre></td></tr></table></figure><h3 id="撤销提交(commit)"><a href="#撤销提交(commit)" class="headerlink" title="撤销提交(commit)"></a>撤销提交(commit)</h3><p>原理就是放弃工作区和index的改动,同时HEAD指针指向前一个commit对象</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment">#撤销上一次的提交</span><br>git reset <span class="hljs-comment">--hard HEAD~1</span><br></code></pre></td></tr></table></figure><p>查看日志与历史</p><p>查看提交日志可以使用git log指令,语法格式如下:</p><figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined">#查看提交日志<br>git log <span class="hljs-meta">[<options>]</span> <span class="hljs-meta">[<revision range>]</span> [[\--] <path>…?]<br></code></pre></td></tr></table></figure><h4 id="撤销暂存区跟新"><a href="#撤销暂存区跟新" class="headerlink" title="撤销暂存区跟新"></a>撤销暂存区跟新</h4><p>使用”git add”把更新提交到了暂存区。这时”git status”的输出中提示我们可以通过”git reset HEAD <file>…”把暂存区的更新移出到WorkSpace中</file></p><h4 id="撤销本地库更新"><a href="#撤销本地库更新" class="headerlink" title="撤销本地库更新"></a>撤销本地库更新</h4><p>在Git中,有一个HEAD指针指向当前分支中最新的提交。当前版本,我们使用”HEAD^”,那么再钱一个版本可以使用”HEAD^^”,如果想回退到更早的提交,可以使用”HEAD~n”。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)</p><h1 id="优质参考"><a href="#优质参考" class="headerlink" title="优质参考"></a>优质参考</h1><p><a href="https://www.cnblogs.com/best/p/7474442.html#_label0" target="_blank" rel="noopener">张果教你用git</a></p>]]></content>
<summary type="html">
<p><img src="/2018/10/10/版本控制SoEasy之Git-01/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="Git" scheme="http://yoursite.com/categories/Git/"/>
<category term="版本控制" scheme="http://yoursite.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
<category term="git" scheme="http://yoursite.com/tags/git/"/>
</entry>
<entry>
<title>SQL基础</title>
<link href="http://yoursite.com/2018/09/29/SQL%E5%9F%BA%E7%A1%80/"/>
<id>http://yoursite.com/2018/09/29/SQL基础/</id>
<published>2018-09-29T09:54:00.000Z</published>
<updated>2018-09-30T03:16:16.326Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/29/SQL基础/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h2 id="mysql-dos常用命令"><a href="#mysql-dos常用命令" class="headerlink" title="mysql dos常用命令"></a>mysql dos常用命令</h2><p>打开mysql服务</p><pre><code>net start mysql</code></pre><p>关闭mysql服务</p><pre><code>net stop mysql</code></pre><p>登陆mysql</p><pre><code>mysql -u root -p </code></pre><p>连接到远程主机上的mysql<br>假设远程主机ip为: 22.22.22.22 ,用户名为root ,密码为abcd123.则键入以下命令</p><pre><code>mysql -h22.22.22.22 -u root -p abc123</code></pre><p>退出mysql</p><pre><code>exit</code></pre><p>修改密码<br>修改root 密码</p><pre><code>update user set password=password("sss") where user = "root";</code></pre><p>打开数据库</p><pre><code>use datatable</code></pre><p>显示所有数据库</p><pre><code>show databases;</code></pre><p>显示数据库mysql里的所有表,先切入到数据库(如use datatables),才能看到表</p><pre><code>show tables;</code></pre><p>显示表mysql数据库中的user表的列信息</p><pre><code>describe user;</code></pre><p>数据库创建</p><pre><code>create database db_name;</code></pre><p>删除数据库</p><pre><code>drop database db_name;删除时可先判断是否存在,drop database if exits db_name</code></pre><p>建表</p><pre><code>create table table_name(字段一 数据类型,字段二 数据类型);</code></pre><p>添加数据 insert into 表名[(字段一,字段二)]value (值1,值2);<br>如果向表中的每一个字段都插入一个值,[]中括号里面的可以不用写</p><p>查询表里所有数据</p><pre><code>select * from tbale;</code></pre><p>更新指定数据</p><pre><code>update table_name set 字段名 = '新值‘where id =1;</code></pre><p>删除表中数据</p><pre><code>delete from table_name;</code></pre><p>一次创建多个数据库用户</p><pre><code>create user username identified by 'password' ,username2 identified by 'password'</code></pre><p>用户的权限控制<br>将某个库中的某个表的控制权赋予某个用户</p><pre><code>grant all on db_name.table_name to user_name [indentified by 'password'];</code></pre><p>表结构的修改<br>增加一个字段</p><pre><code>alert table table_name add column 字段名 字段类型 alter 某字段;</code></pre><p>修改字段名称</p><pre><code>alter table table_name change 旧字段名 新字段名 新字段类型;</code></pre><p>改表的名字</p><pre><code>alter table table_name rename to new_table_name;</code></pre><p>一次性清空表中的所有数据</p><pre><code>truncate table table_name;</code></pre><p>备份数据库</p><pre><code>mysqldump -h host -u root -p dbname >dbname_backup.sql</code></pre><h2 id="sql常用函数"><a href="#sql常用函数" class="headerlink" title="sql常用函数"></a>sql常用函数</h2><p> “Websites” 表<br>+—-+————–+—————————+——-+———+<br>| id | name | url | alexa | country |<br>+—-+————–+—————————+——-+———+<br>| 1 | Google | <a href="https://www.google.cm/" target="_blank" rel="noopener">https://www.google.cm/</a> | 1 | USA |<br>| 2 | 淘宝 | <a href="https://www.taobao.com/" target="_blank" rel="noopener">https://www.taobao.com/</a> | 13 | CN |<br>| 3 | 菜鸟教程 | <a href="http://www.runoob.com/" target="_blank" rel="noopener">http://www.runoob.com/</a> | 4689 | CN |<br>| 4 | 微博 | <a href="http://weibo.com/" target="_blank" rel="noopener">http://weibo.com/</a> | 20 | CN |<br>| 5 | Facebook | <a href="https://www.facebook.com/" target="_blank" rel="noopener">https://www.facebook.com/</a> | 3 | USA |<br>| 7 | stackoverflow | <a href="http://stackoverflow.com/" target="_blank" rel="noopener">http://stackoverflow.com/</a> | 0 | IND |<br>+—-+—————+—————————+——-+———+<br> “access_log”表<br>+—–+———+——-+————+<br>| aid | site_id | count | date |<br>+—–+———+——-+————+<br>| 1 | 1 | 45 | 2016-05-10 |<br>| 2 | 3 | 100 | 2016-05-13 |<br>| 3 | 1 | 230 | 2016-05-14 |<br>| 4 | 2 | 10 | 2016-05-14 |<br>| 5 | 5 | 205 | 2016-05-14 |<br>| 6 | 4 | 13 | 2016-05-15 |<br>| 7 | 3 | 220 | 2016-05-15 |<br>| 8 | 5 | 545 | 2016-05-16 |<br>| 9 | 3 | 201 | 2016-05-17 |<br>+—–+———+——-+————+</p><h4 id="有用的-Aggregate-函数:"><a href="#有用的-Aggregate-函数:" class="headerlink" title="有用的 Aggregate 函数:"></a>有用的 Aggregate 函数:</h4><ul><li>AVG() - 返回平均值</li><li>COUNT() - 返回行数</li><li>FIRST() - 返回第一个记录的值</li><li>LAST() - 返回最后一个记录的值</li><li>MAX() - 返回最大值</li><li>MIN() - 返回最小值</li><li>SUM() - 返回总和</li></ul><p>AVG() - 返回平均值<br>下面的 SQL 语句选择访问量高于平均访问量的 “site_id” 和 “count”:</p><pre><code>SELECT site_id, count FROM access_logWHERE count > (SELECT AVG(count) FROM access_log);</code></pre><p>COUNT() - 返回行数</p><p>COUNT() 函数返回匹配指定条件的行数。适用于mysql,和Oracle<br>COUNT(DISTINCT column_name) 函数返回指定列的不同值的数目:</p><pre><code>SELECT COUNT(DISTINCT column_name) FROM table_name;MAX</code></pre><p>下面的 SQL 语句从 “Websites” 表的 “alexa” 列获取最大值:</p><pre><code>SELECT MAX(alexa) AS max_alexa FROM Websites;MIN</code></pre><p>下面的 SQL 语句从 “Websites” 表的 “alexa” 列获取最小值:</p><pre><code>SELECT MIN(alexa) AS min_alexa FROM Websites;SUM</code></pre><p>下面的 SQL 语句查找 “access_log” 表的 “count” 字段的总数:</p><pre><code>SELECT SUM(count) AS nums FROM access_log;GROUP BY</code></pre><p>GROUP BY 语句用于结合聚合函数,根据一个或多个列对结果集进行分组。</p><p>下面的 SQL 语句统计所有网站的访问的记录数:</p><pre><code>SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_logLEFT JOIN WebsitesON access_log.site_id=Websites.idGROUP BY Websites.name;</code></pre><h5 id="HAVING-子句"><a href="#HAVING-子句" class="headerlink" title="HAVING 子句"></a>HAVING 子句</h5><p>在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。<br>HAVING 子句可以让我们筛选分组后的各组数据。<br>下面的 SQL 语句统计所有网站的访问的记录数:</p><pre><code>SELECT Websites.name,COUNT(access_log.aid) AS nums FROM access_logLEFT JOIN WebsitesON access_log.site_id=Websites.idGROUP BY Websites.name;</code></pre><p>现在我们想要查找总访问量大于 200 的网站,并且 alexa 排名小于 200。<br>我们在 SQL 语句中增加一个普通的 WHERE 子句:</p><pre><code>SELECT Websites.name, SUM(access_log.count) AS nums FROM WebsitesINNER JOIN access_logON Websites.id=access_log.site_idWHERE Websites.alexa < 200 GROUP BY Websites.nameHAVING SUM(access_log.count) > 200;</code></pre><h5 id="UCASE-函数"><a href="#UCASE-函数" class="headerlink" title="UCASE() 函数"></a>UCASE() 函数</h5><p>UCASE() 函数把字段的值转换为大写。</p><p>下面的 SQL 语句从 “Websites” 表中选取 “name” 和 “url” 列,并把 “name” 列的值转换为大写:</p><pre><code>SELECT UCASE(name) AS site_title, urlFROM Websites;</code></pre><h5 id="LCASE-函数"><a href="#LCASE-函数" class="headerlink" title="LCASE() 函数"></a>LCASE() 函数</h5><p>LCASE() 函数把字段的值转换为小写。</p><p>下面的 SQL 语句从 “Websites” 表中选取 “name” 和 “url” 列,并把 “name” 列的值转换为小写:</p><pre><code>SELECT LCASE(name) AS site_title, urlFROM Websites;</code></pre><h5 id="MID-函数"><a href="#MID-函数" class="headerlink" title="MID() 函数"></a>MID() 函数</h5><p>MID() 函数用于从文本字段中提取字符。</p><p>SELECT MID(column_name,start[,length]) FROM table_name;<br>下面的 SQL 语句从 “Websites” 表的 “name” 列中提取前 4 个字符:</p><pre><code>SELECT MID(name,1,4) AS ShortTitleFROM Websites;</code></pre><h5 id="LEN-函数"><a href="#LEN-函数" class="headerlink" title="LEN() 函数"></a>LEN() 函数</h5><p>LEN() 函数返回文本字段中值的长度。</p><pre><code>SELECT name, LENGTH(url) as LengthOfURLFROM Websites;</code></pre><h5 id="ROUND-函数"><a href="#ROUND-函数" class="headerlink" title="ROUND() 函数"></a>ROUND() 函数</h5><p>ROUND() 函数用于把数值字段舍入为指定的小数位数。<br>SELECT ROUND(column_name,decimals) FROM table_name;<br>decimals 必需。规定要返回的小数位数。</p><p>ROUND(X,D): 返回参数X的四舍五入的有 D 位小数的一个数字。如果D为0,结果将没有小数点或小数部分。</p><pre><code>mysql> select ROUND(1.298, 1); -> 1.3 mysql> select ROUND(1.298, 0); -> 1FORMAT() 函数</code></pre><h5 id="FORMAT-函数用于对字段的显示进行格式化。"><a href="#FORMAT-函数用于对字段的显示进行格式化。" class="headerlink" title="FORMAT() 函数用于对字段的显示进行格式化。"></a>FORMAT() 函数用于对字段的显示进行格式化。</h5><pre><code>SELECT FORMAT(column_name,format) FROM table_name;</code></pre><p>column_name 必需,要格式化的字段。<br>format 必需,规定格式。</p><p>下面的 SQL 语句从 “Websites” 表中选取 name, url 以及格式化为 YYYY-MM-DD 的日期:</p><pre><code>SELECT name, url, DATE_FORMAT(Now(),'%Y-%m-%d') AS dateFROM Websites;</code></pre><p>参考<br><a href="https://note.youdao.com/web/#/file/recent/note/61812DBF1C4B4180A0637FD7AF60B04C/" target="_blank" rel="noopener">快速查看</a></p>]]></content>
<summary type="html">
<p><img src="/2018/09/29/SQL基础/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="sql" scheme="http://yoursite.com/categories/sql/"/>
<category term="sql" scheme="http://yoursite.com/tags/sql/"/>
</entry>
<entry>
<title>SSM项目的相关配置</title>
<link href="http://yoursite.com/2018/09/25/SSM%E9%A1%B9%E7%9B%AE%E7%9A%84%E7%9B%B8%E5%85%B3%E9%85%8D%E7%BD%AE/"/>
<id>http://yoursite.com/2018/09/25/SSM项目的相关配置/</id>
<published>2018-09-25T06:58:00.000Z</published>
<updated>2018-09-25T07:07:37.574Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/25/SSM项目的相关配置/1.jpg" alt="在这里插入图片描述"><br> <a id="more"></a></p><h1 id="SSM项目的相关配置"><a href="#SSM项目的相关配置" class="headerlink" title="SSM项目的相关配置"></a>SSM项目的相关配置</h1><p>众所周知,SSM项目的配置主要有六个(当然还有一些其他配置),web.xml的配置,Spring的配置(applicationContext.xml),SpringMVC配置(servlet-mvc.xml),Mybaits的配置(mybatis-config.xml ),JDBC文件与Log4j配置文件。</p><h2 id="下面我们就来仔细讲解这六个配置"><a href="#下面我们就来仔细讲解这六个配置" class="headerlink" title="下面我们就来仔细讲解这六个配置"></a>下面我们就来仔细讲解这六个配置</h2><h3 id="web-xml的配置"><a href="#web-xml的配置" class="headerlink" title="web.xml的配置"></a>web.xml的配置</h3><p>配置web.xml主要有两个内容,一个是Spring,一个是SpringMVC的配置。</p><h3 id="Spring配置信息"><a href="#Spring配置信息" class="headerlink" title="Spring配置信息"></a>Spring配置信息</h3><ul><li>通过全局上下文参数来加载Spring配置文件</li><li>配置监听器</li></ul><h3 id="在web-xml中继续配置Spring-MVC"><a href="#在web-xml中继续配置Spring-MVC" class="headerlink" title="在web.xml中继续配置Spring MVC"></a>在web.xml中继续配置Spring MVC</h3><ul><li>首先配置servlet 通过Servlet标签配置dispatchServlet.需要初始化参数,加载spring MVC配置文件。</li><li>配置Mapping</li></ul><h3 id="下面是我的web-xml配置文件的例子"><a href="#下面是我的web-xml配置文件的例子" class="headerlink" title="下面是我的web.xml配置文件的例子"></a>下面是我的web.xml配置文件的例子</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><code class="hljs undefined"> <span class="hljs-comment"><!--Spring的配置信息<br> 通过全局上下文参数来加载Sprin配置文件--></span><br> <span class="hljs-tag"><<span class="hljs-name">context-param</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">param-name</span>></span>contextConfigLocation<span class="hljs-tag"></<span class="hljs-name">param-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">param-value</span>></span>classpath*:applicationContext*.xml<span class="hljs-tag"></<span class="hljs-name">param-value</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">context-param</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">session-config</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">session-timeout</span>></span>120<span class="hljs-tag"></<span class="hljs-name">session-timeout</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">session-config</span>></span><br> <span class="hljs-comment"><!--配置监听器,通过监听器的方式来Spring框架运行起来--></span><br> <span class="hljs-tag"><<span class="hljs-name">listener</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">listener-class</span>></span>org.springframework.web.context.ContextLoaderListener<span class="hljs-tag"></<span class="hljs-name">listener-class</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">listener</span>></span><br> <span class="hljs-comment"><!--解决中文乱码--></span><br> <span class="hljs-tag"><<span class="hljs-name">filter</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">filter-name</span>></span>CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-name">filter-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">filter-class</span>></span>org.springframework.web.filter.CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-name">filter-class</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">init-param</span>></span><br> <span class="hljs-comment"><!--配置编码格式--></span><br> <span class="hljs-tag"><<span class="hljs-name">param-name</span>></span>encoding<span class="hljs-tag"></<span class="hljs-name">param-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">param-value</span>></span>utf-8<span class="hljs-tag"></<span class="hljs-name">param-value</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">init-param</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">filter</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">filter-mapping</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">filter-name</span>></span>CharacterEncodingFilter<span class="hljs-tag"></<span class="hljs-name">filter-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">url-pattern</span>></span>/*<span class="hljs-tag"></<span class="hljs-name">url-pattern</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">filter-mapping</span>></span><br><br> <br><span class="hljs-comment"><!--默认首页--></span><br> <span class="hljs-tag"><<span class="hljs-name">welcome-file-list</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">welcome-file</span>></span>due/index<span class="hljs-tag"></<span class="hljs-name">welcome-file</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">welcome-file-list</span>></span><br> <span class="hljs-comment"><!--Spring MVC的配置信息<br> 通过Servlet标签配置dispatcher--></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-name</span>></span>dispatcher<span class="hljs-tag"></<span class="hljs-name">servlet-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-class</span>></span>org.springframework.web.servlet.DispatcherServlet<span class="hljs-tag"></<span class="hljs-name">servlet-class</span>></span><br> <span class="hljs-comment"><!--需要一个初始化参数,加载spring MVC配置文件--></span><br> <span class="hljs-tag"><<span class="hljs-name">init-param</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">param-name</span>></span>contextConfigLocation<span class="hljs-tag"></<span class="hljs-name">param-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">param-value</span>></span>classpath*:springmvc-context.xml<span class="hljs-tag"></<span class="hljs-name">param-value</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">init-param</span>></span><br> <span class="hljs-comment"><!--容器启动加载servlet--></span><br> <span class="hljs-tag"><<span class="hljs-name">load-on-startup</span>></span>1<span class="hljs-tag"></<span class="hljs-name">load-on-startup</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">servlet</span>></span><br> <span class="hljs-comment"><!--/监听全局路径--></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-mapping</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-name</span>></span>dispatcher<span class="hljs-tag"></<span class="hljs-name">servlet-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">url-pattern</span>></span>/due/index<span class="hljs-tag"></<span class="hljs-name">url-pattern</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">servlet-mapping</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-mapping</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">servlet-name</span>></span>dispatcher<span class="hljs-tag"></<span class="hljs-name">servlet-name</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">url-pattern</span>></span>/<span class="hljs-tag"></<span class="hljs-name">url-pattern</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">servlet-mapping</span>></span><br></code></pre></td></tr></table></figure><h2 id="Spring的配置"><a href="#Spring的配置" class="headerlink" title="Spring的配置"></a>Spring的配置</h2><ul><li>自动扫描:根据注解创建实例化,控制反转。</li><li>引入配置文件。jdbc的驱动包等信息。</li><li>配置数据源。需要的信息根据第二步中的jdbc中的配置文件来引用。</li><li>配置Mybaits的SqlSessionFactory:有了它可以MyBaits(1:数据源:第三步配置数据源。2:自动扫描mappers.xml文件。所有的映射文件。放在一个对应的路径下。3:加载Mybaits的配置文件</li><li>DAO层接口包。该包下的所有都会被实例化。<br>-配置事务管理:交由Spring来管理(定义事物传播属性)</li><li>配置事物切面。</li><li>异常处理相关。</li></ul><h3 id="下面是applicationContext-xml配置信息"><a href="#下面是applicationContext-xml配置信息" class="headerlink" title="下面是applicationContext.xml配置信息"></a>下面是applicationContext.xml配置信息</h3><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="xml"><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?></span></span> <br><span class="hljs-tag"><<span class="hljs-name">beans</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span> <br> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span> <br> <span class="hljs-attr">xmlns:p</span>=<span class="hljs-string">"http://www.springframework.org/schema/p"</span> <br> <span class="hljs-attr">xmlns:aop</span>=<span class="hljs-string">"http://www.springframework.org/schema/aop"</span> <br> <span class="hljs-attr">xmlns:context</span>=<span class="hljs-string">"http://www.springframework.org/schema/context"</span> <br> <span class="hljs-attr">xmlns:jee</span>=<span class="hljs-string">"http://www.springframework.org/schema/jee"</span> <br> <span class="hljs-attr">xmlns:tx</span>=<span class="hljs-string">"http://www.springframework.org/schema/tx"</span> <br> <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">" <br> http://www.springframework.org/schema/aop<br> http://www.springframework.org/schema/aop/spring-aop.xsd <br> http://www.springframework.org/schema/beans<br> http://www.springframework.org/schema/beans/spring-beans.xsd <br> http://www.springframework.org/schema/context<br> http://www.springframework.org/schema/context/spring-context.xsd <br> http://www.springframework.org/schema/jee<br> http://www.springframework.org/schema/jee/spring-jee.xsd <br> http://www.springframework.org/schema/tx<br> http://www.springframework.org/schema/tx/spring-tx.xsd"</span>></span> <br> <span class="hljs-comment"><!-- 自动扫描 --></span><br> <span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.sys.dao"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.sys.service"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.sys.entity"</span>/></span><br> <span class="hljs-comment"><!-- 引入配置文件,可以使用$</span></span><span class="hljs-template-variable">{}</span><span class="xml"><span class="hljs-comment">语法,location:指定读取文件的路径 --></span><br> <span class="hljs-tag"><<span class="hljs-name">context:property-placeholder</span> <span class="hljs-attr">location</span>=<span class="hljs-string">"classpath:jdbc.properties"</span>/></span><br> <span class="hljs-comment"><!-- 配置数据源 --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"dataSource"</span><br> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.mchange.v2.c3p0.ComboPooledDataSource"</span><br> <span class="hljs-attr">p:driverClass</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.driverClassName}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span><br> <span class="hljs-attr">p:jdbcUrl</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.url}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span><br> <span class="hljs-attr">p:user</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.username}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span><br> <span class="hljs-attr">p:password</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.password}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span><br> <span class="hljs-attr">p:initialPoolSize</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.initialSize}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span><br> <span class="hljs-attr">p:maxPoolSize</span>=<span class="hljs-string">"$</span></span></span><span class="hljs-template-variable">{jdbc.maxActive}</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">"</span>/></span><br> <span class="hljs-comment"><!-- 配置mybatis的sqlSessionFactory --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"sqlSessionFactory"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.mybatis.spring.SqlSessionFactoryBean"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dataSource"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"dataSource"</span> /></span><br> <span class="hljs-comment"><!-- 自动扫描mappers.xml文件 --></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"mapperLocations"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"classpath:mybatis/mappers/*.xml"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br> <span class="hljs-comment"><!-- mybatis配置文件 --></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"configLocation"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"classpath:mybatis/mybatis-config.xml"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br> <span class="hljs-comment"><!-- DAO接口所在包名,Spring会自动查找其下的类 --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"basePackage"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"com.sys.dao"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sqlSessionFactoryBeanName"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"sqlSessionFactory"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br> <span class="hljs-comment"><!-- (事务管理)transaction manager, use JtaTransactionManager for global tx --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"transactionManager"</span><br> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dataSource"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"dataSource"</span> /></span><br> <span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br> <span class="hljs-comment"><!-- 配置事务通知属性 --></span> <br> <span class="hljs-tag"><<span class="hljs-name">tx:advice</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"txAdvice"</span> <span class="hljs-attr">transaction-manager</span>=<span class="hljs-string">"transactionManager"</span>></span><br> <span class="hljs-comment"><!-- 定义事务传播属性 --></span> <br> <span class="hljs-comment"><!-- PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。<br> PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。--></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:attributes</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"add*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"append*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"insert*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"save*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"update*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"modify*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"edit*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"delete*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"remove*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"repair"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"delAndRepair"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"get*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"find*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"load*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"search*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"datagrid*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"SUPPORTS"</span> /></span><br> <span class="hljs-tag"></<span class="hljs-name">tx:attributes</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">tx:advice</span>></span><br> <span class="hljs-comment"><!-- 配置事务切面 --></span> <br> <span class="hljs-tag"><<span class="hljs-name">aop:config</span>></span> <br> <span class="hljs-tag"><<span class="hljs-name">aop:pointcut</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"serviceOperation"</span> <br> <span class="hljs-attr">expression</span>=<span class="hljs-string">"execution(* com.sys.service.*.*(..))"</span> /></span> <br> <span class="hljs-tag"><<span class="hljs-name">aop:advisor</span> <span class="hljs-attr">advice-ref</span>=<span class="hljs-string">"txAdvice"</span> <span class="hljs-attr">pointcut-ref</span>=<span class="hljs-string">"serviceOperation"</span> /></span> <br> <span class="hljs-tag"></<span class="hljs-name">aop:config</span>></span> <br> <span class="hljs-comment"><!-- 异常统一处理 --></span><br> <span class="hljs-comment"><!-- <bean id="exceptionResolver" class="com.sys.util.HandlerException"/> --></span><br><span class="hljs-tag"></<span class="hljs-name">beans</span>></span></span><br></code></pre></td></tr></table></figure><h3 id="需要注意的地方"><a href="#需要注意的地方" class="headerlink" title="需要注意的地方"></a>需要注意的地方</h3><p>(1) advice(建议)的命名:由于每个模块都会有自己的Advice,所以在命名上需要作出规范,初步的构想就是模块名+Advice(只是一种命名规范)。</p><p>(2) tx:attribute标签所配置的是作为事务的方法的命名类型。</p><p> 如<tx:method name=”save*” propagation=”REQUIRED”/></p><p> 其中*为通配符,即代表以save为开头的所有方法,即表示符合此命名规则的方法作为一个事务。</p><p> propagation=”REQUIRED”代表支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。</p><p>(3) aop:pointcut标签配置参与事务的类,由于是在Service中进行数据库业务操作,配的应该是包含那些作为事务的方法的Service类。</p><p>首先应该特别注意的是id的命名,同样由于每个模块都有自己事务切面,所以我觉得初步的命名规则因为 all+模块名+ServiceMethod。而且每个模块之间不同之处还在于以下一句:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-attr">expression</span>=<span class="hljs-string">"execution(*com.test.testAda.test.model.service.*.*(..))"</span><br></code></pre></td></tr></table></figure><p>其中第一个<em>代表返回值,第二</em>代表service下子包,第三个*代表方法名,“(..)”代表方法参数。</p><p>(4) aop:advisor标签就是把上面我们所配置的事务管理两部分属性整合起来作为整个事务管理。</p><p>图解:<br><img src="/2018/09/25/SSM项目的相关配置/2.png" alt="在这里插入图片描述"></p><h2 id="Spring-MVC-Servlet-mvc-xml"><a href="#Spring-MVC-Servlet-mvc-xml" class="headerlink" title="Spring MVC(Servlet-mvc.xml)"></a>Spring MVC(Servlet-mvc.xml)</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?></span></span> <br><span class="hljs-tag"><<span class="hljs-name">beans</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.springframework.org/schema/beans"</span> <br> <span class="hljs-attr">xmlns:xsi</span>=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"</span> <br> <span class="hljs-attr">xmlns:p</span>=<span class="hljs-string">"http://www.springframework.org/schema/p"</span> <br> <span class="hljs-attr">xmlns:aop</span>=<span class="hljs-string">"http://www.springframework.org/schema/aop"</span> <br> <span class="hljs-attr">xmlns:context</span>=<span class="hljs-string">"http://www.springframework.org/schema/context"</span> <br> <span class="hljs-attr">xmlns:jee</span>=<span class="hljs-string">"http://www.springframework.org/schema/jee"</span> <br> <span class="hljs-attr">xmlns:tx</span>=<span class="hljs-string">"http://www.springframework.org/schema/tx"</span><br> <span class="hljs-attr">xmlns:mvc</span>=<span class="hljs-string">"http://www.springframework.org/schema/mvc"</span> <br> <span class="hljs-attr">xsi:schemaLocation</span>=<span class="hljs-string">" <br> http://www.springframework.org/schema/aop <br> http://www.springframework.org/schema/aop/spring-aop.xsd <br> http://www.springframework.org/schema/beans <br> http://www.springframework.org/schema/beans/spring-beans.xsd <br> http://www.springframework.org/schema/context <br> http://www.springframework.org/schema/context/spring-context.xsd <br> http://www.springframework.org/schema/jee <br> http://www.springframework.org/schema/jee/spring-jee.xsd <br> http://www.springframework.org/schema/mvc<br> http://www.springframework.org/schema/mvc/spring-mvc.xsd<br> http://www.springframework.org/schema/tx <br> http://www.springframework.org/schema/tx/spring-tx.xsd"</span>></span> <br><br> <span class="hljs-comment"><!-- 使用注解的包,包括子集 --></span><br> <span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.sys.controller"</span> /></span><br> <span class="hljs-comment"><!-- 添加数据转换的注解驱动 --></span><br> <span class="hljs-tag"><<span class="hljs-name">mvc:annotation-driven</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">mvc:message-converters</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.http.converter.StringHttpMessageConverter"</span>/></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"</span>/></span><br> <span class="hljs-tag"></<span class="hljs-name">mvc:message-converters</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">mvc:annotation-driven</span>></span><br> <span class="hljs-comment"><!-- 视图解析器 --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"viewResolver"</span><br> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"prefix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/"</span> /></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"suffix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">".jsp"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br> <span class="hljs-comment"><!-- 上传组件 --></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"multipartResolver"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.web.multipart.commons.CommonsMultipartResolver"</span>></span><br> <span class="hljs-comment"><!-- 设置上传的编码格式 --></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"defaultEncoding"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"utf-8"</span>/></span><br> <span class="hljs-comment"><!-- 设置最大上传大小 --></span><br> <span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"maxUploadSize"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"5242880"</span>/></span><br> <span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br> <span class="hljs-comment"><!-- 静态资源配置设置:除了控制器一概不管理 --></span><br> <span class="hljs-tag"><<span class="hljs-name">mvc:default-servlet-handler</span>/></span><br><span class="hljs-tag"></<span class="hljs-name">beans</span>></span><br></code></pre></td></tr></table></figure><h2 id="JDBC和Log4配置文件。"><a href="#JDBC和Log4配置文件。" class="headerlink" title="JDBC和Log4配置文件。"></a>JDBC和Log4配置文件。</h2><p>(日志文件,将错误信息保存在日志文件,前台不能显示错误文件,也可以保存用户访问信息,以及数据库操作信息)。</p><p>log4j.properties配置源码:</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs undefined">log4j.rootLogger=info,appender1,appender2<br><br>log4j<span class="hljs-selector-class">.appender</span><span class="hljs-selector-class">.appender1</span>=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.log4j</span><span class="hljs-selector-class">.ConsoleAppender</span> <br><br>log4j<span class="hljs-selector-class">.appender</span><span class="hljs-selector-class">.appender2</span>=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.log4j</span><span class="hljs-selector-class">.FileAppender</span> <br>log4j<span class="hljs-selector-class">.appender</span><span class="hljs-selector-class">.appender2</span><span class="hljs-selector-class">.File</span>=D:/logs/news/logFile<span class="hljs-selector-class">.txt</span><br><br>log4j<span class="hljs-selector-class">.appender</span><span class="hljs-selector-class">.appender1</span><span class="hljs-selector-class">.layout</span>=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.log4j</span><span class="hljs-selector-class">.TTCCLayout</span><br>log4j<span class="hljs-selector-class">.appender</span><span class="hljs-selector-class">.appender2</span><span class="hljs-selector-class">.layout</span>=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.log4j</span><span class="hljs-selector-class">.TTCCLayout</span><br></code></pre></td></tr></table></figure><p>jdbc配置文件中修改相关信息。<br>jdbc.properties文件</p><figure class="highlight nix"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><code class="hljs undefined">jdbc.<span class="hljs-attr">driverClassName=oracle.jdbc.driver.OracleDriver</span> //Oracle数据库<br>jdbc.<span class="hljs-attr">url=jdbc\:oracle\:thin\:@localhost\:1521\:jredu</span> //数据库名<br>jdbc.<span class="hljs-attr">username=OnlineTest</span> //数据库表<br>jdbc.<span class="hljs-attr">password=Jredu12345</span> //数据库密码<br><br>jdbc.<span class="hljs-attr">initialSize=0</span> <br><br>jdbc.<span class="hljs-attr">maxActive=20</span> <br><br>jdbc.<span class="hljs-attr">maxIdle=20</span> <br><br>jdbc.<span class="hljs-attr">minIdle=1</span> <br><br>jdbc.<span class="hljs-attr">maxWait=60000</span><br></code></pre></td></tr></table></figure><p>最好自己动手配置一遍,记忆更深刻哦。</p><h2 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h2><p><a href="https://www.cnblogs.com/rushoooooo/archive/2011/08/28/2155960.html" target="_blank" rel="noopener">Spring声明式事务配置管理方法</a></p>]]></content>
<summary type="html">
<p><img src="/2018/09/25/SSM项目的相关配置/1.jpg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="SSM" scheme="http://yoursite.com/categories/SSM/"/>
<category term="SSM项目配置" scheme="http://yoursite.com/tags/SSM%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE/"/>
</entry>
<entry>
<title>java面试之Spring常用注解</title>
<link href="http://yoursite.com/2018/09/20/java%E9%9D%A2%E8%AF%95%E4%B9%8BSpring%E5%B8%B8%E7%94%A8%E6%B3%A8%E8%A7%A3/"/>
<id>http://yoursite.com/2018/09/20/java面试之Spring常用注解/</id>
<published>2018-09-20T09:48:39.000Z</published>
<updated>2018-09-20T09:52:59.725Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/20/java面试之Spring常用注解/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a><br>Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。<br>Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率!<br>下面按照分类讲解Spring中常用的一些注解。</p><h2 id="主键类注解"><a href="#主键类注解" class="headerlink" title="主键类注解"></a>主键类注解</h2><p>@Component :标准一个普通的spring Bean类。</p><p>@Repository:标注一个DAO组件类。</p><p>@Service:标注一个业务逻辑组件类。 </p><p>@Controller:标注一个控制器组件类。 </p><p>这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。</p><p><img src="/2018/09/20/java面试之Spring常用注解/20180920165943855.png" alt="在这里插入图片描述"></p><p>举例说明<br>1)当一个组件代表数据访问层(DAO)的时候,我们使用@Repository进行注解,如下</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Repository</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HappyDaoImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">HappyDao</span>{</span><br><span class="hljs-keyword">private</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">static</span> Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .<span class="hljs-keyword">class</span>);<br><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> club(){<br> <span class="hljs-comment">//do something ,like drinking and singing</span><br> }<br>}<br></code></pre></td></tr></table></figure><p>2)当一个组件代表业务层时,我们使用@Service进行注解,如下</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Service</span>(value=<span class="hljs-string">"goodClubService"</span>)<br><span class="hljs-comment">//使用@Service注解不加value ,默认名称是clubService</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ClubServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">ClubService</span> </span>{<br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> ClubDao clubDao;<br><br> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doHappy</span><span class="hljs-params">()</span></span>{<br> <span class="hljs-comment">//do some Happy</span><br> }<br> }<br></code></pre></td></tr></table></figure><p>3)当一个组件作为前端交互的控制层,使用@Controller进行注解,如下</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Controller</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HappyController</span> {</span><br> <span class="hljs-meta">@Autowired</span> <span class="hljs-comment">//下面进行讲解</span><br> <span class="hljs-keyword">private</span> ClubService clubService;<br><br> <span class="hljs-comment">// Control the people entering the Club</span><br> <span class="hljs-comment">// do something</span><br>}<br><span class="hljs-comment">/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/</span><br></code></pre></td></tr></table></figure><p>总结注意点<br>1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的! </p><p>2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护! </p><p>3、指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment"><!-- 自动扫描指定包及其子包下的所有Bean类 --></span><br><span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"org.springframework.*"</span>/></span><br></code></pre></td></tr></table></figure><h2 id="装配bean时常用的注解"><a href="#装配bean时常用的注解" class="headerlink" title="装配bean时常用的注解"></a>装配bean时常用的注解</h2><p>@Autowired:属于Springorg.springframework.beans.factory.<br>annotation包下,可用于为类的属性、构造器、方法进行注值<br>@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。<br>@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 </p><h3 id="举例说明"><a href="#举例说明" class="headerlink" title="举例说明"></a>举例说明</h3><p>1):@Autowired<br>源码<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@Target</span>({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})<br><span class="hljs-variable">@Retention</span>(RetentionPolicy.RUNTIME)<br><span class="hljs-variable">@Documented</span><br>public <span class="hljs-variable">@interface</span> Autowired {<br> <span class="hljs-selector-tag">boolean</span> <span class="hljs-selector-tag">required</span>() <span class="hljs-selector-tag">default</span> <span class="hljs-selector-tag">true</span>;<br>}<br></code></pre></td></tr></table></figure></p><p>实例<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@Controller</span><br>public class HappyController {<br> <span class="hljs-variable">@Autowired</span> <span class="hljs-comment">//默认依赖的ClubDao 对象(Bean)必须存在</span><br> <span class="hljs-comment">//@Autowired(required = false) 改变默认方式</span><br> <span class="hljs-variable">@Qualifier</span>(<span class="hljs-string">"goodClubService"</span>)<br> private ClubService clubService;<br><br> <span class="hljs-comment">// Control the people entering the Club</span><br> <span class="hljs-comment">// do something</span><br>}<br></code></pre></td></tr></table></figure></p><p>2):@Resource<br>源码<br><figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined">@<span class="hljs-keyword">Target</span>({<span class="hljs-keyword">TYPE</span>, FIELD, METHOD})<br>@Retention(RUNTIME)<br><span class="hljs-keyword">public</span> @<span class="hljs-keyword">interface</span> Resource {<br> String <span class="hljs-keyword">name</span>() <span class="hljs-keyword">default</span> <span class="hljs-string">""</span>;<br> <span class="hljs-keyword">Class</span> <span class="hljs-keyword">type</span>() <span class="hljs-keyword">default</span> java.lang.Object.<span class="hljs-keyword">class</span>;<br> ...<br></code></pre></td></tr></table></figure></p><p>实例</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AnotationExp</span> </span>{<br><br> <span class="hljs-meta">@Resource(name = <span class="hljs-meta-string">"HappyClient"</span>)</span><br> <span class="hljs-keyword">private</span> HappyClient happyClient;<br><br> <span class="hljs-meta">@Resource(type = HappyPlayAno .class)</span><br> <span class="hljs-keyword">private</span> HappyPlayAno happyPlayAno;<br>}<br></code></pre></td></tr></table></figure><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>1):相同点<br>@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。<br> 2):不同点<br> a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。<br>b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;<br>c:属性<br>@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。<br>还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称。<br>@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。<br>需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 </p><p>d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualitied进行限定。</p><p><a href="http://blog.51cto.com/qiangmzsx/1359952" target="_blank" rel="noopener">Spring中 @Autowired注解与@Resource注解的区别</a></p><h3 id="注意点:使用-Resource也要注意添加配置文件到Spring,如果没有配置component-scan"><a href="#注意点:使用-Resource也要注意添加配置文件到Spring,如果没有配置component-scan" class="headerlink" title="注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan"></a>注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan</h3><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-tag"><<span class="hljs-name">context:component-scan</span>></span> <br><span class="hljs-comment"><!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能--></span><br></code></pre></td></tr></table></figure><p>则一定要配置 annotation-config</p><figure class="highlight verilog"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><<span class="hljs-keyword">context</span>:annotation-<span class="hljs-keyword">config</span>/><br></code></pre></td></tr></table></figure><h2 id="Component-vs-Configuration-and-Bean"><a href="#Component-vs-Configuration-and-Bean" class="headerlink" title="@Component vs @Configuration and @Bean"></a>@Component vs @Configuration and @Bean</h2><h3 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h3><p>Spring的官方团队说@Component可以替代 @Configuration注解,事实上我们看源码也可以发现看到,如下</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Target({ElementType.TYPE})</span><br><span class="hljs-meta">@Retention(RetentionPolicy.RUNTIME)</span><br><span class="hljs-meta">@Documented</span><br><span class="hljs-meta">@Component</span> <span class="hljs-comment">//看这里!!!</span><br><span class="hljs-keyword">public</span> <span class="hljs-meta">@interface</span> Configuration {<br> String value() <span class="hljs-keyword">default</span> <span class="hljs-string">""</span>;<br></code></pre></td></tr></table></figure><p>虽然说可以替代但是两个注解之间还是有区别的!<br>Bean注解主要用于方法上,有点类似于工厂方法,当使用了@Bean注解,我们可以连续使用多种定义bean时用到的注解,譬如用@Qualifier注解定义工厂方法的名称,用@Scope注解定义该bean的作用域范围,譬如是singleton还是prototype等。</p><p>Spring 中新的 Java 配置支持的核心就是@Configuration 注解的类。这些类主要包括 @Bean 注解的方法来为 Spring 的 IoC 容器管理的对象定义实例,配置和初始化逻辑。</p><p>使用@Configuration 来注解类表示类可以被 Spring 的 IoC 容器所使用,作为 bean 定义的资源。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Configuration</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AppConfig</span> </span>{<br> <span class="hljs-meta">@Bean</span><br> <span class="hljs-function"><span class="hljs-keyword">public</span> MyService <span class="hljs-title">myService</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> MyServiceImpl();<br> }<br>}<br></code></pre></td></tr></table></figure><p>这和 Spring 的 XML 文件中的非常类似</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-tag"><<span class="hljs-name">beans</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"myService"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.acme.services.MyServiceImpl"</span>/></span><br><span class="hljs-tag"></<span class="hljs-name">beans</span>></span><br></code></pre></td></tr></table></figure><p>@Bean 注解扮演了和元素相同的角色。</p><h3 id="举例说明-Component-和-Configuration"><a href="#举例说明-Component-和-Configuration" class="headerlink" title="举例说明@Component 和 @Configuration"></a>举例说明@Component 和 @Configuration</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Configuration</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Config</span> </span>{<br><br> <span class="hljs-meta">@Bean</span><br> <span class="hljs-function"><span class="hljs-keyword">public</span> SimpleBean <span class="hljs-title">simpleBean</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SimpleBean();<br> }<br><br> <span class="hljs-meta">@Bean</span><br> <span class="hljs-function"><span class="hljs-keyword">public</span> SimpleBeanConsumer <span class="hljs-title">simpleBeanConsumer</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SimpleBeanConsumer(simpleBean());<br> }<br>}<br></code></pre></td></tr></table></figure><p>@Component<br>public static class Config {</p><pre><code>@Beanpublic SimpleBean simpleBean() { return new SimpleBean();}@Beanpublic SimpleBeanConsumer simpleBeanConsumer() { return new SimpleBeanConsumer(simpleBean());}</code></pre><p>}</p><p>第一个代码正常工作,正如预期的那样,SimpleBeanConsumer将会得到一个单例SimpleBean的链接。第二个配置是完全错误的,因为Spring会创建一个SimpleBean的单例bean,但是SimpleBeanConsumer将获得另一个SimpleBean实例(也就是相当于直接调用new SimpleBean() ,这个bean是不归Spring管理的),既new SimpleBean() 实例是Spring上下文控件之外的。</p><h3 id="总结-1"><a href="#总结-1" class="headerlink" title="总结"></a>总结</h3><p>使用@ configuration,所有标记为@ bean的方法将被包装成一个CGLIB包装器,它的工作方式就好像是这个方法的第一个调用,那么原始方法的主体将被执行,最终的对象将在spring上下文中注册。所有进一步的调用只返回从上下文检索的bean。<br>在上面的第二个代码块中,新的SimpleBeanConsumer(simpleBean())只调用一个纯java方法。为了纠正第二个代码块,我们可以这样做</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Component</span><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Config</span> </span>{<br> <span class="hljs-meta">@Autowired</span><br> SimpleBean simpleBean;<br><br> <span class="hljs-meta">@Bean</span><br> <span class="hljs-function"><span class="hljs-keyword">public</span> SimpleBean <span class="hljs-title">simpleBean</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SimpleBean();<br> }<br><br> <span class="hljs-meta">@Bean</span><br> <span class="hljs-function"><span class="hljs-keyword">public</span> SimpleBeanConsumer <span class="hljs-title">simpleBeanConsumer</span><span class="hljs-params">()</span> </span>{<br> <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> SimpleBeanConsumer(simpleBean);<br> }<br>}<br></code></pre></td></tr></table></figure><p><a href="http://dimafeng.com/2015/08/29/spring-configuration_vs_component/" target="_blank" rel="noopener">Spring @Configuration vs @Component</a><br> <a href="https://wizardforcel.gitbooks.io/spring-doc-3x/content/28.html" target="_blank" rel="noopener">基本概念:@Configuration 和@Bean</a></p><h2 id="spring-MVC模块注解"><a href="#spring-MVC模块注解" class="headerlink" title="spring MVC模块注解"></a>spring MVC模块注解</h2><h3 id="web模块常用到的注解"><a href="#web模块常用到的注解" class="headerlink" title="web模块常用到的注解"></a>web模块常用到的注解</h3><p>@Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为,解释用户的输入,将其转换成一个模型然后将试图呈献给用户。</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Controller</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HappyController</span> {</span><br> <span class="hljs-comment">//do something</span><br>...<br>}<br></code></pre></td></tr></table></figure><p>Spring MVC 使用 @Controller 定义控制器,它还允许自动检测定义在类路径下的组件(配置文件中配置扫描路径)并自动注册。</p><p>@RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Controller</span><br><span class="hljs-meta">@RequestMapping</span>(<span class="hljs-string">"/happy"</span>)<br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">HappyController</span> {</span><br><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> HappyService happyService;<br><br> <span class="hljs-meta">@RequestMapping</span>(<span class="hljs-regexp">/hello/</span>*)<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> sayHello(){<br> <span class="hljs-comment">//请求为 /happy/hello/* 都会进入这个方法!</span><br> <span class="hljs-comment">//例如:/happy/hello/123 /happy/hello/adb</span><br> <span class="hljs-comment">//可以通过get/post 请求</span><br> }<br> <span class="hljs-meta">@RequestMapping</span>(value=<span class="hljs-string">"/haha"</span>,method=RequestMethod.GET)<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> sayHaHa(){<br> <span class="hljs-comment">//只能通过get请求</span><br> }<br></code></pre></td></tr></table></figure><p>@RequestMapping 既可以作用在类级别,也可以作用在方法级别。当它定义在类级别时,标明该控制器处理所有的请求都被映射到 /favsoft 路径下。@RequestMapping中可以使用 method 属性标记其所接受的方法类型,如果不指定方法类型的话,可以使用 HTTP GET/POST 方法请求数据,但是一旦指定方法类型,就只能使用该类型获取数据。</p><p>@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况下,required=true,也就是改参数必须要传。如果改参数可以传可不传,可以配置required=false。</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@RequestMapping</span>(<span class="hljs-string">"/happy"</span>)<br> public String sayHappy(<br> <span class="hljs-variable">@RequestParam</span>(value = <span class="hljs-string">"name"</span>, required = false) String name,<br> <span class="hljs-variable">@RequestParam</span>(value = <span class="hljs-string">"age"</span>, required = true) String age) {<br> <span class="hljs-comment">//age参数必须传 ,name可传可不传</span><br> }<br></code></pre></td></tr></table></figure><p>@PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@RequestMapping</span>(value=<span class="hljs-string">"/happy/{dayid}"</span>,method=RequestMethod.GET)<br>public String findPet(<span class="hljs-variable">@PathVariable</span> String dayid, Model mode) {<br><span class="hljs-comment">//使用@PathVariable注解绑定 {dayid} 到String dayid</span><br>}<br></code></pre></td></tr></table></figure><p>@PathVariable中的参数可以是任意的简单类型,如int, long, Date等等。Spring会自动将其转换成合适的类型或者抛出 TypeMismatchException异常。当然,我们也可以注册支持额外的数据类型。<br>@PathVariable支持使用正则表达式,这就决定了它的超强大属性,它能在路径模板中使用占位符,可以设定特定的前缀匹配,后缀匹配等自定义格式。</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-variable">@RequestBody</span> : <span class="hljs-variable">@RequestBody</span>是指方法参数应该被绑定到HTTP请求Body上。<br><span class="hljs-variable">@RequestMapping</span>(value = <span class="hljs-string">"/something"</span>, method = RequestMethod.PUT)<br>public void handle(<span class="hljs-variable">@RequestBody</span> String body,<span class="hljs-variable">@RequestBody</span> User user){<br></code></pre></td></tr></table></figure><p> //可以绑定自定义的对象类型<br>}</p><p>@ResponseBody : @ResponseBody与@RequestBody类似,它的作用是将返回类型直接输入到HTTP response body中。<br>@ResponseBody在输出JSON格式的数据时,会经常用到。</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@RequestMapping(value = <span class="hljs-meta-string">"/happy"</span>, method =RequestMethod.POST)</span><br><span class="hljs-meta">@ResponseBody</span><br><span class="hljs-keyword">public</span> String helloWorld() { <br><span class="hljs-keyword">return</span> <span class="hljs-string">"Hello World"</span>;<span class="hljs-comment">//返回String类型</span><br>}<br></code></pre></td></tr></table></figure><p>@RestController :控制器实现了REST的API,只为服务于JSON,XML或其它自定义的类型内容,@RestController用来创建REST类型的控制器,与@Controller类型。@RestController就是这样一种类型,它避免了你重复的写@RequestMapping与@ResponseBody。</p><p>@ModelAttribute :@ModelAttribute可以作用在方法或方法参数上,当它作用在方法上时,标明该方法的目的是添加一个或多个模型属性(model attributes)。<br>该方法支持与@RequestMapping一样的参数类型,但并不能直接映射成请求。控制器中的@ModelAttribute方法会在@RequestMapping方法调用之前而调用。</p><p>@ModelAttribute方法有两种风格:一种是添加隐形属性并返回它。另一种是该方法接受一个模型并添加任意数量的模型属性。用户可以根据自己的需要选择对应的风格。</p><h3 id="Spring事务模块注解"><a href="#Spring事务模块注解" class="headerlink" title="Spring事务模块注解"></a>Spring事务模块注解</h3><p>1、常用到的注解</p><p>在处理dao层或service层的事务操作时,譬如删除失败时的回滚操作。使用@Transactional 作为注解,但是需要在配置文件激活</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-comment"><!-- 开启注解方式声明事务 --></span><br> <span class="hljs-tag"><<span class="hljs-name">tx:annotation-driven</span> <span class="hljs-attr">transaction-manager</span>=<span class="hljs-string">"transactionManager"</span> /></span><br></code></pre></td></tr></table></figure><p>2、举例</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-meta">@Service</span><br><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CompanyServiceImpl</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">CompanyService</span> {</span><br> <span class="hljs-meta">@Autowired</span><br> <span class="hljs-keyword">private</span> CompanyDAO companyDAO;<br><br> <span class="hljs-meta">@Transactional</span>(propagation = Propagation.REQUIRED, readOnly = <span class="hljs-literal">false</span>, rollbackFor = Exception.<span class="hljs-keyword">class</span>)<br> <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> deleteByName(String name) {<br><br> <span class="hljs-keyword">int</span> result = companyDAO.deleteByName(name);<br> <span class="hljs-keyword">return</span> result;<br> }<br> ...<br>}<br></code></pre></td></tr></table></figure><h3 id="总结-2"><a href="#总结-2" class="headerlink" title="总结"></a>总结</h3><p>事务的传播机制和隔离机制比较重要!<br><img src="/2018/09/20/java面试之Spring常用注解/20180920174017365.png" alt="在这里插入图片描述">)</p><p><a href="java面试之Spring常用注解/20180920174058938.png">一图学习 Spring事务传播性</a></p><p>readOnly : 事务的读写属性,取true或者false,true为只读、默认为false<br>rollbackFor : 回滚策略,当遇到指定异常时回滚。譬如上例遇到异常就回滚<br>timeout (补充的) : 设置超时时间,单位为秒<br>isolation : 设置事务隔离级别,枚举类型,一共五种</p><p><img src="https://img-blog.csdn.net/20180920174058938?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYTEwMjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="在这里插入图片描述"></p><p> <a href="https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html" target="_blank" rel="noopener">透彻的掌握 Spring 中@transactional 的使用</a></p><p><a href="http://opiece.me/2016/03/18/spring-transactional-introduce/" target="_blank" rel="noopener">Spring事务配置及事务的传播性与隔离级别详解</a></p><h2 id="参考博文"><a href="#参考博文" class="headerlink" title="参考博文"></a>参考博文</h2><p> <a href="http://opiece.me/2016/03/18/spring-transactional-introduce/" target="_blank" rel="noopener">spring 常用注解</a><br> <a href="http://opiece.me/2016/03/18/spring-transactional-introduce/" target="_blank" rel="noopener">详解Spring MVC 4常用的那些注解 </a></p><p> <a href="http://opiece.me/2016/03/18/spring-transactional-introduce/" target="_blank" rel="noopener">史上最全最强SpringMVC详细示例实战教程</a></p>]]></content>
<summary type="html">
<p><img src="/2018/09/20/java面试之Spring常用注解/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
</entry>
<entry>
<title>java面试之Struts-Spring-Hibernate</title>
<link href="http://yoursite.com/2018/09/19/java%E9%9D%A2%E8%AF%95%E4%B9%8BStruts-Spring-Hibernate/"/>
<id>http://yoursite.com/2018/09/19/java面试之Struts-Spring-Hibernate/</id>
<published>2018-09-19T09:09:00.000Z</published>
<updated>2018-09-20T09:55:04.198Z</updated>
<content type="html"><![CDATA[<p> <img src="/2018/09/19/java面试之Struts-Spring-Hibernate/1.jpeg" alt="在这里插入图片描述"><br> <a id="more"></a></p><blockquote><p> 在面试中一般面试官会根据面试者的简历来提问题,如果你的项目有用到ssh的话那么这篇文章也许会对你有帮助。当然,面试题目并不是速成法,如果你对这方面不太了解,建议你看我的另外一篇博客<a href="https://blog.csdn.net/sha1024/article/details/79540528" target="_blank" rel="noopener">点我看基础</a>接下来是我自己总结的一些ssh的面试题集合。</p></blockquote><h1 id="Struts面试题"><a href="#Struts面试题" class="headerlink" title="Struts面试题"></a>Struts面试题</h1><h4 id="谈谈你对mvc的理解"><a href="#谈谈你对mvc的理解" class="headerlink" title="谈谈你对mvc的理解"></a>谈谈你对mvc的理解</h4><p>MVC是Model-View-Controler的简称。即模型-视图-控制器。MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开。<br><img src="/2018/09/19/java面试之Struts-Spring-Hibernate/1.png" alt="直接上图"></p><p>MVC中的模型,视图.控制器他们分别担任着不同的任务。<br>视图:视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。<br>模型: 模型表示业务数据和业务处理。相当于JavaBean。一个模型能为多个视图提供数据。这提高了应用程序的重用性。<br>控制器:当用户单击web页面中的提交按钮时,控制器接受请求并调用相应的模型去处理请求。然后根据处理的结果调用相应的视图来显示处理的结果。<br>MVC处理过程:首先控制器接受用户请求,调用相应的模型<br>来进行业务处理,并返回数据给控制器,控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户</p><h4 id="说下Struts的设计模式"><a href="#说下Struts的设计模式" class="headerlink" title="说下Struts的设计模式"></a>说下Struts的设计模式</h4><p>MVC模式: web应用程序启动时就会加载并初始化ActionServler。用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的Validate()验证后选择将请求发送到哪个Action,如果Action不存在,ActionServlet会先创建这个对象,然后调用Action的execute()方法。Execute()从ActionForm对象中获取数据,完成业务逻辑,返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指定的jsp组件,ActionForward对象指定的jsp生成动态的网页,返回给客户。<br><img src="/2018/09/19/java面试之Struts-Spring-Hibernate/2.png" alt="struts2框架的运行结构"></p><h4 id="Struts2-0常用标签"><a href="#Struts2-0常用标签" class="headerlink" title="Struts2.0常用标签"></a>Struts2.0常用标签</h4><ol><li>往action里传值:<code><input name="userName" type="text" class="input6" size="15"></code></li><li>显示标签 property 用于输出指定值:<code><s:property value="userName "/></code></li><li>用于从页面往action中(user)的对象内传值:<code><s:text name="user.userName " id="username"/></code></li><li>判断<s:if> </s:if> 用于在页面中判断指定数据 <code><s:if test="userName == admin">…. </s:if> <s:else>…. </s:else></code></li><li>迭代<s:iterator>用于将List、Map、ArrayList等集合进行循环遍<br>历</li></ol><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-tag"><<span class="hljs-name">s:iterator</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"userList"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">status</span>=<span class="hljs-string">"u"</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">s:property</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"userName"</span>/></span><span class="hljs-tag"></<span class="hljs-name">a</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">s:iterator</span>></span><br></code></pre></td></tr></table></figure><ol start="6"><li>URL地址标签,<s:url>用于生成一个URL地址,可以通过URL标签指定的<s:param>子元素向URL地址发送请求参数 </li></ol><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-tag"><<span class="hljs-name">s:url</span> <span class="hljs-attr">action</span>=<span class="hljs-string">" "</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">s:param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">" "</span> <span class="hljs-attr">value</span>=<span class="hljs-string">""</span>></span><span class="hljs-tag"></<span class="hljs-name">s:param</span>></span><br> <span class="hljs-tag"></<span class="hljs-name">s:url</span>></span><br></code></pre></td></tr></table></figure><ol start="7"><li>超链接 <a href="">一般和<s:url>标签一起使用,用于带多个参数。</a></li></ol><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><<span class="hljs-keyword">a</span> href=<span class="hljs-comment">"</span><br><br> <<span class="hljs-variable">s:url</span> action=<span class="hljs-string">" "</span>><br><br> <<span class="hljs-variable">s:param</span> name=<span class="hljs-string">" "</span> value=<span class="hljs-string">""</span>></<span class="hljs-variable">s:param</span>><br><br> <<span class="hljs-variable">s:param</span> name=<span class="hljs-string">" "</span> value=<span class="hljs-string">""</span>></<span class="hljs-variable">s:param</span>><br><br> <<span class="hljs-variable">s:param</span> name=<span class="hljs-string">" "</span> value=<span class="hljs-string">""</span>></<span class="hljs-variable">s:param</span>><br><br> </<span class="hljs-variable">s:url</span>><br> <span class="hljs-comment">">超链接</a></span><br></code></pre></td></tr></table></figure><ol start="8"><li>set标签,用于将某个值放入指定的范围内。例如application,session等。</li></ol><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><s:<span class="hljs-builtin-name">set</span> <span class="hljs-attribute">name</span>=<span class="hljs-string">"user"</span> <span class="hljs-attribute">value</span>=<span class="hljs-string">"userName"</span> <span class="hljs-attribute">scope</span>=”request”/><br></code></pre></td></tr></table></figure><h4 id="Struts如何实现国际化"><a href="#Struts如何实现国际化" class="headerlink" title="Struts如何实现国际化"></a>Struts如何实现国际化</h4><p> 以下以两国语言(中文,英文)为例:</p><pre><code>1. 在工程中加入Struts支持2. 编辑ApplicationResource.properties文件,在其中加入要使用国际化的信息, 例如: lable.welcome.china=Welcome!!!3. 创建英文资源文件ApplicationResource_en.properites4. 创建临时中文资源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中国欢迎您!5. 对临时中文资源文件进行编码转换。可以使用myeclipse的插件,也可以在dos下执行:</code></pre><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-selector-tag">native2ascii</span> <span class="hljs-selector-tag">-encoding</span> <span class="hljs-selector-tag">gb2312</span> <span class="hljs-selector-tag">ApplicationResource_temp</span><span class="hljs-selector-class">.properties</span> <span class="hljs-selector-tag">ApplicationResource_zh_CN</span><span class="hljs-selector-class">.properties</span><br></code></pre></td></tr></table></figure><p> 6.在jsp中加入struts的bean标记库 <%@ taglib uri=”/WEB-INF/struts-bean.tld” prefix=”bean”%><br>显示信息: <bean:message key=”label.welcome.china”><br>可以在struts-config.xml文件中定义多个资源包,而每个资源包可使用key属性指定包的名称</p><h4 id="Struts1-x工作机制?"><a href="#Struts1-x工作机制?" class="headerlink" title="Struts1.x工作机制?"></a>Struts1.x工作机制?</h4><p>工作机制:<br>Struts的工作流程:<br>在web应用启动时就会加载初始化ActionServlet,ActionServlet从<br>struts-config.xml文件中读取配置信息,把它们存放到各种配置对象<br>当ActionServlet接收到一个客户请求时,将执行如下流程.<br>-(1)检索和用户请求匹配的ActionMapping实例,如果不存在,就返回请求路径无效信息;<br>-(2)如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中;<br>-(3)根据配置信息决定是否需要表单验证.如果需要验证,就调用ActionForm的validate()方法;<br>-(4)如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActuibErrors对象, 就表示表单验证成功;<br>-(5)ActionServlet根据ActionMapping所包含的映射信息决定将请求转发给哪个Action,如果相应的 Action实例不存在,就先创建这个实例,然后调用Action的execute()方法;<br>-(6)Action的execute()方法返回一个ActionForward对象,ActionServlet在把客户请求转发给 ActionForward对象指向的JSP组件;<br>-(7)ActionForward对象指向JSP组件生成动态网页,返回给客户;</p><h4 id="struts中怎么配置form-bean、action、tiles"><a href="#struts中怎么配置form-bean、action、tiles" class="headerlink" title="struts中怎么配置form-bean、action、tiles"></a>struts中怎么配置form-bean、action、tiles</h4><p>此处配置的是struts1.2的</p><figure class="highlight fortran"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">form</span>-bean配置:(在配置文件struts-config.xml中):<br><br> <<span class="hljs-keyword">form</span>-beans ><br> <br> <<span class="hljs-keyword">form</span>-bean <span class="hljs-keyword">name</span>=<span class="hljs-string">""</span> <span class="hljs-keyword">type</span>=<span class="hljs-string">""</span>></<span class="hljs-keyword">form</span>-bean><br> <br> </<span class="hljs-keyword">form</span>-beans><br><br> <span class="hljs-keyword">name</span>: 指定<span class="hljs-keyword">form</span>的名字; <span class="hljs-keyword">type</span>指定<span class="hljs-keyword">form</span>的类型:包名+类名;<br></code></pre></td></tr></table></figure><p>action配置:(在配置文件struts-config.xml中)</p><figure class="highlight sqf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><<span class="hljs-built_in">action</span>-mappings ><br> <br> <<span class="hljs-built_in">action</span> path=<span class="hljs-string">""</span><br> <br> attribute=<span class="hljs-string">""</span><br> <br> input=<span class="hljs-string">""</span><br> <br> <span class="hljs-built_in">name</span>=<span class="hljs-string">""</span><br> <br> parameter=<span class="hljs-string">""</span><br> <br> scope=<span class="hljs-string">"request"</span><br> <br> <span class="hljs-built_in">type</span>=<span class="hljs-string">""</span><br> <br> ></<span class="hljs-built_in">action</span>><br> <br> </<span class="hljs-built_in">action</span>-mappings><br></code></pre></td></tr></table></figure><p>path:请求Action的名字; attribute:form的名字,与form-bean中的name对应; input:输入页的路径;</p><p>name:如果配置了attribute,name不起作用,与attribute一样; parameter:使用分发Action时,指定调用分发Action中的 方法名;</p><p>scope:Action的范围; type:Action的类型:包名+类名;</p><p>tites配置:</p><ol><li>新建一个 tiles-defs.xml文件,并在其中做如下配置:</li></ol><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"UTF-8"</span><span class="hljs-meta">?></span></span><br> <br> <span class="hljs-meta"><!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd"></span><br> <br> <span class="hljs-tag"><<span class="hljs-name">tiles-definitions</span>></span><br> <br> <span class="hljs-tag"><<span class="hljs-name">definition</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"member-definition"</span> <span class="hljs-attr">path</span>=<span class="hljs-string">"/Jsp/layout.jsp"</span>></span> <br> <br> <span class="hljs-tag"><<span class="hljs-name">put</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"top"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/mTop.do"</span>/></span> <br> <br> <span class="hljs-tag"><<span class="hljs-name">put</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"left"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/mLeft.do"</span>/></span><br> <br> <span class="hljs-tag"><<span class="hljs-name">put</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"main"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/defaultMmain.do"</span>/></span><br> <br> <span class="hljs-tag"></<span class="hljs-name">definition</span>></span><br> <br> <span class="hljs-tag"></<span class="hljs-name">tiles-definitions</span>></span><br></code></pre></td></tr></table></figure><ol start="2"><li><p>在web.xml和struts-config.xml和web.xml中做相应配置:</p><pre><code>在struts-config.xml中配置如下</code></pre><figure class="highlight dsconfig"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><<span class="hljs-string">plug-in </span><span class="hljs-string">className=</span><span class="hljs-string">"org.apache.struts.tiles.TilesPlugin"</span>><br><br> <<span class="hljs-built_in">set-property</span> <span class="hljs-string">property=</span><span class="hljs-string">"definitions-config"</span> <span class="hljs-string">value=</span><span class="hljs-string">"/WEB-INF/tiles-defs.xml"</span>/> <br><br> <<span class="hljs-built_in">set-property</span> <span class="hljs-string">property=</span><span class="hljs-string">"definitions-parser-validate"</span> <span class="hljs-string">value=</span><span class="hljs-string">"true"</span>/><br><br> </<span class="hljs-string">plug-in></span><br></code></pre></td></tr></table></figure></li></ol><p>在web.xml中配置如下:<br><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><init-<span class="hljs-built_in">param</span>> <br><br> <<span class="hljs-built_in">param</span>-name>definitions-config</<span class="hljs-built_in">param</span>-name> <br><br> <<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>>/WEB-INF/tiles-defs.xml</<span class="hljs-built_in">param</span>-<span class="hljs-built_in">value</span>><br><br> </init-<span class="hljs-built_in">param</span>><br></code></pre></td></tr></table></figure></p><ol start="3"><li><p>调用Tiles组件</p><p>Tiles组件是通过Struts Action来调用的,在struts-config.xml中做如下action配置</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><action<br><br> <span class="hljs-attribute">path</span>=<span class="hljs-string">"/member"</span><br><br> <span class="hljs-attribute">parameter</span>=<span class="hljs-string">"member-definition"</span><br><br> <span class="hljs-attribute">type</span>=<span class="hljs-string">"org.apache.struts.actions.ForwardAction"</span>/><br></code></pre></td></tr></table></figure></li></ol><h4 id="action是单实例还是多实例,为什么?"><a href="#action是单实例还是多实例,为什么?" class="headerlink" title="action是单实例还是多实例,为什么?"></a>action是单实例还是多实例,为什么?</h4><p> action是单实例的。当多个用户访问一个请求的时候,服务器内存中只有一个与之对应的action类对象。<br> 因为当服务器第一次加载struts的配置文件的时候,创建了一个Action后,每发送一个请求,服务器都会先去检索相应的范围内(request,session)是否存在<br> 这样一个action实例,如果存在,则使用这个实例,如果不存在,则创建一个action实例。</p><h4 id="struts2-0的mvc模式?与struts1-0的区别"><a href="#struts2-0的mvc模式?与struts1-0的区别" class="headerlink" title="struts2.0的mvc模式?与struts1.0的区别?"></a>struts2.0的mvc模式?与struts1.0的区别?</h4><p> struts2的mvc模式:当用户在页面提交用户请求时,该请求需要提交给struts2的控制器处理。struts2的控制器根据处理结果,<br> 决定将哪个页面呈现给客户端。<br> 与struts1最大的不同是:struts2的控制器。struts2的控制器不再像struts1的控制器,需要继承一个Action父类,甚至可以无需实现<br> 任何接口,struts2的Action就是一个普通的POJO。实际上,Struts2 的Action就是一个包含execute方法的普通Java类<br> 该类里包含的多个属性用于封装用户的请求参数。</p><h4 id="struts的处理流程"><a href="#struts的处理流程" class="headerlink" title="struts的处理流程"></a>struts的处理流程</h4><p>一、ActionServlet的初始化<br>ActionServlet作为Struts组件的前端控制器,由于web.xml的相应配置:</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><load-<span class="hljs-keyword">on</span>-startup><span class="hljs-number">0</span></load-<span class="hljs-keyword">on</span>-startup><br></code></pre></td></tr></table></figure><p>在应用一加载时即会被实例化并调用其init方法,init方法所做的主要工作有二:</p><ol><li>加载struts配置文件,并创建用于封装配置信息的ModuleConfig对象</li><li>加载资源文件,并创建用于封装资源文件的MessageResources对象需要注意两点:如果web.xml有多模块配置,将创建多个ModuleConfig对象和MessageResources对象分别用于封装各个模块的struts配置文件和资源文件。针对各个模块所创建的ModuleConfig对象和MessageResources对象将存储在ServletContext中,对应的属性名中有该模块名称的相应标识。<br>另外,如果有相应配置的话,init方法还将初始化数据源和PlugIn<br>二、ActionServlet的process<br>所有形如*.do的请求(根据web.xml中的相关配置)将提交给ActionServlet,最终将调用其process方法<br>。process方法的主要工作有三:<br>1.根据请求信息获知所请求的模块名称,从ServletContext中获得与请求模块对应的的ModuleConfig对象,并存储到request中。<br>2.根据模块信息获得相应的RequestProcessor对象,一个模块对应一个RequestProcessor对象,RequestProcessor对象将关联与所属模块对应的ModuleConfig对象。<br>3.调用RequestProcessor对象的process方法,将request和response作为参数传递给它。<br>三、RequestProcessor的process<br>RequestProcessor对象的process方法的主要工作有五步:<br>1.调用自己的 processPreprocess(request, response)方法,该方法不进行任何操作,用于子类重写扩展其功能。<br>2.获得与请求地址所匹配的ActionMapping对象,AcionMapping对象用于封装一个特定acion的配置信息。<br>3.根据ActionMapping中的配置信息获得ActionForm对象(该对象将缓存到request或session中),并将表单数据填充到ActionForm中,然后根据ActionMapping的配置决定是否验证ActionForm,如果验证,将调用ActionForm的 validate方法,若其返回的ActionErros对象中包含ActionMessage对象则表示验证<br>失败,将转向action配置信息 input属性所指示的地址。<br>4.如果ActionForm无需验证或验证通过将创建并缓存与请求地址匹配的Action对象,将ActionMapping对象、ActionForm对象、request和response作为参数调用其execute方法。<br>5.根据Action对象的execute方法返回的ActionForward对象,将请求转发或重定向到该ActionForward所封装的地址。<h4 id="Struts-webwork-的工作机制,它有哪些标签"><a href="#Struts-webwork-的工作机制,它有哪些标签" class="headerlink" title="Struts/webwork 的工作机制,它有哪些标签"></a>Struts/webwork 的工作机制,它有哪些标签</h4>Struts 2框架的大致处理流程如下:<br>浏览器发送请求,例如请求/mypage.action、/reports/myreport.pdf等。<br>核心控制器FilterDispatcher根据请求决定调用合适的Action。<br>WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能。<br>回调Action的execute方法,该execute方法先获取用户请求参数,然后执行某种数据库操作,既可以是将数据保存到数据库,也可以从数据库中检索信息。实际上,因为Action只是一个控制器,它会调用业务逻辑组件来处理用户的请求。<br>Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或者其他文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。</li></ol><h2 id="Spring部分"><a href="#Spring部分" class="headerlink" title="Spring部分"></a>Spring部分</h2><h4 id="Spring工作机制"><a href="#Spring工作机制" class="headerlink" title="Spring工作机制"></a>Spring工作机制</h4><p>1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。<br>2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.<br>3.DispatcherServlet请请求提交到目标Controller<br>4.Controller进行业务逻辑处理后,会返回一个ModelAndView<br>5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象<br>6.视图对象负责渲染返回给客户端。</p><p><img src="/2018/09/19/java面试之Struts-Spring-Hibernate/3.png" alt="spring的流程图"></p><h2 id="使用Spring的好处"><a href="#使用Spring的好处" class="headerlink" title="##使用Spring的好处"></a>##使用Spring的好处</h2><p>AOP 让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用 AOP 后,公共服务 (比 如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><bean <span class="hljs-built_in">id</span> = <span class="hljs-string">"proxy"</span> type = <span class="hljs-string">"org.spring.framework.aop.ProxyBeanFacory"</span>><br><<span class="hljs-keyword">property</span> <span class="hljs-built_in">name</span> = <span class="hljs-string">"target"</span> <span class="hljs-keyword">ref</span> = <span class="hljs-string">""</span>></<span class="hljs-keyword">property</span>><br><<span class="hljs-keyword">property</span> <span class="hljs-built_in">name</span> = <span class="hljs-string">"advisor"</span> <span class="hljs-keyword">ref</span> = <span class="hljs-string">""</span>></<span class="hljs-keyword">property</span>><br></bean><br></code></pre></td></tr></table></figure><p>IOC 允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词 倒置 所表明的,IOC 就像反 过来的 JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straight construction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。</p><p>Spring即是一个AOP框架,也是一IOC容器。 Spring 最好的地方是它有助于您替换对象。有了 Spring,只要用 JavaBean 属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。</p><h4 id="Spring是什么-根据你的理解详细谈谈你的见解"><a href="#Spring是什么-根据你的理解详细谈谈你的见解" class="headerlink" title="Spring是什么?根据你的理解详细谈谈你的见解"></a>Spring是什么?根据你的理解详细谈谈你的见解</h4><p>◆目的:解决企业应用开发的复杂性</p><p> ◆功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能</p><p> ◆范围:任何Java应用</p><p> 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。</p><p> ◆轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。</p><p> ◆控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。</p><p> ◆面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。</p><p> ◆容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。</p><p> ◆框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。</p><p> 所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。</p><h4 id="spring在项目中如何充当粘合剂"><a href="#spring在项目中如何充当粘合剂" class="headerlink" title="spring在项目中如何充当粘合剂"></a>spring在项目中如何充当粘合剂</h4><p> 1、在项目中利用spring的IOC(控制反转或依赖注入),明确地定义组件接口(如UserDAO),开发者可以独立开发各个组件, 然后根据组件间的依赖关系组装(UserAction依赖于UserBiz,UserBiz依赖于UserDAO)运行,很好的把Struts(Action)和hibernate(DAO的实现)结合起来了。<br> 2、spring的事务管理把hibernate对数据库的操作进行了事务配置。</p><h2 id="spring的事务如何配置"><a href="#spring的事务如何配置" class="headerlink" title="spring的事务如何配置"></a>spring的事务如何配置</h2><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><code class="hljs undefined"> spring的声明式事务配置:<br><br> 1. <span class="hljs-comment"><!-- 配置sessionFactory --></span><br><br><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"sessionFactory"</span><br><br><span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"configLocation"</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">value</span>></span>/WEB-INF/classes/hibernate.cfg.xml<span class="hljs-tag"></<span class="hljs-name">value</span>></span><br><br><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span> <br><br> 2. 配置事务管理器<br><br> <span class="hljs-comment"><!-- 配置事务管理器 --></span><br><br><span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"transactionManager"</span><br><br><span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.orm.hibernate3.HibernateTransactionManager"</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sessionFactory"</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">ref</span> <span class="hljs-attr">local</span>=<span class="hljs-string">"sessionFactory"</span> /></span><br><br><span class="hljs-tag"></<span class="hljs-name">property</span>></span><br><br><span class="hljs-tag"></<span class="hljs-name">bean</span>></span><br><br> 3. 配置事务特性<br><br> <span class="hljs-tag"><<span class="hljs-name">tx:advice</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"txAdvice"</span> <span class="hljs-attr">transaction-manager</span>=<span class="hljs-string">"transactionManager"</span>></span><br><br><span class="hljs-tag"><<span class="hljs-name">tx:attributes</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"add*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"update*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"del*"</span> <span class="hljs-attr">propagation</span>=<span class="hljs-string">"REQUIRED"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">tx:method</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"*"</span> <span class="hljs-attr">read-only</span>=<span class="hljs-string">"true"</span>/></span><br><br> <span class="hljs-tag"></<span class="hljs-name">tx:attributes</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">tx:advice</span>></span><br><br> 4. 配置哪些类的哪些方法配置事务<br><br> <span class="hljs-tag"><<span class="hljs-name">aop:config</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">aop:pointcut</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"allManagerMethod"</span> <span class="hljs-attr">ession</span>=<span class="hljs-string">"execution(* com.yyaccp.service.impl.*.*(..))"</span>/></span><br><br> <span class="hljs-tag"><<span class="hljs-name">aop:advisor</span> <span class="hljs-attr">advice-ref</span>=<span class="hljs-string">"txAdvice"</span> <span class="hljs-attr">pointcut-ref</span>=<span class="hljs-string">"allManagerMethod"</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">aop:config</span>></span><br></code></pre></td></tr></table></figure><h4 id="transaction有那几种实现"><a href="#transaction有那几种实现" class="headerlink" title="transaction有那几种实现"></a>transaction有那几种实现</h4><p>在Spring中,事务处理主要有两种方式<br>(1) 代码控制事务<br>在程序中引入新的模版类,这个类封装了事务管理的功能<br>(2) 参数配置控制事务,在Application-Context.xml增加一个事务代理(UserDAOProxy)配置<br>IBATIS中的事物属性怎么配置<br>SQL MAP XML配置文件中的transactionManager</p><h2 id="Hibernate面试题"><a href="#Hibernate面试题" class="headerlink" title="Hibernate面试题"></a>Hibernate面试题</h2><h4 id="Hibernate工作原理"><a href="#Hibernate工作原理" class="headerlink" title="Hibernate工作原理"></a>Hibernate工作原理</h4><p>1.读取并解析配置文件</p><p>2.读取并解析映射信息,创建SessionFactory</p><p>3.打开Sesssion</p><p>4.创建事务Transation</p><p>5.持久化操作</p><p>6.提交事务</p><p>7.关闭Session</p><p>8.关闭SesstionFactory</p><p><img src="/2018/09/19/java面试之Struts-Spring-Hibernate/4.png" alt="hibernate的核心构成和执行流程图"><br><img src="/2018/09/19/java面试之Struts-Spring-Hibernate/5.png" alt="hibernate的核心构成和执行流程图"></p><h4 id="什么是Hibernate的并发机制?怎么处理并发问题?"><a href="#什么是Hibernate的并发机制?怎么处理并发问题?" class="headerlink" title="什么是Hibernate的并发机制?怎么处理并发问题?"></a>什么是Hibernate的并发机制?怎么处理并发问题?</h4><p>Hibernate并发机制:<br> a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,然后就丢弃。如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用。如果在Http Session中有hibernate的Session的话,就可能会出现同步访问Http Session。只要用户足够快的点击浏览器的“刷新”,就会导致两个并发运行的线程使用同一个Session。</p><p> b、多个事务并发访问同一块资源,可能会引发第一类丢失更新,脏读,幻读,不可重复读,第二类丢失更新一系列的问题。</p><p> 解决方案:设置事务隔离级别。<br> Serializable:串行化。隔离级别最高</p><p>Repeatable Read:可重复读</p><p> Read Committed:已提交数据读</p><p> Read Uncommitted:未提交数据读。隔离级别最差</p><p> 设置锁:乐观锁和悲观锁。</p><p> 乐观锁:使用版本号或时间戳来检测更新丢失,在<class>的映射中设置 optimistic-lock=”all”可以在没有版本或者时间戳属性映射的情况下实现 版本检查,此时Hibernate将比较一行记录的每个字段的状态<br> 行级悲观锁:Hibernate总是使用数据库的锁定机制,从不在内存中锁定对象!只要为JDBC连接指定一下隔 离级别,然后让数据库去搞定一切就够了。类LockMode 定义了Hibernate所需的不同的锁定级别:<code>LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;</code></class></p><h4 id="Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?"><a href="#Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?" class="headerlink" title="Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?"></a>Hibernate自带的分页机制是什么?如果不使用Hibernate自带的分页,则采用什么方式分页?</h4><p> 1、hibernate自带的分页机制:获得Session对象后,从Session中获得Query对象。用Query.setFirstResult():设置要显示的第一行数据Query.setMaxResults():设置要显示的最后一行数据。</p><p> 2、不使用hibernate自带的分页,可采用sql语句分页,<br> 如:5:为每页显示的记录,2为当前页: <code>select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);</code></p><h4 id="hibernate的三种状态之间如何转换"><a href="#hibernate的三种状态之间如何转换" class="headerlink" title="hibernate的三种状态之间如何转换"></a>hibernate的三种状态之间如何转换</h4><p> 当对象由瞬时状态(Transient)一save()时,就变成了持久化状态。 当我们在Session里存储对象的时候,实际是在Session的Map里存了一份, 也就是它的缓存里放了一份,然后,又到数据库里存了一份,在缓存里这一份叫持久对象(Persistent)。<br> Session 一 Close()了,它的缓存也都关闭了,整个Session也就失效了, 这个时候,这个对象变成了游离状态(Detached),但数据库中还是存在的。当游离状态(Detached)update()时,又变为了持久状态(Persistent)。当持久状态(Persistent)delete()时,又变为了瞬时状态(Transient),此时,数据库中没有与之对应的记录。</p><h4 id="update()和saveOrUpdate()的区别?"><a href="#update()和saveOrUpdate()的区别?" class="headerlink" title="update()和saveOrUpdate()的区别?"></a>update()和saveOrUpdate()的区别?</h4><p> update()和saveOrUpdate()是用来对跨Session的PO进行状态管理的,update()方法操作的对象必须是持久化了的对象。也就是说,如果此对象在数据库中不存在的话,就不能使用update()方法。<br> saveOrUpdate()方法操作的对象既可以使持久化了的,也可以使没有持久化的对象。如果是持久化了的对象调用saveOrUpdate()则会 更新数据库中的对象;如果是未持久化的对象使用此方法,则save到数据库中。</p><h4 id="hibernate拒绝连接、服务器崩溃的原因?最少写5个"><a href="#hibernate拒绝连接、服务器崩溃的原因?最少写5个" class="headerlink" title="hibernate拒绝连接、服务器崩溃的原因?最少写5个"></a>hibernate拒绝连接、服务器崩溃的原因?最少写5个</h4><ol><li><p>db没有打开 </p></li><li><p>网络连接可能出了问题</p></li><li><p>连接配置错了</p></li><li><p>驱动的driver,url是否都写对了</p></li><li><p>LIB下加入相应驱动,数据连接代码是否有误</p></li><li><p>数据库配置可能有问题</p></li><li><p>当前联接太多了,服务器都有访问人数限制的</p></li><li><p>服务器的相应端口没有开,即它不提供相应的服务</p></li><li><p>hibernate有哪些缓存,分别怎么使用?</p></li><li><p>你对hibernate的了解到了一个什么样的程度?</p></li><li><p>写出一个sql语句体现hibernate中一对多的关系</p></li></ol><h4 id="hibernate如何管理缓存"><a href="#hibernate如何管理缓存" class="headerlink" title="hibernate如何管理缓存"></a>hibernate如何管理缓存</h4><p> Hibernate 中提供了两级Cache,第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。</p><p> 1. 一级缓存和二级缓存的比较:第一级缓存 第二级缓存 存放数据的形式 相互关联的持久化对象 对象的散装数据 缓存的范围 事务范围,每个事务都有单独的第一级缓存进程范围或集群范围,缓存被同一个进程或集群范围内的所有事务共享 并发访问策略由于每个事务都拥有单独的第一级缓存,不会出现并发问题,无需提供并发访问策略由于多个事务会同时访问第二级缓存中相同数据,因此必须提供适当的并发访问策略,来保证特定的事务隔离级别 数据过期策略没有提供数据过期策略。处于一级缓存中的对象永远不会过期,除非应用程序显式清空缓存或者清除特定的对象必须提供数据过期策略,如基于内存的缓存中的对象的最大数目,允许对象处于缓存中的最长时间,以及允许对象处于缓存中的最长空闲时间 物理存储介质内存内存和硬盘。对象的散装数据首先存放在基于内在的缓存中,当内存中对象的数目达到数据过期策略中指定上限时,就会把其余的对象写入基于硬盘的缓存中。缓存的软件实现 在Hibernate的Session的实现中包含了缓存的实现由第三方提供,Hibernate仅提供了缓存适配器(CacheProvider)。用于把特定的缓存插件集成到Hibernate中。启用缓存的方式只要应用程序通过Session接口来执行保存、更新、删除、加载和查询数据库数据的操作,Hibernate就会启用第一级缓存,把数据库中的数据以对象的形式拷贝到缓存中,对于批量更新和批量删除操作,如果不希望启用第一级缓存,可以绕过Hibernate API,直接通过JDBC API来执行指操作。用户可以在单个类或类的单个集合的粒度上配置第二级缓存。如果类的实例被经常读但很少被修改,就可以考虑使用第二级缓存。只有为某个类或集合配置了第二级缓存,Hibernate在运行时才会把它的实例加入到第二级缓存中。 用户管理缓存的方式第一级缓存的物理介质为内存,由于内存容量有限,必须通过恰当的检索策略和检索方式来限制加载对象的数目。Session的evit()方法可以显式清空缓存中特定对象,但这种方法不值得推荐。 第二级缓存的物理介质可以是内存和硬盘,因此第二级缓存可以存放大量的数据,数据过期策略的maxElementsInMemory属性值可以控制内存中的对象数目。管理第二级缓存主要包括两个方面:选择需要使用第二级缓存的持久类,设置合适的并发访问策略:选择缓存适配器,设置合适的数据过期策略。</p><p> 2. 一级缓存的管理: 当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的 list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级缓存中。当清理缓存时,Hibernate会根据缓存中对象的状态变化来同步更新数据库。 Session为应用程序提供了两个管理缓存的方法: evict(Object obj):从缓存中清除参数指定的持久化对象。 clear():清空缓存中所有持久化对象。</p><p> 3. 二级缓存的管理:</p><p> 3.1. Hibernate的二级缓存策略的一般过程如下:</p><p> 1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。</p><p> 2) 把获得的所有数据对象根据ID放入到第二级缓存中。</p><p> 3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。</p><p> 4) 删除、更新、增加数据的时候,同时更新缓存。</p><p> Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用。为此,Hibernate提供了针对条件查询的Query Cache。</p><p> 3.2. 什么样的数据适合存放到第二级缓存中? 1 很少被修改的数据 2 不是很重要的数据,允许出现偶尔并发的数据 3 不会被并发访问的数据 4 参考数据,指的是供应用参考的常量数据,它的实例数目有限,它的实例会被许多其他类的实例引用,实例极少或者从来不会被修改。</p><p> 3.3. 不适合存放到第二级缓存的数据? 1 经常被修改的数据 2 财务数据,绝对不允许出现并发 3 与其他应用共享的数据。</p><p> 3.4. 常用的缓存插件 Hibernater 的二级缓存是一个插件,下面是几种常用的缓存插件:</p><p> EhCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,对Hibernate的查询缓存提供了支持。</p><p> OSCache:可作为进程范围的缓存,存放数据的物理介质可以是内存或硬盘,提供了丰富的缓存数据过期策略,对Hibernate的查询缓存提供了支持。</p><p> SwarmCache:可作为群集范围内的缓存,但不支持Hibernate的查询缓存。</p><p> JBossCache:可作为群集范围内的缓存,支持事务型并发访问策略,对Hibernate的查询缓存提供了支持。</p><p> 3.5. 配置二级缓存的主要步骤:</p><p> 1) 选择需要使用二级缓存的持久化类,设置它的命名缓存的并发访问策略。这是最值得认真考虑的步骤。</p><p> 2) 选择合适的缓存插件,然后编辑该插件的配置文件。</p><h4 id="使用Hibernate的优点:"><a href="#使用Hibernate的优点:" class="headerlink" title="使用Hibernate的优点:"></a>使用Hibernate的优点:</h4><ol><li><p>对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。</p></li><li><p>Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作</p></li><li><p>hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。</p></li><li><p>hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。</p><h4 id="Hibernate是如何延迟加载"><a href="#Hibernate是如何延迟加载" class="headerlink" title="Hibernate是如何延迟加载?"></a>Hibernate是如何延迟加载?</h4></li><li><p>Hibernate2延迟加载实现:a)实体对象 b)集合(Collection)</p></li><li><p>Hibernate3 提供了属性的延迟加载功能<br>当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。</p><h4 id="如何优化Hibernate?"><a href="#如何优化Hibernate?" class="headerlink" title="如何优化Hibernate?"></a>如何优化Hibernate?</h4><p>1.使用双向一对多关联,不使用单向一对多</p></li></ol><p>2.灵活使用单向一对多关联</p><p>3.不用一对一,用多对一取代</p><p>4.配置对象缓存,不使用集合缓存</p><p>5.一对多集合使用Bag,多对多集合使用Set</p><ol start="6"><li><p>继承类使用显式多态</p></li><li><p>表字段要少,表关联不要怕多,有二级缓存撑腰</p></li></ol><h1 id="综合考察"><a href="#综合考察" class="headerlink" title="综合考察"></a>综合考察</h1><h3 id="Hibernate和spring中常出现的几个异常"><a href="#Hibernate和spring中常出现的几个异常" class="headerlink" title="Hibernate和spring中常出现的几个异常"></a>Hibernate和spring中常出现的几个异常</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><code class="hljs undefined">org.springframework.beans.factory.BeanCreationException:<br> <br> Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]:<br> <br> Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column:<br> <br> password (should be mapped with <span class="hljs-keyword">insert</span>=<span class="hljs-string">"false"</span> <span class="hljs-keyword">update</span>=<span class="hljs-string">"false"</span>)<br> <br> 出错原因:<span class="hljs-keyword">password</span> 和repassword同时对应数据库表中的<span class="hljs-keyword">password</span>一列,同时<span class="hljs-keyword">password</span>里面的<span class="hljs-keyword">update</span>和<span class="hljs-keyword">insert</span>都设为<span class="hljs-literal">true</span>。<span class="hljs-keyword">xml</span>文件如下:<br> <br> <property <span class="hljs-keyword">name</span>=<span class="hljs-string">"password"</span><br> <br> <span class="hljs-keyword">type</span>=<span class="hljs-string">"java.lang.String"</span><br> <br> <span class="hljs-keyword">update</span>=<span class="hljs-string">"true"</span><br> <br> <span class="hljs-keyword">insert</span>=<span class="hljs-string">"true"</span><br> <br> <span class="hljs-keyword">access</span>=<span class="hljs-string">"property"</span><br> <br> <span class="hljs-keyword">column</span>=<span class="hljs-string">"password"</span><br> <br> <span class="hljs-keyword">length</span> = <span class="hljs-string">"32"</span><br> <br> /><br> <br> <br> <br> <property <span class="hljs-keyword">name</span>=<span class="hljs-string">"repassword"</span><br> <br> <span class="hljs-keyword">type</span>=<span class="hljs-string">"java.lang.String"</span><br> <br> <span class="hljs-keyword">update</span>=<span class="hljs-string">"false"</span><br> <br> <span class="hljs-keyword">insert</span>=<span class="hljs-string">"false"</span><br> <br> <span class="hljs-keyword">access</span>=<span class="hljs-string">"property"</span><br> <br> <span class="hljs-keyword">column</span>=<span class="hljs-string">"password"</span><br> <br> <span class="hljs-keyword">length</span> = <span class="hljs-string">"32"</span><br> <br> /><br> <br> 解决方法:将repassword的<span class="hljs-keyword">insert</span>和<span class="hljs-keyword">update</span>设为<span class="hljs-literal">false</span>。<br> <br> <br> <br> org.springframework.beans.factory.BeanCreationException:<br> <br> <span class="hljs-keyword">Error</span> creating bean <span class="hljs-keyword">with</span> <span class="hljs-keyword">name</span> <span class="hljs-string">'sessionFactory'</span> defined <span class="hljs-keyword">in</span> ServletContext <span class="hljs-keyword">resource</span> [/WEB-INF/applicationContext.xml]:<br> <br> Initialization <span class="hljs-keyword">of</span> bean <span class="hljs-keyword">failed</span>;nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class<br></code></pre></td></tr></table></figure><p> 错误原因:hibernate的映射文件中ID是大写的,而pojo的类中id是小写的<br> 解决方法:要么将pojo类中的id改称大写,要么把hibernate的映射文件中的ID改称小写。</p><h4 id="Hibernate与jdbc的联系"><a href="#Hibernate与jdbc的联系" class="headerlink" title="Hibernate与jdbc的联系"></a>Hibernate与jdbc的联系</h4><p>hibernate是jdbc的轻量级封装,包括jdbc的与数据库的连接(用hibernate.property的配置文件实现当然本质是封装了jdbc的forname),和查询,删除等代码,都用面向对象的思想用代码联系起来,hibernate通过hbm 配置文件把po类的字段和数据库的字段关联起来比如数据库的id, 在po类中就是pravite Long id; public Long getId() ;public setId(Long id);然后hql语句也是面向对象的,它的查询语句不是查询数据库而是查询类的,这些实现的魔法就是xml文件,其实hibernate=封装的jdbc+xml文件。</p><h4 id="Hibernate与spring的联系"><a href="#Hibernate与spring的联系" class="headerlink" title="Hibernate与spring的联系"></a>Hibernate与spring的联系</h4><p>hibernate中的一些对象可以给Spring来管理,让Spring容器来创建hibernate中一些对象实例化。例如:SessionFactory,HibernateTemplate等。<br>Hibernate本来是对数据库的一些操作,放在DAO层,而Spring给业务层的方法定义了事务,业务层调用DAO层的方法,很好的将Hibernate的操作也加入到事务中来了。</p><h4 id="项目中为什么使用SSH"><a href="#项目中为什么使用SSH" class="headerlink" title="项目中为什么使用SSH"></a>项目中为什么使用SSH</h4><ol><li><p>使用Struts是因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;第二,struts有着丰富的taglib,如能灵活运用,则能大大提高开发效率。</p></li><li><p>使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架。hibernate是个轻量级的持久性框架,功能丰富。</p></li><li><p>使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统的框架,但它不强迫你必须在每一层中必须使用Spring,因为它模块化的很好,允许你根据自己的需要选择使用它的某一个模块;</p></li><li><p>采用IoC使得可以很容易的实现bean的装配,提供了简洁的AOP并据此实现事务管理(Transcation Managment),等等</p></li></ol>]]></content>
<summary type="html">
<p> <img src="/2018/09/19/java面试之Struts-Spring-Hibernate/1.jpeg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="面试" scheme="http://yoursite.com/categories/%E9%9D%A2%E8%AF%95/"/>
<category term="ssh" scheme="http://yoursite.com/tags/ssh/"/>
<category term="框架" scheme="http://yoursite.com/tags/%E6%A1%86%E6%9E%B6/"/>
</entry>
<entry>
<title>java基础面试之语法之一</title>
<link href="http://yoursite.com/2018/09/18/java%E5%9F%BA%E7%A1%80%E9%9D%A2%E8%AF%95%E4%B9%8B%E8%AF%AD%E6%B3%95%E4%B9%8B%E4%B8%80/"/>
<id>http://yoursite.com/2018/09/18/java基础面试之语法之一/</id>
<published>2018-09-18T07:41:00.000Z</published>
<updated>2018-09-20T09:55:32.940Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/18/java基础面试之语法之一/1.jpg" alt="在这里插入图片描述"><br><a id="more"></a></p><p>对于Java面试来说的本文只是对Java基础知识的一个小结,并不是什么武功秘籍或者什么速成法,更多的要求面试者自己脚踏实地的去学,多看书,多敲代码,多去思考,才是面试的王者之道。在这里作者提供了Java官方的API以供大家参考和学习[点我去官方API]</p><p>一个”.java”源文件中是否可以包括多个类(不是内部类)?有什么限制?<br>一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一致。<br>每个编译单元只能有一个public 类。这么做的意思是,每个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。<br>你可以根据需要,往这个文件里面添加任意多个提供辅助功能的package 权限的类。但是如果这个编译单元里面有两个或两个以上的public 类的话,程序就不知道从哪里导入了,编译器就会报错。 <br><img src="/2018/09/18/java基础面试之语法之一/2.png" alt="在这里插入图片描述"></p><p>&和&&的区别<br>&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。</p><p>&&还具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,例如,对于if(str != null&& !str.equals(“”))表达式,当str为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。If(x==33 &++y>0) y会增长,If(x==33 && ++y>0)不会增长</p><p>&还可以用作位运算符,当&操作符两边的表达式不是boolean类型时,&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。</p><blockquote><p>备注:这道题先说两者的共同点,再说出&&和&的特殊之处,并列举一些经典的例子来表明自己理解透彻深入、实际经验丰富。</p></blockquote><p><img src="/2018/09/18/java基础面试之语法之一/3.png" alt="在这里插入图片描述"></p><p>下面的例子更清楚<br>y增长<br><img src="/2018/09/18/java基础面试之语法之一/4.png" alt="在这里插入图片描述"></p><p>y没有增长<br><img src="/2018/09/18/java基础面试之语法之一/5.png" alt="在这里插入图片描述"></p><p>在JAVA中如何跳出当前的多重嵌套循环?<br>在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环。例如,<br><img src="/2018/09/18/java基础面试之语法之一/6.png" alt="在这里插入图片描述"></p><p>并不推荐这种方式,让外层的循环条件表达式的结果可以受到里层循环体代码的控制,跳出本层循环</p><p><img src="/2018/09/18/java基础面试之语法之一/7.png" alt="在这里插入图片描述"></p><p>switch语句能否作用在byte上,能否作用在long上,能否作用在String上?<br>在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long符合switch的语法规定,并且不能被隐式转换成int类型,所以,它不能作用于swtich语句中。</p><p><img src="/2018/09/18/java基础面试之语法之一/8.png" alt="在这里插入图片描述"></p><p>short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?<br>对于short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。<br><img src="/2018/09/18/java基础面试之语法之一/9.png" alt="在这里插入图片描述"></p><p>char型变量中能不能存贮一个中文汉字?为什么?<br>当然是可以了,char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字。补充说明:unicode编码占用两个字节,所以,char类型的变量也是占用两个字节。<br><img src="/2018/09/18/java基础面试之语法之一/10.png" alt="在这里插入图片描述"></p><p>8、用最有效率的方法算出2乘以8等於几?<br>2<<3,位移三位就可以了,而位运算cpu直接支持的,效率最高。<br><img src="/2018/09/18/java基础面试之语法之一/11.png" alt="在这里插入图片描述"></p><p>int和Integer有什么区别?<br>Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。<br>Java 为每个原始类型提供了包装类型:</p><ul><li>原始类型: boolean,char,byte,short,int,long,float,double</li><li>包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double<br><img src="/2018/09/18/java基础面试之语法之一/12.png" alt="在这里插入图片描述"></li></ul><p>第二种情况<br><img src="/2018/09/18/java基础面试之语法之一/13.png" alt="在这里插入图片描述"></p><p>解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法。<br>通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;而通过new关键字和构造器创建的对象放在堆空间;程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中。栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,理论上整个内存没有被其他进程使用的空间甚至硬盘上的虚拟内存都可以被当成堆空间来使用。<br>String str = new String(“hello”);<br>上面的语句中变量str放在栈上,用new创建出来的字符串对象放在堆上,而”hello”这个字面量放在静态区。</p><p>数组有没有length()方法?String有没有length()方法?<br>这个问题代码敲多了都应该知道,数组本身就有长度,String字符串则需要length方法来获取长度</p><p>构造器(constructor)是否可被重写(override)?<br>构造器不能被继承,因此不能被重写,但可以被重载。</p><p>两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?<br>不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。<br>补充:关于equals和hashCode方法,很多Java程序都知道,但很多人也就是仅仅知道而已,在Joshua Bloch的大作《Effective Java》(很多软件公司,《Effective Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,如果你还没看过,那就赶紧去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查”参数是否为这个对象的引用”;2. 使用instanceof操作符检查”参数是否为正确的类型”;3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。</p><p>是否可以继承String类?<br>String 类是final类,不可以被继承。</p><blockquote><p>补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。</p></blockquote><p>当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?<br>是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。</p><p>String和StringBuilder、StringBuffer的区别?<br>Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,它们可以储存和操作字符串。其中String是只读字符串,也就意味着String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。<br> 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好?<br>string旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。<br>而StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销</p><blockquote><p>因此我们得出结论:当需要进行频繁修改字符串的操作时先建立StringBuffer类对象进行操作,<br>将最后结果转化成String类对象返回,这样效率会高很多。</p></blockquote><p>重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?<br>方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。</p><blockquote><p>面试题:华为的面试题中曾经问过这样一个问题 – “为什么不能根据返回类型来区分重载”,快说出你的答案吧!<br>因为调用时不能指定类型信息,编译器不知道你要调用哪个函数。<br><code>float max(int a, int b); int max(int a,int b)</code>;</p></blockquote><p>描述一下JVM加载class文件的原理机制?<br>JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。</p><p>由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。</p><p>类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。</p><p>当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。<br>最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。<br>类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。<br>下面是关于几个类加载器的说明:</p><blockquote><p>Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);<br>Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;<br>System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。</p></blockquote><p>抽象类(abstract class)和接口(interface)有什么异同?<br>抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。</p><p>静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?<br>Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的。</p><p>Java 中会存在内存泄漏吗,请简单描述。<br>理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄露的发生。例如hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或清空(flush)一级缓存就可能导致内存泄露。下面例子中的代码也会导致内存泄露。</p><p>抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?<br>都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。<br><img src="/2018/09/18/java基础面试之语法之一/14.jpg" alt="在这里插入图片描述"></p><p>阐述静态变量和实例变量的区别。<br>静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。<br> 静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;<br>实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。<br>例:</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">A</span>{<br><span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> a = <span class="hljs-number">0</span>; <span class="hljs-comment">// 这是静态变量</span><br><span class="hljs-keyword">int</span> b = <span class="hljs-number">0</span>; <span class="hljs-comment">// 这是实例变量</span><br>} <br><br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">B</span>{<br><span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span> (<span class="hljs-params">String[] args</span>)</span>{<br>A a1 = <span class="hljs-keyword">new</span> A();<br>A a2 = <span class="hljs-keyword">new</span> A();<br>a1.a = <span class="hljs-number">3</span>; <span class="hljs-comment">// 对象a1将3赋值给a</span><br>a1.b = <span class="hljs-number">4</span> ; <span class="hljs-comment">// 对象a1将4赋值给“它自己的b”</span><br>System.<span class="hljs-keyword">out</span>.println(a2.a); <span class="hljs-comment">//结果为3</span><br> <span class="hljs-comment">//静态变量是针对所有对象的,所以a1改变a的值,a2获取到的a的值也改变了的</span><br>System.<span class="hljs-keyword">out</span>.println(a2.b); <span class="hljs-comment">//结果为0</span><br> <span class="hljs-comment">//实例变量只改变自身所获取的值,所以a1获取的b的值改变了,不影响a2获取的b的值</span><br> }<br>}<br></code></pre></td></tr></table></figure><p>GC是什么?为什么要有GC?<br>GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。<br>垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。<br>GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc() 或Runtime.getRuntime().gc() ,但JVM可以屏蔽掉显示的垃圾回收调用。<br>垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。<br>与垃圾回收相关的JVM参数:</p><figure class="highlight haml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs undefined">-<span class="ruby">Xms / -Xmx — 堆的初始大小 / 堆的最大大小<br></span>-<span class="ruby">Xmn — 堆中年轻代的大小<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>-DisableExplicitGC — 让System.gc()不产生任何作用<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>+PrintGCDetails — 打印GC的细节<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>+PrintGCDateStamps — 打印GC操作的时间戳<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>NewSize / <span class="hljs-symbol">XX:</span>MaxNewSize — 设置新生代大小/新生代最大大小<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>NewRatio — 可以设置老生代和新生代的比例<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>InitialTenuringThreshold / -<span class="hljs-symbol">XX:</span>MaxTenuringThreshold:设置老年代阀值的初始值和最大值<br></span>-<span class="ruby"><span class="hljs-symbol">XX:</span>TargetSurvivorRatio:设置幸存区的目标使用率</span><br></code></pre></td></tr></table></figure><p>String s = new String(“xyz”);创建了几个字符串对象?<br>两个对象,一个是静态区的”xyz”,一个是用new创建在堆上的对象。</p><p>接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?<br>接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。</p><p>Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?<br>匿名的内部类不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。</p><figure class="highlight cs"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">class</span> <span class="hljs-title">Car</span>{<br> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">move</span>(<span class="hljs-params"></span>)</span>{}<br>}<br><span class="hljs-keyword">interface</span> <span class="hljs-title">Person</span>{<br> <span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">learn</span>(<span class="hljs-params"></span>)</span>;<br>}<br><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">class</span> <span class="hljs-title">Animal</span>{<br> <span class="hljs-function"><span class="hljs-keyword">abstract</span> <span class="hljs-keyword">void</span> <span class="hljs-title">eat</span>(<span class="hljs-params"></span>)</span>;<br>}<br><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title">AnonymousInnerClassDemo</span> {<br> <br> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(<span class="hljs-params">String[] args</span>) </span>{<br> Car car = <span class="hljs-keyword">new</span> Car(){<br> @<span class="hljs-function">Override<br> <span class="hljs-keyword">void</span> <span class="hljs-title">move</span>(<span class="hljs-params"></span>) </span>{<br> System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"匿名内部类的move方法"</span>);<br> }<br> };<br> car.move();<br> <br> Person person = <span class="hljs-keyword">new</span> Person() {<br> <br> <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">learn</span>(<span class="hljs-params"></span>) </span>{<br> System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"匿名内部类的learn方法"</span>);<br> }<br> };<br> person.learn();<br> <br> Animal animal = <span class="hljs-keyword">new</span> Animal() {<br> @<span class="hljs-function">Override<br> <span class="hljs-keyword">void</span> <span class="hljs-title">eat</span>(<span class="hljs-params"></span>) </span>{<br> System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"匿名内部类的eat方法"</span>);<br> }<br> };<br> animal.eat();<br> }<br>}<br></code></pre></td></tr></table></figure><p>指出下面程序的运行结果。<br><img src="/2018/09/18/java基础面试之语法之一/15.png" alt="在这里插入图片描述"><br>执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。<br>如果不能给出此题的正确答案,说明之前Java类加载机制还没有完全理解,赶紧再看看吧。</p><p>数据类型之间的转换:</p><ul><li>如何将字符串转换为基本数据类型?</li><li>如何将基本数据类型转换为字符串?<br>调用基本数据类型对应的包装类中的方法parseXXX(String)或valueOf(String)即可返回相应基本类型;</li><li>一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf()方法返回相应字符串<br>Character ch2 = ‘8’; (char是基本数据类型,Character是其包装类型。)<br> int num2 = Integer.parseInt(ch2.toString());</li></ul><p>如何实现字符串的反转及替换?<br>递归实现字符串反转<br><img src="/2018/09/18/java基础面试之语法之一/16.png" alt="在这里插入图片描述"></p><p>日期和时间:</p><ul><li>如何取得年月日、小时分钟秒?</li><li>如何取得从1970年1月1日0时0分0秒到现在的毫秒数?</li><li>如何取得某月的最后一天?</li><li>如何格式化日期?<br>创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值。Java 8中可以使用java.time.LocalDateTimel来获取,代码如下所示。<br><img src="/2018/09/18/java基础面试之语法之一/17.png" alt="在这里插入图片描述"></li></ul><p>以下方法均可获得该毫秒数。</p><pre><code>Calendar.getInstance().getTimeInMillis();System.currentTimeMillis();Clock.systemDefaultZone().millis(); // Java 8</code></pre><p>取得某月的最后一天<br><img src="/2018/09/18/java基础面试之语法之一/18.png" alt="在这里插入图片描述"></p><p>利用java.text.DataFormat 的子类(如SimpleDateFormat类)中的format(Date)方法可将日期格式化。Java 8中可以用java.time.format.DateTimeFormatter来格式化时间日期,代码如下所示。</p><p><img src="/2018/09/18/java基础面试之语法之一/19.png" alt="在这里插入图片描述"></p><p>打印昨天的当前时刻。</p><p><img src="/2018/09/18/java基础面试之语法之一/20.png" alt="在这里插入图片描述"></p><p>比较一下Java和JavaSciprt。<br>基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言,因而它本身提供了非常丰富的内部对象供设计人员使用。</p><ul><li>解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。(目前的浏览器几乎都使用了JIT(即时编译)技术来提升JavaScript的运行效率)</li><li>强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型。</li><li>代码格式不一样。<br>补充:上面列出的四点是网上流传的所谓的标准答案。其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民,因此JavaScript支持函数式编程,可以使用Lambda函数和闭包(closure),当然Java 8也开始支持函数式编程,提供了对Lambda表达式以及函数式接口的支持。对于这类问题,在面试的时候最好还是用自己的语言回答会更加靠谱,不要背网上所谓的标准答案。</li></ul><p>Error和Exception有什么区别?<br>Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。<br><img src="/2018/09/18/java基础面试之语法之一/21.png" alt="在这里插入图片描述"></p><blockquote><p>提示:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件(什么时候就不再继续递归)。</p></blockquote><p>try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被执行,什么时候被执行,在return前还是后?<br>会执行,在方法返回调用者前执行。<br>注意:在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,就会返回修改后的值。显然,在finally中返回或者修改返回值会对程序造成很大的困扰,C#中直接用编译错误的方式来阻止程序员干这种龌龊的事情,Java中也可以通过提升编译器的语法检查级别来产生警告或错误,Eclipse中可以在如图所示的地方进行设置,强烈建议将此项设置为编译错误。</p><p>Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用?<br>Java通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java中,每个异常都是一个对象,它是Throwable类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果系统会抛出(throw)一个异常对象,可以通过它的类型来捕获(catch)它,或通过总是执行代码块(finally)来处理;try用来指定一块预防所有异常的程序;catch子句紧跟在try块后面,用来指定你想要捕获的异常的类型;throw语句用来明确地抛出一个异常;throws用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟);finally为确保一段代码不管发生什么异常状况都要被执行;try语句可以嵌套,每当遇到一个try语句,异常的结构就会被放入异常栈中,直到所有的try语句都完成。如果下一级的try语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的try语句或者最终将异常抛给JVM。</p><p>运行时异常与受检异常有何异同?<br>异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西,在Effective Java中对异常的使用给出了以下指导原则:</p><ul><li>不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)</li><li>对可以恢复的情况使用受检异常,对编程错误使用运行时异常</li><li>避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)</li><li>优先使用标准的异常</li><li>每个方法抛出的异常都要有文档</li><li>保持异常的原子性</li><li>不要在catch中忽略掉捕获到的异常</li></ul><p>列出一些你常见的运行时异常?</p><pre><code>- ArithmeticException(算术异常)- ClassCastException (类转换异常)- IllegalArgumentException (非法参数异常)- IndexOutOfBoundsException (下标越界异常)- NullPointerException (空指针异常)- SecurityException (安全异常)</code></pre><p>阐述final、finally、finalize的区别。</p><ul><li>final:修饰符(关键字)有三种用法:如果一个类被声明为final,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。将变量声明为final,可以保证它们在使用中不被改变,被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取不可修改。被声明为final的方法也同样只能使用,不能在子类中被重写。</li><li>finally:通常放在try…catch…的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。</li><li>finalize:Object类中定义的方法,Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize()方法可以整理系统资源或者执行其他清理工作。</li></ul><p>List,Set,Map是否继承自Collection接口?<br>List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。</p><p>阐述ArrayList、Vector、LinkedList的存储性能和特性。<br>ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器,但性能上较ArrayList差,因此已经是Java中的遗留容器。LinkedList使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。Vector属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器),已经不推荐使用,但是由于ArrayList和LinkedListed都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类Collections中的synchronizedList方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。</p><p>Collection和Collections的区别?<br>Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。</p><p>List、Map、Set三个接口存取元素时,各有什么特点?<br>List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。</p><p>TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?<br>TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是通过接口注入比较元素大小的算法,也是对回调模式的应用(Java中对函数式编程的支持)。</p>]]></content>
<summary type="html">
<p><img src="/2018/09/18/java基础面试之语法之一/1.jpg" alt="在这里插入图片描述"><br></p>
</summary>
<category term="面试" scheme="http://yoursite.com/categories/%E9%9D%A2%E8%AF%95/"/>
<category term="java" scheme="http://yoursite.com/tags/java/"/>
<category term="面试" scheme="http://yoursite.com/tags/%E9%9D%A2%E8%AF%95/"/>
</entry>
<entry>
<title>docker安装和使用</title>
<link href="http://yoursite.com/2018/09/18/docker/"/>
<id>http://yoursite.com/2018/09/18/docker/</id>
<published>2018-09-18T06:46:00.000Z</published>
<updated>2018-09-18T08:36:47.453Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/18/docker/1.jpeg" alt="image"><br><a id="more"></a></p><h1 id="docker是什么"><a href="#docker是什么" class="headerlink" title="docker是什么"></a>docker是什么</h1><p>Docker:是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的,可移植的,自给自足的容器。<br><img src="/2018/09/18/docker/2018070323183768.jpg" alt="image"><br>Docker的核心概念:镜像、仓库、容器</p><p>Docker镜像:是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。</p><p>Docker 容器(Container):来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。</p><p>仓库(Repository):是集中存放镜像文件的场所</p><h2 id="一次完整docker的操作流程"><a href="#一次完整docker的操作流程" class="headerlink" title="一次完整docker的操作流程"></a>一次完整docker的操作流程</h2><p>一般的流程中,client发pull命令从仓库把image拉到docker host,然后通过run命令指挥image到host上面弄一个container来跑这个image。<br>当然也可以是相反的流程,client 通过build命令在host上面创建一个自己的image,然后通过push命令把image推到仓库。之后这个image可以被别的人或者自己pull。<br>DOCKER在windows上的安装<br>检查电脑环境<br>检查版本,为了运行docker,你的机器必须是windows7或以上的64bit系统。</p><p><img src="/2018/09/18/docker/1143999-20180313140818796-1643765854.png" alt="image"></p><p>另外,你的机器必须支持硬件虚拟化技术(Hardware Virtualization Technology)并且已被启用。对于windows10系统来说,你可以在 任务管理器->性能 中查看到你的电脑是否开启了虚拟化</p><p><img src="/2018/09/18/docker/1143999-20180313141014409-280017963.png" alt="image"></p><p><img src="/2018/09/18/docker/1143999-20180313141112118-714996506.png" alt="image"></p><p>怎么开启虚拟化,因为电脑型号不一样,所以每台电脑进入BOIS的方式不一样,重启电脑,我的电脑是Lenovo的ThinkPad,所以我按的是F1,进入BOIS页面,找到Security,把Security下面的Virtualization里面的Intel(R) Virtualization Technology的状态改为Enable</p><p><img src="/2018/09/18/docker/1143999-20180313141202412-793373079.png" alt="image"></p><p>然后再重启就好了。</p><p>下载dockerToolbox<br><a href="https://get.daocloud.io/toolbox/,下载新版本" target="_blank" rel="noopener">https://get.daocloud.io/toolbox/,下载新版本</a></p><p>全部next就可以了</p><p>安转成功之后桌面会多三个图标</p><p> <img src="/2018/09/18/docker/1143999-20180313141314152-1972331708.png" alt="image"></p><p>如果安装完成之后桌面少了一个Oracle VM VirtualBox 的话,找到你的dockertoolbox<br>安装目录下面的installers下面的virtualbox,双击virtualbox.msi进行安装。</p><p>双击Docker Quickstart Terminal图标,启动一个终端,第一次运行会比较就,一般会报下载对应的镜像iso到对C:下的docker路径的错误,把dockertoolbox下的boot2docker.iso复制放到你docker运行下载镜像的位置,再重新启动就可以了。</p><p>启动成功会出现这样的界面</p><p> <img src="/2018/09/18/docker/1143999-20180313141513155-253707124.png" alt="image"></p><h1 id="docker在linux上的安装"><a href="#docker在linux上的安装" class="headerlink" title="docker在linux上的安装"></a>docker在linux上的安装</h1><p>1.安装docker<br>yum install docker.x86_64 </p><ol start="2"><li>启动Docker<br>service docker start<h1 id="linux常用命令"><a href="#linux常用命令" class="headerlink" title="linux常用命令"></a>linux常用命令</h1> <figure class="highlight stata"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">ls</span> -a(同时列出隐含文件), -<span class="hljs-keyword">l</span>(输出一个比较完整的格式,除每个文件名外,增加显示文件<br><br> 类型、权限、硬链接数、所有者名、组名、大小(byte)、及时间信息-----简化为 ll)<br><br> <span class="hljs-keyword">mkdir</span> 新建目录 例:<span class="hljs-keyword">mkdir</span> <span class="hljs-keyword">test</span> 命令会在当前目录下建立一个名为“<span class="hljs-keyword">test</span>”的新目录 <br><br> touch 创建文件 例:touch <span class="hljs-keyword">test</span>/readme.txt 在 <span class="hljs-keyword">test</span> 目录下创建 readme.txt文件<br><br> <span class="hljs-keyword">cd</span> 切换目录 <span class="hljs-keyword">cd</span> /. 到根目录 <span class="hljs-keyword">cd</span> .. 上一级目录 <span class="hljs-keyword">cd</span> /hahaha/hahaha 到指定目录<br><br> <span class="hljs-keyword">pwd</span> 显示当前目录<br><br> mv 移动/重命名(加上 -i 参数询问是否覆盖) mv hello rock/ 移动到rock目录下 <br><br> mv hello rock 重命名为rock<br><br> cp 拷贝 (加上 -i 参数询问是否覆盖,-r 参数递归调用) <br><br> cp -<span class="hljs-keyword">ir</span> <span class="hljs-keyword">test</span>/ workspace"(递归复制 <span class="hljs-keyword">test</span> 目录到 workpace 目录下并在覆盖时提示)<br><br> <span class="hljs-keyword">rm</span> 删除 (加上 -i 参数确认提示,-r 参数递归调用) <br><br> <span class="hljs-keyword">rm</span> -<span class="hljs-keyword">ir</span> <span class="hljs-keyword">test</span>/ 递归删除<span class="hljs-keyword">test</span>目录及其子目录并询问<br><br> wget url 下载文件到当前目录<br><br> sudo 暂时获取超级用户权限(有默认时长)加上 -i 参数 没有时间限制,输入 <span class="hljs-keyword">exit</span>或logout 退出<br><br> <span class="hljs-keyword">su</span> 账户名 切换到某某用户模式,没有时间限制<br><br> <span class="hljs-keyword">ZIP</span> 工具:<br><br> 压缩文件 <span class="hljs-keyword">zip</span> target.<span class="hljs-keyword">zip</span> filename<br><br> 压缩文件夹 <span class="hljs-keyword">zip</span> -r target.<span class="hljs-keyword">zip</span> <span class="hljs-keyword">dir</span> -r 参数表示递归压缩子目录<br><br> 解压 unzip target.<span class="hljs-keyword">zip</span><br><br> tar 工具:<br><br> -c: 建立压缩档案<br><br> -x:解压<br> -t:查看内容<br> -r:向压缩归档文件末尾追加文件<br> -<span class="hljs-keyword">u</span>:更新原压缩包中的文件<br><br> 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用<br><br> 其中一个。下面的参数是根据需要在压缩或解压档案时可选的。<br> -z:有gzip属性的<br> -j:有bz2属性的<br> -Z:有<span class="hljs-keyword">compress</span>属性的<br> -v:显示所有过程<br> -O:将文件解开到标准输出<br><br> 下面的参数-f是必须的<br><br> -f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名<br><br> 例:tar -xvf <span class="hljs-keyword">file</span>.tar <span class="hljs-comment">//解压 tar包</span><br><br> tar -xzvf jdk-8u131-linux-x64.tar.gz -C /usr/<span class="hljs-keyword">local</span>/java <span class="hljs-comment">//解压jdk到指定文件夹 </span><br><br> tar -cZf jpg.tar.Z *.jpg <span class="hljs-comment">//将目录里所有jpg文件打包成jpg.tar后,并且将其用</span><br><br> <span class="hljs-keyword">compress</span>压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z<br><br> vim 编辑器: vim <span class="hljs-keyword">test</span>.cpp<br><br> vim 有两种模式,一种是普通模式,另一种是插入模式。执行上述命令以后进入普通模式。<br><br> 按下字母键“i”进入插入模式,使用方向键移动光标到需要插入的位置,然后输入想要插入<br><br> 的内容。编辑完成后按键“Esc”退出回到普通模式,在普通模式下输入冒号“:”,然后输入<br><br> w 回车,保存更改。接着输入“:q”退出。也可以直接输入“:wq”保存并退出(注意 w 一定要<br><br> 在 q之前,先保存再退出)。<br><br> 查找:在普通模式下输入“/查找内容”,回车,即可定位到第一个匹配项。接着按下字母<br><br> 键“<span class="hljs-keyword">n</span>”可以查找下一个。<br><br> 撤销:普通模式下输入“:<span class="hljs-keyword">u</span>”并回车,实现撤销<br></code></pre></td></tr></table></figure></li></ol><h1 id="docker常用命令"><a href="#docker常用命令" class="headerlink" title="docker常用命令"></a>docker常用命令</h1><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs undefined">docker search(-s) nginx 搜索相关镜像 <br>加上-s 参数 选出至少start数范围的镜像<br>docker push <span class="hljs-number">192.168</span>.<span class="hljs-number">0.100</span>:<span class="hljs-number">5000</span>/ubuntu 推送镜像库到私有源<br>docker rmi(-f) 镜像名:版本号/镜像ID 删除镜像 (加上 -f 参数 强制删除)<br>docker rmi $(docker images -q) 删除所有镜像<br>docker save docker.io/tomcat:<span class="hljs-number">7.0</span>.<span class="hljs-number">77</span>-jre7 >/root/mytomcat7<span class="hljs-selector-class">.tar</span><span class="hljs-selector-class">.gz</span> 导出镜像<br>docker load < /root/mytomcat7<span class="hljs-selector-class">.tar</span><span class="hljs-selector-class">.gz</span> 导入镜像<br>如果你想要去查看一个镜像的运行效果,你需要先下载一个镜像,直接运行命令docker pull 镜像名<br></code></pre></td></tr></table></figure><p> <br><figure class="highlight sqf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><code class="hljs undefined">docker ps 查看当前正在运行的容器<br><br> docker inspect <span class="hljs-built_in">name</span>/<span class="hljs-built_in">image</span>[<span class="hljs-built_in">name</span>/<span class="hljs-built_in">image</span>...] 查看详细<br><br> docker ps -a 查看所有容器的状态<br><br> docker start/<span class="hljs-built_in">stop</span>(-t) id/<span class="hljs-built_in">name</span>[<span class="hljs-built_in">name</span>...] 启动/停止某个(多个)容器 -t 指定时间<br><br> docker kill (-s) <span class="hljs-built_in">name</span>[<span class="hljs-built_in">name</span>...] 强制中断 -s指定SIGINT信号类型,默认“kill”<br><br> docker restart (-t) <span class="hljs-built_in">name</span>[<span class="hljs-built_in">name</span>...] 重启 -t 指定时间<br><br> docker pause <span class="hljs-built_in">name</span> 暂停 docker unpause <span class="hljs-built_in">name</span> 继续<br><br> docker rm(-$) <span class="hljs-built_in">name</span>[<span class="hljs-built_in">name</span>...] 移除 <br><br> -f --force=<span class="hljs-literal">false</span> 强制移除运行中容器<br><br> -l --link=<span class="hljs-literal">false</span> 移除指定链接,保留底层容器<br><br> -v --volumes=<span class="hljs-literal">false</span> 移除容器关联卷<br></code></pre></td></tr></table></figure></p><h2 id="指令指南"><a href="#指令指南" class="headerlink" title="指令指南"></a>指令指南</h2><figure class="highlight coq"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs undefined">容器生命周期管理 — docker [run|<span class="hljs-type">start</span>|<span class="hljs-type">stop</span>|<span class="hljs-type">restart</span>|<span class="hljs-type">kill</span>|<span class="hljs-type">rm</span>|<span class="hljs-type">pause</span>|<span class="hljs-type">unpause</span>]<br>容器操作运维 — docker [ps|<span class="hljs-type">inspect</span>|<span class="hljs-type">top</span>|<span class="hljs-type">attach</span>|<span class="hljs-type">events</span>|<span class="hljs-type">logs</span>|<span class="hljs-type">wait</span>|<span class="hljs-type">export</span>|<span class="hljs-type">port</span>]<br>镜像仓库 — docker [login|<span class="hljs-type">pull</span>|<span class="hljs-type">push</span>|<span class="hljs-type">search</span>]<br>本地镜像管理 — docker [images|<span class="hljs-type">rmi</span>|<span class="hljs-type">tag</span>|<span class="hljs-type">build</span>|<span class="hljs-type">history</span>|<span class="hljs-type">save</span>|<span class="hljs-type">import</span>]<br>其他命令 — docker [info|<span class="hljs-type">version</span>]<br></code></pre></td></tr></table></figure><h1 id="使用dockerfile制作镜像"><a href="#使用dockerfile制作镜像" class="headerlink" title="使用dockerfile制作镜像"></a>使用dockerfile制作镜像</h1><p>Docker与微服务-使用Maven插件构建Docker镜像(可以参照<a href="http://blog.csdn.net/qq_22841811/article/details/67369530)" target="_blank" rel="noopener">http://blog.csdn.net/qq_22841811/article/details/67369530)</a></p><p>打开我们的项目,在我们项目的src/main下面新建一个docker文件,在docker文件里面新建Dockerfile文本</p><p>FROM java:8 #From是from那个镜像,最好现在docker里面pull下来,不然构建的时候会在再下一遍</p><p>VOLUME /tmp #指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可以共享给其他容器</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">ADD</span><span class="bash"> microservice-discovery-eureka-0.0.1-SNAPSHOT.jar app.jar <span class="hljs-comment">#复制文件</span><br></span><br><span class="hljs-keyword">RUN</span><span class="bash"> bash -c <span class="hljs-string">'touch /app.jar'</span> <span class="hljs-comment">#run是启动容器后执行的命令</span><br></span><br><span class="hljs-keyword">EXPOSE</span> <span class="hljs-number">9000</span> <span class="hljs-comment">#声明暴露的端口</span><br><br><span class="hljs-keyword">ENTRYPOINT</span><span class="bash"> [<span class="hljs-string">"java"</span>,<span class="hljs-string">"-Djava.security.egd=file:/dev/./urandom"</span>,<span class="hljs-string">"-jar"</span>,<span class="hljs-string">"/app.jar"</span>]</span><br></code></pre></td></tr></table></figure><h2 id="Dockerfile文件"><a href="#Dockerfile文件" class="headerlink" title="Dockerfile文件"></a>Dockerfile文件</h2><p>修改pom.xml</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-keyword">FROM</span> Jjava:<span class="hljs-number">8</span> //来自那个基础镜像<br><span class="hljs-keyword">VOLUME</span><span class="bash"> /tmp //指定临时挂载点<br></span><span class="hljs-keyword">ADD</span><span class="bash"> microservice-discovery-eur.jar app.jar //把项目jar添加到app.jar里<br></span><span class="hljs-keyword">RUN</span><span class="bash"> bash -c <span class="hljs-string">'touch/app.jar'</span> //镜像运行后执行该命令<br></span><span class="hljs-keyword">EXPOSE</span>:<span class="hljs-number">9000</span> //暴露出来访问的端口<br><span class="hljs-keyword">ENTRYPOINT</span><span class="bash"> [<span class="hljs-string">"java"</span>,<span class="hljs-string">"-Djava.security.egd=file:/dev/./urandom"</span>,<span class="hljs-string">"-jar"</span>,<span class="hljs-string">"/app.jar"</span>] //运行后执行的命令<br></span>在maven的配置文件里面增加配置<br></code></pre></td></tr></table></figure><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="xml"><span class="hljs-tag"><<span class="hljs-name">build</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">plugins</span>></span><br><br> <span class="hljs-comment"><!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">plugin</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.spotify<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>docker-maven-plugin<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>0.4.12<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">configuration</span>></span><br><br> <span class="hljs-comment"><!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 --></span><br><br> <span class="hljs-comment"><!-- 详见:https://github.com/spotify/docker-maven-plugin Invalid repository<br><br> name ... only [a-z0-9-_.] are allowed --></span><br><br> <span class="hljs-comment"><!-- 如果要将docker镜像push到DockerHub上去的话,这边的路径要和repo路径一致 --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">imageName</span>></span>eacdy/test<span class="hljs-tag"></<span class="hljs-name">imageName</span>></span><br><br> <span class="hljs-comment"><!-- 指定Dockerfile所在的路径 --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">dockerDirectory</span>></span>$</span><span class="hljs-template-variable">{project.basedir}</span><span class="xml">/src/main/docker<span class="hljs-tag"></<span class="hljs-name">dockerDirectory</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">resources</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">resource</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">targetPath</span>></span>/<span class="hljs-tag"></<span class="hljs-name">targetPath</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">directory</span>></span>$</span><span class="hljs-template-variable">{project.build.directory}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">directory</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">include</span>></span>$</span><span class="hljs-template-variable">{project.build.finalName}</span><span class="xml">.jar<span class="hljs-tag"></<span class="hljs-name">include</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">resource</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">resources</span>></span><br><br> <span class="hljs-comment"><!-- 以下两行是为了docker push到DockerHub使用的。 --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">serverId</span>></span>docker-hub<span class="hljs-tag"></<span class="hljs-name">serverId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">registryUrl</span>></span>https://index.docker.io/v1/<span class="hljs-tag"></<span class="hljs-name">registryUrl</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">configuration</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">plugin</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">plugins</span>></span><br><br><span class="hljs-tag"></<span class="hljs-name">build</span>></span></span><br></code></pre></td></tr></table></figure><p>照上面修改后build之后的项目会报找不到2375端口的错误</p><p>需要我们去修改dockerhost的端口</p><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs undefined">在控制台中输入 docker-machine env<br> <br><span class="hljs-variable">$Env</span><span class="hljs-symbol">:DOCKER_TLS_VERIFY</span> = <span class="hljs-string">"1"</span><br><br><span class="hljs-variable">$Env</span><span class="hljs-symbol">:DOCKER_HOST</span> = <span class="hljs-string">"tcp://192.168.99.100:2376"</span><br><br><span class="hljs-variable">$Env</span><span class="hljs-symbol">:DOCKER_CERT_PATH=<span class="hljs-string">"C:\Users\Administrator\.docker\machine\machines\default(每个人的路径都不一样)</span></span><br></code></pre></td></tr></table></figure><p> 再去修改pom.xml</p><figure class="highlight dust"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="xml"><span class="hljs-tag"><<span class="hljs-name">plugin</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">groupId</span>></span>com.spotify<span class="hljs-tag"></<span class="hljs-name">groupId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">artifactId</span>></span>docker-maven-plugin<span class="hljs-tag"></<span class="hljs-name">artifactId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">version</span>></span>0.4.12<span class="hljs-tag"></<span class="hljs-name">version</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">configuration</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">imageName</span>></span>eacdy/test<span class="hljs-tag"></<span class="hljs-name">imageName</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">dockerDirectory</span>></span>$</span><span class="hljs-template-variable">{project.basedir}</span><span class="xml">/src/main/docker<span class="hljs-tag"></<span class="hljs-name">dockerDirectory</span>></span><br><br> <br><br> <span class="hljs-comment"><!-- 解决Connect to localhost:2375的问题的其中一种方式,注意要跟docker-machine env相一致 --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">dockerHost</span>></span>https://192.168.99.100:2376<span class="hljs-tag"></<span class="hljs-name">dockerHost</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">dockerCertPath</span>></span>C:\Users\Administrator\.docker\machine\machines\default<span class="hljs-tag"></<span class="hljs-name">dockerCertPath</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">resources</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">resource</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">targetPath</span>></span>/<span class="hljs-tag"></<span class="hljs-name">targetPath</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">directory</span>></span>$</span><span class="hljs-template-variable">{project.build.directory}</span><span class="xml"><span class="hljs-tag"></<span class="hljs-name">directory</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">include</span>></span>$</span><span class="hljs-template-variable">{project.build.finalName}</span><span class="xml">.jar<span class="hljs-tag"></<span class="hljs-name">include</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">resource</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">resources</span>></span><br><br> <span class="hljs-comment"><!-- 以下两行是为了docker push到DockerHub使用的。 --></span><br><br> <span class="hljs-tag"><<span class="hljs-name">serverId</span>></span>docker-hub<span class="hljs-tag"></<span class="hljs-name">serverId</span>></span><br><br> <span class="hljs-tag"><<span class="hljs-name">registryUrl</span>></span>https://index.docker.io/v1/<span class="hljs-tag"></<span class="hljs-name">registryUrl</span>></span><br><br> <span class="hljs-tag"></<span class="hljs-name">configuration</span>></span><br><br><span class="hljs-tag"></<span class="hljs-name">plugin</span>></span></span><br></code></pre></td></tr></table></figure><p>这样build的项目就不会报错了</p><p> <img src="/2018/09/18/docker/1143999-20180313142250338-1329441659.png" alt="image"></p><p>完美打包构建build项目。</p>]]></content>
<summary type="html">
<p><img src="/2018/09/18/docker/1.jpeg" alt="image"><br></p>
</summary>
<category term="容器" scheme="http://yoursite.com/categories/%E5%AE%B9%E5%99%A8/"/>
<category term="docker" scheme="http://yoursite.com/tags/docker/"/>
</entry>
<entry>
<title>搭建docker私库</title>
<link href="http://yoursite.com/2018/09/12/%E6%90%AD%E5%BB%BAdocker%E7%A7%81%E5%BA%93/"/>
<id>http://yoursite.com/2018/09/12/搭建docker私库/</id>
<published>2018-09-12T12:07:00.000Z</published>
<updated>2018-09-18T07:01:19.901Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/12/搭建docker私库/1.jpeg" alt=""><br><a id="more"></a><br>前面关于nexus的操作参考前面nexus的文章</p><p>1.新建私有私库</p><p><img src="/2018/09/12/搭建docker私库/20180319145543619.png" alt="这里写图片描述"></p><p>2.新建角色和用户</p><p><img src="/2018/09/12/搭建docker私库/20180319145559442.png" alt="这里写图片描述"></p><p><img src="/2018/09/12/搭建docker私库/20180319145636227.png" alt="这里写图片描述"></p><p><img src="/2018/09/12/搭建docker私库/20180319145646202.png" alt="这里写图片描述"></p><p><img src="/2018/09/12/搭建docker私库/20180319145658144.png" alt="这里写图片描述"><br>3.docker上传与下载</p><p>使用docker登录私库:密码<strong><em>**</em></strong></p><p>docker login youstudio.cn:7182<br>给镜像打标记,设置为私库将要提交的路径:</p><p><img src="/2018/09/12/搭建docker私库/201803191458498.png" alt="这里写图片描述"></p><p>docker tag nginx:1.13.5 youstudio.cn:7182/xcfr/test/nginx:1.0.0</p><p><img src="/2018/09/12/搭建docker私库/20180319145918894.png" alt="这里写图片描述"></p><p>往私库上放置一个镜像:</p><p>docker push youstudio.cn:7182/xcfr/test/nginx:1.0.0</p><p><img src="/2018/09/12/搭建docker私库/20180319150023517.png" alt="这里写图片描述"></p><p>从私库上拉取刚刚上传的镜像一个镜像:</p><p>docker pull youstudio.cn:7182/xcfr/test/nginx:1.0.0</p><p><img src="/2018/09/12/搭建docker私库/20180319150122474.png" alt="这里写图片描述"><br>通过浏览器查看结果:</p><p>点击打开链接</p>]]></content>
<summary type="html">
<p><img src="/2018/09/12/搭建docker私库/1.jpeg" alt=""><br></p>
</summary>
<category term="容器" scheme="http://yoursite.com/categories/%E5%AE%B9%E5%99%A8/"/>
<category term="docker私库" scheme="http://yoursite.com/tags/docker%E7%A7%81%E5%BA%93/"/>
</entry>
<entry>
<title>基于highcharts+easui+java生成饼图</title>
<link href="http://yoursite.com/2018/09/12/%E5%9F%BA%E4%BA%8Ehighcharts-easui-java%E7%94%9F%E6%88%90%E9%A5%BC%E5%9B%BE/"/>
<id>http://yoursite.com/2018/09/12/基于highcharts-easui-java生成饼图/</id>
<published>2018-09-12T08:03:00.000Z</published>
<updated>2018-09-18T07:01:45.432Z</updated>
<content type="html"><![CDATA[<p><img src="/2018/09/12/基于highcharts-easui-java生成饼图/1.jpeg" alt=""><br><a id="more"></a><br>前言:第一次接触饼图,刚开始没有思路,后面在网上找了一下对比了一下,发现用highcharts插件去生成图表特别简单,用起来还是非常简单的,只需要后台返回相应的数据前台用json接收一下,就可以完美的实现了。</p><p>一、先来个实体展示,让大家看看效果<br><img src="/2018/09/12/基于highcharts-easui-java生成饼图/1143999-20171106170702075-58795943.png" alt=""></p><p>(效果还是美美的)</p><p>二、要实现这个效果首先要去highcharts官网去下载你自己需要的图表<br>简单的介绍下Highcharts,Highcharts是一个非常流行,界面美观的纯Javascript图表库。它主要包括两个部分:Highcharts和Highstock。Highcharts可以为您的网站或Web应用程序提供直观,互动式的图表。目前支持线,样条,面积,areaspline,柱形图,条形图,饼图和散点图类型。Highstock可以为您方便地建立股票或一般的时间轴图表。它包括先进的导航选项,预设的日期范围,日期选择器,滚动和平移等等。(下面是highcharts官网地址和demo)</p><p>HIghChartS官网:<a href="http://www.highcharts.com/" target="_blank" rel="noopener">http://www.highcharts.com/</a></p><p>HighCharts Demo:<a href="http://www.highcharts.com/demo/" target="_blank" rel="noopener">http://www.highcharts.com/demo/</a></p><p><img src="/2018/09/12/基于highcharts-easui-java生成饼图/1143999-20171106171128778-1396954218.png" alt=""></p><p>2.1引入相应的js文件才能实现页面效果<br>由于我在Web开发框架中,主要采用了MVC+EasyUI的方式,因包含的文件如下所示。(每个图表需要引得文件官网的demo里面都有)</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><br><br><span class="erb"><span class="xml"><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/view/report/highcharts.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/js/grid.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/view/report/exporting.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br> <span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"/view/report/jquery.min.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><br><br><br><br><br><br><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/view/report/jquery.min.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br>@*图表JS文件应用*@<br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/view/report/highcharts.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/js/grid.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span><br><span class="hljs-tag"><<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"<%=</span></span></span><span class="ruby">basePath</span><span class="xml"><span class="hljs-tag"><span class="hljs-string">%>/view/report/exporting.js"</span>></span><span class="undefined"></span><span class="hljs-tag"></<span class="hljs-name">script</span>></span></span></span><br></code></pre></td></tr></table></figure><p> 三、图表的js代码<br>首先是官网下载下来的图表代码</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-string">$(function</span> <span class="hljs-string">()</span> <span class="hljs-string">{</span><br> <span class="hljs-string">$('#container').highcharts({</span><br><span class="hljs-attr"> chart:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> plotBackgroundColor:</span> <span class="hljs-literal">null</span><span class="hljs-string">,</span><br><span class="hljs-attr"> plotBorderWidth:</span> <span class="hljs-literal">null</span><span class="hljs-string">,</span><br><span class="hljs-attr"> plotShadow:</span> <span class="hljs-literal">false</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> title:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> text:</span> <span class="hljs-string">'2014 某网站上各个浏览器的访问量占比'</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> tooltip:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> headerFormat:</span> <span class="hljs-string">'{series.name}<br>'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> pointFormat:</span> <span class="hljs-string">'{point.name}: <b>{point.percentage:.1f}%</b>'</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> plotOptions:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> pie:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> allowPointSelect:</span> <span class="hljs-literal">true</span><span class="hljs-string">,</span><br><span class="hljs-attr"> cursor:</span> <span class="hljs-string">'pointer'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> dataLabels:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> enabled:</span> <span class="hljs-literal">false</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> showInLegend:</span> <span class="hljs-literal">true</span><br> <span class="hljs-string">}</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> series:</span> <span class="hljs-string">[{</span><br><span class="hljs-attr"> type:</span> <span class="hljs-string">'pie'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> name:</span> <span class="hljs-string">'浏览器访问量占比'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> data:</span> <span class="hljs-string">[</span><br> <span class="hljs-string">['Firefox',</span> <span class="hljs-number">45.0</span><span class="hljs-string">],</span><br> <span class="hljs-string">['IE',</span> <span class="hljs-number">26.8</span><span class="hljs-string">],</span><br> <span class="hljs-string">{</span><br><span class="hljs-attr"> name:</span> <span class="hljs-string">'Chrome'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> y:</span> <span class="hljs-number">12.8</span><span class="hljs-string">,</span><br><span class="hljs-attr"> sliced:</span> <span class="hljs-literal">true</span><span class="hljs-string">,</span><br><span class="hljs-attr"> selected:</span> <span class="hljs-literal">true</span><br> <span class="hljs-string">},</span><br> <span class="hljs-string">['Safari',</span> <span class="hljs-number">8.5</span><span class="hljs-string">],</span><br> <span class="hljs-string">['Opera',</span> <span class="hljs-number">6.2</span><span class="hljs-string">],</span><br> <span class="hljs-string">['其他',</span> <span class="hljs-number">0.7</span><span class="hljs-string">]</span><br> <span class="hljs-string">]</span><br> <span class="hljs-string">}]</span><br> <span class="hljs-string">});</span><br><span class="hljs-string">});</span><br></code></pre></td></tr></table></figure><p>改动后的样式,只需要把data换成动态的数组用json来接收</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><span class="hljs-string">var</span> <span class="hljs-string">chart2=</span> <span class="hljs-string">Highcharts.chart('container1',</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> chart:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> margin:</span> <span class="hljs-string">[0,</span> <span class="hljs-number">0</span><span class="hljs-string">,</span> <span class="hljs-number">0</span><span class="hljs-string">,</span> <span class="hljs-number">0</span><span class="hljs-string">],</span><br><span class="hljs-attr"> width:</span><span class="hljs-number">300</span><span class="hljs-string">,</span><br><span class="hljs-attr"> padding:</span><span class="hljs-string">[0,</span> <span class="hljs-number">0</span><span class="hljs-string">,</span> <span class="hljs-number">0</span><span class="hljs-string">,</span> <span class="hljs-number">0</span><span class="hljs-string">],</span><br><span class="hljs-attr"> plotBackgroundColor:</span> <span class="hljs-literal">null</span><span class="hljs-string">,</span><br><span class="hljs-attr"> plotBorderWidth:</span> <span class="hljs-literal">null</span><span class="hljs-string">,</span><br><span class="hljs-attr"> plotShadow:</span> <span class="hljs-literal">false</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> title:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> text:</span> <span class="hljs-string">'各航站异常行李数量'</span><br> <span class="hljs-string">},</span><br> <span class="hljs-string">/*</span> <span class="hljs-attr">tooltip:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> headerFormat:</span> <span class="hljs-string">'{series.name}<br>'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> pointFormat:</span> <span class="hljs-string">'{point.name}: <b>{point.percentage:.1f}%</b>'</span><br> <span class="hljs-string">},*/</span><br><span class="hljs-attr"> plotOptions:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> pie:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> allowPointSelect:</span> <span class="hljs-literal">true</span><span class="hljs-string">,</span><br><span class="hljs-attr"> cursor:</span> <span class="hljs-string">'pointer'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> dataLabels:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> enabled:</span> <span class="hljs-literal">true</span><span class="hljs-string">,</span><br><span class="hljs-attr"> format:</span> <span class="hljs-string">'<b>{point.name}</b>'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> style:</span> <span class="hljs-string">{</span><br><span class="hljs-attr"> color:</span> <span class="hljs-string">(Highcharts.theme</span> <span class="hljs-string">&&</span> <span class="hljs-string">Highcharts.theme.contrastTextColor)</span> <span class="hljs-string">||</span> <span class="hljs-string">'black'</span><br> <span class="hljs-string">}</span><br> <span class="hljs-string">}</span><br> <span class="hljs-string">}</span><br> <span class="hljs-string">},</span><br><span class="hljs-attr"> series:</span> <span class="hljs-string">[{</span><br><span class="hljs-attr"> type:</span> <span class="hljs-string">'pie'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> name:</span> <span class="hljs-string">'异常行李量'</span><span class="hljs-string">,</span><br><span class="hljs-attr"> data:</span> <span class="hljs-string">[</span> <span class="hljs-string">]</span><br> <span class="hljs-string">}]</span><br> <span class="hljs-string">});</span><br></code></pre></td></tr></table></figure><p> 我的ajax请求</p><p> function getPieJson(){<br> var data1 = [];<br> $.ajax({<br> type : “POST”, // 提交方式<br> url :servicefulPath + ‘/irregularBagReportTotal/pieChart’,<br> success : function(result){<br> var json = result.data;<br> for ( var key in json) {<br> //通过遍历对象属性的方法,遍历键值对,获得key,然后通过 对象[key]获得对应的值<br> if (json.hasOwnProperty(key)) {<br> data1.push([key, json[key]]);<br> }<br> }<br> chart2.series[0].setData(data1);<br> }<br> });<br> }</p><p>四,后台代码格式<br>(注明:每个的后台框架和条件都不一样,最重要的是返回一个map数据到前台就可以了)</p><figure class="highlight processing"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><code class="hljs undefined"><br><span class="hljs-comment">//饼图</span><br> <span class="hljs-keyword">public</span> Map<<span class="hljs-keyword">String</span>, <span class="hljs-keyword">Object</span>> pieChart(){<br> Map<<span class="hljs-keyword">String</span>, <span class="hljs-keyword">Object</span>> <span class="hljs-built_in">map</span> = <span class="hljs-keyword">new</span> <span class="hljs-keyword">HashMap</span><<span class="hljs-keyword">String</span>, <span class="hljs-keyword">Object</span>>();<br> StringBuffer sql = <span class="hljs-keyword">new</span> StringBuffer(<span class="hljs-string">"SELECT SUM (E .LOSE) AS lose,SUM (E .MISSHIPMENT) AS miss,"</span>);<br> sql.<span class="hljs-built_in">append</span>(<span class="hljs-string">" SUM (E .LEAKAGE_LUCK) AS leak,SUM (E . LESS) AS LESS,SUM (E .DAMAGED) AS damaged"</span>);<br> sql.<span class="hljs-built_in">append</span>(<span class="hljs-string">" FROM E_ABNOM_BAGGA_TRAN E"</span>);<br> Query query = entityManager.createNativeQuery(sql.toString());<span class="hljs-comment">//执行sql语句</span><br> <span class="hljs-keyword">Object</span>[] o = (<span class="hljs-keyword">Object</span>[])query.getResultList().<span class="hljs-built_in">get</span>(<span class="hljs-number">0</span>);<br> IrregularBagReport count = <span class="hljs-keyword">new</span> IrregularBagReport();<br> <span class="hljs-comment">//丢失</span><br> <span class="hljs-keyword">if</span> (o[<span class="hljs-number">0</span>] == <span class="hljs-keyword">null</span>) {<br> count.setLost(BigDecimal.ZERO);<br> } <span class="hljs-keyword">else</span> {<br> count.setLost((BigDecimal) o[<span class="hljs-number">0</span>]);<br> }<br> <span class="hljs-comment">//错运</span><br> <span class="hljs-keyword">if</span> (o[<span class="hljs-number">1</span>] == <span class="hljs-keyword">null</span>) {<br> count.setMisshipMent(BigDecimal.ZERO);<br> } <span class="hljs-keyword">else</span> {<br> count.setMisshipMent((BigDecimal) o[<span class="hljs-number">1</span>]);<br> }<br> <span class="hljs-comment">//漏运</span><br> <span class="hljs-keyword">if</span> (o[<span class="hljs-number">2</span>] == <span class="hljs-keyword">null</span>) {<br> count.setLeakageLuck(BigDecimal.ZERO);<br> } <span class="hljs-keyword">else</span> {<br> count.setLeakageLuck((BigDecimal) o[<span class="hljs-number">2</span>]);<br> }<br> <span class="hljs-comment">//少收</span><br> <span class="hljs-keyword">if</span> (o[<span class="hljs-number">3</span>] == <span class="hljs-keyword">null</span>) {<br> count.setLess(BigDecimal.ZERO);<br> } <span class="hljs-keyword">else</span>{<br> count.setLess( (BigDecimal) o[<span class="hljs-number">3</span>]);<br> }<br> <span class="hljs-comment">//破损</span><br> <span class="hljs-keyword">if</span> (o[<span class="hljs-number">4</span>] == <span class="hljs-keyword">null</span>) {<br> count.setDamaged(BigDecimal.ZERO);<br> } <span class="hljs-keyword">else</span> {<br> count.setDamaged((BigDecimal) o[<span class="hljs-number">4</span>]);<br> }<br> <span class="hljs-built_in">map</span>.put(<span class="hljs-string">"丢失"</span>, count.getLost());<br> <span class="hljs-built_in">map</span>.put(<span class="hljs-string">"错运"</span>, count.getMisshipMent());<br> <span class="hljs-built_in">map</span>.put(<span class="hljs-string">"漏运"</span>,count.getLeakageLuck());<br> <span class="hljs-built_in">map</span>.put(<span class="hljs-string">"少收"</span>, count.getLess());<br> <span class="hljs-built_in">map</span>.put(<span class="hljs-string">"破损"</span>, count.getDamaged());<br> <span class="hljs-keyword">return</span> <span class="hljs-built_in">map</span>;<br> }<br></code></pre></td></tr></table></figure><p> 综上所述,按照上面的步骤就能生成饼图了,欢迎大佬们评论留言。</p>]]></content>
<summary type="html">
<p><img src="/2018/09/12/基于highcharts-easui-java生成饼图/1.jpeg" alt=""><br></p>
</summary>
<category term="java" scheme="http://yoursite.com/categories/java/"/>
<category term="java" scheme="http://yoursite.com/tags/java/"/>
<category term="easui" scheme="http://yoursite.com/tags/easui/"/>
</entry>
</feed>