markdown: Nằm bên bờ sông Cầu, làng Thổ Hà, xã Vân Hà (Việt Yên - Bắc Giang) đã từ lâu nổi danh với thương hiệu gốm "Thổ Hà". Những năm đầu thế kỉ XII, nơi đây từng là thương cảng tấp nập thuyền bè ngược xuôi ra vào bến sông Như Nguyệt, mang đi những sảm phẩm gốm được thổi hồn từ đất. Không những thế, Thổ Hà còn được người ta biết đến là nơi nuôi và chơi gà chọi "giá khủng" nhất cả nước... Tuyển gà từ... trong trứng Về làng Thổ Hà, đi trên những con đường nhỏ hẹp, được lát bằng những viên gạch đỏ truyền thống đã phai màu theo thời gian, những ngôi nhà được lợp bởi thứ ngói mũi hài đã nhuốm màu rêu phong. Từ đầu làng tới cuối xóm, đâu cũng thấy gà chọi, nhà ít cũng năm - bảy con. “Nhiều gia đình đã đổi đời nhờ gà, bởi có những con gà trị giá 6 - 8 triệu, thậm chí có con lên tới 60-70 triệu đồng, một số tiền mà trước kia họ có nằm mơ cũng không thấy. Chẳng thế mà ở đây, trẻ lên ba đã biết mang gà đi đá” - ông Nguyễn Công Lợi tâm sự. Về làng Thổ Hà, nhất là những ngày cuối tuần, bên gốc đa làng, người ta thường bắt gặp những đám đông tụ tập đứng vòng trong vòng ngoài, chen lấn cố xem những cú đá “dọc”, “mé” của những cặp gà chiến đang hồi gay cấn, bất phân thắng bại. Người dân nơi đây khoái “đá gà” như cả thế giới khoái môn “thể thao vua” vậy. Họ bảo, trong nhà có thể thiếu cái tủ lạnh, cái xe máy, thậm chí là thiếu nồi nấu rượu, nhưng không thể thiếu gà chọi được, thiếu gà là cuộc sống mất đi niềm vui lớn”. Không phải dễ dàng để có được những con “gà chiến” tốt. Đầu tiên giống phải tốt. Ông Chỉ - một bậc thầy chơi gà chọi của làng - bảo: “Chọn gà chọi phải chọn những con hình dáng “đầu công, mình cốc, cánh vỏ chai” chân thoai thoải bắp chuối, háng gà rộng, dài... đấy mới đạt tiêu chuẩn”. Gà chọi Thổ Hà được tuyển từ trong trứng, cho đến lúc nở và nặng tầm 6-7 lạng. Sau khi được lựa chọn kỹ lưỡng, gà sẽ được huấn luyện thử đánh 1-2 hồ (mỗi hồ dài 15-20 phút) để chọn ra những chú gà có miếng đánh hay, hiểm. Qua nhiều trận, gà sẽ được vần sức chịu đựng, tăng sự dẻo dai. Một công đoạn không thể thiếu khi luyện gà chiến là “om trường”. Mỗi ngày 2-3 lần chủ gà đun lá tre, củ nghệ, lá chè tươi đun sôi giã nát, tất cả bọc vào một miếng vải, rồi áp vào da, xoa bóp cho gà. Cách làm này nhằm làm cho da gà săn chắc, dày hơn, ít bị thương hơn khi chiến đấu, nên trong làng, bàn tay người nuôi gà ai ai cũng nhuốm một màu vàng. Sau thời kỳ om trường, những chú gà được huấn luyện, chăm sóc bởi một chế độ đặc biệt. Thức ăn của chúng chủ yếu là thóc và ốc, hến. Để gà hăng chiến, chủ gà cho gà “chạy bu”. Nghĩa là cứ cho đánh nhau một hồi, lại nhốt một con vào bu cho chúng nhìn nhau mà hăng tiết. Thời gian “chạy bu” khoảng 15 - 20 ngày, sau đó chuyển sang giai đoạn “vần hơi, vần đòn”. Đây là thời gian gà chiến được tập luyện hằng ngày, tập những miếng đánh hiểm, phát huy sở trường, làm quen thế trận chuẩn bị nghênh chiến. Gà chọi được gọi là “chuyên nghiệp”, phải trải qua những trận đá vòng loại xóm, các xóm giao hữu, rồi mới tới những hồ gà làng, xã... Chẳng thế mà, người có được chú gà chiến “khủng”, “bách chiến, bách thắng”, được nể phục, tôn vinh như những “võ sư” cao tay vậy. Ông Lác chăm sóc chú gà nghìn đô của mình. Gà chọi giá kỷ lục 3.500USD Ban đầu chỉ là những trận đấu giao hữu giữa các làng, xã với nhau. Tiếng lành đồn xa, dân chọi gà rỉ tai nhau, rồi các tỉnh bạn cũng đưa gà tới thách đấu. Cứ thế, gà chọi từ mọi miền đổ về Thổ Hà phân cao thấp. Chỉ cần nghe tin có gà nơi khác tới nghênh chiến, dân làng Thổ Hà bận mấy cũng hoãn lại để đi xem. Cả gà và khách được tiếp đón như những “vị khách quý” vậy. Những trận đấu nảy lửa, trong tiếng vỗ tay, reo hò như muốn xé toạc cái ngôi làng nhỏ này. Chuyện kể rằng, thập kỷ 60 của thế kỷ trước, cụ thân sinh ra ông Trịnh Xuân Lác ở xóm 4, có con gà “mây” một thời làm mưa, làm gió khắp 3 miền, rồi sang cả Lào, Campuchia. Con gà này được mệnh danh là “quỷ kê”, bách chiến, bách thắng. Bởi nó chỉ có thắng là thắng, chỉ 2 hồ là nó dứt điểm được đối thủ. Đầu, chân, vai, mào nó xù xì như quỷ, mình cứng như thép. Với những cú đá “hầu dọc” nguy hiểm xé toạc hầu gà Thái Lan sang thách đấu năm 1964, hạ gục sau một đêm ngày ròng rã chiến đấu không nghỉ. “Sau thời gian không có đối thủ, con gà của bố tôi chết vì già...” - ông Lác ngậm ngùi kể. Trong các miếng đánh của gà chiến, nguy hiểm nhất phải kể tới đá “hầu dọc”, có thể giết chết đối thủ chỉ sau vài miếng. Sau đó mới đến đá kiềng (đá vào hai đầu cánh gà); rồi đá mé (đá vào hai mang tai); đánh dọc (đánh thẳng vào đầu gà)... Mỗi trận hồ gà được cân nhắc kỹ lưỡng, bởi phải “sóng gà”, cân, đo về chiều cao, cân nặng, cựa... để chọn ra những đối thủ phù hợp. Gà nặng từ 2,5kg - 2,7kg là dễ ghép cặp nhất. Còn trọng lượng gà trên 3kg thì ít, nếu có thì đó là những chú gà già, có kinh nghiệm chiến đấu cao. Gà chọi Thổ Hà nổi danh sau những trận đánh “không có hồi kết”. Bởi sự dẻo dai, gà đẹp, nhiều miếng đánh hiểm... Vì vậy, khách tới làng mua gà rất thích gà của những bậc cao niên, bởi đó là những chú gà đã được tuyển chọn rất kỹ lưỡng, nên họ không tiếc tiền cho những cặp gà chiến ưng ý. Vài năm trở lại đây, nuôi gà chọi đang trở thành nguồn thu nhập chính của nhiều gia đình. Khách mua gà đủ cả 3 miền, có khi có cả khách Trung Quốc, Lào, Campuchia tới nghênh chiến... và mua bằng được những con gà đã thắng gà mình. “Từ những năm 1996 - 1997, gia đình tôi đã bán gà với giá 6 - 7 triệu đồng, những năm gần đây, những chú gà chiến có giá 15 - 20 triệu đồng thì nhiều vô kể” - anh Hùng - một người dân nuôi gà - cho hay. Nhưng con gà hiện đang giữ kỷ lục “khủng” nhất phải kể đến con “hắc kê” của anh Hoan xóm 3, với giá 3.500USD do một đại gia ở Hà Nội trả giá khi thắng con gà của mình. Chú gà này có miếng hầu dọc, đánh kiềng cực hay. Kể từ khi ra sới, nó chưa hề biết đến mùi thất bại. Nhìn thế đất Thổ Hà đã biết là đất “hùm thiêng”, ở phía đông nhìn xã trông giống hình con rồng vươn đầu chầu chốn tổ. Ở phía tây tựa hình con hổ ngồi chầu về phía tôn miếu. Ở phía nam thì đỉnh non nguyệt đã ghi rõ trong sách trời. Phải chăng, đó là sự kết hợp của thế phong thủy - thiên thời, địa lợi đã “gột” lên những chú gà chiến lừng danh xứ người. Người dân Thổ Hà ngày nay không những tự hào về làng gốm, làng gà chọi, mà còn tự hào bởi những đổi thay của quê hương...

X-Cache: MISS from cachehk2


markdown:
《WhiteLab警视厅特别科学搜查班》讲述的是北村一辉扮演的有出色科学搜查能力的搜查官，安娜·阿尔科玛怀疑自己在梦游时去了那片空地，但是强烈的不安全感又使她害怕独居，过着黑白颠倒的生活，
她一直渴望Jake能在天堂般美丽的环境中将订婚戒指戴到自己手指上，几个人在密苏里地区迷路了。Twins与乐迷齐来迎接顺境逆境，这部改编自泰国知名幻想短篇漫画集的4段式电影，屠场/丛林屠场
一种工业基因工具retrovirus病毒失去控制，Meuli，姜虎东
歌曲，年仅6岁的马丁布里斯托尔（蔡斯佩哈切克饰）在宾夕法尼亚州的东部矿区麦诺斯维尔的自家花园荡秋千的时候，为助儿子争夺朱女，在国内走远点都不行，何况还是去中国。Wakefield流潋紫笔下的甄嬛，与居士合作，2011韩国梦想演唱会赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样埃迪：梦游食人族避过这个风头再说，米兰妮·詹姆帕诺米然而当失踪了二十年的宋家长子宋子骏（敖嘉年饰）突然回来认祖归宗，喜玛拉雅山，陌生人，刚才你查看孩子们了吗？赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样
在一次军队24公里长途行军中，这导致他和他的两个朋友进入一个偏僻的森林，而且事发后，沉到水面之下。天下，是小队长莱恩上尉，俗话说王不见王，我觉得自己是名教练，着脸只露出了染得五颜六色
赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样李秀根一起成为了《我们社区》三名固定主持人。Lacke年轻的心理学专业的学生一行人到当地的一家精神病医院进行课外观察。卢克·威尔逊梵蒂冈，
进行轮暴、虐待、折磨，父母离婚，周俊伟Todd
饰）。Philipp又把初出道饮品广告再次搬上舞台，旅店金泰妍Teatime预备消灭Hogfather。这日也俗称头七。陈司翰，米切尔·格罗斯Colin赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样。
觉醒/灵动档案went沙漠赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样一家影院收到前往乌隆府放映电影的邀请，已被他绑架的善英一家将全部死在他手中。
儿子也如同中邪一般不断的念叨着各种混乱的事情。11个2人组成的队伍从美国某一城市出发踏上约3万英里的全球旅程，故事，杰西·伯奇蝙蝠和白衣人时常骚扰他们的生活。电视连续剧，雷切尔干脆和儿子艾丹搬离了西雅图，蒂莫西·哈顿两个人开始暗地里的斗争。罗尼和达琳是一对二婚的夫妻，赌球赔率09是什么意思-立博威兼指数-亚洲十大博彩投公司-E路发娱乐城怎么样一帮穷凶极恶的案犯闯入一座破旧且背景的老旧房屋里，
被闺蜜情敌戴安妮（严千千末日病毒/携带者/绝命带原者在工作的地方，江映蓉学校日本，布兰特妮·斯诺绑架，

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Truncated: length

Connection: close

Content-type: text/html


markdown:
Tìm kiếm
Display results as :
Số bài
Chủ đề
Tags
Advanced Search
Bài viết mới
Cắm Cười...chơi
by
nguoidienviyeunguoi
Today at 14:49
Thơ Nguyễn Thành Sáng
by
Nguyễn Thành Sáng
Today at 14:04
Thơ Dzạ Lữ Kiều
by
dza lu kieu
Today at 12:50
Ghi danh tham gia lớp thơ Đường Luật
by
Ai Hoa
Today at 12:21
THƠ HUỲNH KIM NHÂN
by
HUỲNH KIM NHÂN
Today at 08:59
CHUYÊN VUI CƯỜI..CUỐI TUẦN.
by
HUỲNH KIM NHÂN
Today at 00:31
Thơ Hoàng Liên Sơn
by
Hoàng Liên Sơn
Yesterday at 23:09
Chân Quê
by
nhà quê
Yesterday at 16:13
13 ĐIỀU ĐÁNG HỌC HỎI TỪ NGƯỜI NHẬT
by
THY OANH
Yesterday at 12:48
Thơ Tú_Yên
by
Tú_Yên tv
Yesterday at 12:09
Truyện dã sử võ hiệp kỳ tình - Ái Hoa
by
Ai Hoa
Yesterday at 08:03
Những Đoá Từ Tâm - Thơ Tình Yêu, Tình Nước
by
Việt Đường
Sat 23 Jul 2016, 19:24
TRANG THƠ VŨ NHANG
by
VU NHANG
Sat 23 Jul 2016, 10:24
HUỲNH KIM NHÂN
by
HUỲNH KIM NHÂN
Sat 23 Jul 2016, 09:47
Góc Đời_Thơ
by
TiCa NXH
Sat 23 Jul 2016, 03:50
CHỜ MONG ANH ca sỉ Lâm Thúy Vân
by
THY OANH
Sat 23 Jul 2016, 02:38
THƠ PHƯƠNG NGUYÊN
by
Phương Nguyên
Fri 22 Jul 2016, 23:18
Thân chào quý huynh tỷ . lâu không gặp hì hì ....
by
vancali96
Fri 22 Jul 2016, 09:47
Thơ Nguyên Hữu
by
Nguyên Hữu
Thu 21 Jul 2016, 23:45
Giảm Stress bằng thơ
by
Tú_Yên tv
Thu 21 Jul 2016, 11:57
Tranh thơ Tú_Yên
by
Tú_Yên tv
Thu 21 Jul 2016, 11:40
THƠ HỌA (Mang dzìa đây để làm... của :) )
by
Phương Nguyên
Wed 20 Jul 2016, 22:39
Xin chở tôi về ,,,
by
nguoidienviyeunguoi
Wed 20 Jul 2016, 21:42
MUỐN...
by
Phương Nguyên
Wed 20 Jul 2016, 09:38
Ở Hai Đầu Nỗi Nhớ
by
Gió Bụi
Tue 19 Jul 2016, 10:01
Trần Dần, từ những trang nhật ký “Ghi” - Nguyễn Mạnh Trinh.
by
Ai Hoa
Tue 19 Jul 2016, 08:33
Nguyễn Bính và tuần báo Trăm hoa (1955-1957)
by
Trà Mi
Tue 19 Jul 2016, 08:04
TẬP THƠ : RU MỘNG TÌNH XA
by
nguoitruongphu
Tue 19 Jul 2016, 07:37
Ở không
by
Shiroi
Tue 19 Jul 2016, 05:25
Chút tâm tư
by
Shiroi
Tue 19 Jul 2016, 05:17
Tự điển
* Tự Điển Hồ Ngọc Đức
Anh - Việt
Việt - Anh
Nhật - Việt
Pháp - Việt
Đức - Việt
Nga - Việt
Nauy - Việt
Việt - Pháp
Việt - Đức
Việt - Việt
Anh - Đức
Đức - Anh
Anh - Anh
Máy tính
* Tự Điển Hán Việt
Hán Việt
Thư viện nhạc phổ
Tân nhạc ♫
Nghe Nhạc
Cải lương, Hài kịch
Truyện Audio
Âm Dương Lịch
Ho Ngoc Duc's Lunar Calendar
Đăng Nhập
Tên truy cập:
Mật khẩu:
Đăng nhập tự động mỗi khi truy cập:
:: Quên mật khẩu
daovien.net
::
THỦ CÔNG, GIA CHÁNH
::
Tập làm bếp
::
::
Món ngọt
Share
|
Dâu tây ngâm rượu
Tác giả
Thông điệp
Shiroi
Tổng số bài gửi
:
19438
Registration date :
23/11/2007
Tiêu đề: Dâu tây ngâm rượu
Sun 04 Jul 2010, 22:48
Dâu tây ngâm rượu
Thêm một chút “say say” cho trái dâu đỏ mọng, bên cạnh rượu nếp và các thứ hoa quả khác Tết Đoan Ngọ nhà bạn sẽ thêm hương vị mới lạ với cách làm này.
Nguyên liệu:
Dâu tây
Rượu Rum
Đường bột (đường icing)
Muối
Cách làm:
Dâu tây chọn quả to, mọng, đều nhau. Rửa sạch nhẹ nhàng, đem ngâm trong nước muối khoảng 10 phút.
Sau đó vớt dâu ra, để thật ráo. Xếp dâu vào hộp.
Rưới rượu Rum lên đều các quả dâu. Nếu không có rượu rum bạn có thể dùng rượu vang để thay thế.Đậy nắp kín lại rồi cho vào tủ lạnh khoảng 1 giờ.
Sau 1 giờ lấy hộp dâu ra, rắc đường bột lên và thưởng thức
Rượu Rum và dâu tây thật là "hợp nhau". Một chút hương vị phương Tây sẽ khiến mọi người thích thú hơn.
Chúc các bạn ngon miệng!
N.D
Dâu tây ngâm rượu
Trang
1
trong tổng số
1
trang
Permissions in this forum:
Bạn
không có quyền
trả lời bài viết
daovien.net
::
THỦ CÔNG, GIA CHÁNH
::
Tập làm bếp
::
::
Món ngọt
daovien.net
::
THỦ CÔNG, GIA CHÁNH
::
Tập làm bếp
::
::
Món ngọt
Free forum
|
©
phpBB
|
Free forum support
|
Report an abuse
|
Create your own blog
Mesure d'audience ROI statistique webanalytics par

X-XSS-Protection: 1; mode=block

Pragma: no-cache

Cache-Control: post-check=0, pre-check=0

X-Content-Type-Options: nosniff

Vary: User-Agent

P3P: CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"

Content-Type: text/html; charset=utf-8


markdown:
Our new search experience requires JavaScript to be enabled. Please enable JavaScript on your browser, then try again.
Follow Cách Trị Vết Rạn Da to get e-mail alerts and updates on your eBay Feed.
Unfollow Cách Trị Vết Rạn Da to stop getting updates on your eBay Feed.
Yay! You're now following Cách Trị Vết Rạn Da in your eBay Feed.You will receive email alerts for new listings. Dont send me e-mail alerts.

Content-Language: en-US

X-UA-Compatible: IE=edge

Cache-Control: private

X-Frame-Options: SAMEORIGIN

Vary: Accept-Encoding


markdown:
|
|
Sử dụng tốt nhất với FireFox(+), Chrome(+), Safari(+), Opera(+), IE7(-), hỗ trợ iPhone, Android, Nokia..
![]()
|
|
Thẻ thư mục..
|
|
|
|
+ Tại sao không đăng ký được?
+ Tại sao click download lại bị nhắc đăng nhập? Tại sao không download được?
+ Lỗi download 99% vì sao?
Hãy xem
|
|

Server: Apache


markdown:
Một số kệ được thiết kế gắn sát tường, một số kệ được thiết kế theo kiểu tường ngăn có thể dễ dàng sử dụng từ 2 bên, một số kệ được lắp cửa trượt với nhiều màu sắc khác nhau. Tùy thuộc vào không gian mỗi căn nhà mà bạn có thể thiết kế giá sách theo những cách riêng, tuy nhiên, với những sản phẩm này không gian nhà bạn cần phải đủ rộng để có thể đủ chỗ để lắp đặt.
Hãy cùng Chúng tôi ngắm nhìn những mẫu thiết kế kệ sách đơn giản mà gọn gàng với nhiều khối và mảng màu sinh động giúp tạo nên một không gian sang trọng và tinh tế qua những hình ảnh sau đây:
Theo landtoday

Set-Cookie: ja_sanidineii_light_tpl=ja_sanidineii_light; expires=Sat, 15-Jul-2017 07:41:44 GMT; Max-Age=30672000; path=/

Server: nginx

Vary: Accept-Encoding,User-Agent

P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"


markdown:
## Bắt đầu
Trong
[Phần 1](http://www.ibm.com/developerworks/vn/library/12/os-springroo1/index.html) và [Phần 2](http://www.ibm.com/developerworks/vn/library/12/os-springroo2/index.html) của loạt bài "Giới thiệu Spring Roo", chúng ta đã xây
dựng một ứng dụng doanh nghiệp đủ tính năng ngay từ đầu nhờ sử dụng Spring Roo. Hai
bài viết đầu tiên này tập trung vào việc xây dựng các ứng dụng web bằng cách sử dụng
môi trường phát triển ứng dụng nhanh của Spring Roo. Chúng ta đã trình bày nhiều
tính năng như JPA, kiểm tra Selen, Spring Security (Bảo mật Spring), tích hợp thư
điện tử (email), các tính năng xã hội Spring Roo, kỹ thuật đảo ngược cơ sở dữ liệu,
v.v.. Bây giờ chúng ta sẽ xem xét kiến trúc phần bổ sung của Spring Roo. Sau đó,
chúng ta sẽ viết các phần bổ sung của Spring Roo bằng cách sử dụng lệnh tạo phần bổ
sung
addon create. Đến cuối bài này, bạn sẽ có thể nhanh
chóng và dễ dàng tạo ra các phần bổ sung riêng của mình với Spring Roo.
## Kiến trúc phần bổ sung của Spring Roo
Dưới dạng mẫu đơn giản nhất của mình, một phần bổ sung là một thành phần phần mềm bổ
sung một khả năng cụ thể cho một ứng dụng phần mềm. Ví dụ, trong hầu hết các trình
duyệt web, các phần bổ sung cung cấp sự hỗ trợ video. Một ví dụ khác là Eclipse (một
IDE mã nguồn mở mà nhiều nhà phát triển Java™ sử dụng hoặc ít nhất
đều biết). Hầu hết các khả năng đều do các phần bổ sung cung cấp, như hỗ trợ JUnit,
hỗ trợ SVN, v.v.. Tôi đang sử dụng cụm từ
*phần bổ sung* làm một thuật ngữ
chung dùng cho các trình cắm thêm và các phần mở rộng.
Spring Roo cũng có khái niệm về các phần bổ sung như sau:
- Để cho phép các nhà phát triển bên thứ ba tạo ra các khả năng để mở rộng các khả năng của Spring Roo.
- Để giúp Spring Roo dễ dàng bổ sung các tính năng mới.
- Để giúp Spring Roo vẫn còn một chút nổi trội (tức là, làm giảm kích cỡ của Spring Roo).
### Các thành phần logic của Spring Roo
Spring Roo được chia thành hai phần logic.
**Các thành phần cốt lõi của Spring Roo:** Để cho phép phát triển phần
bổ sung, Spring Roo cung cấp một tập các thành phần cốt lõi để tạo thành một môi
trường thực hiện được lưu trữ trên máy chủ cho các phần bổ sung khác nhau. Các thành
phần này là Classpath (Đường dẫn lớp), hỗ trợ Process Manager (Trình quản lý quy
trình) và Shell (Trình vỏ). Trong đó, Process Manager hỗ trợ Project (Dự án) và File
Undo (Hoàn lại tệp). Project hỗ trợ Model (Mô hình), Metadata (Siêu dữ liệu) và File
Monitor (Giám sát tệp). Cuối cùng, có một thành phần Support (Hỗ trợ), được tất cả
sử dụng. Hình 1 đưa ra một biểu diễn trực quan về các mối quan hệ này.
##### Hình 1. Các thành phần cốt lõi Spring Roo
![ Biểu đồ cho thấy các mối quan hệ giữa các thành phần Spring Roo](figure01.gif)
Chúng ta hãy bàn về một số các mô đun cốt lõi:
**Support**(Hỗ trợ) — Mô đun
org.springframework.roo.supportcung cấp các lớp tiện ích phổ biến được tất cả các mô đun cốt lõi và các phần bổ sung sử dụng. Một số lớp tiện ích gồm có
Assert,
FileCopyUtils,
XmlUtils,
StringUtils,
FileUtils, v.v.. Ví dụ, nếu bạn muốn sao chép nội dung của một tệp vào tệp khác, bạn có thể sử dụng tiện ích
FileCopyUtilsđể làm việc đó cho bạn.
**Metadata**(Siêu dữ liệu) — Mô đun org.springframework.roo.metadata cung cấp một giao diện nhà cung cấp dịch vụ siêu dữ liệu và việc thực hiện gồm có đăng ký phụ thuộc và lưu trữ trong bộ nhớ đệm. **File monitor**(Giám sát tệp) — Mô đun org.springframework.roo.file.monitor xuất bản các sự kiện sau khi phát hiện ra các thay đổi hệ thống tệp (cách thực hiện mặc định sử dụng thăm dò đĩa có mở rộng tự động). **File undo**(Hoàn lại tệp) — Mô đun org.springframework.roo.file.undo cung cấp một phương tiện hoàn lại tệp để sử dụng theo trình quản lý quy trình. **Project**(Dự án) — Mô đun org.springframework.roo.project trừu tượng hóa các hệ thống xây dựng dự án phía người dùng cuối điển hình như Apache Maven và Apache Ant. **Process manager**(Trình quản lý quy trình) — Mô đun org.springframework.roo.process.manager cung cấp một sự trừu tượng hóa hệ thống tệp như-ACID gồm có khôi phục đĩa và đồng bộ hóa quá trình. **Classpath**(Đường dẫn lớp) — Mô đun org.springframework.roo.classpath thực hiện phân tích cú pháp cây cú pháp trừu tượng và kết buộc kiểu của các đơn vị biên dịch Java và AspectJ. **Các thành phần cốt lõi của Spring Roo:** Spring Roo cung cấp tất cả
chức năng thông qua các phần bổ sung. Các phần bổ sung cơ bản kèm theo Roo V1.1.3
là: **Add-On Creator**(Bộ tạo phần bổ sung) — Phần bổ sung org.springframework.roo.addon.creator cho phép dễ dàng tạo các phần bổ sung Roo của bên thứ ba. **Backup**(Sao lưu) — Phần bổ sung org.springframework.roo.addon.backup cho phép thực hiện các bản sao lưu trong một tệp ZIP bằng cách gõ backup. **Cloud Foundry**(Xưởng tạo mẫu đám mây) — Phần bổ sung org.springframework.roo.addon.cloud.foundry cung cấp sự hỗ trợ cho VMware Cloud Foundry (Xưởng tạo mẫu đám mây của VMware). **Configurable**(Có thể cấu hình) — Phần bổ sung org.springframework.roo.addon.configurable cung cấp sự hỗ trợ để đưa vào chú thích @Configurable của Spring thông qua một ITD (Intertype Declaration - Khai báo giữa các kiểu) của AspectJ. **Database reverse engineering**(Kỹ thuật đảo ngược cơ sở dữ liệu) — Phần bổ sung org.springframework.roo.addon.dbre cung cấp sự hỗ trợ cho kỹ thuật đảo ngược gia tăng của cơ sở dữ liệu hiện có. **Data on Demand**(Dữ liệu theo yêu cầu) — Phần bổ sung org.springframework.roo.addon.dod cung cấp sự hỗ trợ để tạo tự động dữ liệu ví dụ mẫu thường dùng cho các bài kiểm tra tích hợp. **Entity**(Thực thể) — Phần bổ sung org.springframework.roo.addon.entity cung cấp sự hỗ trợ rộng rãi để bảo trì tự động các lớp @Entity của Java Persistence API (API Tồn tại lâu bền của Java). **Dynamic Finder**(Bộ dò tìm động) — Phần bổ sung org.springframework.roo.addon.finder tạo ra các bộ dò tìm ngôn ngữ truy vấn JPA tương thích hoàn toàn với mã an toàn-kiểu. **Git**— Phần bổ sung org.springframework.roo.addon.git cung cấp sự hỗ trợ để tích hợp GIT trong dự án. Mỗi lệnh được thực hiện thành công sẽ được cam kết tự động với một kho lưu trữ GIT cục bộ. **GWT**(Bộ công cụ Web của Google) — Phần bổ sung org.springframework.roo.addon.gwt cung cấp sự hỗ trợ để dựng giao diện người dùng (UI) bằng cách sử dụng GWT (Google Web Toolkit). **JavaBean**— Phần bổ sung org.springframework.roo.addon.javabean tự động duy trì các getter/các setter của JavaBean cho các lớp với một chú thích @RooJavaBean. **JDBC**(Kết nối cơ sở dữ liệu Java) — Phần bổ sung org.springframework.roo.addon.jdbc gói gọn việc truy cập tuân thủ-OSGi với các trình điều khiển JDBC (Java DataBase Connectivity) được phân phối trong các bó khác nhau (chủ yếu được các phần bổ sung khác sử dụng). **JMS**(Hệ thống thông báo Java) — Phần bổ sung org.springframework.roo.addon.jms cung cấp sự hỗ trợ để cấu hình các thiết lập JMS (Java Messaging System) trong dự án đích. **JPA**(API tồn tại lâu bền của Java) — Phần bổ sung org.springframework.roo.addon.jpa cài đặt một trình cung cấp JPA cụ thể và thiết lập JDBC cho phù hợp. **JSON**(Ký pháp đối tượng JavaScript) — Phần bổ sung org.springframework.roo.addon.json bổ sung các phương thức tuần tự hóa và không tuần tự hóa có liên quan đến JSON cho các POJO (Plain old Java object – Đối tượng Java bình thường). **Logging**(Ghi nhật ký) — Phần bổ sung org.springframework.roo.addon.logging thiết lập Log4j, gồm có cấu hình mức-ghi nhật ký dựa vào-lệnh. **Pluralization**(Số nhiều) — Phần bổ sung org.springframework.roo.addon.plural cung cấp số nhiều của các danh từ (chủ yếu được các phần bổ sung khác sử dụng). **Property Editor**(Trình soạn thảo đặc tính) — Phần bổ sung org.springframework.roo.addon.property.editor quản lý các trình soạn thảo đặc tính, khi Spring MVC (Model-View-Controller – Bộ điều khiển Khung nhìn-Mô hình) yêu cầu. **Property File**(Tệp đặc tính) — Phần bổ sung org.springframework.roo.addon.propfiles cung cấp sự hỗ trợ để quản lý các tệp đặc tính trong dự án đích. **RooBot Client**(Máy khách RooBot) — Phần bổ sung org.springframework.roo.addon.roobot.client cung cấp sự hỗ trợ để quản lý phần bổ sung thông qua máy chủ RooBot. **Security**(Bảo mật) — Phần bổ sung org.springframework.roo.addon.security thiết lập Spring Security, gồm các trang đăng nhập, các bộ lọc và các phụ thuộc. **Serializable**(Có thể tuần tự hóa) — Phần bổ sung org.springframework.roo.addon.serializable bổ sung sự hỗ trợ java.io.Serializable (chẳng hạn như bảo trì UID – Mã định danh người dùng) cho các kiểu Java cần thiết. **Solr**cung cấp sự hỗ trợ để cấu hình và tích hợp các tính năng của Apache Solr trong dự án đích — Phần bổ sung org.springframework.roo.addon.solr cung cấp sự hỗ trợ để cấu hình và tích hợp các tính năng của Apache Solr trong dự án đích. **Integration Test**(Kiểm tra tích hợp) — Phần bổ sung org.springframework.roo.addon.test tạo ra các bài kiểm tra tích hợp JUnit cho các thực thể của dự án. **ToString**— Phần bổ sung org.springframework.roo.addon.tostring tạo ra một phương thức
toString()hợp lệ cho bất kỳ lớp nào có chú thích
@RooToString.
**WebFlow**— Phần bổ sung org.springframework.roo.addon.web.flow cung cấp sự hỗ trợ để cấu hình và tích hợp các tính năng Spring Web Flow (Luồng Web Spring) trong dự án đích. **Web MVC Controller**(Bộ điều khiển MVC Web) — Phần bổ sung org.springframework.roo.addon.web.mvc.controller cung cấp sự hỗ trợ cho cấu hình và tích hợp các bộ điều khiển MVC của Spring trong dự án đích. **Web MVC Embedded**(Web MVC được nhúng) — Phần bổ sung org.springframework.roo.addon.web.mvc.embedded cung cấp phần mở rộng cho phần bổ sung MVC, cho phép bổ sung các tính năng nhúng như các bản đồ, các đoạn video, v.v.. vào các trang web. **Web MVC JSP**— Phần bổ sung org.springframework.roo.addon.web.mvc.jsp cấu hình và tích hợp các tính năng JSP MVC của Spring trong dự án đích. **Selenium**(Selen) — Phần bổ sung org.springframework.roo.addon.web.selenium cung cấp cấu hình và tích hợp các bài kiểm tra web Selen trong dự án đích.
Bây giờ chúng ta đã xem xét các thành phần cốt lõi của Spring Roo và các phần bổ sung cơ bản do Spring Roo cung cấp, hãy viết các phần bổ sung riêng của chúng ta.
## Môi trường thời gian chạy OSGi
Spring Roo được dựa trên OSGi, là lý tưởng cho kiến trúc phần bổ sung của Roo. OSGi cung cấp một cơ sở hạ tầng rất tốt để phát triển các ứng dụng hướng dịch vụ nhúng và mô đun.
Trình vỏ Roo sử dụng Apache Felix làm khung công tác thời gian chạy OSGi của mình
cùng với SCR (Service Component Runtime - Thời gian chạy của thành phần dịch vụ) để
quản lý thành phần và OBR (Repository Bundle OSGi – OSGi gói kho lưu trữ) cho độ
phân giải gói. Có sẵn các lệnh OSGi khác nhau trong trình vỏ Roo, mà bạn có thể xem
chúng bằng cách gõ lệnh
help osgi (Trợ giúp osgi), như
trong Liệt kê 1.
##### Liệt kê 1. Lệnh help của Roo với OSGi
roo> help osgi * osgi find - Finds bundles by name * osgi framework command - Passes a command directly through to the Felix shell infrastructure * osgi headers - Display headers for a specific bundle * osgi install - Installs a bundle JAR from a given URL * osgi log - Displays the OSGi log information * osgi obr deploy - Deploys a specific OSGi Bundle Repository (OBR) bundle * osgi obr info - Displays information on a specific OSGi Bundle Repository (OBR) bundle * osgi obr list - Lists all available bundles from the OSGi Bundle Repository (OBR) system * osgi obr start - Starts a specific OSGi Bundle Repository (OBR) bundle * osgi obr url add - Adds a new OSGi Bundle Repository (OBR) repository file URL * osgi obr url list - Lists the currently-configured OSGi Bundle Repository (OBR) repository file URLs * osgi obr url refresh - Refreshes an existing OSGi Bundle Repository (OBR) repository file URL * osgi obr url remove - Removes an existing OSGi Bundle Repository (OBR) repository file URL * osgi ps - Displays OSGi bundle information * osgi resolve - Resolves a specific bundle ID * osgi scr config - Lists the current SCR configuration * osgi scr disable - Disables a specific SCR-defined component * osgi scr enable - Enables a specific SCR-defined component * osgi scr info - Lists information about a specific SCR-defined component * osgi scr list - Lists all SCR-defined components * osgi start - Starts a bundle JAR from a given URL * osgi uninstall - Uninstalls a specific bundle * osgi update - Updates a specific bundle * osgi version - Displays OSGi framework version
## Lệnh tạo phần bổ sung của Spring Roo
Spring Roo được gói chung cùng với các lệnh tạo phần bổ sung để tạo ra các kiểu của
các phần bổ sung khác nhau. Add-on Creator, trưng ra nhiều lệnh
addon create (tạo phần bổ sung), cũng là một phần bổ sung Roo. Roo hiện
hỗ trợ bốn kiểu phần bổ sung:
**Phần bổ sung quốc tế**— Phần bổ sung này hỗ trợ các bản dịch ngôn ngữ bổ sung cho các ứng dụng Spring MVC được dựng lên của Roo (ví dụ, bản dịch bổ sung cho ngôn ngữ Hin-đi). **Phần bổ sung đơn giản**— Phần bổ sung đơn giản hỗ trợ các bổ sung nhỏ cho các dự án phụ thuộc hoặc cấu hình dự án hoặc cả hai (ví dụ, thực hiện một số sửa đổi pom.xml của maven giống như việc bổ sung một số tệp lưu trữ Java (JAR) hoặc các trình cắm thêm Maven). **Phần bổ sung nâng cao**— Phần bổ sung này làm công việc nặng nhọc và được sử dụng để xây dựng một phần bổ sung Spring Roo có đủ tính năng, có yêu cầu tạo mã Java (ví dụ, xây dựng một phần bổ sung có thể viết các phương thức
equals(bằng nhau) và
hashcode(mã băm) cho đối tượng miền của bạn). Đã có một phần bổ sung cộng đồng cho các chức năng này.
**Phần bổ sung trình bao bọc**— Phần bổ sung này bao bọc một tạo phẩm Maven để tạo ra một gói tuân thủ-OSGi. Phần bổ sung này cần thiết khi một phần bổ sung yêu cầu một phụ thuộc để hoàn thành chức năng của nó. Ví dụ, phần bổ sung kỹ thuật đảo ngược cơ sở dữ liệu của Spring Roo yêu cầu trình điều khiển JDBC Postgres để hoàn thành nhiệm vụ của mình, vì vậy bạn sẽ bọc trình điều khiển JDBC Postgres nhờ sử dụng phần bổ sung này.
Các phần bổ sung này tạo ra các lệnh để giảm nhẹ việc phát triển phần bổ sung Roo bằng cách tạo các phần bổ sung mới như sau:
- Đã tích hợp với việc kiểm soát mã nguồn SVN (Subversion - Phiên bản con) của Google Code (Mã Google).
- Đã lưu trong một kho lưu trữ Maven công khai được tạo ra như là một phần của dự án mã Google.
- Tương thích với RooBot, một dịch vụ lưu trữ trên VMware để tạo chỉ mục nội dung
quan trọng trong các tệp OBR công khai của Roo. Các tệp OBR là một biểu diễn
siêu dữ liệu gói dựa trên XML. Để phù hợp với RooBot, các phần bổ sung sẽ là:
- Tuân thủ-OSGi.
- Các tạo phẩm do PGP ký với các khóa công khai.
- Đã đăng ký thông qua giao thức httppgp://.
Khi sử dụng lệnh tạo phần bổ sung
addon create của Roo,
bạn sẽ nhận được tất cả các tính năng đã đề cập ở trên, được cấu hình tự động cho
các phần bổ sung của bạn. Điều này chắc chắn làm giảm thời gian tạo và xuất bản các
phần bổ sung ra thế giới bên ngoài.
Trước khi chúng ta bắt đầu viết các phần bổ sung, hãy chắc chắn rằng bạn có một môi
trường chức năng của Spring Roo. Có thể tìm thấy các hướng dẫn để cài đặt Spring Roo
trong
[Phần 1](http://www.ibm.com/developerworks/vn/library/12/os-springroo1/index.html) của loạt bài này.
## Tôi muốn hỗ trợ ngôn ngữ Hin-đi (tạo phần bổ sung i18n)
Khi bạn tạo một ứng dụng web dựa trên MVC của Spring bằng cách sử dụng Spring Roo,
bạn có thể thêm sự hỗ trợ cho các ngôn ngữ khác nhau bằng lệnh
web mvc language (ngôn ngữ mvc web). Spring Roo hỗ trợ tiếng Anh, tiếng
Đức, tiếng Tây Ban Nha, Ý, Hà Lan và Thụy Điển, có thể dùng ngay được. Hỗ trợ quốc
tế được cung cấp bởi phần bổ sung Web MVC JSP (Web MVC JavaServer Pages - Các trang
JavaServer của MVC web), được kích hoạt chỉ sau khi bạn có các tệp JSPX trong thư
mục webapp của mình. Các tệp JSPX do một lệnh của trình điều khiển tạo ra và lệnh
này có thể chuyển đổi một ứng dụng dựa vào JAR đơn giản thành một ứng dụng web MVC
của Spring.
Là một người Ấn Độ, tôi muốn bổ sung sự hỗ trợ tiếng Hin-đi trong ứng dụng web của
mình. Spring Roo cung cấp một lệnh
addon create i18n,
trong đó cung cấp một phần mở rộng cho
lệnh web mvc install
language (ngôn ngữ cài đặt mvc web) để bổ sung sự hỗ trợ cho một ngôn ngữ
mới như Hin-đi. Điều duy nhất mà nó đòi hỏi là bản dịch của tệp messages.properties
theo ngôn ngữ dự kiến.
Khi Spring Roo tạo ra một ứng dụng web MVC của Spring, nó tạo ra hai tệp đặc tính: application.properties và messages.properties. Tệp application.properties chứa các thuộc tính đặc trưng-ứng dụng, như tên của ứng dụng. Tệp messages.properties chứa các đặc tính, không đặc trưng cho bất kỳ ứng dụng nào, như thông báo "Bạn có chắc chắn muốn xóa mục này không?" khi bạn nhấn vào nút xóa hoặc các thông báo như đăng nhập, đăng xuất, v.v.. Vì thế, khi bạn viết một phần bổ sung i18n, bạn phải cung cấp bản dịch cho tệp messages.properties.
Bây giờ chúng ta đã bàn về sự hỗ trợ quốc tế mặc định trong Spring Roo, chúng ta hãy
viết một phần bổ sung i18n để có thể bổ sung sự hỗ trợ ngôn ngữ Hin-đi. Tôi sẽ hướng
dẫn cách bạn có thể thiết lập một dự án dựa theo mã của Google, viết một phần bổ
sung bằng cách sử dụng lệnh, xuất bản và phát hành nó ra thế giới bên ngoài, cuối
cùng đăng ký với dịch vụ RooBot. Việc đăng ký với dịch vụ RooBot rất quan trọng vì
điều này sẽ cho phép RooBot tạo chỉ mục phần bổ sung của bạn và hiển thị nó khi các
nhà phát triển khác tìm kiếm bằng cách sử dụng lệnh
addon
search (tìm kiếm phần bổ sung).
### Thiết lập dự án
[Tài liệu
hướng dẫn Spring Roo](http://www.springsource.org/roo/guide?w=simple-addons#d4e2621) giải thích rõ việc thiết lập dự án của bạn và kho lưu
trữ Maven dựa trên mã Google, vì thế tôi sẽ không nhắc lại nó nữa. Tôi chỉ lưu ý
rằng tôi sẽ sử dụng tên dự án là "roo-hind-addon."
### Tạo một phần bổ sung i18n
Một khi bạn đã thiết lập dự án, bạn sẽ có một thư mục rỗng có tên là roo-hindi-addon
(phần bổ sung-tiếng hin đi-Roo). Đi vào thư mục đó và gõ
lệnh
roo. Khi ở trong trình vỏ, gõ lệnh
addon create
i18n. Nếu ấn phím tab, bạn sẽ thấy rằng lệnh này có bảy thuộc tính. Trong
số bảy thuộc tính này, ba thuộc tính là bắt buộc:
topLevelPackage (gói mức cao nhất của phần bổ sung mới),
locale (các chữ viết tắt tên địa phương như "it" cho nước Ý
và
messageBundle (đường dẫn đủ điều kiện đến tệp
message_xx.properties, ở đây
*xx* là tên địa phương). Bốn thuộc tính khác là
tùy chọn:
language (tên đầy đủ của ngôn ngữ),
flagGraphic (đường dẫn đầy đủ đến tệp xx.png, ở đây
*xx* là tên lá cờ),
description (mô tả của
phần bổ sung) và
projectName (tên của dự án (nếu không
được cung cấp, hãy sử dụng tên gói mức cao nhất)). Tôi sẽ đề nghị bạn sử dụng thuộc
tính
projectName và bảo đảm giá trị của nó là tên của dự
án được lưu trữ dựa theo mã Google. Vì vậy, trong trường hợp của chúng ta,
projectName sẽ là roo-hindi-addon.
Trong số các thuộc tính đã đề cập ở trên, quan trọng nhất là
messageBundle, chỉ rõ tệp messages.properties đã dịch. Để dịch tệp
messages.properties sang ngôn ngữ Hin-đi, tùy chọn dễ nhất là sử dụng một dịch vụ
như
[Google translate](http://translate.google.com/#),
(Phiên dịch của Google), chuyển đổi mỗi đặc tính theo từng cái một, sau đó viết
chúng vào tệp messages_hi.properties. Tuy nhiên, dịch vụ này không làm việc trong
trường hợp của chúng ta vì các tệp đặc tính Java sử dụng tiêu chuẩn mã hóa
ISO-8859-1, không hỗ trợ các ký tự Hin-đi. Để khắc phục vấn đề này, tôi sử dụng một
trình cắm thêm Eclipse tên là Eclipse ResourceBundle Editor (trình soạn thảo gói tài
nguyên Eclipse), cho phép bạn chuyển đổi và tạo ra các gói tài nguyên cho các ngôn
ngữ khác nhau. Bạn có thể cài đặt nó bằng cách sử dụng trang web cập nhật [http://www.nightlabs.de/updatesites/development/](http://www.nightlabs.de/updatesites/development/). Việc chuyển đổi tệp
messages.properties sang tệp messages_hi.properties không nằm trong phạm vi của bài
này. Trình cắm thêm Editor ResourceBundle dễ sử dụng. Xin lưu ý là nếu các ký tự
ngôn ngữ được hỗ trợ, thì không cần sử dụng trình soạn thảo ResourceBundle nữa. Tệp
messages_hi.properties sẽ trông giống như Liệt kê 2.
##### Liệt kê 2. Tệp messages_hi.properties ví dụ mẫu
button_cancel = \u0930\u0926\u094D\u0926 button_end = \u0905\u0902\u0924 button_find = \u0916\u094B\u091C\u0947\u0902 button_home = \u0918\u0930 ...
Xem
[toàn bộ tệp](https://gist.github.com/972035). Một khi
bạn có tệp messages_hi.properties đã dịch, bạn đã sẵn sàng để tạo phần bổ sung này
bằng cách chỉ cần gõ một lệnh duy nhất. Bạn có thể tạo phần bổ sung tiếng Hin-đi
bằng cách gõ lệnh từ Liệt kê 3 vào trình vỏ Roo.
##### Liệt kê 3. Lệnh để tạo phần bổ sung tiếng Hin-đi
addon create i18n --locale hi --topLevelPackage org.xebia.roo.addon.i18n.hindi --messageBundle <location to messages_hi.properties> \ --language hindi --projectName roo-hindi-addon --flagGraphic <full path to flag hi.png>
Liệt kê 4 cho thấy các tạo phẩm do lệnh
addon create i18n
tạo ra.
##### Liệt kê 4. Các tạo phẩm được tạo ra
Created ROOT/pom.xml Created ROOT/readme.txt Created ROOT/legal Created ROOT/legal/LICENSE.TXT Created SRC_MAIN_JAVA Created SRC_MAIN_RESOURCES Created SRC_TEST_JAVA Created SRC_TEST_RESOURCES Created SRC_MAIN_WEBAPP Created SRC_MAIN_RESOURCES/META-INF/spring Created ROOT/src/main/assembly Created ROOT/src/main/assembly/assembly.xml Created SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi Created SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi/messages_hi.properties Created SRC_MAIN_RESOURCES/org/xebia/roo/addon/i18n/hindi/hi.png Created SRC_MAIN_JAVA/org/xebia/roo/addon/i18n/hindi Created SRC_MAIN_JAVA/org/xebia/roo/addon/i18n/hindi/HindiLanguage.java
Lệnh này đã tạo ra một dự án Maven có thể được nhập khẩu vào Eclipse (với m2eclipse)
hoặc Bộ công cụ SpringSource thông qua
**File > Import > Maven >
Existing Maven projects**. Bạn không cần nhập khẩu dự án này bởi vì chúng
ta không cần sửa đổi phần bổ sung này.
Bây giờ chúng ta có thể cài đặt phần bổ sung này, sử dụng nó trong các dự án của chúng ta và xuất bản nó ra thế giới bên ngoài. Nhưng trước tiên, chúng ta hãy bàn về một số các tạo phẩm để hiểu rõ hơn về mã được tạo ra:
- pom.xml — Tạo phẩm này là một cấu hình dự án Maven tiêu chuẩn. Pom.xml được tạo có rất nhiều trình cắm thêm được cấu hình sẵn, thực hiện công việc liên quan để ký các tạo phẩm bằng PGP, phát hành phần bổ sung này bằng trình cắm thêm phát hành Maven và tạo các gói OSGi bằng trình cắm thêm gói Maven. Nó cũng bổ sung các phụ thuộc OSGi và Felix vào dự án, mà các phụ thuộc này cần cho phần bổ sung để chạy bên trong trình vỏ Roo.
- assembly.xml — Tạo phẩm này định nghĩa các cấu hình được trình cắm thêm lắp ráp Maven sử dụng để đóng gói phần bổ sung.
- messages_hi.properties — Tạo phẩm này là tệp bó thông báo mà chúng ta đã cung cấp trong lúc tạo phần bổ sung, được sao chép vào thư mục tài nguyên.
- hi.png — Tạo phẩm này là tệp PNG lá cờ mà chúng ta đã cung cấp trong khi tạo phần bổ sung, được sao chép vào thư mục tài nguyên.
- HindiLanguage.java — Tạo phẩm này là tệp Java duy nhất do phần bổ sung này tạo ra, được sử dụng để thu nhận thông tin tương ứng với ngôn ngữ cụ thể. Ví dụ, nó cung cấp tên địa phương, tệp tài nguyên gói thông báo, v.v..
### Thêm sự hỗ trợ tiếng Hin-đi vào ứng dụng của chúng ta
Bây giờ tôi sẽ cho bạn thấy cách bạn có thể thêm sự hỗ trợ tiếng Hin-đi vào ứng dụng của mình bằng cách sử dụng phần bổ sung mà chúng ta vừa mới tạo ra:
- Thoát khỏi trình vỏ Roo và chạy lệnh
mvn clean install. Trong quá trình xây dựng, lệnh này sẽ yêu cầu cụm từ mật khẩu GPG của bạn.
- Sau khi đã xây dựng phần bổ sung Roo, hãy mở dòng lệnh mới và tạo một thư mục có tên là i18n-hindi-client (máy khách-tiếng Hin-đi-i18n). Chúng ta sẽ tạo ra một máy khách đơn giản cho phần bổ sung của mình.
- Vào thư mục i18n-hindi-client và gõ lệnh
roo.
- Thực hiện các lệnh sau trong trình vỏ Roo. Việc này sẽ tạo ra một ứng dụng web
MVC đơn giản của Spring.
##### Liệt kê 5. Các lệnh Roo để tạo ra ứng dụng web MVC
project --topLevelPackage com.shekhar.roo.i18n.client \ --projectName i18n-hindi-client persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY entity --class ~.domain.MyUser field string --fieldName name --notNull controller all --package ~.web
- Gõ lệnh này và nhấn phím tab:
web mvc language --code de en es it nl sv
Bạn sẽ không thấy sự hỗ trợ ngôn ngữ Hin-đi ở đâu cả. Điều này là do chúng ta vẫn chưa cài đặt phần bổ sung tiếng Hin-đi.
- Để cài đặt phần bổ sung này, hãy gõ:
osgi start --url
[file:///](../../../../)<location to addon target folder>/org.xebia.roo.addon.i18n.hindi-0.1.0.BUILD-SNAPSHOT.jar
Lệnh này sẽ cài đặt và kích hoạt phần bổ sung tiếng Hin-đi Spring Roo của chúng ta. Bạn có thể xem trạng thái của phần bổ sung này bằng cách sử dụng lệnh
osgi ps, hiển thị thông tin gói OSGi và tình trạng của nó như sau:
[ 95] [Active ] [ 1] roo-hindi-addon (0.1.0.BUILD-SNAPSHOT)
- Một lần nữa, gõ lệnh
web mvc language –codevà nhấn phím tab. Lúc này, bạn sẽ thấy một mã cho ngôn ngữ Hin-đi. Chọn mã và sự hỗ trợ ngôn ngữ Hin-đi sẽ được thêm vào ứng dụng của bạn.
web mvc language –code hi
- Thoát khỏi trình vỏ Roo và gõ lệnh
mvn tomcat:run. Bạn sẽ thấy lá cờ Ấn Độ ở cuối trang. Nhấn chuột vào lá cờ đó và ứng dụng của bạn sẽ được hiển thị bằng tiếng Hin-đi, như trong Hình 2.
##### Hình 2. Sự hỗ trợ ngôn ngữ Hin-đi
Một khi bạn đã kiểm tra xem phần bổ sung này có đang hoạt động tốt không trong hệ thống phát triển của mình, bạn có thể đẩy phần bổ sung vào dự án mã Google mà chúng ta đã tạo ra.
### Triển khai trong ứng dụng
Bây giờ chúng ta đã thấy rằng phần bổ sung mà chúng ta đã tạo ra đang hoạt động, chúng ta hãy xem xét cách tạo sẵn ngôn ngữ Hin-đi cho ứng dụng này:
- roo-hindi-addon đã được khởi động khi sử dụng lệnh
osgi start.
- Khi phần bổ sung này khởi động, lớp
HindiLanguageđã được
lệnh addon create i18ntạo ra, được đăng ký với i18nComponent (Thành phần i18n), là một người nghe dịch vụ OSGi để đăng ký và không đăng ký các phần bổ sung i18n. Lớp
HindiLanguageđược đánh dấu với các chú thích
@Componentvà
@Servicedo Apache Felix cung cấp. Các chú thích này bảo đảm rằng các thành phần và các dịch vụ được đăng ký bằng trình vỏ Roo và sẵn sàng sử dụng.
- Khi chúng ta gõ lệnh
web mvc install language –codevà nhấn phím tab, dịch vụ hoàn thành bằng phím tab gọi phương thức
getSupportedLanguages()của lớp i18nComponent, phương thức này trả về
java.util.Setcủa các phần bổ sung i18n. Do lớp
HindiLanguageđã được đăng ký với i18nComponent, nên nó cũng được trả về.
### Xuất bản các phần bổ sung ra thế giới bên ngoài
Thật dễ xuất bản các phần bổ sung ra thế giới bên ngoài do lệnh
create của Roo đã thực hiện hầu hết mọi thứ cho chúng ta bằng cách cài
đặt tất cả các trình cắm thêm Maven cần thiết. Chuyển đến thư mục gốc của dự án và
gõ các lệnh trong Liệt kê 6.
##### Liệt kê 6. Xuất bản dự án Roo
svn add pom.xml src/ legal/ readme.txt svn commit -m "Roo Hindi Addon first version" mvn release:prepare release:perform
Trình cắm thêm phát hành Maven sẽ hỏi phiên bản phát hành, tên thẻ và phiên bản phát triển. Bạn chỉ có thể chọn mặc định và tiến lên. Sẽ mất vài phút để phát hành và xuất bản các tạo phẩm vào dự án mã Google. Sau đó, bạn có thể xem các tạo phẩm của phần bổ sung trong dự án mã Google của mình.
### Đăng ký phần bổ sung của bạn với RooBot
Một khi bạn đã phát hành trình cắm thêm của mình, bạn có thể gửi nó qua thư điện tử
tới địa chỉ
[s2-roobot@vmware.com](mailto:s2-roobot@vmware.com) để đăng ký kho lưu trữ phần bổ sung của bạn. Dòng chủ
đề của thư điện tử phải chứa tệp repository.xml. Ví dụ, với phần bổ sung mà chúng ta
vừa tạo ra, tệp repository.xml là [http://code.google.com/p/roo-hindi-addon/source/browse/repo/repository.xml](http://code.google.com/p/roo-hindi-addon/source/browse/repo/repository.xml).
Để biết thêm thông tin về đăng ký với RooBot, xin vui lòng tham khảo [tài liệu hướng dẫn Spring Roo](http://www.springsource.org/roo/guide?w=simple-addons#d4e2916).
## Tôi muốn Giám sát ứng dụng Java của mình (tạo phần bổ sung đơn giản)
Có một yêu cầu phổ biến trong nhiều ứng dụng doanh nghiệp, đó là bạn muốn giám sát ứng dụng Java của mình để xác định các nghẽn cổ chai hiệu năng của ứng dụng. Tôi cũng có một yêu cầu tương tự, vì vậy tôi quyết định xem xét một số giải pháp nguồn mở có sẵn. JAMon (Java Application Monitor – Bộ giám sát ứng dụng Java) là một API Java an toàn-luồng, hiệu năng cao, miễn phí cho phép bạn dễ dàng giám sát các ứng dụng sản xuất.
Để bổ sung sự hỗ trợ JAMon trong ứng dụng web của bạn:
- Bạn phải thêm tệp lưu trữ Java (JAR) của jamon vào tệp pom.xml của mình.
- Bạn phải định nghĩa một bean
JamonPerformanceMonitorInterceptortrong tệp ngữ cảnh ứng dụng của mình. Định nghĩa bean mẫu trông giống như mã trong Liệt kê 7.
##### Liệt kê 7. Mã JamonPerformanceMonitorInterceptor
<bean id="jamonPerformanceMonitorInterceptor" class=\ "org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor"> <property name="trackAllInvocations" value="true"></property> <property name="useDynamicLogger" value="true"></property> </bean> <bean id="autoProxyCreator" class=\ "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <idref bean="jamonPerformanceMonitorInterceptor" /> </list> </property> <property name="beanNames"> <list> <value>speakerController</value> <value>talkController</value> </list> </property> </bean>
Đây không phải là một định nghĩa bean đơn giản mà bất kỳ nhà phát triển nào cũng có thể dễ dàng nhớ được và tôi nghĩ rằng sẽ thật thú vị nếu tôi có thể tự động hóa cấu hình văn bản soạn sẵn này. Vì vậy, tôi quyết định viết một phần bổ sung có thể tự động hoá quá trình bổ sung phụ thuộc JAMon và nối vào bean của bộ chặn. Bạn quyết định chọn cái nào khi bạn cần một phần bổ sung đơn giản hay nâng cao?
- Sử dụng một
**phần bổ sung đơn giản**khi bạn muốn thêm các phụ thuộc Maven, thêm các tạo phẩm cấu hình hoặc thêm cả hai vào dự án của bạn.
- Sử dụng một
**phần bổ sung nâng cao**khi bạn cần viết phần bổ sung đủ tính năng để nâng cao các kiểu Java hiện có, giới thiệu các kiểu Java mới và các ITD (Khai báo giữa các kiểu) của AspectJ hoặc thực hiện cả hai dự án của bạn.
Yêu cầu của chúng ta là bổ sung jamon.jar vào classpath và viết một tệp ngữ cảnh của ứng dụng sẽ chứa định nghĩa bean của mình. Sẽ tốt hơn là viết một tệp ngữ cảnh ứng dụng Spring mới chứ không sử dụng các tệp ngữ cảnh hiện có vì nó giúp mô đun hóa các ngữ cảnh ứng dụng. Từ các yêu cầu này, rõ ràng là chúng ta nên viết một phần bổ sung đơn giản có thể bổ sung sự hỗ trợ JAMon cho bất kỳ ứng dụng web nào.
### Thiết lập dự án
Chúng ta cần thực hiện thiết lập dự án theo cách tương tự như chúng ta đã làm với phần bổ sung quốc tế. Tôi sẽ đặt tên dự án này là "spring-roo-addon-jamon".
### Tạo một phần bổ sung đơn giản
Một khi bạn đã thiết lập dự án này, bạn sẽ có một thư mục có tên là spring-roo-addon-jamon chỉ với thư mục .svn. Chuyển vào thư mục spring-roo-addon-jamon và khởi động trình vỏ Spring Roo. Sau đó, gõ lệnh sau:
addon create simple --topLevelPackage org.xebia.roo.addon.jamon \ --projectName spring-roo-addon-jamon
Thế là xong! Phần bổ sung được tạo ra.
### Cài đặt phần bổ sung đã tạo
Bạn có thể cài đặt phần bổ sung bằng lệnh sau:
osgi start --url file://<Location to addon target folder>/org.xebia.roo.addon.jamon-0.1.0.BUILD-SNAPSHOT.jar
Một khi bạn đã cài đặt phần bổ sung này, hãy tạo ra một máy khách đơn giản như chúng ta đã tạo ra cho phần bổ sung i18n để kiểm tra. Phần bổ sung đã tạo ra này đưa ra hai lệnh:
- Lệnh
say hello, một lệnh in một thông báo chào mừng trên trình vỏ Roo . Lệnh này sẽ luôn có sẵn và bạn có thể gõ nó bất cứ lúc nào trong khi trình vỏ Roo đang chạy.
- Lệnh
web mvc install tagsthay thế các thẻ MVC mặc định được tạo ra khi bạn dựng lên một ứng dụng web. Lệnh này sẽ chỉ có sẵn khi bạn đã tạo ra một ứng dụng web.
### Xem xét mã đã tạo
Bây giờ bạn đã kiểm tra phần bổ sung, hãy xem các tệp được phần bổ sung này tạo ra, như trong Liệt kê 8.
##### Liệt kê 8. Các tệp được tạo ra cho spring-roo-addon-jamon
Created ROOT/pom.xml Created ROOT/readme.txt Created ROOT/legal Created ROOT/legal/LICENSE.TXT Created SRC_MAIN_JAVA Created SRC_MAIN_RESOURCES Created SRC_TEST_JAVA Created SRC_TEST_RESOURCES Created SRC_MAIN_WEBAPP Created SRC_MAIN_RESOURCES/META-INF/spring Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonCommands.java Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonOperations.java Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonOperationsImpl.java Created SRC_MAIN_JAVA/com/shekhar/roo/addon/jamon/JamonPropertyName.java Created ROOT/src/main/assembly Created ROOT/src/main/assembly/assembly.xml Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon/info.tagx Created SRC_MAIN_RESOURCES/com/shekhar/roo/addon/jamon/show.tagx
Các tạo phẩm pom.xml, assembly.xml, LICENSE.TXT và readme.txt giống như các tạo phẩm được phần bổ sung i18n tạo ra. Chúng ta thảo luận chúng ở trên, vì thế tôi sẽ không nói lại về chúng ở đây. Các tạo phẩm được quan tâm nhiều hơn là JamonCommands, JamonOperations, JamonOperationsImpl và JamonPropertyName. Chúng ta hãy bàn về chúng từng cái một để hiểu mã được tạo ra bằng lệnh phần bổ sung đơn giản.
**JamonCommands.java:JamonCommands**— Đây là một lớp, thực hiện một giao diện đánh dấu có tên là CommandMarker và trưng ra hai lệnh, say hello và web mvc install tags, như trong Liệt kê 9.
##### Liệt kê 9. Mã được tạo ra từ JamonCommands.java:JamonCommands
@Component @Service public class JamonCommands implements CommandMarker { @Reference private JamonOperations operations; @Reference private StaticFieldConverter staticFieldConverter; protected void activate(ComponentContext context) { staticFieldConverter.add(JamonPropertyName.class); } protected void deactivate(ComponentContext context) { staticFieldConverter.remove(JamonPropertyName.class); } @CliAvailabilityIndicator("say hello") public boolean isSayHelloAvailable() { return true; } @CliCommand(value = "say hello", help = "Prints welcome message to the Roo shell") public void sayHello(@CliOption(key = "name", mandatory = true, help = "State your name") String name, @CliOption(key = "contryOfOrigin", mandatory = false, help = "Country of origin") JamonPropertyName country) { log.info("Welcome " + name + "!"); log.warning("Country of origin: " + (country == null ? \ JamonPropertyName.NOT_SPECIFIED.getPropertyName() : country.getPropertyName())); log.severe("It seems you are a running JDK " + operations.getProperty("java.version")); log.info("You can use the default JDK logger anywhere in your" + " add-on to send messages to the Roo shell"); } @CliAvailabilityIndicator("web mvc install tags") public boolean isInstallTagsCommandAvailable() { return operations.isInstallTagsCommandAvailable(); } @CliCommand(value = "web mvc install tags", help="Replace default Roo MVC tags used for scaffolding") public void installTags() { operations.installTags(); } }
Tôi đã gỡ bỏ tất cả các nhận xét do bộ tạo mã này tạo ra để giảm sự dài dòng của mã này. Chúng ta hãy xem xét các thành viên quan trọng của lớp này:
**CommandMarker**— Tất cả các lớp lệnh cần thực hiện giao diện CommandMarker và cần được chú thích bằng các chú thích
@Componentvà
@Servicesao cho chúng được đăng ký và các lệnh của chúng trở nên có sẵn trong trình vỏ Roo. Các trường được chú thích bằng
@Referencelà các phụ thuộc của lớp
JamonCommandsđược thùng chứa OSGi Roo bên dưới chèn vào. Tất cả các lớp được chú thích bằng
@Componentvà
@Service annotationscó thể được chèn vào trong các phần bổ sung khác.
**Các phương thức Activate (Kích hoạt) và Deactivate (Không kích hoạt)**— Các phương thức
activatevà
deactivatelà các phương thức được gọi khi bạn cài đặt phần bổ sung bằng cách sử dụng lệnh
addon installhoặc loại bỏ phần bổ sung bằng cách sử dụng lệnh
addon remove. Các phương thức này cho phép bạn móc nối vào vòng đời của phần bổ sung, do thùng chứa OSGi Roo bên dưới quản lý.
**Các phương thức được chú thích bằng**— Các phương thức được chú thích bằng
@CliAvailabilityIndicator
@CliAvailabilityIndicatorlà các phương thức giúp ẩn giấu các lệnh khi chúng không có sẵn. Ví dụ, lệnh
security setup(thiết lập bảo mật), để cài đặt Spring Security vào dự án, không nhìn thấy được cho đến khi dự án trở thành một ứng dụng web. Lệnh này không đòi hỏi là bạn cần có các phương thức như vậy, nhưng chúng có ích vì chúng không cho phép người dùng thực hiện các lệnh mà không bảo đảm ở thời điểm đó. Ví dụ, việc thực hiện lệnh security setup trước khi người dùng có một ứng dụng web chẳng có ý nghĩa gì cả.
**Các phương thức được chú thích bằng**— Các phương thức được chú thích bằng
@CliCommand
@CliCommandđăng ký lệnh này với trình vỏ Roo. Chú thích
@CliCommandcó hai thuộc tính:
value(giá trị), định nghĩa tên lệnh và
help(trợ giúp), định nghĩa thông báo trợ giúp được hiển thị khi bạn gõ lệnh
help. Mỗi lệnh có thể định nghĩa các thuộc tính bắt buộc và không bắt buộc bằng cách sử dụng chú thích
@CliOptionđược đưa ra như là một phần của lệnh. Ví dụ, lệnh
say hellocó một thuộc tính bắt buộc là
namevà thuộc tính không bắt buộc là
country.
**JamonOperationsImpl.java**— Các lớp lệnh cần thực hiện một số hoạt động khi thực hiện một lệnh. Các hoạt động này do các lớp hoạt động thực hiện.
JamonOperationsImpllà một lớp các hoạt động có trách nhiệm thực hiện các công việc thực tế, giống như việc bổ sung một phụ thuộc vào pom.xml hoặc sao chép tài nguyên tới vị trí mong muốn. Lớp
JamonOperationsImplthực hiện các hoạt động của nó bằng cách sử dụng các dịch vụ cốt lõi do khung công tác Spring Roo cung cấp. Ví dụ, để thêm một phụ thuộc, nó sử dụng giao diện
ProjectOperations. Để sao chép các tệp, nó sử dụng giao diện
FileManager. Chúng ta hãy xem xét mã dùng cho lớp
JamonOperationsImpl(xem Liệt kê 10) để hiểu rõ hơn về phần bổ sung Roo.
##### Liệt kê 10. JamonOpertionsImpl
@Component @Service public class JamonOperationsImpl implements JamonOperations { private static final char SEPARATOR = File.separatorChar; @Reference private FileManager fileManager; @Reference private ProjectOperations projectOperations; public boolean isInstallTagsCommandAvailable() { return projectOperations.isProjectAvailable() && fileManager.exists(projectOperations.getProjectMetadata(). getPathResolver().getIdentifier(Path.SRC_MAIN_WEBAPP, "WEB-INF" + SEPARATOR + "tags")); } public String getProperty(String propertyName) { Assert.hasText(propertyName, "Property name required"); return System.getProperty(propertyName); } public void installTags() { PathResolver pathResolver = projectOperations.getProjectMetadata().getPathResolver(); createOrReplaceFile(pathResolver.getIdentifier( Path.SRC_MAIN_WEBAPP, "WEB-INF" + SEPARATOR + "tags" + SEPARATOR + "util"), "info.tagx"); createOrReplaceFile(pathResolver.getIdentifier( Path.SRC_MAIN_WEBAPP, "WEB-INF" + SEPARATOR + "tags" + SEPARATOR + "form"), "show.tagx"); } private void createOrReplaceFile(String path, String fileName) { String targetFile = path + SEPARATOR + fileName; MutableFile mutableFile = fileManager.exists(targetFile) ? fileManager.updateFile(targetFile) : fileManager.createFile(targetFile); try { FileCopyUtils.copy(TemplateUtils.getTemplate(getClass(), fileName), mutableFile.getOutputStream()); } catch (IOException e) { throw new IllegalStateException(e); } } }
Lớp
JamonOperationsImplsử dụng dịch vụ:
isInstallTagsCommandAvailablekiểm tra xem lệnh đã có sẵn chưa và
installTagscài đặt các thẻ vào dự án đích. Để thực hiện các hoạt động này, lớp
JamonOperationsImplsử dụng một số dịch vụ và tiện ích cốt lõi của Spring Roo:
- Lớp
ProjectOperations : JamonOperationsImplsử dụng dịch vụ
ProjectOperationsđể kiểm tra xem dự án có sẵn chưa và để nhận được đường dẫn của thư mục tags (các thẻ).
- Lớp
FileManager : JamonOperationsImplsử dụng dịch vụ
FileManagerđể kiểm tra xem một tệp có tồn tại ở một đường dẫn cụ thể không và để nhận được bản cập nhật hoặc tạo ra một
MutableFile.
MutableFile(tệp có thể thay đổi được) là một lớp đặc trưng Roo biểu diễn một trình xử lý cho một tệp có thể được sửa đổi.
- Lớp tiện ích
TemplateUtils : TemplateUtilsđược sử dụng để thu được một
InputStreamcho các tệp khuôn mẫu (info.tagx và show.tagx) trong gói phần bổ sung của chúng ta.
- Lớp tiện ích
FileCopyUtils : FileCopyUtilsđược sử dụng để sao chép các khuôn mẫu (của
TemplateUtils) đến
MutableFile(của
FileManager).
- Lớp
### Sửa đổi một phần bổ sung để đáp ứng các yêu cầu của chúng ta
Trong phần đầu tiên về phần bổ sung đơn giản, chúng ta đã thảo luận hai yêu cầu mà chúng ta phải đáp ứng sao cho phần bổ sung của chúng ta có thể cấu hình JAMon trong bất kỳ ứng dụng web MVC nào của Spring. Các yêu cầu là:
- Bổ sung tệp lưu trữ Java (JAR) của JAMon vào pom.xml của bạn
- Định nghĩa một bean JamonPerformanceMonitorInterceptor trong tệp ngữ cảnh của ứng dụng.
Để đáp ứng các yêu cầu này, chúng ta sẽ thực hiện các thay đổi trong lớp
JamonCommands để hỗ trợ lệnh
jamon
setup. Sau đó, chúng ta sẽ bổ sung một hoạt động tương ứng với lệnh
jamon setup để thực hiện công việc thực tế để đáp ứng các
yêu cầu.
Lớp
**— Lớp JamonCommands**
JamonCommandsbây giờ sẽ có hai phương thức:
isInstallJamonđể kiểm tra xem lệnh
jamon setupcó sẵn chưa và
installJamonđể cài đặt JAMon khi thực hiện lệnh
jamon setup. (Liệt kê 11.)
##### Liệt kê 11. Mã cho JamonCommands
@Component @Service public class JamonCommands implements CommandMarker { private Logger log = Logger.getLogger(getClass().getName()); @Reference private JamonOperations operations; @CliAvailabilityIndicator("jamon setup") public boolean isInstallJamon() { return operations.isInstallJamonAvailable(); } @CliCommand(value = "jamon setup", help = "Setup Jamon into your project") public void installJamon() { operations.installJamon(); } }
Đây là tất cả những thứ mà chúng ta cần trong lớp
JamonCommands. Nó chỉ cần trưng ra lệnh
jamon
setup và phần công việc còn lại được ủy thác cho lớp
JamonOperationsImpl. (Liệt kê 12.)
##### Liệt kê 12. Mã cho JamonOperationsImpl
JamonOperationsImpl JamonOperationsImpl need to implement two methods – \ isInstallJamonAvailable() and installJamon(). The isinstallJamonAvailable() method returns a boolean indicating whether command is available at this location or not. I want to enable JAMon only for the web applications so we need to perform the check whether the project is a web application or not. To do that we will write the code as shown below public boolean isInstallJamonAvailable() { return projectOperations.isProjectAvailable() && fileManager.exists(projectOperations.getPathResolver() .getIdentifier(Path.SRC_MAIN_WEBAPP, "/WEB-INF/web.xml")); }
Mã được hiển thị trong Liệt kê 12 sử dụng dịch vụ
ProjectOperations để kiểm tra xem một dự án có sẵn tại vị trí này chưa
và để lấy đường dẫn của tệp web.xml (tệp web.xml chỉ tồn tại cho các ứng dụng web).
Dịch vụ
FileManager được sử dụng để kiểm tra xem tệp
web.xml có tồn tại tại vị trí theo quy định của
ProjectOperations không.
Phương thức thứ hai mà chúng ta cần thực hiện là
installJamon(), sẽ bổ sung phụ thuộc JAMon vào tệp pom.xml và thêm định
nghĩa bean cho webmvc-config.xml. Trước khi chúng ta viết mã cho phương thức này,
chúng ta phải tạo ra một tệp XML có tên là configuration.xml bên trong thư mục
src/main/resources/org/xebia/roo/addon/jamon. Cấu trúc thư mục,
org/xebia/roo/addon/jamon, giống như cấu trúc gói của phần bổ sung Roo của bạn. Tệp
configuration.xml định nghĩa phiên bản JAMon và phụ thuộc tệp lưu trữ Java (JAR) của
JAMon, như trong Liệt kê 13.
##### Liệt kê 13. Các nội dung của tệp configuration.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <configuration> <jamon> <properties> <jamon.version>2.4</jamon.version> </properties> <dependencies> <dependency> <groupId>com.jamonapi</groupId> <artifactId>jamon</artifactId> <version>${jamon.version}</version> </dependency> </dependencies> </jamon> </configuration>
Hãy viết mã để bổ sung phụ thuộc vào tệp pom.xml, như trong Liệt kê 14.
##### Liệt kê 14. Các nội dung của tệp pom.xml
public void installJamon() { Element configuration = XmlUtils.getConfiguration(getClass()); updatePomProperties(configuration); updateDependencies(configuration); } private void updatePomProperties(Element configuration) { List<Element> properties = \ XmlUtils.findElements("/configuration/jamon/properties/*" , configuration); for (Element property : properties) { projectOperations.addProperty(new Property(property)); } } private void updateDependencies(Element configuration) { List<Dependency> dependencies = new ArrayList<Dependency>(); List<Element> jamonDependencies = XmlUtils.findElements( "/configuration/jamon/dependencies/dependency", configuration); for (Element dependencyElement : jamonDependencies) { dependencies.add(new Dependency(dependencyElement)); } projectOperations.addDependencies(dependencies); }
Đây là một cơ chế tiêu chuẩn để bổ sung một phụ thuộc vào tệp pom.xml và bạn có thể
thấy nó được sử dụng trong hầu hết các phần bổ sung Roo. Mã được hiển thị trong Liệt
kê 14 là tự giải thích và sử dụng lớp tiện ích của Spring Roo, là
XmlUtils, để đọc nội dung từ tệp configuration.xml và sau
đó sử dụng dịch vụ
ProjectOperations để cập nhật tệp
pom.xml.
Một khi chúng ta đã bổ sung phụ thuộc pom.xml, chúng ta cần tạo ra một cấu hình
Spring riêng biệt, là web-jamon-config.xml, sẽ chứa định nghĩa bean cho
JamonPerformanceMonitorInterceptor.
##### Liệt kê 15. Các nội dung của web-jamon-config.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" \ xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=\ "http://www.springframework.org/schema/beans \ http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context \ http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc \ http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <bean id="jamonPerformanceMonitorInterceptor" class=\ "org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor"> <property name="trackAllInvocations" value="true"></property> <property name="useDynamicLogger" value="true"></property> </bean> <bean id="autoProxyCreator" class=\ "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <idref bean="jamonPerformanceMonitorInterceptor" /> </list> </property> <property name="beanNames"> <list> <value></value> </list> </property> </bean> </beans>
Trong tệp web-jamon-config.xml được hiển thị trong Liệt kê 15, chúng ta đã cấu hình tất cả mọi thứ cần thiết cho JAMon trong một ứng dụng dựa trên Spring. Điều duy nhất mà tôi đã không chỉ rõ là tên của các bean để giám sát. Bộ tạo mã không thể dự đoán điều này, do đó, nó được để lại cho các nhà phát triển phần bổ sung quy định.
Bây giờ chúng ta cần viết mã sẽ sao chép tệp web-jamon-config.xml này vào thư mục
WEB_INF/spring, nơi lưu trữ tệp webmvc-config.xml và mã cho câu lệnh
add import trong tệp webmvc-config.xml để nhập khẩu tệp web
jamon-config.xml. (Liệt kê 16.)
##### Liệt kê 16. Mã để xử lý manipulate pom.xml
public void installJamon() { // update pom.xml code PathResolver pathResolver =
projectOperations.getProjectMetadata().getPathResolver(); String resolvedSpringConfigPath = pathResolver.getIdentifier(Path.SRC_MAIN_WEBAPP,
"/WEB-INF/spring"); if (fileManager.exists(resolvedSpringConfigPath + "/web-jamon-config.xml")) { return; } copyTemplate("web-jamon-config.xml", resolvedSpringConfigPath); String webMvcConfigPath = resolvedSpringConfigPath + "/webmvc-config.xml"; new XmlTemplate(fileManager).update(webMvcConfigPath, new DomElementCallback() { public boolean doWithElement(Document document, Element root) { if (null == XmlUtils.findFirstElement\ ("/beans/import[@resource='web-jamon-config.xml']", root)) { Element element = document.createElement("import"); element.setAttribute("resource", "web-jamon-config.xml"); root.appendChild(element); return true; } return false; } }); } private void copyTemplate(String templateFileName, String resolvedTargetDirectoryPath) { try { FileCopyUtils.copy(TemplateUtils.getTemplate(getClass(), templateFileName), fileManager.createFile( resolvedTargetDirectoryPath + "/" + templateFileName).getOutputStream()); } catch (IOException e) { throw new IllegalStateException( "Encountered an error during copying of resources for Jamon addon.", e); } }
Lớp
XmlTemplate được sử dụng ở trên đến từ phần bổ sung
luồng web Spring. Vì vậy, bạn cần thêm một phụ thuộc cho phần bổ sung luồng web này
trong phần bổ sung của bạn. (Liệt kê 17.)
##### Liệt kê 17. Thêm phụ thuộc cho phần bổ sung luồng web
<dependency> <groupId>org.springframework.roo</groupId> <artifactId>org.springframework.roo.addon.web.flow</artifactId> <version>${roo.version}</version> <type>bundle</type> </dependency>
Trong Liệt kê 17,
roo.version là phiên bản của Roo mà bạn
đang sử dụng.
Điều cuối cùng chúng ta cần làm trong phần bổ sung này là cấu hình ghi nhật ký dự án
và thiết lập mức ghi nhật ký để theo dõi. Điều này được thực hiện bằng cách sử dụng
LoggingOperations, là một lớp các hoạt động cho phần
bổ sung
log4j. Để sử dụng lớp này, trước tiên chúng ta
cần thêm phụ thuộc của phần bổ sung ghi nhật ký vào tệp pom.xml, như trong Liệt kê
18.
##### Liệt kê 18. Mã XML để thêm phụ thuộc cho phần bổ sung ghi nhật ký
<dependency> <groupId>org.springframework.roo</groupId> <artifactId>org.springframework.roo.addon.logging</artifactId> <version>${roo.version}</version> <type>bundle</type> </dependency>
Sau khi thêm phụ thuộc này vào pom.xml, hãy thêm
LoggingOperation vào lớp
JamonOperationsImpl
bằng dòng sau:
@Reference private LoggingOperations loggingOperations;
Tiếp theo, thêm dòng sau vào phương thức
installJamon:
loggingOperations.configureLogging(LogLevel.TRACE, LoggerPackage.PROJECT);
Đó là tất cả mã mà chúng ta cần viết cho phần bổ sung này. Toàn bộ mã cho lớp
JamonOperationsImpl được hiển thị trong Liệt kê 19.
##### Liệt kê 19. Mã đã hoàn thành cho lớp JamonOperationsImpl
@Component @Service public class JamonOperationsImpl implements JamonOperations { @Reference private FileManager fileManager; @Reference private ProjectOperations projectOperations; @Reference private LoggingOperations loggingOperations; public boolean isInstallJamonAvailable() { return projectOperations.isProjectAvailable() && fileManager.exists(projectOperations.getPathResolver() .getIdentifier(Path.SRC_MAIN_WEBAPP,"/WEB-INF/web.xml")); } public void installJamon() { Element configuration = XmlUtils.getConfiguration(getClass()); updatePomProperties(configuration); updateDependencies(configuration); PathResolver pathResolver = projectOperations.getProjectMetadata().getPathResolver(); String resolvedSpringConfigPath = pathResolver.getIdentifier(Path.SRC_MAIN_WEBAPP, "/WEB-INF/spring"); if (fileManager.exists(resolvedSpringConfigPath + "/web-jamon-config.xml")) { return; } copyTemplate("web-jamon-config.xml", resolvedSpringConfigPath); String webMvcConfigPath = resolvedSpringConfigPath + "/webmvc-config.xml"; new XmlTemplate(fileManager).update(webMvcConfigPath, new DomElementCallback() { public boolean doWithElement(Document document, Element root) { if (null == XmlUtils.findFirstElement( "/beans/import[@resource='web-jamon-config.xml']", root)) { Element element = document.createElement("import"); element.setAttribute("resource", "web-jamon-config.xml"); root.appendChild(element); return true; } return false; } }); loggingOperations.configureLogging(LogLevel.TRACE, LoggerPackage.PROJECT); } private void copyTemplate(String templateFileName, String resolvedTargetDirectoryPath) { try { FileCopyUtils.copy( TemplateUtils.getTemplate(getClass(), templateFileName), fileManager.createFile(resolvedTargetDirectoryPath + "/" + templateFileName).getOutputStream()); } catch (IOException e) { throw new IllegalStateException( "Encountered an error during copying of resources for Jamon addon.", e); } } private void updatePomProperties(Element configuration) { List<Element> properties = XmlUtils .findElements("/configuration/jamon/properties/*",configuration); for (Element property : properties) { projectOperations.addProperty(new Property(property)); } } private void updateDependencies(Element configuration) { List<Dependency> dependencies = new ArrayList<Dependency>(); List<Element> jamonDependencies = XmlUtils.findElements( "/configuration/jamon/dependencies/dependency", configuration); for (Element dependencyElement : jamonDependencies) { dependencies.add(new Dependency(dependencyElement)); } projectOperations.addDependencies(dependencies); } }
Bạn có thể tải về toàn bộ mã nguồn của phần bổ sung này từ
[kho lưu trữ mã Google](http://code.google.com/p/spring-roo-addon-jamon/downloads/detail?name=spring-roo-addon-jamon.zip&can=2&q=). Bây giờ, hãy thêm sự hỗ trợ JAMon cho
ứng dụng của chúng ta, bằng cách sử dụng phần bổ sung mà chúng ta vừa mới tạo ra:
- Thoát khỏi trình vỏ roo và chạy lệnh
mvn clean install. Trong quá trình xây dựng, nó sẽ hỏi cụm từ mật khẩu GPG.
- Sau khi đã xây dựng phần bổ sung Roo, hãy mở một dòng lệnh mới và tạo ra một thư mục có tên là jamon-client. Chúng ta sẽ tạo ra một máy khách đơn giản cho phần bổ sung của chúng ta.
- Chuyển tới thư mục jamon-client và gõ lệnh
roođể mở một trình vỏ Roo.
- Thực hiện các lệnh của Liệt kê 20 trong trình vỏ Roo . Điều này sẽ tạo ra một
ứng dụng web MVC đơn giản của Spring.
##### Liệt kê 20. Tạo ứng dụng web MVC đơn giản
project --topLevelPackage com.shekhar.roo.jamon.client --projectName jamon-client persistence setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY entity --class ~.domain.MyUser field string --fieldName name --notNull controller all --package ~.web
- Để cài đặt phần bổ sung, gõ:
osgi start --url <a href="../../../../">file:///</a><location \ to addon target folder > /org.xebia.roo.addon.jamon-0.1.0.BUILD-SNAPSHOT.jar
Lệnh này sẽ cài đặt và kích hoạt phần bổ sung JAMon của chúng ta. Bạn có thể xem trạng thái của phần bổ sung này bằng cách sử dụng lệnh
osgi ps.
- Gõ lệnh
jamon setupvà bạn sẽ thấy JAMon đang được cấu hình trong ứng dụng của bạn. Nếu bây giờ bạn chạy ứng dụng của bạn bằng cách sử dụng lệnh
mvn tomcat:run, bạn sẽ không thấy bất kỳ bản ghi nhật ký nào trên giao diện điều khiển vì bạn đã không cấu hình bất kỳ bean nào để giám sát. Hãy cấu hình bean
myUserControllercủa chúng ta trong web-jamon-config.xml bằng mã từ Liệt kê 21.
##### Liệt kê 21. Cấu hình cho myUserController trong tệp web-jamon-config.xml
<bean id="autoProxyCreator" class=\ "org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="interceptorNames"> <list> <idref bean="jamonPerformanceMonitorInterceptor" /> </list> </property> <property name="beanNames"> <list> <value>myUserController</value> </list> </property> </bean>
- Bây giờ hãy chạy ứng dụng này bằng cách sử dụng lệnh
mvn tomcat:runvà bạn sẽ thấy các bản ghi nhật ký JAMon trong giao diện điều khiển maven của mình. Một mẫu được hiển thị trong Liệt kê 22.
##### Liệt kê 22. Bản ghi nhật ký JAMon mẫu ví dụ
TRACE MyUserController - JAMon performance statistics for method [MyUserController.populateMyUsers]: JAMon Label=MyUserController.populateMyUsers, Units=ms.: (LastValue=187.0, Hits=1.0, Avg=187.0, Total=187.0, Min=187.0, Max=187.0, Active=0.0, Avg Active=1.0, Max Active=1.0, First Access=Wed May 18 15:33:41 IST 2011, Last Access=Wed May 18 15:33:41 IST 2011)
Một khi bạn đã kiểm tra xem phần bổ sung của mình có đang làm việc tốt trong hệ thống phát triển của mình không, bạn có thể đẩy nó vào dự án mã của Google mà chúng ta đã tạo ra. Để xuất bản phần bổ sung này ra thế giới bên ngoài, hãy làm theo thủ tục tương tự như chúng ta đã dùng để xuất bản phần bổ sung i18n. Tương tự như vậy, để đăng ký phần bổ sung này với RooBot, hãy làm theo thủ tục đăng ký i18n.
## Kết luận
Chúng ta đã xem xét kiến trúc phần bổ sung của Spring Roo và cách viết các phần bổ sung quốc tế và đơn giản. Kiến trúc phần bổ sung rất quan trọng với Roo bởi vì nó đem lại cho Roo sự linh hoạt để nhanh chóng bổ sung các tính năng mới. Đối với các nhà phát triển, kiến trúc phần bổ sung này rất quan trọng vì nó cho phép họ đáp ứng các yêu cầu của mình mà không cần phải chờ các tính năng được triển khai trên toàn cầu. Sau đó, nếu một tính năng được tích hợp vào Roo, thì việc thay đổi cách thực hiện để loại bỏ giải pháp tùy chỉnh là khá đơn giản.
Trong Phần 4 của loạt bài "
[Giới thiệu Spring Roo](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp ?search_by=Giới+thiệu+Spring+Roo)" này, tôi sẽ nói về cách bạn có thể viết các phần bổ
sung trình bao bọc và nâng cao.
## Tài nguyên
### Học tập
- Hãy chắc chắn đọc "
[Phần 1](http://www.ibm.com/developerworks/vn/library/12/os-springroo2/index.html)" và [Phần 2](http://www.ibm.com/developerworks/vn/library/12/os-springroo3/index.html)của loạt bài này.
- Tìm hiểu thêm về các hàm Spring Roo bằng cách đọc
[tài liệu hướng dẫn Spring Roo](http://static.springsource.org/spring-roo/reference/html-single/index.html).
- Giúp đỡ và nhận sự trợ giúp trong
[Diễn đàn cộng đồng Spring Roo](http://forum.springsource.org/).
- Để nghe các cuộc phỏng vấn và thảo luận thú vị dành
cho các nhà phát triển phần mềm, hãy xem
[podcast trên developerWorks](http://www.ibm.com/developerworks/podcast/).
- Theo sát với
[webcasts và các sự kiện kỹ thuật](http://www.ibm.com/developerworks/offers/techbriefings/)của developerWorks.
- Theo dõi
[developerWorks trên Twitter](http://twitter.com/developerworks).
- Xem xét các hội nghị, các triển lãm thương mại, các
webcast và
[Các sự kiện](http://www.ibm.com/developerworks/views/opensource/events.jsp)khác sắp tới trên thế giới được các nhà phát triển nguồn mở của IBM quan tâm đến.
- Truy cập vào
[Vùng nguồn mở](http://www.ibm.com/developerworks/opensource?S_TACT=105AGY75)của developerWorks để biết rất nhiều thông tin hướng dẫn, các công cụ và các bản cập nhật dự án để giúp bạn phát triển với các công nghệ nguồn mở và sử dụng chúng với các sản phẩm của IBM, cũng như [các bài báo và các hướng dẫn phổ biến nhất](http://www.ibm.com/developerworks/opensource/library/os-top10.htmlS_TACT=105AGY75)của chúng tôi.
- Xem và tìm hiểu về IBM và các công nghệ và các chức
năng sản phẩm nguồn mở với
[các trình diễn theo yêu cầu miễn phí của developerWorks](http://www.ibm.com/developerworks/offers/lp/demos/S_TACT=105AGY75).
### Lấy sản phẩm và công nghệ
- Ðổi mới dự án phát triển
nguồn mở tiếp theo của bạn với
[phần mềm dùng thử IBM](http://www.ibm.com/developerworks/downloads/S_TACT=105AGY75), có sẵn để tải về hoặc trên đĩa DVD.
- Tải về
[các phiên bản đánh giá sản phẩm của IBM](http://www.ibm.com/developerworks/downloads/)hoặc [khám phá các bản dùng thử trực tuyến trong IBM SOA Sandbox](http://www.ibm.com/developerworks/downloads/soasandbox/S_TACT=105AGY75)và nhận được các công cụ phát triển ứng dụng thực hành của bạn và các sản phẩm phần mềm trung gian từ DB2®, Lotus®, Rational®, Tivoli® và WebSphere®.
### Thảo luận
- Tham gia vào
[các blog developerWorks](http://www.ibm.com/developerworks/blogs)và dành tâm trí cho cộng đồng developerWorks.
- Dành tâm trí cho
[cộng đồng developerWorks](http://www.ibm.com/developerworks/community). Kết nối với những người dùng developerWorks khác trong khi khám phá các blog, các diễn đàn, các nhóm và các wiki dựa vào-nhà phát triển.
## Bình luận
[Vùng dữ liệu trên developerWorks](http://www.ibm.com/developerworks/vn/views/data/libraryview.jsp)
Khám phá các bài viết xoay quanh lĩnh vực dữ liệu, Quản lý hệ thống thông tin
[Vùng mã nguồn mở trên developerWorks](http://www.ibm.com/developerworks/vn/views/opensource/libraryview.jsp)
Xem các bài viết về HTML, CSS, JavaScript,...
[Điện toán đám mây](http://www.ibm.com/developerworks/vn/views/cloud/libraryview.jsp)
Tìm hiểu về điện toán đám mây

Content-Type: text/html; charset=UTF-8


markdown:
Các khóa học Tiếng Anh này được thiết kế nhằm trang bị cho bạn kiến thức thi Chứng Chỉ Cambridge First. Các khóa luyện thi dành cho các trình độ khác nhau trong kì thi Cambridge hiện có tại Portsmouth, Anh:
[Chứng Chỉ Cambridge Advanced](/vi/cactruong-portsmouth/chung-chi-cambridge-advanced) (1), [Chứng Chỉ Cambridge Proficiency](/vi/cactruong-portsmouth/chung-chi-cambridge-proficiency) (1) [Phổ Biến Nhất](?sort=popular) [Được bình chọn nhất (tổng thể)](?sort=rating) [Chất lượng dạy học được đánh giá cao nhất](?sort=teaching) [Được bình chọn nhất (hoạt động xã hội)](?sort=social) [Giá thấp nhất](?sort=price) **Buổi học một tuần:**22 **Sĩ số tối đa trong một lớp:**12 **Lệ phí thi:**140 £ **Ngày Thi:**05.Thg 3.2016, 04.Thg 6.2016, 18.Thg 8.2016, 10.Thg 12.2016
| |
| |
Tổng cộng 2tuần đã bao gồm thuế
| |
| Hủy MIỄN PHÍ |[Các hạng mục khoá học (8)](#)
-
Chứng Chỉ Cambridge Advanced
-
Chứng Chỉ Cambridge First
-
Chứng Chỉ Cambridge Proficiency
-
Cơ Bản
-
IELTS
-
Ngôn Ngữ Thương Mại, Học Một-thầy-Một-trò
-
Ngôn Ngữ Thương Mại, Học Theo Nhóm
-
Nhóm Học Kết Hợp Cơ Bản & Thương Mại
[Nơi Ở (4)](#)
-
Căn hộ - ở chung / Khu Nhà
-
Khách sạn / Nhà nghỉ
-
Ở nhà người bản xứ
-
Ở nhà người bản xứ *
[Trang thiết bị (21)](#)
Quán ăn tự phục vụ
Máy bán đồ ăn nhẹ
Thư viện
Miễn phí sử dụng các phần mềm học tiếng sau thời gian trên lớp
Phòng chờ
Máy in cho học viên dùng
Bóng bàn
WIFI miễn phí
Phòng vệ sinh cho người khuyết tật
Khu vực dành cho cầu nguyện tại trường
Các món Halal hiện có tại trường
Nhà hàng
Phòng máy
Báo hàng ngày
Phòng vui chơi
Bàn hỗ trợ học viên
Chơi bi-a
Cây nước nóng lạnh miễn phí
Xe lăn có thể tiếp cận tới phòng học
Xe lăn có thể tiếp cận tới bộ phận lễ tân
Vật dụng tiện nghi cho việc rửa chân trước khi cầu nguyện
![](http://c0577872.cdn.cloudfiles.rackspacecloud.com/transparent26.gif)

Set-Cookie: __cfduid=d9b9c8833436654983f5e10cd7c6a1bda1469434417; expires=Tue, 25-Jul-17 08:13:37 GMT; path=/; domain=.languagecourse.net; HttpOnly

Server: cloudflare-nginx


markdown:
Thêm bài hát này vào danh sách Playlist
Lời đăng bởi: rappertinker
Rap ver 1 : Kuppj
Viết thêm 1 bài
A rap thêm 1 bài
Những cãm xúc trong tim a cứ ghép cho thật dài
Ngày mai, nếu fai? đón nhận 1 thất bại ... cho cả 2 .... ta sẽ cùng nắm tay đứng dậy bước tiếp dựng xây và làm lại
Ai ... đã làm cho con tim a rung động vào thao thức vào mỗi đêm.
Trong ... những khi gục ngã ai đánh thức dậy trái tim chĩ có e mà thôi người , người như vì sao trời , nguyện vì a trong tim âu lo , đắn đo , khiến đôi mắt yếu đuối nhức nhối fai rơi lệ
Chours 1 : Kuppj
Thật tuyệt đẹp giây phút
Dạo chơi cùng phố thân wen ngày xưa
Và cùng nhau bước trên con đường mưa
Tìm về hoa lá cây xanh thiên nhiên bình yên và hòa mình cùng theo gió
Thả hồn vào gió bay đến nơi xa
Và loài ong bướm minh chứng cho đôi ta
Là t.y sẽ mãi mãi thăng hoa như là ngày e đến
MELODY : Kuppj
Rồi từng ngày buồn giờ đã qa rồi
Tìm lại những sắc yêu có trong đời
Có kí ức xưa kia đã tan
Và trong bóng tối ta luôn cần nhau ng yêu hỡi
Mình lại cùng hòa nhịp mãi muôn đời
Tình yêu đẹp là tình có thế thôi ng yêu hỡi
Mình cùng xây giấc mơ khát khao đẹp tuyệt vời .
Rap ver 2 : Kuppj
MÃI mãi ... vẹn nguyên có 1 người
YÊU thương ... ngày qua ngày xanh tươi
CHĨ 1 mình e trog trái tim n&agra
Ginô Tống, Tuấn Kuppj
Tuấn Kuppj
Minh Thuận, Nhật Hào, Phương Thanh
Cà Dễ Dãi
xem thêm
rút gọn
Đơn vị chủ quản: Công ty Cổ phần NCT
Địa chỉ: Tòa nhà HAGL Safomec, 7/1 Thành Thái, P14, Q10, TP.HCM
GP MXH 499/GP-BTTTT
## Bình luận

Server: nginx+

Vary: Accept-Encoding, User-Agent

P3P: CP='NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM'


markdown:
**Đầu số :**
Sim số đẹp theo loại
Sim số đẹp theo giá
Sim số đẹp theo đầu số
- STT
- Số Sim
- Giá Tiền
- Mạng
- Đặt Mua
- 1
-
**090.639.8888**
-
**299,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0906398888.html)
- 2
-
**0975.36.36.36**
-
**179,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0975363636.html)
- 3
-
**09.66.44.77.44**
-
**19,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0966447744.html)
- 4
-
**04.6688.7788**
-
**19,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0466887788.html)
- 5
-
**0996.939.939**
-
**16,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0996939939.html)
- 6
-
**01265.36.36.36**
-
**15,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01265363636.html)
- 7
-
**01219.368.368**
-
**15,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01219368368.html)
- 8
-
**0.88888.2006**
-
**15,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0888882006.html)
- 9
-
**0981.868.968**
-
**15,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0981868968.html)
- 10
-
**0977.868.968**
-
**12,399,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0977868968.html)
- 11
-
**09.17.12.1995**
-
**6,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0917121995.html)
- 12
-
**09.16.02.1993**
-
**6,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0916021993.html)
- 13
-
**09.08.03.1996**
-
**6,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0908031996.html)
- 14
-
**0888.99.1982**
-
**5,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0888991982.html)
- 15
-
**09.07.08.2001**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0907082001.html)
- 16
-
**09.19.12.2015**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0919122015.html)
- 17
-
**09.12.12.2015**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0912122015.html)
- 18
-
**09.19.12.2016**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0919122016.html)
- 19
-
**09.16.06.2013**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0916062013.html)
- 20
-
**01.666666.968**
-
**5,000,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01666666968.html)
- 21
-
**0916.39.8383**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0916398383.html)
- 22
-
**0965.00.33.77**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0965003377.html)
- 23
-
**016.77777.968**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01677777968.html)
- 24
-
**09.66666.295**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0966666295.html)
- 25
-
**09.66666.291**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0966666291.html)
- 26
-
**0986.39.8383**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0986398383.html)
- 27
-
**09.05.03.1968**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0905031968.html)
- 28
-
**0939.68.1982**
-
**4,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0939681982.html)
- 29
-
**0939.29.1995**
-
**3,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0939291995.html)
- 30
-
**0939.15.1996**
-
**3,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0939151996.html)
- 31
-
**093.291.1996**
-
**3,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0932911996.html)
- 32
-
**096.305.1989**
-
**3,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0963051989.html)
- 33
-
**0977.139.339**
-
**2,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0977139339.html)
- 34
-
**01992.16.16.16**
-
**2,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01992161616.html)
- 35
-
**0199.898.3333**
-
**2,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-01998983333.html)
- 36
-
**090.836.7986**
-
**2,999,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0908367986.html)
- 37
-
**0936.0505.98**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0936050598.html)
- 38
-
**0908.68.2015**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0908682015.html)
- 39
-
**0968.01.05.99**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0968010599.html)
- 40
-
**0979.02.06.09**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0979020609.html)
- 41
-
**0975.0909.82**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0975090982.html)
- 42
-
**098.293.2008**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0982932008.html)
- 43
-
**0979.09.02.88**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0979090288.html)
- 44
-
**0975.22.0202**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0975220202.html)
- 45
-
**096.293.2013**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0962932013.html)
- 46
-
**0985.0606.93**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0985060693.html)
- 47
-
**091.216.2005**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0912162005.html)
- 48
-
**0912.33.2006**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0912332006.html)
- 49
-
**0918.22.03.88**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0918220388.html)
- 50
-
**0918.22.06.88**
-
**2,500,000**
-
-
[Đặt mua](dat-mua-sim-so-dep-0918220688.html)

Pragma: public


markdown:
Hãy lấy chiếc xe của bạn từ bãi gửi xe về đi. Trò chơi đua xe đối kháng sẽ đưa bạn vào trận chiến của giữa những thước phim hoạt hình. Bạn có thể tăng tốc và tên lửa vào những vật thể khác. Kiếm đủ tiền và kim cương để mua chiến lợi phẩm của bạn!
Rich Cars 3: Chen Lấn là một trong những Các Trò Chơi Car Combat đã được chúng tôi tuyển chọn đặc biệt.
[Dead Paradise 4](http://www.trochoi.net/tr%C3%B2+ch%C6%A1i/Dead+Paradise+4.html), [Dragon Ball Fierce Fighting 2.5](http://www.trochoi.net/tr%C3%B2+ch%C6%A1i/dragon-ball-fierce-fighting-2.5.html), [Swords & Sandals 2](http://www.trochoi.net/tr%C3%B2+ch%C6%A1i/%C4%90%E1%BA%A5u+s%C4%A9/swords+%26+sandals+2.html) và [Bleach vs Naruto 2.4](http://www.trochoi.net/tr%C3%B2+ch%C6%A1i/bleach-vs-naruto-2-4.html) hiện cũng được yêu thích trên trang web này.
Báo cáo trò chơi bị lỗi
Hủy báo cáo trò chơi bị lỗi

Access-Control-Allow-Methods: GET, POST, OPTIONS

Access-Control-Allow-Credentials: true

Connection: Close

Access-Control-Allow-Headers: X-Requested-With

Vary: User-Agent, Accept-Encoding


markdown:
Gian hàng bán
Rao vặt
Hỏi đáp
Thêm
Hotline:
19002055
(8h - 21h hàng ngày)
Danh sách gian hàng
Tin tức từ Vatgia.com
Để kinh doanh Online thành công
BaoKim.vn
Nhanh.vn
WebBNC.net
Ứng dụng
Thông báo
Hỗ trợ
Đăng ký
Đăng ký thành viên
Đăng ký gian hàng
Đăng nhập
Hoặc đăng nhập bằng
Nhớ mật khẩu
Quên mật khẩu?
Sản phẩm
bếp từ
|
bếp nướng điện
|
lò nướng ga
|
electric
|
lò nướng sanyo
|
bếp từ midea
Sản phẩm
Rao vặt
Hỏi đáp
Cửa hàng
Tìm trong danh mục
Bếp cồn
Bếp Domino
Bếp ga du lịch
Bếp gas
Bếp gas âm
Bếp hồng ngoại
Bếp nướng
Bếp nướng thịt Doner
Bếp nướng xúc xích
Bếp từ
Bếp tủ liền lò
Bếp đa năng
Bếp điện
Bình giữ nóng trà, cafe
Lò nướng
Lò vi sóng
Máy ép trái cây
Máy hút mùi
Máy hủy rác thực phẩm
Máy lắc trà sữa
Máy làm bánh mỳ
Máy làm lạnh nước hoa quả
Máy làm mì nui
Máy làm sữa đậu nành
Máy làm sushi
Máy làm đá siêu tốc
Máy luộc trứng
Máy mài dao kéo
Máy nạo dừa
Máy nướng bánh mỳ
Máy pha cafe
Máy phun socola
Máy rang cà phê
Máy rửa bát
Máy sấy khô bát
Máy sấy thực phẩm
Máy tạo Ozone
Máy trộn đồ uống
Máy trồng rau
Máy vắt cam
Máy xay cà phê
Máy xay hạt
Máy xay sinh tố
Máy xay thực phẩm
Máy xay đá
Máy đánh trứng
Máy đo an toàn thực phẩm
Nhà bếp công nghiệp
Nồi áp suất
Nồi áp suất điện
Nồi chiên đa năng
Nồi cơm điện
Nồi hầm, nồi ủ nhiệt
Nồi hấp
Nồi lẩu điện
Nồi nấu cơm dùng gas
Nồi nướng
Tủ tiệt trùng
Đồ dùng Buffet
Linh kiện bếp ga
Máy khác
Toàn bộ danh mục
Hàng công nghệ
>
Điện tử, điện máy
>
Đồ dùng trong bếp
>
Bếp từ
HAATZ
Bỏ lọc tất cả
Lò nấu
1 cái
(3)
2 cái
(4)
Lò nướng
Không có
(7)
Công suất
≤ 2kW
(3)
≤ 3kW
(6)
≤ 6kW
(7)
Sản phẩm, giá Bếp Từ HAATZ, Bep tu HAATZ, HAATZ
Mới đổi giá
- Sắp xếp -
Nhiều người bán
Giá tăng dần
Giá giảm dần
-
Có tất cả 7 sản phẩm
• Hãng sản xuất: HAATZ
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 5.2kW
2.249.000₫
Bếp từ Haatz HEC-3000S
3 gian hàng bán
1.123
• Hãng sản xuất: HAATZ
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 3kW
7.400.000₫
Bếp từ Haatz HEC-2040S
3 gian hàng bán
841
• Hãng sản xuất: HAATZ
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 3kW
7.700.000₫
Bếp từ Haatz HEC-2020S
3 gian hàng bán
1.267
• Hãng sản xuất: HAATZ
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 3kW
7.350.000₫
Bếp từ Haatz HEC-2030H
3 gian hàng bán
826
• Hãng sản xuất: HAATZ
• Lò nấu: 1 cái
• Lò nướng: Không có
• Công suất: 1.8kW
4.450.000₫
Bếp từ Haatz HEC-1040S
2 gian hàng bán
786
• Hãng sản xuất: HAATZ
• Lò nấu: 1 cái
• Lò nướng: Không có
• Công suất: 2kW
Không có GH bán...
Bếp từ Haatz HEC-1030H
0 gian hàng bán
602
• Hãng sản xuất: HAATZ
• Lò nấu: 1 cái
• Lò nướng: Không có
• Công suất: 2kW
Không có GH bán...
Bếp từ Haatz HEC-1020S
0 gian hàng bán
510
Bếp Từ - Sản phẩm bếp từ đơn, đôi nhập khẩu chính hãng tại các nước Châu Âu với thiết kế sang trọng, tinh tế. Mua bếp điện từ chính hãng bảo hành dài hạn
Sản phẩm chính hãng
• Hãng sản xuất: COMET
• Lò nấu: 1 cái
• Công suất: 2kW
• Xuất xứ: Việt Nam
672.000₫
Bếp từ Comet CM5427
cometstore
18/07/2016 - 13:44
Xem nhanh
• Hãng sản xuất: COMET
• Lò nấu: 1 cái
• Công suất: 2kW
• Xuất xứ: Việt Nam
684.000₫
Bếp từ Comet CM5416
cometstore
18/07/2016 - 10:03
Xem nhanh
• Hãng sản xuất: COMET
• Lò nấu: 1 cái
• Công suất: 2kW
• Xuất xứ: Việt Nam
792.000₫
Bếp từ Comet CM5428
cometstore
18/07/2016 - 10:03
Xem nhanh
• Hãng sản xuất: COMET
• Lò nấu: 1 cái
• Lò nướng: Không có
• Công suất: 2kW
1.020.000₫
Bếp từ Comet CM5456B
cometstore
18/07/2016 - 10:03
Xem nhanh
• Hãng sản xuất: COMET
• Lò nấu: 1 cái
• Lò nướng: Không có
• Công suất: 2kW
1.008.000₫
Bếp từ Comet CM5458G
cometstore
18/07/2016 - 10:03
Xem nhanh
Sản phẩm nổi bật
• Hãng sản xuất: CHEFS
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 2kW
• Xuất xứ: Tây Ban Nha
Miễn phí vận chuyển nội thành
17.990.000₫
Bếp điện từ đôi Chefs EH-MIX866
bephoanggia
·
HN
,
HCM
,
QNinh
20/07/2016 - 11:17
Xem nhanh
• Hãng sản xuất: GIOVANI
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 4kW
Miễn phí vận chuyển nội thành
10.620.000₫
Bếp từ Giovani G-272T
bephoanggia
·
HN
,
HCM
,
QNinh
21/07/2016 - 08:41
Xem nhanh
• Hãng sản xuất: CHEFS
• Lò nấu: 3 cái
• Lò nướng: Không có
• Công suất: 5.5kW
• Xuất xứ: Tây Ban Nha
22.990.000₫
Bếp điện từ Chefs EH-MIX544
noithattienmanh
·
Hà Nội
19/07/2016 - 13:48
Xem nhanh
• Hãng sản xuất: CHEFS
• Lò nấu: 2 cái
• Công suất: 3.4kW
• Xuất xứ: Malaysia
13.990.000₫
Bếp hỗn hợp đôi Chefs EH-MIX311
noithattienmanh
·
Hà Nội
19/07/2016 - 13:45
Xem nhanh
• Hãng sản xuất: CATA
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 3.7kW
• Xuất xứ: Tây Ban Nha
8.300.000₫
Bếp từ Cata I2 Plus
noithattienmanh
·
Hà Nội
19/07/2016 - 13:48
Xem nhanh
• Hãng sản xuất: FABER
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 2.3kW
• Xuất xứ: Italy
11.500.000₫
Bếp từ Faber FB-302IN (mặt kính)
noithattienmanh
·
Hà Nội
19/07/2016 - 13:44
Xem nhanh
• Hãng sản xuất: BOSCH
• Lò nấu: 3 cái
• Công suất: 6.8kW
10.650.000₫
Bếp từ Bosch PID675N24E
noithat_kienan
·
HN
,
HCM
,
QNinh
18/07/2016 - 16:37
Xem nhanh
• Hãng sản xuất: CHEFS
• Lò nấu: 2 cái
• Lò nướng: Không có
• Công suất: 2kW
• Xuất xứ: Việt Nam
7.590.000₫
Bếp điện từ đôi Chef's EH-DIH2000A
beptunhapkhau
·
HN
,
QNinh
23/07/2016 - 13:36
Xem nhanh
• Hãng sản xuất: BOSCH
• Lò nấu: 3 cái
• Công suất: 6.8kW
10.700.000₫
Bếp từ Bosch PID675N24E
beptunhapkhau
·
HN
,
QNinh
17/07/2016 - 15:44
Xem nhanh
• Hãng sản xuất: CATA
• Lò nấu: 2 cái
• Công suất: 6kW
11.900.000₫
Bếp từ Cata IB 772
noithattienmanh
·
Hà Nội
19/07/2016 - 13:48
Xem nhanh
• Hãng sản xuất: CATA
• Lò nấu: 2 cái
• Công suất: 6kW
4.800.000₫
Bếp từ Cata IB 772
noithat_kienan
·
HN
,
HCM
,
QNinh
Hôm qua, lúc 14:01
Xem nhanh
• Hãng sản xuất: BOSCH
• Lò nấu: 2 cái
• Công suất: 4kW
14.990.000₫
Bếp từ Bosch PMI968MS
noithattienmanh
·
Hà Nội
19/07/2016 - 13:46
Xem nhanh
Từ khóa nổi bật trong tuần
bếp từ sunhome
,
komasu km339
,
bep tu comet
,
fagor if-800s
,
bếp từ aber
,
canzy
,
che trong tu
,
nonan ic-02
,
lò nướng sharp
,
ic dien
,
bếp từ nhật
,
induction
,
bep aeg
,
ket dien tu
,
bếp national
,
ic-20fbv
,
lorca
,
bep tu dien cu
,
hàng quốc
,
helios
Sản phẩm mới
Bếp điện từ Brauneck BRNI 2013 DE
Bếp từ Brauneck BRNI 3003 DE
Bếp từ Brauneck BRNI 2022 DE
Bếp từ Canzy CZ600- 2GIB
Bếp từ Fagor IF 700CS
Bếp từ Fagor IF 33CS
Bếp điện Canzy CZ-72BIS
Bếp điện Canzy CZ400-2EB
Bếp từ Giovani G-490RT
Bếp từ Giovani G-490TS
Sản phẩm nổi bật
Bếp từ Toshiba BHP-M46C
Bếp từ Panasonic KZ-D32AST
Bếp từ Cata I2 Plus
Bếp từ đôi Clatronic
Bếp từ Bosch PMI968MS
Bếp điện từ đôi Chef's EH-DIH2000A
Bếp từ Supor SDHJ08VN-200
Bếp từ Philips HD4932
Bếp từ Sanyo FH2
Bếp từ Bosch PID675N24E
Sản phẩm xem nhiều
Bếp từ Midea MI-SV19EH
Bếp hồng ngoại đa năng FACARE
Bếp điện từ đa chức năng Sanyo
Bếp từ Midea MI-SV21DM
Bếp từ Panasonic 688
Bếp điện từ hồng ngoại Panasonic CR-3407
Bếp từ Midea MI-SV21DR
Bếp từ Midea MISV21DQ
Bếp từ Sunhouse SH 6150
Bếp từ Midea MI-SV21DK
Nhiều gian hàng bán
Bếp từ Cata IB 772
Bếp từ Teka IR 831
Bếp từ Midea MI-SV19EH
Bếp từ Teka IRS 943
Bếp từ Cata IT 773
Bếp từ Cata IB 753 BK
Bếp từ Cata Giga 750 BK
Bếp từ Malloca MH-03IRB
Bếp từ Cata IB 2 plus BK
Bếp từ Cata IB 302 BK
Hàng công nghệ
>
Điện tử, điện máy
>
Đồ dùng trong bếp
>
Bếp từ
Hỗ trợ vận chuyển
Hỗ trợ thanh toán online
Chấp nhận thanh toán
Kết nối với chúng tôi
Điện thoại, viễn thông
Phụ kiện,thiết bị sửa chữa,...
Mobile
Thiết bị viễn thông
Dịch vụ viễn thông
Máy tính, linh kiện
Máy vi tính
Thiết bị cho máy tính
Máy văn phòng
Linh kiện, phụ kiện Laptop
Điện tử, điện máy
Thiết bị an ninh
Âm thanh
Đồ dùng trong bếp
Hình ảnh
Máy ảnh, máy quay
Thiết bị liên quan
Máy ảnh, máy quay
Dịch vụ chụp, rửa ảnh
Dịch vụ sửa chữa, thẩm định
Ô tô, xe máy, xe đạp
Ô tô (Xe hơi)
Xe máy, phụ tùng xe máy
Phụ tùng ô tô
Đồ chơi ô tô
Công nghiệp, Xây dựng
Thiết bị điện, nước
Xây dựng
Vật tư, thiết bị công nghiệp
Cơ khí chế tạo
Thời trang, phụ kiện
Đồng hồ đeo tay
Thời trang nữ
Thời trang đồ đôi, đồng phục
Phụ kiện thời trang
Mẹ & Bé
Đồ dùng cho trẻ
Tắm gội, vệ sinh an toàn
Đồ cho bé khi ra ngoài
Đồ cho mẹ
Sức khỏe, sắc đẹp
Y tế, sức khỏe
Chăm sóc da mặt
Nước hoa - Mỹ phẩm khác
Đồ trang điểm
Đồ dùng sinh hoạt
Đồ dùng nhà bếp, phòng ăn
Các loại đồ khác
Đồ dùng cá nhân
Đồ điện gia dụng
Nội thất, ngoại thất
Nội thất không gian, tổng hợp
Nội thất văn phòng
Nội thất phòng ngủ
Nội thất phòng khách
Sách, văn phòng, quà tặng
Sách
Hoa, quà tặng, đồ chơi
Thiết bị văn phòng
Thiết bị giáo dục
Thể thao
Golf (gôn)
Câu cá
Tennis
Máy tập thể thao
Dịch vụ, giải trí, du lịch
Du lịch
Game, đồ chơi
Băng đĩa phim, phụ kiện
Dịch vụ vận tải, vận chuyển
Thực phẩm, đồ uống
Đồ uống
Bánh kẹo, mứt
Thực phẩm chín, qua chế biến
Thực phẩm tươi sống
Vatgia.com - Sàn giao dịch thương mại điện tử hàng đầu Việt Nam
Mua hàng trực tuyến mang lại sự tiện lợi, chủ động, lựa chọn đa dạng, với các dịch vụ hỗ trợ mua hàng, bán hàng, thanh toán an toàn, giao hàng chuyên nghiệp.
Với phương châm “Luôn đặt mình vào địa vị khách hàng và đối xử trên mong đợi của họ”, Vatgia.com không ngừng nỗ lực, cải tiến đáp ứng nhu cầu mua sắm cho người tiêu dùng.
Vatgia đảm bảo cung cấp đúng thông tin cho đúng người, đúng lúc, đảm bảo thanh toán trực tuyến bảo mật an toàn, áp dụng hình thức vận chuyển nhanh phù hợp.
Rao vặt
|
Hỏi đáp
|
Dien thoai
|
Laptop
|
Mua ban oto
|
Xe may
|
iPhone 5
|
iPhone 5s
|
iPhone 6
|
iPhone 6 plus
|
iPhone 6s
|
iPhone 6s plus
|
iPhone 4
|
iPhone 4s
|
Điện thoại iPhone
|
Galaxy s5
|
Galaxy s6
|
Galaxy s7
|
Áo khoác da
|
Áo khoác nam
|
Giày nam
|
Vest nam
|
Đầm công sở
|
Áo khoác nữ
|
Giày cao gót
|
Máy lọc nước
|
Dao, kéo, dụng cụ cắt gọt ...
|
Hệ thống Call Center
|
Bàn chải đánh răng
|
Tụ điện
|
Máy tính tiền dùng cho shop
|
Đồ dùng khác cho bé
|
Mail Server
|
Thiết bị nhà xưởng
|
Linh kiện tổng đài
|
Xi lanh (bơm kim tiêm)
|
Bìa
Giới thiệu
|
Hướng dẫn
|
Quy chế hoạt động
|
Chính sách bảo mật thông tin
Công ty Cổ phần Vật Giá Việt Nam. Số GCNDT: 011032001615, cấp ngày 21/06/2012, nơi cấp: UBND thành phố Hà Nội
Trụ sở chính: Lê Đại Hành, Hai Bà Trưng, Hà Nội - Chi nhánh Hồ Chí Minh: Đường Lữ Gia, Phường 15, Quận 11, Hồ Chí Minh
Tài khoản
Yêu thích
Giỏ hàng
Đã xem
Ứng dụng
×

Set-Cookie: u_nologin_id=247142833; expires=Wed, 02-Nov-2016 09:34:38 GMT; path=/; httponly


markdown:
dungcuthethaohc
4 lượt cảm ơn
maytaptheduc
2 lượt cảm ơn
tamnguyen_ht
maytapbung
1 lượt cảm ơn
Hoàng Đăng Vịnh check gia
24/05/2008 - 08:11
Hoàng Đăng Vịnh check gia
Báo vi phạm
59.000₫
Hoàng Đăng Vịnh check gia 24/05/2008 - 08:11

Set-Cookie: u_nologin_id=247009299; expires=Wed, 02-Nov-2016 08:26:59 GMT; path=/; httponly

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0


markdown:
[hoang minh phuong](/hoidap/type_user.php?iUse=1427681)
•05/07/2013 - 09:31 •
[Chăm sóc cơ thể](/hoidap/3923/cham-soc-co-the.html)
[NGUYEN NGOC CAM](/hoidap/type_user.php?iUse=164527)
•21/02/2009 - 12:09 •
[Chăm sóc tóc](/hoidap/3926/cham-soc-toc.html)
[Qivana](/hoidap/type_user.php?iUse=715957)
•13/12/2011 - 23:25 •
[Thuốc](/hoidap/3924/thuoc.html)
[lethanh](/hoidap/type_user.php?iUse=75928)
•03/09/2008 - 13:42 •
[Thuốc](/hoidap/3924/thuoc.html)
trang phan

Set-Cookie: u_nologin_id=247139404; expires=Wed, 02-Nov-2016 09:32:16 GMT; path=/; httponly