-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJust Spring.html
650 lines (587 loc) · 54.8 KB
/
Just Spring.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<title>Just Spring</title>
<link rel="alternate" type="application/rss+xml" title="RSS 2.0 - all posts" href="http://spring66.com/blogs/?feed=rss2" />
<link rel="alternate" type="application/rss+xml" title="RSS 2.0 - all comments" href="http://spring66.com/blogs/?feed=comments-rss2" />
<link rel="pingback" href="http://spring66.com/blogs/xmlrpc.php" />
<!-- style START -->
<!-- default style -->
<style type="text/css" media="screen">@import url( http://spring66.com/blogs/wp-content/themes/inove/style.css );</style>
<!-- for translations -->
<!--[if IE]>
<link rel="stylesheet" href="http://spring66.com/blogs/wp-content/themes/inove/ie.css" type="text/css" media="screen" />
<![endif]-->
<!-- style END -->
<!-- script START -->
<script type="text/javascript" src="http://spring66.com/blogs/wp-content/themes/inove/js/base.js"></script>
<script type="text/javascript" src="http://spring66.com/blogs/wp-content/themes/inove/js/menu.js"></script>
<!-- script END -->
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://spring66.com/blogs/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://spring66.com/blogs/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 3.3.1" />
<link rel='shortlink' href='http://wp.me/Mlyl' />
<link rel="stylesheet" type="text/css" href="http://spring66.com/blogs/wp-content/plugins/openid_bck/files/openid.css?ver=svn-47054" /> <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>
<link type="text/css" rel="stylesheet" href="http://spring66.com/blogs/wp-content/plugins/syntaxhighlighter-plus/syntaxhighlighter/styles/shCore.css"></link>
<link type="text/css" rel="stylesheet" href="http://spring66.com/blogs/wp-content/plugins/syntaxhighlighter-plus/syntaxhighlighter/styles/shThemeEmacs.css"></link>
</head>
<body>
<!-- wrap START -->
<div id="wrap">
<!-- container START -->
<div id="container" >
<!-- header START -->
<div id="header">
<!-- banner START -->
<!-- banner END -->
<div id="caption">
<h1 id="title"><a href="http://spring66.com/blogs/">Just Spring</a></h1>
<div id="tagline">แหล่งรวมข่าวสารสปริงเฟรมเวิร์คสำหรับชาวไทย</div>
</div>
<div class="fixed"></div>
</div>
<!-- header END -->
<!-- navigation START -->
<div id="navigation">
<!-- menus START -->
<ul id="menus">
<li class="current_page_item"><a class="home" title="Home" href="http://spring66.com/blogs/">Home</a></li>
<li class="page_item page-item-2"><a href="http://spring66.com/blogs/?page_id=2">เกี่ยวกับสปริงหกหก</a></li>
<li class="page_item page-item-875"><a href="http://spring66.com/blogs/?page_id=875">Enterprise Wiki</a></li>
<li class="page_item page-item-463"><a href="http://spring66.com/blogs/?page_id=463">สรุป Spring Training Day 3</a></li>
<li class="page_item page-item-222"><a href="http://spring66.com/blogs/?page_id=222">Spring66 Wiki</a></li>
<li><a class="lastmenu" href="javascript:void(0);"></a></li>
</ul>
<!-- menus END -->
<!-- searchbox START -->
<div id="searchbox">
<form action="http://spring66.com/blogs" method="get">
<div class="content">
<input type="text" class="textfield" name="s" size="24" value="" />
<input type="submit" class="button" value="" />
</div>
</form>
</div>
<script type="text/javascript">
//<![CDATA[
var searchbox = MGJS.$("searchbox");
var searchtxt = MGJS.getElementsByClassName("textfield", "input", searchbox)[0];
var searchbtn = MGJS.getElementsByClassName("button", "input", searchbox)[0];
var tiptext = "Type text to search here...";
if(searchtxt.value == "" || searchtxt.value == tiptext) {
searchtxt.className += " searchtip";
searchtxt.value = tiptext;
}
searchtxt.onfocus = function(e) {
if(searchtxt.value == tiptext) {
searchtxt.value = "";
searchtxt.className = searchtxt.className.replace(" searchtip", "");
}
}
searchtxt.onblur = function(e) {
if(searchtxt.value == "") {
searchtxt.className += " searchtip";
searchtxt.value = tiptext;
}
}
searchbtn.onclick = function(e) {
if(searchtxt.value == "" || searchtxt.value == tiptext) {
return false;
}
}
//]]>
</script>
<!-- searchbox END -->
<div class="fixed"></div>
</div>
<!-- navigation END -->
<!-- content START -->
<div id="content">
<!-- main START -->
<div id="main">
<div id='fb-root'></div>
<script type='text/javascript'>
window.fbAsyncInit = function()
{
FB.init({appId: null, status: true, cookie: true, xfbml: true});
};
(function()
{
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
<div class="post" id="post-1088">
<h2><a class="title" href="http://spring66.com/blogs/?p=1088" rel="bookmark">Spring Roo 1.2</a></h2>
<div class="info">
<span class="date">December 22nd, 2011</span>
<span class="comments"><a href="http://spring66.com/blogs/?p=1088#respond" title="Comment on Spring Roo 1.2">No comments</a></span>
<div class="fixed"></div>
</div>
<div class="content">
<div class='wpfblike' style='height: 40px;'><fb:like href='http://spring66.com/blogs/?p=1088' layout='default' show_faces='false' width='400' action='like' colorscheme='light' send='false' /></div><p>Spring Roo 1.2 ออกมาได้สักพักมีการเปลี่ยนแปลงเกิดขึ้นมากมายเหมือนเช่นเคย รอบนี้ Alan Stewart, SpringSource project lead ออกมาโชว์ความสามารถของ 1.2 release. เช่น multi-module Maven projects, JSF/PrimeFaces integration,… ยาวเกือบ 50 นาทีขอเชิญเสพครับ<br />
<iframe width="560" height="315" src="http://www.youtube.com/embed/U2L82-D7uxY" frameborder="0" allowfullscreen></iframe></p>
<div class="fixed"></div>
</div>
<div class="under">
<span class="categories">Categories: </span><span><a href="http://spring66.com/blogs/?cat=6" title="View all posts in general information" rel="category">general information</a></span> <span class="tags">Tags: </span><span><a href="http://spring66.com/blogs/?tag=spring-roo" rel="tag">Spring Roo</a></span> </div>
</div>
<div class="post" id="post-1083">
<h2><a class="title" href="http://spring66.com/blogs/?p=1083" rel="bookmark">Micro Cloud Foundry</a></h2>
<div class="info">
<span class="date">August 28th, 2011</span>
<span class="comments"><a href="http://spring66.com/blogs/?p=1083#respond" title="Comment on Micro Cloud Foundry">No comments</a></span>
<div class="fixed"></div>
</div>
<div class="content">
<div class='wpfblike' style='height: 40px;'><fb:like href='http://spring66.com/blogs/?p=1083' layout='default' show_faces='false' width='400' action='like' colorscheme='light' send='false' /></div><p>ใครยังไม่มีไปสมัครซะ ของเขาดีจริงอะไรจริงครับมันคือ PAAS ที่มีความสมบูรณ์ในตัวเองและสามารถนำมาใช้งานได้ในเครื่อง Mac และ PC ดังนั้นเราจะสามารถสร้าง end-to-end cloud application ได้อย่างสะดวกสะบายอย่างยิ่งแม้กระทั่งการ deploy ก็ยังไม่ต้องเปลี่ยน code แม้แต่บรรทัดเดียว</p>
<p><iframe width="420" height="345" src="http://www.youtube.com/embed/cKkz_vRNG1Q" frameborder="0" allowfullscreen></iframe></p>
<div class="fixed"></div>
</div>
<div class="under">
<span class="categories">Categories: </span><span><a href="http://spring66.com/blogs/?cat=7" title="View all posts in news" rel="category">news</a></span> <span class="tags">Tags: </span><span><a href="http://spring66.com/blogs/?tag=cloud" rel="tag">cloud</a>, <a href="http://spring66.com/blogs/?tag=cloud-foundry" rel="tag">Cloud Foundry</a></span> </div>
</div>
<div class="post" id="post-1063">
<h2><a class="title" href="http://spring66.com/blogs/?p=1063" rel="bookmark">เข้าใจ AMQ โปรโตคอลที่ถูกใช้โดย RabbitMQ</a></h2>
<div class="info">
<span class="date">June 16th, 2011</span>
<span class="comments"><a href="http://spring66.com/blogs/?p=1063#respond" title="Comment on เข้าใจ AMQ โปรโตคอลที่ถูกใช้โดย RabbitMQ">No comments</a></span>
<div class="fixed"></div>
</div>
<div class="content">
<div class='wpfblike' style='height: 40px;'><fb:like href='http://spring66.com/blogs/?p=1063' layout='default' show_faces='false' width='400' action='like' colorscheme='light' send='false' /></div><p>พอดีมีงานที่ต้องใช้ Message Broker เลยลองอ่านๆดูหลายๆตัวไม่ว่าจะเป็น ActiveMQ, Open MQ แต่ละอันก็มีความสามารถอลังการแต่มันเยอะไปเลยตัดสินใจไปใช้ RabbitMQ ที่เป็น Messaging Service ที่เรียบง่าย Foot Print น้อย(ใช้ Erlang กระมัง) ติดตั้งง่ายหลังจากลองใช้ไปก็รู้สึกประทับใจจริงๆเลยขอทำความเข้าใจมันและเพื่อไม่ให้ลืมเราก็ต้องจด<br />
โดยแปลมาจาก <a href="http://blog.springsource.com/2010/06/14/understanding-amqp-the-protocol-used-by-rabbitmq/">Understand AMQP the protocol used by RabbitMQ</a><br />
RabbitMQ คือ lightweight, reliable, scalable และ portable message broker แต่มันไม่เหมือน messages broker ตัวอื่นๆตรงที่แอพพลิเคชั่นของเราจะติดต่อสื่อสารกับ RabbitMQ ด้วย platform-neutral, wire-level protocol ที่ชื่อ the Advanced Message Queuing Protocol (AMQP). ซึ่งเป็นกระบวนการทำงานที่แตกต่างกับการใช้งาน JMS อย่างสิ้นเชิง บางคนอาจจะงงได้ง่ายๆดังนั้นเพื่อใ้ทุกคนเห็นภาพของ AMQ บทความนี้จะยกตัวอย่างการใช้งานออกมาเป็น 3 ลักษณะแต่ก่อนอื่นเรามาเข้าใจแนวคิดพื้นฐานเรื่อง messages broker ก่อน</p>
<p><strong>Exchanges, Queues และ Bindings</strong><br />
AMQ นั้นก็ไม่มีอะไรพิเศษไปกว่า messaging system อื่นคือโปรโตคอลนี้มีเพื่อใช้จัดการกับ publisher และ consumer โดยที่เราคงรู้อยู่แล้วว่า publisher มีหน้าที่ส่ง message ออกไปเพื่อให้ consumer ทำหน้าที่หยิบ message เหล่านั้นไปเพื่อทำงานอะไรบางอย่างและหน้าที่หลักอีกอย่างของ messaging service คือการรับประกันว่า message เหล่านั้นถูกส่งไปยัง consumer ที่ถูกและกระบวนการรับประกันนี้จะเป็นต้องให้เครื่องมืออะไรบางอย่างเข่ามาช่วยนั่นก็คือ Exchange และ Queue นั่นเองถ้าคิดไม่ออกดูรูฟไปก่อน<br />
<img alt="" src="http://blog.springsource.com/wp-content/uploads/2010/06/rabbit-basics.png" class="alignnone" width="587" height="152" /><br />
ดูภาพไปสักพักก็จะสบถว่า “ไม่มีห่านอะไรเลย” เริ่มต้นด้วย publisher ส่ง message ไปให้ exchange จากนั้น consumer ก็เข้ามาหยิบ message ออกไปจาก queue (หรือ queue ทำหน้าที่ push message นั้นไปที่ consumer อันนี้แล้วแต่เราเลือกแผนตามความเหมาะสม) คำถาม? แล้วไอ้สามสี่ท่อนนี้มันต่อกันยังไง แน่นอนมันต้องต่อกันก่อนครับลำดับเป็นไปตามนี้<br />
หน่ึง queue ถูก attached เข้ากับ exchange ที่เราต้องการซึ่งโดยปกติแล้ว consumer จะเป็นคนสร้าง queue ขึ้นมาและทำการ attached เข้ากับ exchange แทบจะทันทีที่สร้าง queue ขึ้นมา<br />
สอง message ที่ถูกรับไว้ที่ exchange นั้นจะต้องมีอะไรบางอย่างที่ตรงกับสิ่งที่ queue กำหนดไว้ ซึ่งกระบวนการแจ้งข้อกำหนดของ queue ต่อ exchange เรียกว่า binding และเพื่อให้เข้าใจกระบวนการ binding เราต้องเข้าใจ คุณลักษณะพื้นฐานของ AMQP message ก่อน<br />
<img alt="" src="http://blog.springsource.com/wp-content/uploads/2010/06/rabbit-message.png" class="alignnone" width="228" height="171" /><br />
จากภาพเราจะเห็น header และ properties ของ message ที่ไม่มีอะไรมากไปกว่า key/value แต่สิ่งที่แตกต่างระหว่าง header กับ properties คือ header จะถูกกำหนดโดย AMQP เท่านั้นส่วน properties จะเป็นส่วนที่ application สามารถกำหนดค่าให้มันได้และส่วน message content จะเป็นตัวเนื้อความที่เราต้องการสื่อสารซึ่งจริงๆแล้วคือ sequence ของ byte นั่นเอง<br />
ต่อไปแล้วไอ้ header, properties, content มันไปเกี่ยวอะไรกับ binding ล่ะ? คำตอบคือเกี่ยวแน่นอนเพราะใน header เราจะใส่สิ่งที่เรียกว่า routing-key ซึ่งค่าค่านี้จะถูกใช้โดย broker เพื่อตรวจสอบว่า message นั้นๆเหมาะกับ queue หรือไม่ โดยที่แต่ละ queue เองก็จะกำหนด binding key ไว้เพิื่อกำหนดลักษณะของ message ที่ต้องการรับเช่นกันดังนั้นถ้า binding-key ตรงตาม routing-key ก็จะทำให้ queue นั้นได้รับ message ในทันที<br />
อย่างไรก็ตามก่อนจะไปไกลกว่านี้เรามาดูคุณลักษระของ exchange กันก่อนว่ามันทำงานได้กี่แบบ</p>
<p><strong>Exchange type Behaviour</strong><br />
Direct The binding key must match the routing key exactly – no wildcard support.<br />
Topic Same as Direct, but wildcards are allowed in the binding key. ‘#’ matches zero or more dot-delimited words and ‘*’ matches exactly one such word.<br />
Fanout The routing and binding keys are ignored – all published messages go to all bound queues.<br />
Headers<br />
ยกตัวอย่างเช่น publisher ส่ง message ที่มี routing key เป็น “NYSE” ไปที่ exchange ที่ชื่อ “Stocks” ดังนั้นสำหรับ consumer ใดๆที่สร้าง queue เข้ามาต่อกับ exchange โดยใช้ binding key เป็น “#” หรือ “*” หรือ “NYSE” จะทำให้ queue นั้นๆได้รับ message อย่างไรก็ตาม ถ้า message ถูกส่งเข้ามาที่ exchange โดยไปแปะ routing key มาด้วย queue ที่มี binding key เป็น “#” หรือ “*” จะไม่ได้รับ message เนื่องจาก binding key จะถูกใช้การค้นหาในเชิง literals ไม่ใช่แบบ wildcard แบบที่เราคุ้นๆ ดังนั้นเพื่อให้เข้าใจมากขึ้นลองมาดูตัวอย่างกัน ถ้าเรามี routing key เป็น “NYSE.TECH.MSCT” ให้ลองทายว่า binding key ไหนจะได้ message ไป<br />
Binding key Match?<br />
NYSE.TECH.MSFT Yes<br />
# Yes<br />
NYSE.# Yes<br />
*.* No<br />
NYSE.* No<br />
NYSE.TECH.* Yes<br />
NYSE.*.MSFT Yes</p>
<p>ต่อไปเราลองมาดูตัวอย่างการใช้งาน RabbitMQ กัน</p>
<p><strong>Pub(lish)/Sub(scribe)</strong><br />
JMS มีของแบบนี้ AMQP ก็มีเช่นกันและใช้งานง่ายมาดูรูปกันก่อน<br />
<img alt="" src="http://blog.springsource.com/wp-content/uploads/2010/06/rabbit-pub-sub.png" class="alignnone" width="341" height="402" /><br />
ข้อดีของ AMQP คือ queue สามารถ filter message ได้ด้วยการกำหนด binding key ไว้แต่ถ้าต้องการจะรับทุก message ก็สามารถทำได้ด้วยการใส่ binding key เป็น “#” หรือถ้าต้องการกรองด้วยการนับจุดก่อนก็สามารถใส่เป็น “*” หรือ “*.*” ก็ได้</p>
<p><strong>Work distribution</strong><br />
Pattern นี้เหมาะกับ application ที่มีงานต้อง execute เยอะมากๆ และเราไม่ต้องการรอเราสามารถสร้าง queue ขึ้นมาหนึ่งอันแล้ว worker เข้ามาร่วมใช้ queue นี้โดยที่ publisher ไม่สนใจว่าใครจะได้งานไปทำแต่รับรองว่ามรคนเอาไปทำแน่ๆ<br />
Configuring it is pretty straightforward, as shown in this diagram:<br />
<img alt="" src="http://blog.springsource.com/wp-content/uploads/2010/06/rabbit-work.png" class="alignnone" width="341" height="432" /><br />
และแน่นอนว่ามี consumer หรือ worker เพียงคนเดียวเท่านั้นที่ได้งานไปทำ สองอันนี้เป็นแค่ตัวอย่างพื้นๆถ้าอยากรู้รายละเอียดมากขึ้นแนะนำให้ไปอ่านต่อที่เว็บ RabbitMQ นะจ๊ะ</p>
<div class="fixed"></div>
</div>
<div class="under">
<span class="categories">Categories: </span><span><a href="http://spring66.com/blogs/?cat=6" title="View all posts in general information" rel="category">general information</a></span> <span class="tags">Tags: </span><span><a href="http://spring66.com/blogs/?tag=amqp" rel="tag">AMQP</a>, <a href="http://spring66.com/blogs/?tag=rabbitmq" rel="tag">RabbitMQ</a></span> </div>
</div>
<div class="post" id="post-960">
<h2><a class="title" href="http://spring66.com/blogs/?p=960" rel="bookmark">Spring + GWT + Maven (Part1)</a></h2>
<div class="info">
<span class="date">March 17th, 2011</span>
<span class="comments"><a href="http://spring66.com/blogs/?p=960#respond" title="Comment on Spring + GWT + Maven (Part1)">No comments</a></span>
<div class="fixed"></div>
</div>
<div class="content">
<div class='wpfblike' style='height: 40px;'><fb:like href='http://spring66.com/blogs/?p=960' layout='default' show_faces='false' width='400' action='like' colorscheme='light' send='false' /></div><p>สวัสดีครับทุกท่าน อันที่จริงว่าจะเขียนเรื่องนี้มานานละ แต่ไม่ได้เขียนซะที คราวนี้สบโอกาสพอดีจะทำ Workshop ให้น้องๆ ที่คณะครับ ก็เลยกะว่าเอามาโพสที่นี่ด้วยเลยก็แล้วกันครับ เนื้อหาก็เป็นการแบ่งปันประสบการณ์ของผมเองที่ผ่านมาหนึ่งโปรเจ็ค กับการใช้ GWT มาแบ่งปันกัน คงไม่ได้ลึกอะไรมากนะครับ เพราะลึกๆ ผมก็ไม่รู้เหมือนกัน ใช้งานเป็นอย่างเดียว 55</p>
<p>ผมจะแบ่งเขียนเป็น Series นะครับ น่าจะมีราว 3 ตอน คือ</p>
<p>1. Maven GWT Get Start : How to create GWT project using Maven</p>
<p>2. Spring GWT Get Start : Basic concept and configuration</p>
<p>3. Introduce SmartGWT</p>
<p>ว่าแล้วมาเริ่มตอนที่ 1 กันดีกว่าครับ</p>
<h2><strong>Maven GWT Get Start : How to create GWT project using Maven</strong></h2>
<p><span style="text-decoration: underline;"><strong>Step 1 Preparing Environment<br />
</strong></span></p>
<p>อย่างแรกเลยก็ต้อง เตรียมของกันก่อนเนอะ ก็มีตามนี้ครับ</p>
<p><a class="alignleft" title="ไปดาวน์โหลด จาวาเร็วส์ กันนะเอ้อ" href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_self">JDK5</a> ลงให้เรียบร้อยครับ อย่าลืมสร้าง JAVA_HOME ให้มันด้วย</p>
<p><a class="alignleft" title="ไปดูวิธีติดตั้ง maven นะเอ้อ" href="http://spring66.com/blogs/?p=147" target="_self">Maven2 </a>ลงให้เรียบร้อยเช่นกันครับ อย่าลืมสร้าง M2_HOME ให้มันด้วย</p>
<p><span style="text-decoration: underline;"><strong>Step 2 Creating Project</strong></span></p>
<p>อะ อะ อะ แล้วพระเอกของเราหล่ะ ไปไหน ไม่ต้องห่วงครับ เราจะใช้ archetype GWT Maven plugin ช่วยสร้างโปรเจ็คครับ Maven ช่างสะดวกเสียจริง ว่าแล้วก็สร้างกันเลยครับ โดย รัวคีย์บอร์ด เจ้าบรรทัดข้างล่างนี้ลงไปเลยครับ</p>
<pre class="brush: xml">
mvn archetype:generate
-DarchetypeRepository=repo1.maven.org
-DarchetypeGroupId=org.codehaus.mojo
-DarchetypeArtifactId=gwt-maven-plugin
-DarchetypeVersion=2.2.0
</pre>
<p>จากนั้นเมื่อเรากด Enter แล้ว maven มันจะให้เราใส่ groupId, artifactId, version และ gwt module ครับ เราก็ใส่ไปตามที่เราอยากได้ ส่วนของผมใส<strong>่</strong>แบบนี้ครับ</p>
<p>GroupId : com.spring66<br />
ArtifactId : SpringGWT<br />
Version : 1.0-SNAPSHOT<br />
Module name : MyGWTApplication</p>
<p>จากนั้นพอกด Enter แล้ว maven ก็จะทำการสร้างโปรเจ็ค หล่อๆ ให้เราทั้งหมดครับ</p>
<blockquote><p>สำหรับ Eclipse IDE นะครับ มันจะมีปัญหานิดหน่อย ไม่รู็คนอื่นเป็นกันมั้ย แต่ผมเป็น คือ maven dependedcy management มันไม่ทำงาน วิธีแก้คือไป disable มันก่อนครั้งหนึ่ง แล้ว enable มันอีกทีครับ แค่นั้นก็ได้แล้วครับ</p></blockquote>
<p><strong><span style="text-decoration: underline;">Step 3 Let’s play</span></strong></p>
<p>เมื่อได้โปรเจ็คมาแล้วนะครับ เราจะลองรันกันดูนะครับ โดยก่อนอื่นต้อง mvn clean install ก่อนเลย ถ้าเปิดใน netbean นะครับ เพราะว่า project ที่ได้ มันจะยังไม่ generate code บางอย่างให้เราไม่ครบ เราเลยต้อง build โปรเจ็คก่อนหนึ่งรอบครับ<strong><span style="text-decoration: underline;"><br />
</span></strong></p>
<p>จากนั้นก็ลอง mvn gwt:run ดูครับ</p>
<p>เราควรจะเจอ pop up window หน้าตา แบบนี้ออกมาครับ</p>
<p><img src="https://lh4.googleusercontent.com/_gWqDVV01L5w/TYBXODBXhgI/AAAAAAAAAPk/3rRi9Wz8WhM/s400/spring66springwtUI2.png" alt="" /></p>
<p>แล้วเราก็กด Launch Default Browser ครับ ก็จะเจอ UI หน้าตาแบบนี้ครับ</p>
<p><img src="https://lh4.googleusercontent.com/_gWqDVV01L5w/TYBTWpQt6VI/AAAAAAAAAPU/EE5YDPe4ZZg/s400/spring66springwtUI1.png" alt="" /></p>
<p>สวยมั้ยครับ แถมมี validation ด้วยนะเอ่อว์ (ถ้าใส่ไใ่ครบ 3 ตัวอักษร ลองดูครับ)</p>
<p><span style="text-decoration: underline;"><strong>Step 4 Jump into the hole</strong></span></p>
<p>หลังจากเห็นความหล่อของ GWT แล้ว เรามาดูข้างใน Project Structure กันดีกว่า</p>
<p><img src="http://mojo.codehaus.org/gwt-maven-plugin/images/user-guide/projectLayout.png" alt="" /></p>
<p>อันนี้คือ Layout ของโปรเจ็คนะครับ จะเห็นว่าชื่อโปรเจ็ค ไม่ตรงกับของผม เพราะไป copy เค้ามาครับ สังเกตุว่า โดยรวมแล้วก็น่าตา เหมือนกันกับ Maven Structure ปกติ</p>
<p>ดูใน src/main/java ครับ จะเห็นว่ามี 3 packages อยู่ข้างในคือ</p>
<p><strong>client </strong>: เอาไว้เก็บ code ที่เป็น GWT ทั้งหมดครับ และถ้ามี domain object เราก็จะเก็บไว้ภายใต้ package นี้ด้วยเช่นกันครับ ในตอน compile ของทุกอย่างใน package นี้จะถูกแปลงเป็น JavaScript ทั้งหมดนะครับ ระวังอย่าเอาอะไรที่นอกเหนือจาก การทำ User Interface เ้้ข้าไปไว้ข้างในนะครับเดี๋ยว Error</p>
<p><strong>server</strong> : เอาไว้เก็บ code ทำงานฝั่ง server ทั้งหมดครับ แต่ถ้าเราทำฝั่ง server เป็น RESTful เราก็ไม่ต้องมี package นี้ก็ได้ครับ เพราะส่วนใหญ่เราจะแยก โปรเจ็ค กันไปเลย</p>
<p><strong>shared</strong> : อันที่จริง สำหรับ package ใน gwt-maven plugin version 1.2 มันเอาไว้เก็บ พวกรูป icon ที่เราใช้ ใน ฝั่ง client แต่ใน version ใหม่ (หลังจาก 2.1 เป็นต้นมา) ผมยังไม่ค่อยแน่ใจครับ ยังไม่ขอตอบละกันครับ เดี๋ยววันหลังมาเพิ่มเติมให้ใหม่</p>
<p>ต่อมาใน src/main/resources ครับ</p>
<p>ในนี้มีไฟล์ประเอกของเราอยู่ครับ มันคือ Module ไฟล์ครับ ซึ่งในโปรเจ็คของเราก็คือ MyGWTApplication.gwt.xml นั่นเองครับ เ่อ่ามาดูข้างในกันดีกว่า</p>
<pre class="brush: xml">
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to='MyGWTApplication'>
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User'/>
<!-- Inherit the default GWT style sheet. You can change -->
<!-- the theme of your GWT application by uncommenting -->
<!-- any one of the following lines. -->
<inherits name='com.google.gwt.user.theme.standard.Standard'/>
<!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
<!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/> -->
<!-- Other module inherits -->
<!-- Specify the app entry point class. -->
<entry-point class='com.clbs.ex.springgwt.client.MyGWTApplication'/>
<!-- Specify the paths for translatable code -->
<source path='client'/>
<source path='shared'/>
</module>
</pre>
<p>ดูกันทีละอันก็แล้วกันครับ<br />
อันแรก tag <inherits> นะครับ อันนี้เอาไว้ inherit module และ theme ต่างที่มีใน GWT โดยอย่างน้ยที่สุดจะต้อง inherit com.google.gwt.user.User และ theme com.google.gwt.user.theme.standard.Standard ครับ</p>
<p>ต่อมา tag <entry-point> เป็น tag ที่เราใช้มากที่สุดครับ คือ เอาไว้ระบุว่า class ไหนจะเป็น class ที่เราเอาไว้โหลด User Interface ของเราครับ ซึ่ง class ที่จะเป็น entry-point ได้ จะต้อง inherit EntryPoint ด้วยครับ<br />
เช่นในโปรเจ็คเรา ถ้าไปดู MyGWTApplication ใน package client ก็จะเห็น</p>
<pre class="brush: java">
public class MyGWTApplication implements EntryPoint {
..
}
</pre>
<p>สุดท้ายเราต้องระบุ source ที่จะถูก compile ไปเป็น JavaScript ครับ โดยใช้ tag <source> ครับ</p>
<p>ในโปเจ็คเราก็ระบุไว้สองที่ครับ คือ client กับ shared</p>
<pre class="brush: xml">
<!-- Specify the paths for translatable code -->
<source path='client'/>
<source path='shared'/>
</pre>
<p>แค่นี้ก่อนครับ หมดแรง เดี๋ยวคราวหน้าเราจะต่อด้วยเรื่องของการผูก GWT กับ Spring กับ จริงๆ จังๆ ครับ</p>
<div class="fixed"></div>
</div>
<div class="under">
<span class="categories">Categories: </span><span><a href="http://spring66.com/blogs/?cat=82" title="View all posts in how to" rel="category">how to</a>, <a href="http://spring66.com/blogs/?cat=5" title="View all posts in tutorial series" rel="category">tutorial series</a></span> <span class="tags">Tags: </span><span><a href="http://spring66.com/blogs/?tag=gwt" rel="tag">GWT</a>, <a href="http://spring66.com/blogs/?tag=maven" rel="tag">maven</a>, <a href="http://spring66.com/blogs/?tag=spring" rel="tag">spring</a></span> </div>
</div>
<div id="pagenavi">
<span class="newer"></span>
<span class="older"><a href="http://spring66.com/blogs/?paged=2" >Older Entries</a></span>
<div class="fixed"></div>
</div>
</div>
<!-- main END -->
<!-- sidebar START -->
<div id="sidebar">
<!-- sidebar north START -->
<div id="northsidebar" class="sidebar">
<!-- feeds -->
<div class="widget widget_feeds">
<div class="content">
<div id="subscribe">
<a rel="external nofollow" id="feedrss" title="Subscribe to this blog..." href="http://spring66.com/blogs/?feed=rss2"><abbr title="Really Simple Syndication">RSS</abbr></a>
</div>
<div class="fixed"></div>
</div>
</div>
<!-- showcase -->
<div id="text-3" class="widget widget_text"> <div class="textwidget"><a href="http://www.oseda.or.th"><img src="http://www.wordpress.in.th/wp-content/themes/pimkam/images/ad-oseda.png"></img></a></div>
</div><div id="statpress" class="widget widget_statpress"><h3>StatPress</h3>Visits today: 95
Top Browser: Firefox 3
</div> <div id="recent-posts-3" class="widget widget_recent_entries"> <h3>Recent Posts</h3> <ul>
<div id='fb-root'></div>
<script type='text/javascript'>
window.fbAsyncInit = function()
{
FB.init({appId: null, status: true, cookie: true, xfbml: true});
};
(function()
{
var e = document.createElement('script'); e.async = true;
e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
document.getElementById('fb-root').appendChild(e);
}());
</script>
<li><a href="http://spring66.com/blogs/?p=1088" title="Spring Roo 1.2">Spring Roo 1.2</a></li>
<li><a href="http://spring66.com/blogs/?p=1083" title="Micro Cloud Foundry">Micro Cloud Foundry</a></li>
<li><a href="http://spring66.com/blogs/?p=1063" title="เข้าใจ AMQ โปรโตคอลที่ถูกใช้โดย RabbitMQ">เข้าใจ AMQ โปรโตคอลที่ถูกใช้โดย RabbitMQ</a></li>
<li><a href="http://spring66.com/blogs/?p=960" title="Spring + GWT + Maven (Part1)">Spring + GWT + Maven (Part1)</a></li>
<li><a href="http://spring66.com/blogs/?p=996" title="ทำ Log ใน Spring ด้วย Log4j และ SpringAOP">ทำ Log ใน Spring ด้วย Log4j และ SpringAOP</a></li>
</ul>
</div><div id="recent-comments-3" class="widget widget_recent_comments"><h3>Recent Comments</h3><ul id="recentcomments"><li class="recentcomments"><a href='http://www.roofimon.com' rel='external nofollow' class='url'>roofimon</a> on <a href="http://spring66.com/blogs/?p=593&cpage=1#comment-543">REST Architecture เบื้องต้น</a></li><li class="recentcomments">sinapam on <a href="http://spring66.com/blogs/?p=593&cpage=1#comment-542">REST Architecture เบื้องต้น</a></li><li class="recentcomments">Flukeky on <a href="http://spring66.com/blogs/?p=980&cpage=1#comment-514">Graph Database (Neo4J)</a></li><li class="recentcomments">panthephin on <a href="http://spring66.com/blogs/?p=996&cpage=1#comment-512">ทำ Log ใน Spring ด้วย Log4j และ SpringAOP</a></li><li class="recentcomments">champillon on <a href="http://spring66.com/blogs/?p=918&cpage=1#comment-509">Service-Oriented Architecture and Enterprise Architecture Part1</a></li></ul></div><div id="calendar-2" class="widget widget_calendar"><h3> </h3><div id="calendar_wrap"><table id="wp-calendar">
<caption>January 2012</caption>
<thead>
<tr>
<th scope="col" title="Monday">M</th>
<th scope="col" title="Tuesday">T</th>
<th scope="col" title="Wednesday">W</th>
<th scope="col" title="Thursday">T</th>
<th scope="col" title="Friday">F</th>
<th scope="col" title="Saturday">S</th>
<th scope="col" title="Sunday">S</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="3" id="prev"><a href="http://spring66.com/blogs/?m=201112" title="View posts for December 2011">« Dec</a></td>
<td class="pad"> </td>
<td colspan="3" id="next" class="pad"> </td>
</tr>
</tfoot>
<tbody>
<tr>
<td colspan="6" class="pad"> </td><td>1</td>
</tr>
<tr>
<td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td>
</tr>
<tr>
<td>9</td><td>10</td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td>
</tr>
<tr>
<td>16</td><td>17</td><td id="today">18</td><td>19</td><td>20</td><td>21</td><td>22</td>
</tr>
<tr>
<td>23</td><td>24</td><td>25</td><td>26</td><td>27</td><td>28</td><td>29</td>
</tr>
<tr>
<td>30</td><td>31</td>
<td class="pad" colspan="5"> </td>
</tr>
</tbody>
</table></div></div><div id="archives-3" class="widget widget_archive"><h3>Archives</h3> <ul>
<li><a href='http://spring66.com/blogs/?m=201112' title='December 2011'>December 2011</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201108' title='August 2011'>August 2011</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201106' title='June 2011'>June 2011</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201103' title='March 2011'>March 2011</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201102' title='February 2011'>February 2011</a> (2)</li>
<li><a href='http://spring66.com/blogs/?m=201012' title='December 2010'>December 2010</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201011' title='November 2010'>November 2010</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201010' title='October 2010'>October 2010</a> (2)</li>
<li><a href='http://spring66.com/blogs/?m=201009' title='September 2010'>September 2010</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201008' title='August 2010'>August 2010</a> (2)</li>
<li><a href='http://spring66.com/blogs/?m=201007' title='July 2010'>July 2010</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=201006' title='June 2010'>June 2010</a> (4)</li>
<li><a href='http://spring66.com/blogs/?m=201005' title='May 2010'>May 2010</a> (4)</li>
<li><a href='http://spring66.com/blogs/?m=201004' title='April 2010'>April 2010</a> (5)</li>
<li><a href='http://spring66.com/blogs/?m=201003' title='March 2010'>March 2010</a> (4)</li>
<li><a href='http://spring66.com/blogs/?m=201002' title='February 2010'>February 2010</a> (3)</li>
<li><a href='http://spring66.com/blogs/?m=201001' title='January 2010'>January 2010</a> (9)</li>
<li><a href='http://spring66.com/blogs/?m=200912' title='December 2009'>December 2009</a> (1)</li>
<li><a href='http://spring66.com/blogs/?m=200911' title='November 2009'>November 2009</a> (3)</li>
<li><a href='http://spring66.com/blogs/?m=200910' title='October 2009'>October 2009</a> (5)</li>
<li><a href='http://spring66.com/blogs/?m=200908' title='August 2009'>August 2009</a> (5)</li>
<li><a href='http://spring66.com/blogs/?m=200907' title='July 2009'>July 2009</a> (7)</li>
<li><a href='http://spring66.com/blogs/?m=200906' title='June 2009'>June 2009</a> (7)</li>
<li><a href='http://spring66.com/blogs/?m=200905' title='May 2009'>May 2009</a> (8)</li>
<li><a href='http://spring66.com/blogs/?m=200903' title='March 2009'>March 2009</a> (6)</li>
<li><a href='http://spring66.com/blogs/?m=200902' title='February 2009'>February 2009</a> (5)</li>
<li><a href='http://spring66.com/blogs/?m=200901' title='January 2009'>January 2009</a> (20)</li>
</ul>
</div><div id="linkcat-2" class="widget widget_links"><h3>Blogroll</h3>
<ul class='xoxo blogroll'>
<li><a href="http://www.grails66.com" title="The search is over, super fast web development framework">Grails แห่งประเทศไทย</a></li>
<li><a href="http://www.welovebug.com" title="Software Testing Blog">คนรัก Bug</a></li>
</ul>
</div>
<div id="tag_cloud-3" class="widget widget_tag_cloud"><h3>Tags</h3><div class="tagcloud"><a href='http://spring66.com/blogs/?tag=acquire' class='tag-link-42' title='2 topics' style='font-size: 11.1111111111pt;'>acquire</a>
<a href='http://spring66.com/blogs/?tag=certificate' class='tag-link-14' title='1 topic' style='font-size: 8pt;'>certificate</a>
<a href='http://spring66.com/blogs/?tag=cloud' class='tag-link-71' title='4 topics' style='font-size: 14.9135802469pt;'>cloud</a>
<a href='http://spring66.com/blogs/?tag=coldfusion' class='tag-link-16' title='2 topics' style='font-size: 11.1111111111pt;'>coldfusion</a>
<a href='http://spring66.com/blogs/?tag=dao-ibatis' class='tag-link-25' title='2 topics' style='font-size: 11.1111111111pt;'>DAO Ibatis</a>
<a href='http://spring66.com/blogs/?tag=datasource-database' class='tag-link-24' title='1 topic' style='font-size: 8pt;'>datasource database</a>
<a href='http://spring66.com/blogs/?tag=di' class='tag-link-11' title='3 topics' style='font-size: 13.1851851852pt;'>DI</a>
<a href='http://spring66.com/blogs/?tag=dynamicblock' class='tag-link-28' title='1 topic' style='font-size: 8pt;'>DynamicBlock</a>
<a href='http://spring66.com/blogs/?tag=eai' class='tag-link-19' title='2 topics' style='font-size: 11.1111111111pt;'>EAI</a>
<a href='http://spring66.com/blogs/?tag=ehcache' class='tag-link-65' title='2 topics' style='font-size: 11.1111111111pt;'>EhCache</a>
<a href='http://spring66.com/blogs/?tag=flex' class='tag-link-22' title='1 topic' style='font-size: 8pt;'>flex</a>
<a href='http://spring66.com/blogs/?tag=grails' class='tag-link-13' title='1 topic' style='font-size: 8pt;'>grails</a>
<a href='http://spring66.com/blogs/?tag=groovy' class='tag-link-12' title='1 topic' style='font-size: 8pt;'>groovy</a>
<a href='http://spring66.com/blogs/?tag=gwt' class='tag-link-113' title='2 topics' style='font-size: 11.1111111111pt;'>GWT</a>
<a href='http://spring66.com/blogs/?tag=hibernate3-tutorial' class='tag-link-26' title='1 topic' style='font-size: 8pt;'>hibernate3 tutorial</a>
<a href='http://spring66.com/blogs/?tag=ibatis' class='tag-link-27' title='1 topic' style='font-size: 8pt;'>iBatis</a>
<a href='http://spring66.com/blogs/?tag=integration' class='tag-link-20' title='4 topics' style='font-size: 14.9135802469pt;'>Integration</a>
<a href='http://spring66.com/blogs/?tag=ioc' class='tag-link-10' title='4 topics' style='font-size: 14.9135802469pt;'>IOC</a>
<a href='http://spring66.com/blogs/?tag=javarebel' class='tag-link-40' title='2 topics' style='font-size: 11.1111111111pt;'>javarebel</a>
<a href='http://spring66.com/blogs/?tag=json' class='tag-link-32' title='2 topics' style='font-size: 11.1111111111pt;'>JSON</a>
<a href='http://spring66.com/blogs/?tag=maven' class='tag-link-9' title='5 topics' style='font-size: 16.2962962963pt;'>maven</a>
<a href='http://spring66.com/blogs/?tag=osgi' class='tag-link-48' title='4 topics' style='font-size: 14.9135802469pt;'>OSGi</a>
<a href='http://spring66.com/blogs/?tag=products' class='tag-link-4' title='1 topic' style='font-size: 8pt;'>products</a>
<a href='http://spring66.com/blogs/?tag=rabbitmq' class='tag-link-108' title='2 topics' style='font-size: 11.1111111111pt;'>RabbitMQ</a>
<a href='http://spring66.com/blogs/?tag=rest' class='tag-link-88' title='2 topics' style='font-size: 11.1111111111pt;'>REST</a>
<a href='http://spring66.com/blogs/?tag=restful' class='tag-link-77' title='8 topics' style='font-size: 19.2345679012pt;'>RESTFul</a>
<a href='http://spring66.com/blogs/?tag=rmi' class='tag-link-68' title='2 topics' style='font-size: 11.1111111111pt;'>rmi</a>
<a href='http://spring66.com/blogs/?tag=roo' class='tag-link-84' title='4 topics' style='font-size: 14.9135802469pt;'>roo</a>
<a href='http://spring66.com/blogs/?tag=service-layer' class='tag-link-29' title='1 topic' style='font-size: 8pt;'>service layer</a>
<a href='http://spring66.com/blogs/?tag=soa' class='tag-link-90' title='2 topics' style='font-size: 11.1111111111pt;'>SOA</a>
<a href='http://spring66.com/blogs/?tag=spring' class='tag-link-3' title='12 topics' style='font-size: 22pt;'>spring</a>
<a href='http://spring66.com/blogs/?tag=spring3' class='tag-link-17' title='4 topics' style='font-size: 14.9135802469pt;'>spring3</a>
<a href='http://spring66.com/blogs/?tag=spring-batch' class='tag-link-30' title='2 topics' style='font-size: 11.1111111111pt;'>Spring Batch</a>
<a href='http://spring66.com/blogs/?tag=spring-java-config' class='tag-link-18' title='2 topics' style='font-size: 11.1111111111pt;'>Spring Java Config</a>
<a href='http://spring66.com/blogs/?tag=spring-maven' class='tag-link-21' title='3 topics' style='font-size: 13.1851851852pt;'>spring maven</a>
<a href='http://spring66.com/blogs/?tag=springmvc' class='tag-link-31' title='7 topics' style='font-size: 18.3703703704pt;'>springMvc</a>
<a href='http://spring66.com/blogs/?tag=springmvc-3' class='tag-link-96' title='2 topics' style='font-size: 11.1111111111pt;'>SpringMVC 3</a>
<a href='http://spring66.com/blogs/?tag=springpython' class='tag-link-53' title='2 topics' style='font-size: 11.1111111111pt;'>SpringPython</a>
<a href='http://spring66.com/blogs/?tag=spring-roo' class='tag-link-85' title='4 topics' style='font-size: 14.9135802469pt;'>Spring Roo</a>
<a href='http://spring66.com/blogs/?tag=swiz' class='tag-link-23' title='1 topic' style='font-size: 8pt;'>swiz</a>
<a href='http://spring66.com/blogs/?tag=tc-server' class='tag-link-79' title='2 topics' style='font-size: 11.1111111111pt;'>tc server</a>
<a href='http://spring66.com/blogs/?tag=test' class='tag-link-15' title='1 topic' style='font-size: 8pt;'>test</a>
<a href='http://spring66.com/blogs/?tag=training' class='tag-link-33' title='1 topic' style='font-size: 8pt;'>training</a>
<a href='http://spring66.com/blogs/?tag=training2' class='tag-link-59' title='2 topics' style='font-size: 11.1111111111pt;'>training2</a>
<a href='http://spring66.com/blogs/?tag=tutorial' class='tag-link-8' title='3 topics' style='font-size: 13.1851851852pt;'>tutorial</a></div>
</div></div>
<!-- sidebar north END -->
<div id="centersidebar">
<!-- sidebar east START -->
<div id="eastsidebar" class="sidebar">
<!-- categories -->
<div class="widget widget_categories">
<h3>Categories</h3>
<ul>
<li class="cat-item cat-item-46"><a href="http://spring66.com/blogs/?cat=46" title="View all posts filed under case study">case study</a>
</li>
<li class="cat-item cat-item-6"><a href="http://spring66.com/blogs/?cat=6" title="View all posts filed under general information">general information</a>
</li>
<li class="cat-item cat-item-82"><a href="http://spring66.com/blogs/?cat=82" title="View all posts filed under how to">how to</a>
</li>
<li class="cat-item cat-item-7"><a href="http://spring66.com/blogs/?cat=7" title="View all posts filed under news">news</a>
</li>
<li class="cat-item cat-item-5"><a href="http://spring66.com/blogs/?cat=5" title="View all posts filed under tutorial series">tutorial series</a>
</li>
<li class="cat-item cat-item-1"><a href="http://spring66.com/blogs/?cat=1" title="View all posts filed under Uncategorized">Uncategorized</a>
</li>
</ul>
</div>
</div>
<!-- sidebar east END -->
<!-- sidebar west START -->
<div id="westsidebar" class="sidebar">
<!-- blogroll -->
<div class="widget widget_links">
<h3>Blogroll</h3>
<ul>
<li><a href="http://www.grails66.com" title="The search is over, super fast web development framework">Grails แห่งประเทศไทย</a></li>
<li><a href="http://www.welovebug.com" title="Software Testing Blog">คนรัก Bug</a></li>
</ul>
</div>
</div>
<!-- sidebar west END -->
<div class="fixed"></div>
</div>
<!-- sidebar south START -->
<div id="southsidebar" class="sidebar">
<!-- archives -->
<div class="widget">
<h3>Archives</h3>
<ul>
<li><a href='http://spring66.com/blogs/?m=201112' title='December 2011'>December 2011</a></li>
<li><a href='http://spring66.com/blogs/?m=201108' title='August 2011'>August 2011</a></li>
<li><a href='http://spring66.com/blogs/?m=201106' title='June 2011'>June 2011</a></li>
<li><a href='http://spring66.com/blogs/?m=201103' title='March 2011'>March 2011</a></li>
<li><a href='http://spring66.com/blogs/?m=201102' title='February 2011'>February 2011</a></li>
<li><a href='http://spring66.com/blogs/?m=201012' title='December 2010'>December 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201011' title='November 2010'>November 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201010' title='October 2010'>October 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201009' title='September 2010'>September 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201008' title='August 2010'>August 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201007' title='July 2010'>July 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201006' title='June 2010'>June 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201005' title='May 2010'>May 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201004' title='April 2010'>April 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201003' title='March 2010'>March 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201002' title='February 2010'>February 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=201001' title='January 2010'>January 2010</a></li>
<li><a href='http://spring66.com/blogs/?m=200912' title='December 2009'>December 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200911' title='November 2009'>November 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200910' title='October 2009'>October 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200908' title='August 2009'>August 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200907' title='July 2009'>July 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200906' title='June 2009'>June 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200905' title='May 2009'>May 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200903' title='March 2009'>March 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200902' title='February 2009'>February 2009</a></li>
<li><a href='http://spring66.com/blogs/?m=200901' title='January 2009'>January 2009</a></li>
</ul>
</div>
<!-- meta -->
<div class="widget">
<h3>Meta</h3>
<ul>
<li><a href="http://spring66.com/blogs/wp-login.php?action=register">Register</a></li> <li><a href="http://spring66.com/blogs/wp-login.php">Log in</a></li>
</ul>
</div>
</div>
<!-- sidebar south END -->
</div>
<!-- sidebar END -->
<div class="fixed"></div>
</div>
<!-- content END -->
<!-- footer START -->
<div id="footer">
<a id="gotop" href="#" onclick="MGJS.goTop();return false;">Top</a>
<a id="powered" href="http://wordpress.org/">WordPress</a>
<div id="copyright">
Copyright © 2009-2011 Just Spring </div>
<div id="themeinfo">
Theme by <a href="http://www.neoease.com/">NeoEase</a>. Valid <a href="http://validator.w3.org/check?uri=referer">XHTML 1.1</a> and <a href="http://jigsaw.w3.org/css-validator/check/referer?profile=css3">CSS 3</a>. </div>
</div>
<!-- footer END -->
</div>
<!-- container END -->
</div>
<!-- wrap END -->
<script type='text/javascript' src='http://spring66.com/blogs/wp-includes/js/jquery/jquery.js?ver=1.7.1'></script>
<script type='text/javascript' src='http://spring66.com/blogs/wp-content/plugins/openid_bck/files/jquery.textnode.js?ver=svn-47054'></script>
<script type='text/javascript' src='http://spring66.com/blogs/wp-content/plugins/openid_bck/files/jquery.xpath.js?ver=svn-47054'></script>
<script type='text/javascript' src='http://spring66.com/blogs/wp-content/plugins/openid_bck/files/openid.js?ver=svn-47054'></script>
<!--stats_footer_test--><script src="http://stats.wordpress.com/e-201203.js" type="text/javascript"></script>
<script type="text/javascript">
st_go({blog:'11522597',v:'ext',post:'0'});
var load_cmc = function(){linktracker_init(11522597,0,2);};
if ( typeof addLoadEvent != 'undefined' ) addLoadEvent(load_cmc);
else load_cmc();
</script>
<!-- SyntaxHighlighter Stuff -->
<script type="text/javascript" src="http://spring66.com/blogs/wp-content/plugins/syntaxhighlighter-plus/syntaxhighlighter/src/shCore.js"></script>
<script type="text/javascript" src="http://spring66.com/blogs/wp-content/plugins/syntaxhighlighter-plus/syntaxhighlighter/scripts/shBrushXml.js"></script>
<!-- Reassign aliases -->
<script type="text/javascript">
SyntaxHighlighter.brushes.Xml.aliases = ["xml", "html", "xhtml", "xslt"];
</script>
<script type="text/javascript" src="http://spring66.com/blogs/wp-content/plugins/syntaxhighlighter-plus/syntaxhighlighter/scripts/shBrushJava.js"></script>
<!-- Reassign aliases -->
<script type="text/javascript">
SyntaxHighlighter.brushes.Java.aliases = ["java"];
</script>
<script type="text/javascript">
SyntaxHighlighter.all();
</script>
</body>
</html>