Trong Quá trình xử lí quá trình tách biệt các thành phần xử lí khỏi hệ thống UI là rất cần thiết, tạo ra khả năng xử lí độc lập cho UI.
Việc tách rời dữ liệu khỏi UI sẻ tạo ra được nhiều UI khác nhau cho các cách thể hiện khác nhau.
Code xử lý đặt trong UI gây khó khăn cho việc kiểm tra và gây phức tạp và trùng lập code. Việc kiểm tra các UI thường hoặc phải chạy ứng dụng thủ công hoặc sử dụng kịch bản (script) để thực hiện việc tương tác tự động lên các UI, do đó sẽ tốn nhiều chi phí và thời gian hơn để kiểm tra các xử lý bên trong thành phần này.
Việc tách các xử lý này ra ngoài ra còn tăng tính tái sử dụng code và dễ bảo trì hơn.
Phương pháp để giải quyết là dùng kiến trúc MVC (Model-View-Controller) và một mẫu kiến trúc thừa kế là MVP, hiện được ứng dụng rộng rãi trong môi trường .NET.
Mẫu kiến trúc Model-View-Controller chia nhỏ các thành phần dữ liệu, thể hiện (output) và dữ liệu nhập từ người dùng (input) thành những thành phần riêng biệt.
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic). Thành phần model thường được trình bày ở dạng Domain Model.
View là thành phần đảm nhận việc thể hiện những dữ liệu của Model. View bao gồm những gì thể hiện trên màn hình như các control, form... Trên cùng một Model, có thể có nhiều View.
Controller là thành phần đảm nhận việc xử lý đáp trả lại các dữ liệu được đưa vào từ người dùng như các sự kiện chuột, bàn phím, các tương tác lên các control... Controller là cầu nối giữa người dùng và ứng dụng.
Sự phụ thuộc của Model vào các thành phần khác và tại một thời điểm khó xác định điều gì sẽ xảy ra khi đọc code và việc kiểm tra cũng khó khăn hơn.
Kiến trúc MVP dựa trên tư tưởng cơ bản của MVC nhưng với cách tiếp cận khác nhằm khắc phục các hạn chế của MVC cổ điển.
Các thành phần của MVP
Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới.
View là thành phần đảm nhận việc thể hiện những dữ liệu của Model và là tổng hợp của các form, control được sử dụng.
Presenter là thành phần đảm nhận các xử lý thể hiện cũng như tương tác đến dữ liệu bên dưới và có thể tương tác để thay đổi View trong quá trình xử lý.
Phối hợp các thành phần
Mẫu kiến trúc MVP của Microsoft tương tự như Passive View nhưng có bổ sung ràng buộc là Presenter chỉ có thể truy cập đến View thông qua interface IView. Điều này giúp Presenter không phụ thuộc đến cài đặt cụ thể của View và có thể dễ dàng kiểm tra Presenter một cách độc lập.
Mối quan hệ giữa Presenter và Model là quan hệ một chiều (chiều còn lại là gián tiếp). Hệ quả là chúng ta có một mô hình đa lớp như cấu trúc ở trên theo ý nghĩa các thành phần ở một lớp chỉ phụ thuộc và sử dụng các thành phần ở lớp ngay bên dưới nó.
Với MVP, một View gắn liền với một interface IView. Khi View được tạo ra, nó tạo ra một đối tượng private Presenter và gắn nó vào đối tượng này thông qua IView. Khi một sự kiện xảy ra, View bắt lấy và sau đó kích hoạt một phương thức của Presenter mà sau đó có thể tương tác với Model. Một số sự kiện như bắt đầu hiển thị và đóng của View cũng được gửi tới để Presenter kích hoạt một số phương thức tương ứng, điều này giúp cho một số công việc như khởi tạo và giải phóng dữ liệu cho View được dễ dàng hơn. Model được tổ chức bổ sung một lớp Service nằm bên trên để tương tác với Presenter.
16 thg 3, 2010
Facebook | Tuan Nx, Một ngày se lạnh thú vị
Một chiều thu, thời tiết se lạnh… ảnh hưởng bão mà. Không đến mức phải mặc áo thật dầy, nhưng cũng đủ để ngta phải cuống quít tìm cái áo thu để mặc. Thời tiết thế này, thik nhất được ngồi trà nóng vỉa hè với mấy anh em, tán gẫu ba chuyện lăng nhăng nhưng khá thú vị :D.
Sẽ chẳng có j để viết tiếp nếu như chiều nay…không có cuộc gặp gỡ bất ngờ đó, không có vụ phải đợi đến 30’ trong tâm trạng vừa háo hức + lo lắng cho một người chỉ mới gặp lần đầu….
Mấy anh em đang nói chuyện, thì bỗng có một nhỏ đi ngang qua. Dáng người, khuôn mặt cũng không có j ấn tượg lắm, bởi lẽ cũng chỉ là những người đi lại trên đường thui. Nhưng đột nhiên nhỏ ngồi rụp xuống ôm bụng. Sẵn tính ga-lăng trong người (haha), Hắn tiến đến hỏi han, dìu nhỏ vào ghế ngồi, gọi cho nhỏ cốc trà nóng. Nhỏ thì vẫn ngồi ôm bụng vậy, mấy anh em hỏi han tí rùi lại quay lại câu chuyện của mình. Hắn để ý Nhỏ cứ nhìn đồng hồ lo lắng, Nhỏ hỏi đi xe bus bao nhiu để đến Chùa Láng????(Làm khó mình đây. Đã bj đi bus đến đóa đâu:-s.). Đã ga-lăng thì ga-lăng cho trót, với lại sắc mặt+tình trạng của nhỏ trong lúc này đi xe bus là không ổn chút nào, Hắn một mực bắt nhỏ lên xe và đưa đến trường. May quá ít ra mặt Hắn cũng có tem đảm bảo nên sau 2 3 lần từ chối, nhỏ cũng chịu lên. Trong lòng tự nhiên thấy vui vui vì làm được việc tốt^^. Hehe. Trên đường đưa nhỏ đi, Hắn bít được nhỏ học Ngân hàng, bình thường thì đi xe máy, mà hum nay mệt nên đi xe bus. Hum nay nhỏ đi học thêm TA, TOEIC j đó ở Chùa Láng, 7h30 là vào lớp, nhà nhỏ ở Định Công… Đưa nhỏ đến lớp xong Hắn và nhỏ tạm biệt, nhỏ cảm ơn và Hắn thì quay xe về nhà. Chuyện tưởng chừng đến đây là có thể kết thúc đc rùi. Nhưng trên đường về, Hắn thấy lạnh, áo cọc, quần ngố mừ, hjx. Nghĩ đến nhỏ bị đau bụng + lạnh thế này, lúc học về chắc cũng 9h 9h30….Sao mình hok làm ng tốt trọn vẹn nhỉ???...Hắn sẽ đón Nhỏ...Ha thế là một kế hoạch được định hình trong đầu, xem nào về nhà cơm nước tắm rửa, mặc thừa 1 cái áo rùi 9h kém ra đợi nhỏ là vừa.. WOAAA, 1 kế hoạch “chuẩn hok cần chỉnh”. Về nhà Hắn tiến hành theo đúng kế hoạch đề ra, hjx có tí ti thay đổi là Hắn mải xem nốt bộ phim nên hơi sai giờ chút^^.Cuối cùng thì cũng ra khỏi nhà,vận trên mình tới 3 cái áo lận…Úi chà chà. Như là sốt rét ế. Nhưng còn lâu mới sốt rét cái trời thế này nhé… Mặc nhìu áo lát về còn cho nhỏ mượn cái áo khoác chứ.:)) Hắn tự thấy mình sao lại chu đáo đến thế (:D.)..Đi đến chỗ nhỏ học là 9h12p. Hie ngồi trà nóng chờ nhỏ chút vậy, chờ đến 9h40p không thấy nhỏ đâu, hắn đoán nhỏ zìa rùi, bùn bùn, vào hỏi một bác thì bác ý bảo : lớp cô ..(j í quên roày) về từ 9h rồi cháu ạ.
Èo. Thế là mất cơ hội làm ng tốt trọn vẹn rùi. Thực sự hắn chẳng hiểu nổi cảm xúc sao lại điều khiển Hắn hành động thế nữa…..Uh thì cứ cho là làm một việc tốt đi…..Hok nghĩ j nữa^^. Hắn trong sáng nhé….:D. Sau ngày hôm nay, có thể trong Hắn cũng hok đọng lại j nhìu về hình ảnh của Nhỏ, về việc mà hắn đã làm. Bởi nó đơn giản như một việc hắn nên làm. Một ngày thu hơi se lạnh + một tâm trạng vui vui khi giúp đc ai đó cũng đủ làm hắn thấy phấn chấn, thấy iu đời.hehe
Có lần hắn đã đọc được:
“Trong cuộc sống, có những điều chắc chắn lại hóa vu vơ
Có những cuộc gặp gỡ bất ngờ lại trở thành định mệnh.” ….Có thể thế hok nhỉ.^^.???
Sẽ chẳng có j để viết tiếp nếu như chiều nay…không có cuộc gặp gỡ bất ngờ đó, không có vụ phải đợi đến 30’ trong tâm trạng vừa háo hức + lo lắng cho một người chỉ mới gặp lần đầu….
Mấy anh em đang nói chuyện, thì bỗng có một nhỏ đi ngang qua. Dáng người, khuôn mặt cũng không có j ấn tượg lắm, bởi lẽ cũng chỉ là những người đi lại trên đường thui. Nhưng đột nhiên nhỏ ngồi rụp xuống ôm bụng. Sẵn tính ga-lăng trong người (haha), Hắn tiến đến hỏi han, dìu nhỏ vào ghế ngồi, gọi cho nhỏ cốc trà nóng. Nhỏ thì vẫn ngồi ôm bụng vậy, mấy anh em hỏi han tí rùi lại quay lại câu chuyện của mình. Hắn để ý Nhỏ cứ nhìn đồng hồ lo lắng, Nhỏ hỏi đi xe bus bao nhiu để đến Chùa Láng????(Làm khó mình đây. Đã bj đi bus đến đóa đâu:-s.). Đã ga-lăng thì ga-lăng cho trót, với lại sắc mặt+tình trạng của nhỏ trong lúc này đi xe bus là không ổn chút nào, Hắn một mực bắt nhỏ lên xe và đưa đến trường. May quá ít ra mặt Hắn cũng có tem đảm bảo nên sau 2 3 lần từ chối, nhỏ cũng chịu lên. Trong lòng tự nhiên thấy vui vui vì làm được việc tốt^^. Hehe. Trên đường đưa nhỏ đi, Hắn bít được nhỏ học Ngân hàng, bình thường thì đi xe máy, mà hum nay mệt nên đi xe bus. Hum nay nhỏ đi học thêm TA, TOEIC j đó ở Chùa Láng, 7h30 là vào lớp, nhà nhỏ ở Định Công… Đưa nhỏ đến lớp xong Hắn và nhỏ tạm biệt, nhỏ cảm ơn và Hắn thì quay xe về nhà. Chuyện tưởng chừng đến đây là có thể kết thúc đc rùi. Nhưng trên đường về, Hắn thấy lạnh, áo cọc, quần ngố mừ, hjx. Nghĩ đến nhỏ bị đau bụng + lạnh thế này, lúc học về chắc cũng 9h 9h30….Sao mình hok làm ng tốt trọn vẹn nhỉ???...Hắn sẽ đón Nhỏ...Ha thế là một kế hoạch được định hình trong đầu, xem nào về nhà cơm nước tắm rửa, mặc thừa 1 cái áo rùi 9h kém ra đợi nhỏ là vừa.. WOAAA, 1 kế hoạch “chuẩn hok cần chỉnh”. Về nhà Hắn tiến hành theo đúng kế hoạch đề ra, hjx có tí ti thay đổi là Hắn mải xem nốt bộ phim nên hơi sai giờ chút^^.Cuối cùng thì cũng ra khỏi nhà,vận trên mình tới 3 cái áo lận…Úi chà chà. Như là sốt rét ế. Nhưng còn lâu mới sốt rét cái trời thế này nhé… Mặc nhìu áo lát về còn cho nhỏ mượn cái áo khoác chứ.:)) Hắn tự thấy mình sao lại chu đáo đến thế (:D.)..Đi đến chỗ nhỏ học là 9h12p. Hie ngồi trà nóng chờ nhỏ chút vậy, chờ đến 9h40p không thấy nhỏ đâu, hắn đoán nhỏ zìa rùi, bùn bùn, vào hỏi một bác thì bác ý bảo : lớp cô ..(j í quên roày) về từ 9h rồi cháu ạ.
Èo. Thế là mất cơ hội làm ng tốt trọn vẹn rùi. Thực sự hắn chẳng hiểu nổi cảm xúc sao lại điều khiển Hắn hành động thế nữa…..Uh thì cứ cho là làm một việc tốt đi…..Hok nghĩ j nữa^^. Hắn trong sáng nhé….:D. Sau ngày hôm nay, có thể trong Hắn cũng hok đọng lại j nhìu về hình ảnh của Nhỏ, về việc mà hắn đã làm. Bởi nó đơn giản như một việc hắn nên làm. Một ngày thu hơi se lạnh + một tâm trạng vui vui khi giúp đc ai đó cũng đủ làm hắn thấy phấn chấn, thấy iu đời.hehe
Có lần hắn đã đọc được:
“Trong cuộc sống, có những điều chắc chắn lại hóa vu vơ
Có những cuộc gặp gỡ bất ngờ lại trở thành định mệnh.” ….Có thể thế hok nhỉ.^^.???
1 thg 3, 2010
25 thg 2, 2010
Email, Ba con heo
1. Email
Một người đàn ông lên đường đi nghỉ hè lúc vợ của anh ta đi công tác chưa kịp về. Họ sắp xếp kế hoạch gặp lại nhau vào ngày hôm sau. Tới nơi, anh ta vội vàng gửi e-mail về cho vợ. Do đánh sai địa chỉ, bức thư của anh ta thay vì được chuyển về cho vợ, thì nó lại đến một phụ nữ có chồng vừa qua đời ngày hôm trước. Khi người vợ góa tội nghiệp nọ mở hộp thư, bức thư vừa hiện ra bà ta thét lên một tiếng khủng khiếp, té xuống sàn nhà và chết thẳng cẳng. Nghe tiếng thét, người nhà chạy vào phòng thì chỉ thấy một bức thư trên màn hình máy tính: "Vợ yêu quý nhất của anh, anh vừa đến nơi. Mọi thứ đã được chuẩn bị sẵn để đón em vào ngày mai. Người chồng yêu quý nhất của em!"
2.Ba con heo
Ba con heo, heo A tên là "Ai" , heo B tên là "Ở Đâu" , heo C tên là "Cái Gì". Có một hôm, heo A và heo B đứng trước cửa, heo C thì ở trên gác. Một con sói phát hiện và muốn ăn thịt chúng, thế là chạy lại trước mặt heo A...
Sói : mày là ai ??
Heo A : uh !!
Sói : cái gì ??
Heo A : cái gì trên gác.
Sói : tao hỏi mày tên gì ??
Heo A : tôi là ai !!
- Sói lại quay sang hỏi heo B...
Sói : mày là ai ??
Heo B : tôi ko phải là ai, nó là ai.(chỉ sang heo A)
Sói : mày quen nó ??
Heo B : uh.
Sói : nó là ai ??
Heo B : đúng thế.
Sói : cái gì ??
Heo B : cái gì trên gác.
Sói : ở đâu ??
Heo B : ở đâu là tôi.
Sói : ai ???
Heo B : nó là ai !! (lại chỉ sang heo A)
Sói : sao tao biết đc.
Heo B : ông tìm "ai" ??
Sói : cái gì ??
Heo B : cái gì trên gác.
Sói : ở đâu ??
Heo B : là tôi.
Sói : ai ??
Heo B :tôi ko phải là ai, nó là ai.(tiếp tục chỉ sang heo A)
Sói : trời ơi !!
Heo A+B : "trời ơi" là Ba của chúng tôi.
Sói : cái gì là ba của chúng mày à ??
Heo B : ko phải.
Sói chịu hết nỗi, lớn tiếng quát: tại sao...???
Heo A+B : ông quen Ông nội chúng tôi hả ??
Sói : cái gì ??
Heo A : cái gì trên gác, tại sao là Ông nội chúng tôi.
Sói : tại sao ??
Heo A : đúng rồi.
Sói : cái gì ??
Heo A : không, cái gì ở trên gác.
Sói : ai ??
Heo A : tôi là ai.
Sói : mày là ai ??
Heo A : uh, tôi là ai.
Sói : cái gì ??
Heo A+B : nó trên gác.
...Sói cắn lưỡi tự sát
Sưu tầm
Một người đàn ông lên đường đi nghỉ hè lúc vợ của anh ta đi công tác chưa kịp về. Họ sắp xếp kế hoạch gặp lại nhau vào ngày hôm sau. Tới nơi, anh ta vội vàng gửi e-mail về cho vợ. Do đánh sai địa chỉ, bức thư của anh ta thay vì được chuyển về cho vợ, thì nó lại đến một phụ nữ có chồng vừa qua đời ngày hôm trước. Khi người vợ góa tội nghiệp nọ mở hộp thư, bức thư vừa hiện ra bà ta thét lên một tiếng khủng khiếp, té xuống sàn nhà và chết thẳng cẳng. Nghe tiếng thét, người nhà chạy vào phòng thì chỉ thấy một bức thư trên màn hình máy tính: "Vợ yêu quý nhất của anh, anh vừa đến nơi. Mọi thứ đã được chuẩn bị sẵn để đón em vào ngày mai. Người chồng yêu quý nhất của em!"
2.Ba con heo
Ba con heo, heo A tên là "Ai" , heo B tên là "Ở Đâu" , heo C tên là "Cái Gì". Có một hôm, heo A và heo B đứng trước cửa, heo C thì ở trên gác. Một con sói phát hiện và muốn ăn thịt chúng, thế là chạy lại trước mặt heo A...
Sói : mày là ai ??
Heo A : uh !!
Sói : cái gì ??
Heo A : cái gì trên gác.
Sói : tao hỏi mày tên gì ??
Heo A : tôi là ai !!
- Sói lại quay sang hỏi heo B...
Sói : mày là ai ??
Heo B : tôi ko phải là ai, nó là ai.(chỉ sang heo A)
Sói : mày quen nó ??
Heo B : uh.
Sói : nó là ai ??
Heo B : đúng thế.
Sói : cái gì ??
Heo B : cái gì trên gác.
Sói : ở đâu ??
Heo B : ở đâu là tôi.
Sói : ai ???
Heo B : nó là ai !! (lại chỉ sang heo A)
Sói : sao tao biết đc.
Heo B : ông tìm "ai" ??
Sói : cái gì ??
Heo B : cái gì trên gác.
Sói : ở đâu ??
Heo B : là tôi.
Sói : ai ??
Heo B :tôi ko phải là ai, nó là ai.(tiếp tục chỉ sang heo A)
Sói : trời ơi !!
Heo A+B : "trời ơi" là Ba của chúng tôi.
Sói : cái gì là ba của chúng mày à ??
Heo B : ko phải.
Sói chịu hết nỗi, lớn tiếng quát: tại sao...???
Heo A+B : ông quen Ông nội chúng tôi hả ??
Sói : cái gì ??
Heo A : cái gì trên gác, tại sao là Ông nội chúng tôi.
Sói : tại sao ??
Heo A : đúng rồi.
Sói : cái gì ??
Heo A : không, cái gì ở trên gác.
Sói : ai ??
Heo A : tôi là ai.
Sói : mày là ai ??
Heo A : uh, tôi là ai.
Sói : cái gì ??
Heo A+B : nó trên gác.
...Sói cắn lưỡi tự sát
Sưu tầm
24 thg 2, 2010
Chạy NokiaSoftwareUpdaterSetup trên Windows 7
Chuẩn bị:
- 7 zip- NokiaSoftwareUpdaterSetup.exe
Dùng 7 zip unpack NokiaSoftwareUpdaterSetup.exe ra, chọn thư mục Installer, file Configuration.icf, dòng có chữ
TargetOSs=winXP,winVista . Thêm vào ',win7' chạy installer >> ngon!
Running NokiaSoftwareUpdaterSetup on Windows 7
Today I needed to upgrade the software on my Nokia N97, and was prompted by the Nokia software to download and run NokiaSoftwareUpdaterSetup_en.exe.
The only thing was, this just exited with a message saying unsupported platform or something. I quickly tested if the exe file was an archive and discovered I could unpack it with 7-Zip. Inside the resulting directory, in a folder named Installer, I found a file called Configuration.icf, and in this a line with the string
1 | TargetOSs=winXP,winVista |
I added ‘,win7′ on a hunch and ran Installer.exe, and what do you know, it worked
Nguồn Running NokiaSoftwareUpdaterSetup on Windows 7 | Rantings in the dark
2 thg 2, 2010
Thước đo sự trong sáng
Các nhà nghiên cứu sau 1 thời gian đã phát hiện ra là trẻ con ko nhìn thấy hình của đôi tình nhân trong ảnh phía dưới này vì đầu óc của chúng còn trong sáng , chưa biết chuyện xxx ....
Xin mời hãy thử
Nếu sau nhiều nhất là 5 giây bạn vẫn không nhìn ra được con cá heo nào thì có nghĩa là đầu óc của bạn đã thực sự đen tối, hết cách chữa.
Hjx. Tớ thì nhìn mãi mới ra. >> Hết thuốc!
Xin mời hãy thử
Nếu sau nhiều nhất là 5 giây bạn vẫn không nhìn ra được con cá heo nào thì có nghĩa là đầu óc của bạn đã thực sự đen tối, hết cách chữa.
Hjx. Tớ thì nhìn mãi mới ra. >> Hết thuốc!
24 thg 1, 2010
Cách khắc phục lỗi font chữ ở blog yahoo plus!
Trong khảng 1 tháng trở lại đây, Plus và beta Plus bị lỗi font rất khó chịu. Khi post bài lần đầu tiên thì không bị sao, nhưng chỉ cần click vào "sửa bài" là toàn bộ font chữ của bài viết đều bị lỗi, em và rất nhiều bạn đều bị lỗi như thế:
Hiện tại chỉ có thể sửa bài bằng cách copy lại bài cũ (lúc chưa bị lỗi font) sau đó vào sửa bài, check HTML, xóa toàn bộ code HTML đi, check lại rồi paste bài cũ vào rồi sửa bài.
Bạn mình cũng gặp lỗi này, mình search mãi ko thấy chỗ nào có cả, tự viết 1 cái để cho mọi người dùng. Mình đã deploy lên địa chỉ này mọi người vào sử dụng nhé: http://tools.vnonweb.net/
Hiện tại chỉ có thể sửa bài bằng cách copy lại bài cũ (lúc chưa bị lỗi font) sau đó vào sửa bài, check HTML, xóa toàn bộ code HTML đi, check lại rồi paste bài cũ vào rồi sửa bài.
Bạn mình cũng gặp lỗi này, mình search mãi ko thấy chỗ nào có cả, tự viết 1 cái để cho mọi người dùng. Mình đã deploy lên địa chỉ này mọi người vào sử dụng nhé: http://tools.vnonweb.net/
Những câu hỏi thông thường về GWT cho người bắt đầu
GWT là gì ?
GWT là một open source Java framework giúp cho việc phát triển các ứng dựng Ajax dễ dàng hơn. Trước đây, khi phát triển một ứng dụng web, phía client phải viết rất nhiều mã JSP, HTML, JavaScript,... Nay với GWT, bạn có thể viết toàn bộ ứng dụng web phía client bằng mã Java, sau đó GWT sẽ biên dịch (compile) mã Java thành mã JavaScript. Ta có thể xem GWT là một bộ biên dịch Java sang JavaScript. Xem thêm tại Product Overview.Tôi nên bắt đầu với GWT từ đâu ?
Bạn nên vào mục Developer Guide trên website chính thức của GWT: http://code.google.com/webtoolkit/documentation/Tại đây cung cấp thông tin về API, Tutorial, Ví dụ và rất nhiều thông tin khác
Tôi sử dụng Linux, GWT có hỗ trợ không ?
Do viết trên Java, GWT có thể chạy trên Windows, Linux, Mac OS.Cài đặt GWT có dễ không ?
Rất đơn giản, bạn làm theo 3 bước sau:- Cài đặt Java SDK (cái này chắc bạn nào sử dụng Java cũng đã làm rồi)
- Download GWT
- Unzip vào một thư mục nào đó. Để đơn giản, bạn unzip GWT vào c:\dev\gwt (trong Windows) hoặc /home/your_user_name/dev/gwt (trong Linux).
GWT có thể dùng để phát triển các phần mềm thương mại không ?
Có ! GWT phát hành với Apache 2.0 open source license, nên có thể sử dụng để phát triển các ứng dụng thương mại, phi thương mại và doanh nghiệp (enterprise)Tôi muốn xem source code của GWT thì lấy ở đâu ?
Bạn check out từ SVN theo url sau:http://google-web-toolkit.googlecode.com/svn/trunk/
Tôi có thể sử dụng GWT cùng với Struts, Spring, Hibernate được không ?
Cấu trúc của GWT rất uyển chuyển. Bạn có thể sử dụng GWT cùng với các Java Framework khác.Tôi muốn xem một vài demo của GWT ?
Gmail, Google Calendar, Google Docs là những ví dụ thực tế nhất về GWT. Ngoài ra bạn có thế xem thêm một số sample như:- Mail Application
- Kitchen Sink
- JSON Interop Using JSNI
- ... và còn nhiều nữa tại Example Projects
21 thg 1, 2010
Thơ con cóc của LANGTUJAVA Tú
Đau đầu vì tiền
Điên đầu vì tình
Đâm đầu vào tường
Văng ra tứ phương
Rơi tõm xuống mương
Thân nát như tương
Trông thật thảm thương
Thương ơi là thương.
Yêu yêu yêu yêu.... mẹ bảo yêu
Con nít, Tình yêu? chẳng biết nhiều
Cô "bắt" cầm tay đi vào lớp
Dung dăng dung dẻ... chắc là yêu
Yêu yêu yêu yêu.... lại là yêu
Chung bàn với "nó" lớp học chiều
Giằng nhau thước kẻ.... hờn đôi chút
Vạch phấn ngăn bàn....: "Ứ thèm yêu"
Nhện kia giăng lưới bắt ruồi
Còn em giăng lưới bắt người em yêu
Ruồi kia vừa nhắng vừa điêu
Người em giăng lưới còn điêu hơn ruồi
Điên đầu vì tình
Đâm đầu vào tường
Văng ra tứ phương
Rơi tõm xuống mương
Thân nát như tương
Trông thật thảm thương
Thương ơi là thương.
Yêu yêu yêu yêu.... mẹ bảo yêu
Con nít, Tình yêu? chẳng biết nhiều
Cô "bắt" cầm tay đi vào lớp
Dung dăng dung dẻ... chắc là yêu
Yêu yêu yêu yêu.... lại là yêu
Chung bàn với "nó" lớp học chiều
Giằng nhau thước kẻ.... hờn đôi chút
Vạch phấn ngăn bàn....: "Ứ thèm yêu"
Nhện kia giăng lưới bắt ruồi
Còn em giăng lưới bắt người em yêu
Ruồi kia vừa nhắng vừa điêu
Người em giăng lưới còn điêu hơn ruồi
20 thg 1, 2010
Generate ER - Diagram from exist database, Lấy design của một database nào đó
Hơi ma giáo một tí nhưng mà đôi khi cần học hỏi (khác với copy). Thì ta cần xem design của database nào đó, điều này hoàn toàn có thể bằng cách sử dụng một module sẵn có của MyEclipse: MyEclipseHirbernate.
Chuẩn bị:
Chuẩn bị:
- Database (tất nhiên).
- MyEclipse (trial is ok).
- Open Pespertive
- Create new connection (host,jdbc,user,pass,schema)
- Chọn Schema cần generate design
- New ER Diagram, chọn thư mục, tên, và chờ tí ti.
- Vậy là ok.
limit connections windows server 2003 : force restart
Hiện trạng là con server windows 2003 ở xa bị limit connections khi remote.
Sau khi sục sạo tìm kiếm 1 số tool : pstools (chạy từ win), winexe (linux)
( http://www.microsoft.com/technet/sysinternals/utilities/pstools.mspx
psexec \\host -u user -p password cmd (this will give you access to the cmd prompt on the server) để run cmd)
( http://eol.ovh.org/winexe/
winexe -U Administrator%Pass123 //host 'cmd /C dir C:\' )
đều không được (mà bình thường có vẻ được). Thì một sư tổ trong ngành mách cho 1 câu rất đơn giản để restart máy từ linux: net rpc shutdown -r -f -I host -U username thì chạy ngon luôn.
Sau khi sục sạo tìm kiếm 1 số tool : pstools (chạy từ win), winexe (linux)
( http://www.microsoft.com/technet/sysinternals/utilities/pstools.mspx
psexec \\host -u user -p password cmd (this will give you access to the cmd prompt on the server) để run cmd)
( http://eol.ovh.org/winexe/
winexe -U Administrator%Pass123 //host 'cmd /C dir C:\' )
đều không được (mà bình thường có vẻ được). Thì một sư tổ trong ngành mách cho 1 câu rất đơn giản để restart máy từ linux: net rpc shutdown -r -f -I host -U username thì chạy ngon luôn.
18 thg 1, 2010
Got a call from +12142694231
Tự nhiên nhận được 1 cuộc từ số máy +12142694231, tiếng Anh cùi, nghe hok hỉu, bảo nó mail + tìm hiểu thì thấy nó bảo là "scam calling". http://800notes.com/Phone.aspx/1-214-269-4231/1
15 thg 1, 2010
10 điều mọi Lập trình viên JAVA nên biết « vinh{vt}
Kể từ khi JAVA được công bố chính thức từ năm 1995, nó đã thay đổi rất nhiều cái nhìn của chúng ta về Hệ Điều hành. Bill Gate đã từng nói đùa rằng, nó – Hệ Điều hành – không phải là phần cứng mà là phần mềm, là tương lai. (It was not about the hardware but the software which will be the future). Một thập kỷ sau, John Gage (thành viên thứ năm của SUN) đã nói, “Mạng là máy tính” (The Network is the Computer). Và điều này đã nhanh chóng được chứng minh trong thế kỷ 21 này. Tuy nhiên, JAVA đã được xây dựng không phụ thuộc vào Hệ Điều hành và được triển khai qua mạng. JAVA với công nghệ Applet đã khai sinh cho những Ứng dụng Mạng Giàu Tương tác (Rich Network Application hay còn gọi là Rich Internet Application – RIA). JAVA không hoàn hảo và chúng ta liên tục có những bản phát hành khác nhau, tuy nhiên JAVA đã khai sinh một ngôn ngữ lập trình cực kỳ phổ biến.
Trở lại với nội dung bài viết, tác giả Armel Nene (Senior Java developer với kinh nghiệm làm việc trong lĩnh vực tài chính như Barclays, SMBC và công nghiệp game) muốn nhấn mạnh vào những gì mà mọi lập trình viên Java nên biết dù kinh nghiệm của họ có tới đâu đi chăng nữa và cũng không tin rằng một người với kinh nghiệm 5 năm thì không thể bằng một người có kinh nghiệm 10 năm. Mỗi người đều có một phương pháp làm việc tuy nhiên với một người lập trình viên, bạn luôn luôn phải đồng hành cùng công nghệ. Sau đây là 10 điều mà tác giả nghĩ là quan trọng hàng đầu đối với lập trình viên Java.
- Ghi nhớ những vấn đề căn bản của JAVA và OOP (Remember the basic of JAVA language and OOP paradigm)
Hầu hết mọi LTV chuyên nghiệp dường như quên mất những nguyên lý của mỗi ngôn ngữ. Nói như vậy, không có nghĩa là họ không giỏi, tuy nhiên liệu họ có thể giải thích cho một lập trình viên ít kinh nghiệm tại sao họ sử dụng “interfaces” thay vì sử dụng các “abstract classes” hay tại sao ứng dụng một “pattern” lên một cái khác. Một lập trình viên thường rất kiêu ngạo vì tin rằng họ đã code “đẹp” nhất, tuy nhiên thực tế là mọi người làm việc theo nhóm với kỹ năng và kinh nghiệm khác nhau. Một điều quan trọng nữa là bạn có thể backup đối với các thao tác cũng như đối với mã nguồn. Một câu hỏi rất đơn giản tựa như khi nào nên sử dụng một “String object” thay vì “StringBuilder” hoặc “StringBuffer”. Có thể, bạn nhận thấy nó khá dễ dàng tuy nhiên làm cách nào để truyền đạt cho người khác hiểu. - Hiểu biết về tầng công nghệ của mình (Know your technology stack)
Mọi lập trình viên đều phải biết về tầng công nghệ của mình. Điều này có nghĩa là gì? JAVA không giống như những ngôn ngữ khác, JAVA có các tập hợp con như công nghệ J2ME và các tập hợp phía trên như công nghệ Java EE. Chúng ta có kinh nghiệm trong một lĩnh vực nhưng cũng thật quan trọng khi nắm được sự khác biệt giữa các công nghệ của JAVA. Những câu hỏi căn bản như sự khác biệt giữa SWING, Applet, Servlets, EJBs hay như JAVAFX sẽ giúp bạn thêm tự tin. Hầu hết các lập trình viên không biết làm cách nào để điều chỉnh JVM và sự khác biệt giữa môi trường JRE và SDK. Bạn có biết tại sao phải cần cài đặt SDK để chạy Tomcat nhưng chỉ cần JRE để chạy một ứng dụng? - Thử nghiệm với nhiều framework khác nhau Java EE (Experiment with various Java EE framework)
Mặc dù không đòi hỏi bạn phải là chuyên gia trong từng framework của Java EE, nhưng nó sẽ tạo ra điểm khác biệt nếu bạn đã quen thuộc với Spring hay EJB. Đó thực sự là một yếu tố mang tính cốt lõi mà CVs của mọi lập trình viên nên có. Lập trình viên cũng nên biết về sự khác biệt giữa Java EE 5 (và sắp tới là Java EE 6) với Spring. Hibernate cũng thật sự rất cần thiết để truy cập dữ liệu tuy nhiên mọi người đã có thể chuyển sang sử dụng JPA. Hibernate cũng tuân theo JPA và do đó không có sự bào chữa nào ở đây cả. - Hiểu biết về một ngôn ngữ kịch bản (Know a scripting language)
JAVA có thể là quá nặng nề đối với một số tác vụ đơn giản mà có thể được thực hiện bằng các ngôn ngữ động đơn giản như Python, Perl hay các loại khác. Thực sự, các lập trình viên nên tìm hiểu về ngôn ngữ kịch bản tương ứng mà hệ điều hành mục tiêu cung cập thư viện (shell script). - Hiểu biết về cách thức phát triển các dịch vụ web (Know how to develop web services)
Mạng là máy tính, do đó thật sự quan trọng khi hiểu biết về sự khác biệt giữa các framework về web services hiện có. Dữ liệu đã được gom lại nhờ các web services và hướng các services của bạn tới “cloud”. Các lập trình viên SWING có thể sẽ không phát triển các web services nhưng chắc chắn họ sẽ được kết nối với dữ liệu thông qua các web services. Hiểu về sự khác biệt giữa các dạng chuẩn SOAP hay phi chuẩn ReST sẽ giúp lựa chọn ra cái phù hợp cho web services. - Biết được làm cách nào và khi nào sử dụng đa luồng cho ứng dụng (Know how and when to multithread your application)
“À, tôi phải đăt nó đúng ở chỗ đó!”. Các lập trình viên nên biết khi nào và tại sao phải đa luồng hóa một ứng dụng, một luồng thông tin nhiều chiều (inter-communication) hay luồng giám sát. Mọi lập trình viên, dù ít kinh nghiệm hay không cũng đều nên biết cách viết một ứng dụng đa luồng. - Triển khai Cơ sở dữ liệu sử dụng JDBC và JPA (Database development using JDBC and JPA)
Đây đã là nguyên tắc bất di bất dịch của việc quy trình phát triển. Mọi LTV đều nên biết cách viết các câu truy vấn SQL và cách tạo Cơ sở dữ liệu. Mọi ứng dụng doanh nghiệp đều lưu trữ dữ liệu trong một Hệ Quản trị CSDL quan hệ và đó chính là điều cực kỳ quan trọng mà những kiến thức này trở thành một điều kiện tiên quyết thứ hai. Java EE đã giới thiệu JPA (JDO đã được giới thiệu trước đó) những không phải là có thể ứng dụng được trong mọi tình huống. Do vậy, hiểu được điểm khác biệt và biết được khi nào thì sử dụng cái này thay cho cái kia thì hết sức quan trọng. - Biết một ngôn ngữ kịch bản phía client và AJAX là gì (Know a client script languague and what is AJAX)
Mạng là máy tính và Internet là nền tảng triển khai. Java EE và các frameworks khác giữ vai trò thực thi phía server có thể tạo ra thêm các “tải” (load) cho server. Nếu bạn muốn chuyển sang một hệ thống mây (cloud-based system) nơi mà nhà cung cấp tính tiền mỗi tài nguyên mà bạn dùng, vậy tại sao không chuyển việc tính toán sang phía client. AJAX đã gây ra một chấn động lớn vào thời điểm 3 năm trước dù nó không phải là một công nghệ nhưng lại là một cách thức mới để thực hiện các tác vụ đã có sẳn trước đó. Có vô số các AJAX framework dựa trên nền tảng JAVA như GWT hay DWR, những cái mà giúp LTV dễ dàng phát triển các ứng dụng AJAX. Bên cạnh đó, LTV cũng nên biết về nguyên lý của nó - Biết được đối thủ cạnh tranh và không tham gia vào các cuộc thảo luận kiểu như “Đâu là IDE tốt nhất” (Know your competitors and do not take part in “what is the best IDE” discusstion)
JAVA không phải là ngôn ngữ duy nhất có thể làm được thứ nó làm. Tuy nhiên, JAVA có lẽ trưởng thành và hoàn thiện hơn so với các ngôn ngữ khác. Hiểu được điểm khác biệt giữa JAVA và .NET hay JAVA và Ruby là một sự trang bị hết sức đáng giá. Bạn cũng cần phải biết khi nào và tại sao lại sử dụng cái này thay cho cái kia, và xin đừng bao giờ tham gia vào các cuộc tranh luận kiểu như “IDE của tôi tốt hơn IDE kia bởi vì…”, điều này sẽ giúp cho cộng đồng JAVA có được nhiều lưa chọn hơn về IDEs, frameworks v.v… Mọi công cụ đều có một vị thế nhất định chẳng hạn như JDeveloper thì tốt hơn cái khác nếu bạn dự định phát triển hoàn toàn trên tầng kiến trúc của Oracle v.v… - Biết về ANT (or MAVEN), TOMCAT và các máy chủ ứng dụng mainstream khác (Know ANT , TOMCAT and any other mainstream application server)
ANT, thực tế là ngôn ngữ kịch bản để build các ứng dụng JAVA. MAVEN cũng dần trở nên thông dụng như ANT. Còn TOMCAT, với các LTV, nó có lẽ vĩnh viễn trở thành một ứng dụng phía server để xử lý các servlet và render các trang web có chứa mã JSP.
Nguồn: http://armelnene.blogspot.com/2009/11/10-things-all-java-developers-should.html
Nguồn : 10 điều mọi Lập trình viên JAVA nên biết « vinh{vt}
14 thg 1, 2010
Post xml lên blog
Nó đơn giản nhưng nhiều lúc ngớ ngẩn, ko để ý, hjx. Dùng một cái HTML encoder nào đó paste vào đó rùi cho vào chỉnh sửa html của cái đăng blog là xong. Đây là một cái encoder http://centricle.com/tools/html-entities/
Phát triển Java 2.0: Chào Google App Engine, Groovy
Bài này mình lấy trên IBM, cũng đang tập tành appengine, mục tiêu là sử dụng những cái trong tut này + GWT, deploy lên appspot.com. Ai có hứng thì pm chỉ bảo mình với nhé!
Ah rất buồn là appspot.com lại chưa hỗ trợ developer Việt đăng kí. (Cần confirm = sms mà). Nếu bạn có người quen ở nước ngoài phải xin 1 cái số và active là xong. Chúc thành công.
Thế giới Java là một hệ sinh thái phong phú với một bố cục trải rộng gồm các nhà phát triển, các doanh nghiệp và — quan trọng nhất — các ứng dụng, nhiều ứng dụng đã hoàn thiện trong hơn một thập kỷ qua. Cộng đồng Java trên toàn thế giới đã đầu tư rất nhiều tiền bạc, thời gian và trí lực vào nền tảng này và những đóng góp này đã mang lại một kho tàng giàu có các công cụ mã nguồn mở và các công cụ thương mại, các khung công tác, và thực sự cả các giải pháp, rất thành công.
Hàng loạt đầu tư như nói trên vào nền tảng Java đã thay đổi cách phát triển Java một cách khéo léo. Hai xu hướng chính đang thay đổi nhanh chóng đặc điểm của nó:
Bài viết này khởi đầu một loạt bài viết mới sẽ tìm hiểu việc phát triển Java 2.0 sâu hơn. Bạn sẽ tìm hiểu về việc xây dựng và triển khai các ứng dụng Web với EC2 của Amazon, sử dụng Google App Engine (máy ứng dụng của Google), sử dụng CouchDB (đang được gọi là cơ sở dữ liệu cho Web) và các công cụ và các công nghệ khác cung cấp các khối xây dựng để lắp ráp, thử nghiệm và triển khai các ứng dụng nhanh gọn và chi phí ít tiền hơn so với từ trước đến bây giờ.
Điểm dừng đầu tiên: Google App Engine cho Java (xem Tài nguyên). Tôi sẽ giới thiệu cho bạn nền tảng này bằng phương pháp "Hello World" (Xin chào Thế giới) truyền thống, sau đó chỉ cho bạn cách tạo một ứng dụng Web hoạt động bằng cách sử dụng Groovy, Java Data Objects (JDO-Các đối tượng dữ liệu Java) và trình cắm thêm Eclipse cho Google App Engine. Tuy nhiên, theo trình tự, trước tiên hãy xem tổng quan nhanh về giá trị kinh doanh của việc phát triển Java 2.0.
Nhanh và rẻ
Các từ nhanh và rẻ thường không được kết hợp với việc phát triển Java. Trong thực tế, chúng thường gợi lên các ấn tượng về phát triển phần mềm ít quan trọng — tầm nhìn của các công ty nhỏ có ít nguồn lực. Tuy nhiên, sự thật của vấn đề là CNTT là một trọng tâm chi phí đối với nhiều công ty (lớn và nhỏ), thúc đẩy họ giữ cho các chi phí CNTT thấp trong khi rút ra càng nhiều giá trị càng tốt.
Đó là nơi việc phát triển Java 2.0 vào cuộc. Bằng cách sử dụng các công cụ mã nguồn mở, các khung công tác và thậm chí các giải pháp, các công ty có thể lắp ráp các ứng dụng phần mềm nhanh chóng vì họ không phải tự mình viết nhiều mã lệnh. Khi lần đầu tiên tôi bắt đầu phát triển phần mềm bằng công nghệ Java hơn 10 năm trước đây, phạm vi của các công cụ và các khung công tác có sẵn cho các nhà phát triển nhỏ bé hơn nhiều. Một số ít các công cụ đó cũng không có sẵn miễn phí. Bạn phải mua một IDE, một cơ sở dữ liệu, một khung công tác ánh xạ đối tượng-quan hệ (ORM) (ôi chết tiệt, bạn có thể đã phải mua trình điều khiển cần thiết để giao tiếp với cơ sở dữ liệu của bạn) và dĩ nhiên, các máy để triển khai ứng dụng của bạn trên đó. Bây giờ? Tất cả mọi thứ mà tôi vừa liệt kê (và nhiều hơn nữa) là có sẵn miễn phí và chất lượng cao.
Hơn nữa, bằng cách vay mượn cơ sở hạ tầng (ví dụ như những cơ sở hạ tầng được EC2 của Amazon hoặc Google App Engine cung cấp), bạn có thể triển khai ứng dụng khá rẻ (so với mua toàn bộ cơ sở hạ tầng cần thiết).
Xây dựng, mua, hay mượn: Đó là câu hỏi mới
Nhiều doanh nghiệp có cả một danh sách phần cứng để chạy các ứng dụng như các cơ sở dữ liệu, các máy chủ ứng dụng, các hệ thống quản lý thay đổi và các công cụ lần vết tìm lỗi. Tuy vậy, ngày nay, danh sách này có thể dễ dàng vứt bỏ để thay bằng việc sử dụng chính gói phần mềm ấy dưới dạng một dịch vụ đang chạy trên một cơ sở hạ tầng của người nào đó khác.
Toàn bộ chồng ứng dụng mà một nhóm làm việc có thể phải sử dụng để quản lý một quá trình phát triển có thể được vay mượn — nghĩa là, thuê với một khoản phí nhỏ — giải phóng cho công ty khỏi phải đầu tư vào phần cứng để chạy chúng. Ví dụ, thay vì mua một máy tính để chạy một hệ thống quản lý thay đổi (như Subversion hoặc Git, cả hai là mã nguồn mở và có sẵn miễn phí), một nhóm làm việc có thể sử dụng một dịch vụ quản lý thay đổi dùng chung như GitHub. Công ty đằng sau GitHub phải gánh chịu chi phí của các tài sản phần cứng và tính một chi phí danh nghĩa (thường là hàng tháng cho mỗi người dùng) cho các tổ chức khác sử dụng Git. Cùng một nguyên tắc thuê phần mềm như là một dịch vụ từ các nhà cung cấp khác như thế này có thể được áp dụng cho việc lần vết tìm lỗi, quản lý các bài kiểm thử và quản lý các yêu cầu (ví dụ qua JIRA Hosted hoặc Pivotal Tracker).
Cũng có thể nói giống như vậy đối với các tài sản phần cứng nằm dưới mà các nền tảng phần mềm khác (về bản chất, thường là tùy chỉnh) chạy trên đó. Một doanh nghiệp có thể vứt bỏ phần cứng nằm bên dưới của một ứng dụng web cụ thể để thay bằng việc chạy ứng dụng trên phần cứng được cung cấp bởi Amazon, Google hoặc các đối tác khác. Các công ty này đưa ra khả năng thuê phần cứng ở các mức độ khác nhau, vừa vặn có thể lưu trữ một ứng dụng. Hơn nữa, các công ty này quản lý khả năng mở rộng, sao lưu và thậm chí cả an ninh nữa. Hãy suy nghĩ về nó một lát: Amazon và Google đã nêu ra những mối quan tâm này (và nhiều hơn nữa) từ lâu rồi và đối phó tốt hơn với chúng, có nhiều đổi mới xung quanh các khía cạnh của việc chạy các nền tảng phần mềm sao cho hiệu quả. (Đó là đúng. Hãy đương đầu với nó).
Bằng cách sử dụng App Engine của Google, ví dụ thế, một công ty CNTT có thể hạ thấp tổng chi phí mua một cơ sở hạ tầng để chạy các ứng dụng cần thiết. Và họ có thể triển khai các ứng dụng đó nhanh hơn vì vô số các mối quan tâm đan chéo nhau, kết hợp với việc triển khai ứng dụng và quản lý đã được tính đến và vì thế được cung cấp cho họ (với nhiều khả năng là theo một cách tốt hơn).
Nhanh và rẻ không còn có nghĩa là chất lượng thấp. Ngược lại, phát triển Java 2.0 là một cách tiếp cận chiến thuật đã giả định một quy trình vững chắc để nhấn mạnh chất lượng.
Một ngày đơn giản với App Engine của Google
App Engine của Google là một nền tảng thực sự để xây dựng và triển khai ứng dụng Web Java (và Python) trên cơ sở hạ tầng mở rộng của Google. Nó không yêu cầu lệ phí cấp phép sử dụng (tất nhiên, trừ ra một số thư viện phần mềm mà bạn chọn để sử dụng trên cơ sở hạ tầng ấy yêu cầu giấy phép) và không cần chi phí trả trước cho băng thông hoặc không gian lưu trữ. Cơ sở hạ tầng của App Engine là hoàn toàn miễn phí cho đến khi bạn đạt đến ngưỡng về mức sử dụng — dung lượng lưu trữ 500MB và, theo như trích dẫn nguyên văn từ Google, "đủ CPU và băng thông cho khoảng 5 triệu lượt xem trang mỗi tháng". Chỉ cần nói rằng, khi bạn đạt tới điểm mà Google bắt đầu gửi hóa đơn tính phí cho bạn, ứng dụng Web của bạn rõ ràng đã tạo ra lưu lượng đáng kể (và do đó có lãi).
Dựng lên một ứng dụng và chạy nó trên App Engine không thể dễ dàng hơn nữa. Google thậm chí còn cung cấp một trình cắm thêm Eclipse xử lý gần như mọi thứ cho bạn. Và trình cắm thêm này bao gồm các thành phần thiết yếu của một ứng dụng servlet "Hello World" để giúp bạn bắt đầu với nền tảng này. Trong bài giới thiệu nhập môn gần đây của ông trên developerWorks ("App Engine của Google cho Java, Phần 1: Tăng tốc nó!") Rick Hightower sẽ đưa bạn qua từng bước triển khai ứng dụng Hello World (bao gồm các ảnh chụp màn hình). Nếu bạn chưa từng làm việc theo bài viết của Rick, hãy làm theo các bước sau:
Bạn đã triển khai thành công ứng dụng Google App Engine đầu tiên của bạn và bạn đã không viết một dòng mã nào. Thực vậy, nếu bạn có kế hoạch sử dụng App Engine, bạn sẽ đi đến chỗ viết một số dòng mã — nhưng hãy nhớ rằng, đã có nhiều mã ở đó mà bạn có thể tái sử dụng để làm cho công việc của bạn dễ dàng hơn. Mã tái sử dụng đó có thể là các dịch vụ mà Google cung cấp (chẳng hạn như các dịch vụ tài khoản Google hoặc dịch vụ lưu trữ dữ liệu của nó) hoặc các thư viện nguồn mở đã được chuyển đến để làm việc trên cơ sở hạ tầng của Google. Việc dùng lại mã của người khác thường có nghĩa là bạn viết mã ít hơn — và ít mã hơn rất có thể có nghĩa là có ít lỗi hơn.
Một trong những thư viện nguồn mở yêu thích của tôi (và thực ra là các nền tảng) hầu như luôn dẫn đến ít dòng mã hơn để tạo ra các ứng dụng làm việc là Groovy (xem Tài nguyên). Nhóm Groovy gần đây đã phát hành các phiên bản của nền tảng này để làm việc trên App Engine, cho phép bạn sử dụng Groovlets thay vì các servlet làm cho một ứng dụng hoạt động nhanh gọn. Groovlets là các kịch bản lệnh Groovy đơn giản hành động như các servlet. Vì bạn đã có một servlet để in "Hello, world", tôi sẽ chỉ cho bạn cách làm điều tương tự với một Groovlet sẽ dễ dàng như thế nào (và bạn sẽ thấy Groovy cho phép ít hơn bao nhiêu dòng mã).
Việc triển khai một Groovlet trên App Engine với trình cắm thêm Eclipse diễn ra theo một vài bước đơn giản:
Bây giờ tôi sẽ chỉ cho bạn việc sử dụng Groovy cùng với App Engine của Google có thể mang lại một ứng dụng hoạt động nhanh gọn như thế nào. Tôi sẽ sử dụng một trang HTML đơn giản, một Groovlet và một lớp Java có tăng cường JDO để lưu giữ lâu bền một sự kiện (trong trường hợp này, một cuộc thi ba môn phối hợp). Tôi sẽ giữ cho nó đơn giản vào lúc này, nhưng bạn sẽ thấy rằng ứng dụng này có thể phát triển thêm để bao gồm các đặc tính khác và trong các bài viết tiếp theo của loạt bài này bạn sẽ thực hiện chúng (tất nhiên, sử dụng các cơ sở hạ tầng và các công nghệ khác).
JDO nhanh
Google App Engine cung cấp khả năng để lưu giữ lâu bền dữ liệu khi sử dụng JDO, là một tiêu chuẩn Java cho lưu giữ lâu bền (xem Tài nguyên). Đối với hầu hết các nhà phát triển Java, lưu giữ lâu bền dữ liệu thường ngụ ý việc ghi lưu thông tin vào một cơ sở dữ liệu quan hệ; tuy nhiên, trong trường hợp của Google, cơ chế lưu trữ nằm dưới là sở hữu độc quyền của Big Table, không phải là cơ sở dữ liệu quan hệ. Điều vừa nói không thực sự quan trọng: các chi tiết về cách Google lưu giữ lâu bền các thuộc tính cụ thể phần lớn được ẩn dấu với bạn. Chỉ cần nói rằng, bạn có thể sử dụng các đối tượng Java bình thường (hoặc các đối tượng Groovy, cho vấn đề này) để xây dựng một ứng dụng có thể lưu trữ thông tin như bạn sẽ làm trong bất kỳ ứng dụng nào khác. Vừ̀a vặn trong trường hợp của Google, bạn phải sử dụng JDO. (Hibernate, được cho là̀ một khung công tác ORM phổ biến cho Java, không làm việc với App Engine.)
JDO là khá đơn giản. Bạn tạo các POJO — Plain Old Java Objects (các đối tượng thuần Java) (có thể các có mối quan hệ với các đối tượng Java khác) — mà bạn khai báo có khả năng lưu giữ lâu bền thông qua chú giải mức lớp
Liệt kê 2. Một JDO của sự kiện thi đấu ba môn phối hợp đơn giản
Lưu trữ lâu bền dữ liệu, bất kể cơ chế nằm dưới (đó là, cơ sở dữ liệu quan hệ hoặc Big Table của Google) vẫn đòi hỏi khái niệm về khóa: một cách để bảo đảm tính độc nhất của các khía cạnh dữ liệu khác nhau để tránh những xung đột dữ liệu. Ví dụ, trong trường hợp của một cuộc thi đấu ba môn phối hợp, khóa có thể là tên của cuộc thi đấu ba môn phối hợp này. Nếu hai cuộc thi đấu ba môn phối hợp có cùng tên, thì khóa có thể là tổ hợp gồm tên và ngày tháng. Bất kể bạn chọn để biểu diễn một khoá với App Engine của Google và JDO như thế nào, bạn phải chỉ định một khóa trong đối tượng JDO của bạn thông qua chú giải
Liệt kê 3. Thêm một khóa chính cho JDO của cuộc thi đấu ba môn phối hợp
Như bạn có thể thấy trong Liệt kê 3, JDO của cuộc thi đấu ba môn phối hợp của tôi bây giờ có một khoá được cơ sở hạ tầng của Google quản lý và tôi đã thêm một vài phương thức tiêu chuẩn (
Tôi đã giữ cho JDO của mình đơn giản có mục đích, nhưng như bạn có thể thấy, không có nhiều thứ cho nó (đó là, tôi đã bỏ qua các mối quan hệ và bỏ qua các phương thức getter và setter cho ngắn gọn). Đơn giản là bạn mô hình hóa miền quan tâm của bạn và sau đó trang trí mô hình đó với một vài chú giải và Google sẽ lo phần còn lại.
Với một đối tượng được định nghĩa là có khả năng lưu giữ lâu bền, còn một bước cuối cùng. Để tương tác với kho lưu trữ dữ liệu nằm dưới, bạn cần phải làm việc với lớp
Liệt kê 4. Một cá thể đơn giản để trả về một cá thể
Như bạn có thể thấy
Hai đối tượng Java vừa mới được định nghĩa nằm trong thư mục src của dự án của tôi, và tôi đã thêm thư viện commons-lang tới thư mục war/WEB-INF/lib.
Với một JDO POJO của cuộc thi đấu ba môn phối hợp đơn giản đã định nghĩa và một đối tượng
Hầu hết các ứng dụng Web theo cùng một mẫu: nắm bắt thông tin qua các biểu mẫu (form) HTML và gửi chúng đến một nguồn tài nguyên phía máy chủ để xử lý. Chắc chắn, rất nhiều gia vị được trộn thêm ở đâu đó, nhưng mẫu này vẫn giữ nguyên không phụ thuộc vào công nghệ hoặc cơ sở hạ tầng nằm dưới. Google App Engine cũng không khác — tôi đã mã hoá nguồn tài nguyên phía máy chủ để xử lý lưu trữ dữ liệu thi đấu ba môn phối hợp. Tất cả những gì còn lại là một cách để nắm bắt được thông tin — một biểu mẫu — và một cách để buộc phía máy chủ và biểu mẫu này với nhau. Theo ngôn ngữ Model-View-Controller (MVC- Mô hình -Khung nhìn- Trình điều khiển), tôi cần một trình điều khiển, nó thường là một servlet; thay vào đó tôi sẽ sử dụng Groovlet vì tôi muốn viết mã ít hơn.
Biểu mẫu HTML của tôi rất đơn giản: tất cả những gì tôi đã làm là tạo ra một trang HTML có sử dụng mã Cascading Style Sheets (CSS-phiếu định kiểu nhiều tầng) đơn giản, được hiển thị trong Hình 1, trông giống như Web 2.0 hơn các trang HTML vào khoảng năm 1998:
Hình 1. Một biểu mẫu HTML đơn giản
Như bạn thấy trong Hình 1, biểu mẫu thu giữ một tên, lời mô tả và một ngày tháng. Tuy nhiên, ngày tháng không đơn giản như thế — thực sự có ba thuộc tính về ngày tháng.
Groovlet nhanh
Groovlets làm cho viết mã lệnh trình điều khiển trở thành việc ngon ơ: chúng yêu cầu mã ít hơn và tự động cung cấp các đối tượng cần thiết. Trong một Groovlet, bạn có khả năng truy cập ngầm ẩn đến các yêu cầu HTML và các đáp ứng HTML thông qua các đối tượng
Liệt kê 5. Groovlets hoạt động
JDO mà tôi đã viết mã trên đây sử dụng một đối tượng Java
Liệt kê 6. Định dạng ngày tháng hoạt động
Cuối cùng, với tất cả các tham số thu được từ một biểu mẫu HTML đã gửi đi, trong Liệt kê 7 tôi có thể lưu giữ lâu bền chúng vào cơ sở hạ tầng của Google qua JDO của tôi và đối tượng
Liệt kê 7. JDO để lưu giữ lâu bền dễ dàng
Vậy là xong! Dĩ nhiên nếu như nhiều trang khác được bổ sung vào ứng dụng đơn giản của tôi (ví dụ như thu giữ các kết quả của một cuộc thi đấu ba môn phối hợp cụ thể), thì tôi có lẽ sẽ chuyển tiếp hoặc chuyển hướng đến một biểu mẫu khác, sau đó biểu mẫu này sẽ nắm bắt thông tin bổ sung, giống như một trình thủ thuật. Dù sao chăng nữa, chỉ bằng một vài đoạn mã ngắn, tôi nhanh chóng sắp đặt thành một ứng dụng Web đơn giản, có thể lưu giữ lâu bền dữ liệu vào cơ sở hạ tầng của Google thông qua JDO (được mã hóa bằng Java thông thường) và một Groovlet (tất nhiên, được mã hóa theo Groovy). Việc triển khai ứng dụng rất dễ dàng, đúng như chỉ định một phiên bản trong tệp appengine-web.xml và nhấn vào nút Deploy.
Mặc dù ứng dụng Web chỉ có một biểu mẫu bắt giữ các sự kiện thi đấu ba môn phối hợp không đun sôi đại dương, phải nói như vậy, nhưng tôi đã triển khai nó tới một môi trường vô định hình, có mặt ở khắp nơi. Tôi đã không phải thực hiện một thùng chứa Web hoặc thậm chí chỉ rõ triển khai ứng dụng ở đâu. (Ổ đĩa cứng của tôi đang ở California, hoặc trên mặt trăng?). Vẻ đẹp là điều không quan trọng — Google đã chăm lo về việc này. Tất cả về việc này. Hơn nữa, đó là một sự đặt cược an toàn vì Google đã tính toán ở quy mô toàn cầu để cho ai đó xem ứng dụng ở Ấn Độ có cũng trải nghiệm tương tự như một người nào đó đang ở, nói ví dụ, Argentina.
Khi nói tất cả những điều này, bạn cần phải ghi nhớ một số điều. Cơ sở hạ tầng của Google hỗ trợ công nghệ Java, nhưng không phải hỗ trợ tất cả mọi thứ; nếu bạn còn nhớ khi J2ME xuất hiện vài năm trước đây, các hạn chế của App Engine hơi giống thế về bản chất. Nghĩa là, không phải tất cả các thư viện Java lõi và các thư viện nguồn mở có liên quan được hỗ trợ. Như tôi đã đề cập, không thể sử dụng Hibernate (chủ yếu là bởi vì bạn không có một cơ sở dữ liệu quan hệ với App Engine). Tôi cũng đã gặp một số thách thức khi sử dụng một số thư viện nguồn mở có nhúng mã hóa base64 (Google yêu cầu bạn sử dụng dịch vụ URL Fetch của mình để thay thế). App Engine là một nền tảng — bạn phải phát triển với nó và, cho đến nay, đó có thể là một đường phố một chiều.
Alan Kay, một trong những cha đẻ của lập trình hướng đối tượng, được trích dẫn rằng đã nói: "Cách tốt nhất để dự đoán tương lai là phát minh ra nó." Tôi đồng ý với Alan Kay. Bất kể những gì người khác đang giả thuyết là tương lai của công nghệ Java, tôi nghĩ rằng tương lai đã ở đây rồi.
Như bạn đã thấy trong bài viết này, Google App Engine là một nền tảng cho tương lai — đã cung cấp cho bạn trò chơi trong hộp cát (sandbox) của nó. (Hãy nhớ rằng tôi đã trình bày chỉ một vài hạt cát trong hộp cát đó, App Engine có rất nhiều tính năng). Nếu bạn muốn linh hoạt hơn (nghĩa là, bạn muốn có một cơ sở dữ liệu quan hệ và không thể sống mà không có Hibernate) nhưng lại cũng thích ý tưởng vay mượn cơ sở hạ tầng có khả năng mở rộng của người khác, đã có sẵn các sự lựa chọn thay thế. EC2 của Amazon chính xác là một máy chủ ảo trên một cơ sở hạ tầng không định hình mà bạn cũng có thể gọi đến theo yêu cầu. Bạn sẽ đọc nó trong bài viết tiếp theo về Sự phát triển Java 2.0 trong tháng tới.
Tài nguyên
Học tập
Nguồn : http://www.ibm.com/developerworks/vn/library/j-javadev2-1/index.html
Ah rất buồn là appspot.com lại chưa hỗ trợ developer Việt đăng kí. (Cần confirm = sms mà). Nếu bạn có người quen ở nước ngoài phải xin 1 cái số và active là xong. Chúc thành công.
Thế giới Java là một hệ sinh thái phong phú với một bố cục trải rộng gồm các nhà phát triển, các doanh nghiệp và — quan trọng nhất — các ứng dụng, nhiều ứng dụng đã hoàn thiện trong hơn một thập kỷ qua. Cộng đồng Java trên toàn thế giới đã đầu tư rất nhiều tiền bạc, thời gian và trí lực vào nền tảng này và những đóng góp này đã mang lại một kho tàng giàu có các công cụ mã nguồn mở và các công cụ thương mại, các khung công tác, và thực sự cả các giải pháp, rất thành công.
Hàng loạt đầu tư như nói trên vào nền tảng Java đã thay đổi cách phát triển Java một cách khéo léo. Hai xu hướng chính đang thay đổi nhanh chóng đặc điểm của nó:
- Lợi dụng hoàn toàn các công cụ và các khung công tác mã nguồn mở để xây dựng các ứng dụng từ trên xuống dưới.
- Thuê (hoặc mượn) các cơ sở hạ tầng ứng dụng cần thiết ở mọi cấp độ để quản lý vòng đời phần mềm, bao gồm cả việc tự chạy các ứng dụng.
Bài viết này khởi đầu một loạt bài viết mới sẽ tìm hiểu việc phát triển Java 2.0 sâu hơn. Bạn sẽ tìm hiểu về việc xây dựng và triển khai các ứng dụng Web với EC2 của Amazon, sử dụng Google App Engine (máy ứng dụng của Google), sử dụng CouchDB (đang được gọi là cơ sở dữ liệu cho Web) và các công cụ và các công nghệ khác cung cấp các khối xây dựng để lắp ráp, thử nghiệm và triển khai các ứng dụng nhanh gọn và chi phí ít tiền hơn so với từ trước đến bây giờ.
Điểm dừng đầu tiên: Google App Engine cho Java (xem Tài nguyên). Tôi sẽ giới thiệu cho bạn nền tảng này bằng phương pháp "Hello World" (Xin chào Thế giới) truyền thống, sau đó chỉ cho bạn cách tạo một ứng dụng Web hoạt động bằng cách sử dụng Groovy, Java Data Objects (JDO-Các đối tượng dữ liệu Java) và trình cắm thêm Eclipse cho Google App Engine. Tuy nhiên, theo trình tự, trước tiên hãy xem tổng quan nhanh về giá trị kinh doanh của việc phát triển Java 2.0.
Nhanh và rẻ
Các từ nhanh và rẻ thường không được kết hợp với việc phát triển Java. Trong thực tế, chúng thường gợi lên các ấn tượng về phát triển phần mềm ít quan trọng — tầm nhìn của các công ty nhỏ có ít nguồn lực. Tuy nhiên, sự thật của vấn đề là CNTT là một trọng tâm chi phí đối với nhiều công ty (lớn và nhỏ), thúc đẩy họ giữ cho các chi phí CNTT thấp trong khi rút ra càng nhiều giá trị càng tốt.
Đó là nơi việc phát triển Java 2.0 vào cuộc. Bằng cách sử dụng các công cụ mã nguồn mở, các khung công tác và thậm chí các giải pháp, các công ty có thể lắp ráp các ứng dụng phần mềm nhanh chóng vì họ không phải tự mình viết nhiều mã lệnh. Khi lần đầu tiên tôi bắt đầu phát triển phần mềm bằng công nghệ Java hơn 10 năm trước đây, phạm vi của các công cụ và các khung công tác có sẵn cho các nhà phát triển nhỏ bé hơn nhiều. Một số ít các công cụ đó cũng không có sẵn miễn phí. Bạn phải mua một IDE, một cơ sở dữ liệu, một khung công tác ánh xạ đối tượng-quan hệ (ORM) (ôi chết tiệt, bạn có thể đã phải mua trình điều khiển cần thiết để giao tiếp với cơ sở dữ liệu của bạn) và dĩ nhiên, các máy để triển khai ứng dụng của bạn trên đó. Bây giờ? Tất cả mọi thứ mà tôi vừa liệt kê (và nhiều hơn nữa) là có sẵn miễn phí và chất lượng cao.
Hơn nữa, bằng cách vay mượn cơ sở hạ tầng (ví dụ như những cơ sở hạ tầng được EC2 của Amazon hoặc Google App Engine cung cấp), bạn có thể triển khai ứng dụng khá rẻ (so với mua toàn bộ cơ sở hạ tầng cần thiết).
Xây dựng, mua, hay mượn: Đó là câu hỏi mới
Nhiều doanh nghiệp có cả một danh sách phần cứng để chạy các ứng dụng như các cơ sở dữ liệu, các máy chủ ứng dụng, các hệ thống quản lý thay đổi và các công cụ lần vết tìm lỗi. Tuy vậy, ngày nay, danh sách này có thể dễ dàng vứt bỏ để thay bằng việc sử dụng chính gói phần mềm ấy dưới dạng một dịch vụ đang chạy trên một cơ sở hạ tầng của người nào đó khác.
Toàn bộ chồng ứng dụng mà một nhóm làm việc có thể phải sử dụng để quản lý một quá trình phát triển có thể được vay mượn — nghĩa là, thuê với một khoản phí nhỏ — giải phóng cho công ty khỏi phải đầu tư vào phần cứng để chạy chúng. Ví dụ, thay vì mua một máy tính để chạy một hệ thống quản lý thay đổi (như Subversion hoặc Git, cả hai là mã nguồn mở và có sẵn miễn phí), một nhóm làm việc có thể sử dụng một dịch vụ quản lý thay đổi dùng chung như GitHub. Công ty đằng sau GitHub phải gánh chịu chi phí của các tài sản phần cứng và tính một chi phí danh nghĩa (thường là hàng tháng cho mỗi người dùng) cho các tổ chức khác sử dụng Git. Cùng một nguyên tắc thuê phần mềm như là một dịch vụ từ các nhà cung cấp khác như thế này có thể được áp dụng cho việc lần vết tìm lỗi, quản lý các bài kiểm thử và quản lý các yêu cầu (ví dụ qua JIRA Hosted hoặc Pivotal Tracker).
Cũng có thể nói giống như vậy đối với các tài sản phần cứng nằm dưới mà các nền tảng phần mềm khác (về bản chất, thường là tùy chỉnh) chạy trên đó. Một doanh nghiệp có thể vứt bỏ phần cứng nằm bên dưới của một ứng dụng web cụ thể để thay bằng việc chạy ứng dụng trên phần cứng được cung cấp bởi Amazon, Google hoặc các đối tác khác. Các công ty này đưa ra khả năng thuê phần cứng ở các mức độ khác nhau, vừa vặn có thể lưu trữ một ứng dụng. Hơn nữa, các công ty này quản lý khả năng mở rộng, sao lưu và thậm chí cả an ninh nữa. Hãy suy nghĩ về nó một lát: Amazon và Google đã nêu ra những mối quan tâm này (và nhiều hơn nữa) từ lâu rồi và đối phó tốt hơn với chúng, có nhiều đổi mới xung quanh các khía cạnh của việc chạy các nền tảng phần mềm sao cho hiệu quả. (Đó là đúng. Hãy đương đầu với nó).
Bằng cách sử dụng App Engine của Google, ví dụ thế, một công ty CNTT có thể hạ thấp tổng chi phí mua một cơ sở hạ tầng để chạy các ứng dụng cần thiết. Và họ có thể triển khai các ứng dụng đó nhanh hơn vì vô số các mối quan tâm đan chéo nhau, kết hợp với việc triển khai ứng dụng và quản lý đã được tính đến và vì thế được cung cấp cho họ (với nhiều khả năng là theo một cách tốt hơn).
Nhanh và rẻ không còn có nghĩa là chất lượng thấp. Ngược lại, phát triển Java 2.0 là một cách tiếp cận chiến thuật đã giả định một quy trình vững chắc để nhấn mạnh chất lượng.
App Engine của Google là một nền tảng thực sự để xây dựng và triển khai ứng dụng Web Java (và Python) trên cơ sở hạ tầng mở rộng của Google. Nó không yêu cầu lệ phí cấp phép sử dụng (tất nhiên, trừ ra một số thư viện phần mềm mà bạn chọn để sử dụng trên cơ sở hạ tầng ấy yêu cầu giấy phép) và không cần chi phí trả trước cho băng thông hoặc không gian lưu trữ. Cơ sở hạ tầng của App Engine là hoàn toàn miễn phí cho đến khi bạn đạt đến ngưỡng về mức sử dụng — dung lượng lưu trữ 500MB và, theo như trích dẫn nguyên văn từ Google, "đủ CPU và băng thông cho khoảng 5 triệu lượt xem trang mỗi tháng". Chỉ cần nói rằng, khi bạn đạt tới điểm mà Google bắt đầu gửi hóa đơn tính phí cho bạn, ứng dụng Web của bạn rõ ràng đã tạo ra lưu lượng đáng kể (và do đó có lãi).
Dựng lên một ứng dụng và chạy nó trên App Engine không thể dễ dàng hơn nữa. Google thậm chí còn cung cấp một trình cắm thêm Eclipse xử lý gần như mọi thứ cho bạn. Và trình cắm thêm này bao gồm các thành phần thiết yếu của một ứng dụng servlet "Hello World" để giúp bạn bắt đầu với nền tảng này. Trong bài giới thiệu nhập môn gần đây của ông trên developerWorks ("App Engine của Google cho Java, Phần 1: Tăng tốc nó!") Rick Hightower sẽ đưa bạn qua từng bước triển khai ứng dụng Hello World (bao gồm các ảnh chụp màn hình). Nếu bạn chưa từng làm việc theo bài viết của Rick, hãy làm theo các bước sau:
- Hãy tạo một tài khoản App Engine của Google (nó là miễn phí) bằng cách nhấn vào liên kết Sign up (Đăng nhập) trong Getting Started (Bắt đầu) trên trang http://code.google.com/appengine/.
- Tải xuống trình cắm thêm App Engine của Google cho Eclipse từ http://code.google.com/appengine/downloads.html và cài đặt nó.
- Tạo một dự án mới bằng cách nhấn vào nút New Web Application Project (Dự án ứng dụng Web mới) trong Eclipse, trong hộp thoại kết quả, bỏ dấu chọn của tùy chọn Use Google Web Toolkit (sử dụng dụng cụ Web của Google). Đặt tên dự án và gói tương ứng là bất cứ cái gì bạn muốn.
- Chọn dự án của bạn trong hệ thống phân cấp và nhấn vào nút Deploy App Engine Project (Triển khai dự án App Engine).
- Nhập mã ủy quyền của bạn (là cái mà bạn đã sử dụng khi tạo ra một tài khoản App Engine trong Bước 1).
- Kết hợp dự án cục bộ của bạn với mã nhận dạng (ID) của ứng dụng mà bạn tạo ra khi bạn bước đầu tạo một tài khoản App Engine. (Bạn có thể có đến 10 ID).
- Nhấn vào nút Deploy (Triển khai). Bạn sẽ thấy rất nhiều văn bản trôi qua trên bàn điều khiển Eclipse (trình cắm thêm đang thực hiện rất nhiều đằng sau hậu trường bao gồm việc cải tiến mọi lớp cần thiết nào để sử dụng dịch vụ lưu trữ-dữ liệu rất ấn tượng của Google). Khi tiếng ồn dịu dần (và tất cả mọi thứ đã làm việc đúng), bạn sẽ thấy một thông báo kết thúc bằng dòng chữ "Việc triển khai đã hoàn tất thành công."
- Đi tới trang tài khoản App Engine của bạn tại Google và tìm liên kết Versions trên bảng điều khiển của Google. Ở đó bạn sẽ thấy phiên bản đã triển khai của bạn và URL tương ứng của nó. Nhấn vào URL và sau đó nhấn vào liên kết tới servlet đã tạo ra để thấy dòng chữ "Hello, world" (Xin chào, thế giới) buồn tẻ nhưng lại làm bạn hài lòng làm sao, được in ra dạng văn bản.
Bạn đã triển khai thành công ứng dụng Google App Engine đầu tiên của bạn và bạn đã không viết một dòng mã nào. Thực vậy, nếu bạn có kế hoạch sử dụng App Engine, bạn sẽ đi đến chỗ viết một số dòng mã — nhưng hãy nhớ rằng, đã có nhiều mã ở đó mà bạn có thể tái sử dụng để làm cho công việc của bạn dễ dàng hơn. Mã tái sử dụng đó có thể là các dịch vụ mà Google cung cấp (chẳng hạn như các dịch vụ tài khoản Google hoặc dịch vụ lưu trữ dữ liệu của nó) hoặc các thư viện nguồn mở đã được chuyển đến để làm việc trên cơ sở hạ tầng của Google. Việc dùng lại mã của người khác thường có nghĩa là bạn viết mã ít hơn — và ít mã hơn rất có thể có nghĩa là có ít lỗi hơn.
Một trong những thư viện nguồn mở yêu thích của tôi (và thực ra là các nền tảng) hầu như luôn dẫn đến ít dòng mã hơn để tạo ra các ứng dụng làm việc là Groovy (xem Tài nguyên). Nhóm Groovy gần đây đã phát hành các phiên bản của nền tảng này để làm việc trên App Engine, cho phép bạn sử dụng Groovlets thay vì các servlet làm cho một ứng dụng hoạt động nhanh gọn. Groovlets là các kịch bản lệnh Groovy đơn giản hành động như các servlet. Vì bạn đã có một servlet để in "Hello, world", tôi sẽ chỉ cho bạn cách làm điều tương tự với một Groovlet sẽ dễ dàng như thế nào (và bạn sẽ thấy Groovy cho phép ít hơn bao nhiêu dòng mã).
Việc triển khai một Groovlet trên App Engine với trình cắm thêm Eclipse diễn ra theo một vài bước đơn giản:
- Tải về phiên bản mới nhất của Groovy (tại thời điểm bài viết này là 1.6.3) từ http://groovy.codehaus.org/Download.
- Tìm tệp groovy-all-1.6.3.jar và đặt nó vào thư mục war/WEB-INF/lib của dự án App Engine của bạn. Tiện thể, trong thư mục này, bạn có thể đặt bất kỳ thư viện nào mà ứng dụng của bạn yêu cầu (với một số cảnh báo mà tôi sẽ trình bày ngay sau đây).
- Thêm các câu trong Liệt kê 1 (để ánh xạ Groovlets tới các yêu cầu chuyên dùng) vào tệp web.xml, có trong thư mục war/WEB-INF:
Liệt kê 1. Cập nhật tệp web.xml để hỗ trợ Groovlets
<servlet> <servlet-name>GroovyServlet</servlet-name> <servlet-class>groovy.servlet.GroovyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GroovyServlet</servlet-name> <url-pattern>*.groovy</url-pattern> </servlet-mapping>
- Thêm một thư mục groovy vào thư mục WEB-INF của bạn; đây là nơi bạn sẽ lưu Groovlets của mình. Trong thư mục groovy, tạo một tệp mới gọi là helloworld.groovy. Trong tệp mới đó, gõ nhập
println "Hello, Groovy baby!"
- Cập nhật phiên bản của ứng dụng của bạn — gọi là 1-1 — và triển khai lại. Tìm URL tương ứng qua bảng điều khiển Google và sau đó lướt tới /helloworld.groovy trong trình duyệt của bạn và thưởng thức sự lộng lẫy của một thông báo hợp thời được in từ Groovy trên cơ sở hạ tầng của Google.
Về đầu trang
Groovy + Java = ứng dụng hoạt động. Rất nhanh chóng.Bây giờ tôi sẽ chỉ cho bạn việc sử dụng Groovy cùng với App Engine của Google có thể mang lại một ứng dụng hoạt động nhanh gọn như thế nào. Tôi sẽ sử dụng một trang HTML đơn giản, một Groovlet và một lớp Java có tăng cường JDO để lưu giữ lâu bền một sự kiện (trong trường hợp này, một cuộc thi ba môn phối hợp). Tôi sẽ giữ cho nó đơn giản vào lúc này, nhưng bạn sẽ thấy rằng ứng dụng này có thể phát triển thêm để bao gồm các đặc tính khác và trong các bài viết tiếp theo của loạt bài này bạn sẽ thực hiện chúng (tất nhiên, sử dụng các cơ sở hạ tầng và các công nghệ khác).
JDO nhanh
Google App Engine cung cấp khả năng để lưu giữ lâu bền dữ liệu khi sử dụng JDO, là một tiêu chuẩn Java cho lưu giữ lâu bền (xem Tài nguyên). Đối với hầu hết các nhà phát triển Java, lưu giữ lâu bền dữ liệu thường ngụ ý việc ghi lưu thông tin vào một cơ sở dữ liệu quan hệ; tuy nhiên, trong trường hợp của Google, cơ chế lưu trữ nằm dưới là sở hữu độc quyền của Big Table, không phải là cơ sở dữ liệu quan hệ. Điều vừa nói không thực sự quan trọng: các chi tiết về cách Google lưu giữ lâu bền các thuộc tính cụ thể phần lớn được ẩn dấu với bạn. Chỉ cần nói rằng, bạn có thể sử dụng các đối tượng Java bình thường (hoặc các đối tượng Groovy, cho vấn đề này) để xây dựng một ứng dụng có thể lưu trữ thông tin như bạn sẽ làm trong bất kỳ ứng dụng nào khác. Vừ̀a vặn trong trường hợp của Google, bạn phải sử dụng JDO. (Hibernate, được cho là̀ một khung công tác ORM phổ biến cho Java, không làm việc với App Engine.)
JDO là khá đơn giản. Bạn tạo các POJO — Plain Old Java Objects (các đối tượng thuần Java) (có thể các có mối quan hệ với các đối tượng Java khác) — mà bạn khai báo có khả năng lưu giữ lâu bền thông qua chú giải mức lớp
@PersistenceCapable
. Bạn xác định các thuộc tính nào của đối tượng được lưu giữ lâu bền qua các chú giải @Persistent
. Ví dụ, tôi muốn lưu trữ các sự kiện thi đấu ba môn phối hợp (lúc này tôi sẽ tập trung vào sự kiện này mà không phải là nhiều kết quả khác có liên quan đến một cuộc thi đấu ba môn phối hợp) — có nghĩa là, một sự kiện có một tên (tên của cuộc thi đấu ba môn phối hợp), có thể là có một mô tả (cuộc thi đấu ba môn phối hợp kiểu nào) và một ngày tháng. Cho đến nay, JDO của tôi trông giống như Liệt kê 2:Liệt kê 2. Một JDO của sự kiện thi đấu ba môn phối hợp đơn giản
import java.util.Date; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.IdentityType; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Triathlon { @Persistent private Date date; @Persistent private String name; @Persistent private String description; } |
Lưu trữ lâu bền dữ liệu, bất kể cơ chế nằm dưới (đó là, cơ sở dữ liệu quan hệ hoặc Big Table của Google) vẫn đòi hỏi khái niệm về khóa: một cách để bảo đảm tính độc nhất của các khía cạnh dữ liệu khác nhau để tránh những xung đột dữ liệu. Ví dụ, trong trường hợp của một cuộc thi đấu ba môn phối hợp, khóa có thể là tên của cuộc thi đấu ba môn phối hợp này. Nếu hai cuộc thi đấu ba môn phối hợp có cùng tên, thì khóa có thể là tổ hợp gồm tên và ngày tháng. Bất kể bạn chọn để biểu diễn một khoá với App Engine của Google và JDO như thế nào, bạn phải chỉ định một khóa trong đối tượng JDO của bạn thông qua chú giải
@PrimaryKey
. Bạn cũng có thể chọn các chiến lược để sinh ra một khóa như thế nào — hoặc do bạn làm hoặc do cơ sở hạ tầng của Google. Tôi sẽ dành việc này cho Google và làm cho nó đơn giản: khóa của đối tượng cuộc thi đấu ba môn phối hợp của tôi được biểu diễn như là một đối tượng Long
Java thông thường và tôi sẽ để cho Google chọn giá trị thực tế bằng cách xác định một chiến lược giá trị. Liệt kê 3 bổ sung thêm khóa chính:Liệt kê 3. Thêm một khóa chính cho JDO của cuộc thi đấu ba môn phối hợp
import java.util.Date; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; import javax.jdo.annotations.IdentityType; import org.apache.commons.lang.builder.EqualsBuilder; import org.apache.commons.lang.builder.HashCodeBuilder; import org.apache.commons.lang.builder.ReflectionToStringBuilder; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Triathlon { @PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id; @Persistent private Date date; @Persistent private String name; @Persistent private String description; public Triathlon(Date date, String name, String description) { super(); this.date = date; this.name = name; this.description = description; } //...setters and getters left out public String toString() { return ReflectionToStringBuilder.toString(this); } public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } } |
Như bạn có thể thấy trong Liệt kê 3, JDO của cuộc thi đấu ba môn phối hợp của tôi bây giờ có một khoá được cơ sở hạ tầng của Google quản lý và tôi đã thêm một vài phương thức tiêu chuẩn (
toString
, hashCode
, và equals
) chúng trợ giúp nhiều cho việc gỡ rối, ghi nhật ký và tất nhiên cả phương thức chức năng thích hợp. Thay vì tự mình viết chúng, tôi sử dụng thư viện Apache commons-lang (xem Tài nguyên). Tôi cũng đã thêm một hàm tạo (constructor) để tạo ra các đối tượng được khởi tạo đầy để dễ dàng hơn nhiều nếu so với gọi một lô phương thức setterTôi đã giữ cho JDO của mình đơn giản có mục đích, nhưng như bạn có thể thấy, không có nhiều thứ cho nó (đó là, tôi đã bỏ qua các mối quan hệ và bỏ qua các phương thức getter và setter cho ngắn gọn). Đơn giản là bạn mô hình hóa miền quan tâm của bạn và sau đó trang trí mô hình đó với một vài chú giải và Google sẽ lo phần còn lại.
Với một đối tượng được định nghĩa là có khả năng lưu giữ lâu bền, còn một bước cuối cùng. Để tương tác với kho lưu trữ dữ liệu nằm dưới, bạn cần phải làm việc với lớp
PersistenceManager
, đây là một lớp JDO tiêu chuẩn thực hiện những gì mà tên của nó ngụ ý: ghi lưu, cập nhật, lấy ra và loại bỏ các đối tượng từ một kho lưu trữ dữ liệu nằm dưới (giống như đối tượng Session
của Hibernate). Lớp này được tạo ra thông qua một lớp nhà máy (PersistenceManagerFactory
), nó khá phức tạp, vì thế, Google khuyến cáo tạo ra một đối tượng đơn lẻ để quản lý chỉ một cá thể của nhà máy (đối tượng ấy sẽ trả về một PersistenceManager
thích hợp khi bạn cần nó). Theo đó, tôi có thể định nghĩa một đối tượng đơn lẻ đơn giản để trả về một cá thể PersistenceManager
, như hiển thị trong Liệt kê 4: Liệt kê 4. Một cá thể đơn giản để trả về một cá thể
PersistenceManager
import javax.jdo.JDOHelper; import javax.jdo.PersistenceManager; import javax.jdo.PersistenceManagerFactory; public class PersistenceMgr { private static final PersistenceManagerFactory instance = JDOHelper.getPersistenceManagerFactory("transactions-optional"); private PersistenceMgr() {} public static PersistenceManager manufacture() { return instance.getPersistenceManager(); } } |
Như bạn có thể thấy
PersistenceMgr
của tôi khá đơn giản. Một phương thức, manufacture
, trả về một cá thể PersistenceManager
từ chỉ một cá thể của một PersistenceManagerFactory
. Bạn cũng sẽ nhận thấy rằng không có mã đặc thù Google nào trong Liệt kê 4 hoặc bất kỳ liệt kê nào khác sử dụng JDO — tất cả các tham chiếu đều là các lớp và các giao diện JDO tiêu chuẩn.Hai đối tượng Java vừa mới được định nghĩa nằm trong thư mục src của dự án của tôi, và tôi đã thêm thư viện commons-lang tới thư mục war/WEB-INF/lib.
Với một JDO POJO của cuộc thi đấu ba môn phối hợp đơn giản đã định nghĩa và một đối tượng
PersistenceMgr
dễ sử dụng, tôi đã sẵn sàng để tiếp tục. Tất cả những thứ mà tôi cần bây giờ là một cách để nắm bắt thông tin về cuộc thi đấu ba môn phối hợp.Về đầu trang
Nắm bắt dữ liệu qua một giao diện Web Hầu hết các ứng dụng Web theo cùng một mẫu: nắm bắt thông tin qua các biểu mẫu (form) HTML và gửi chúng đến một nguồn tài nguyên phía máy chủ để xử lý. Chắc chắn, rất nhiều gia vị được trộn thêm ở đâu đó, nhưng mẫu này vẫn giữ nguyên không phụ thuộc vào công nghệ hoặc cơ sở hạ tầng nằm dưới. Google App Engine cũng không khác — tôi đã mã hoá nguồn tài nguyên phía máy chủ để xử lý lưu trữ dữ liệu thi đấu ba môn phối hợp. Tất cả những gì còn lại là một cách để nắm bắt được thông tin — một biểu mẫu — và một cách để buộc phía máy chủ và biểu mẫu này với nhau. Theo ngôn ngữ Model-View-Controller (MVC- Mô hình -Khung nhìn- Trình điều khiển), tôi cần một trình điều khiển, nó thường là một servlet; thay vào đó tôi sẽ sử dụng Groovlet vì tôi muốn viết mã ít hơn.
Biểu mẫu HTML của tôi rất đơn giản: tất cả những gì tôi đã làm là tạo ra một trang HTML có sử dụng mã Cascading Style Sheets (CSS-phiếu định kiểu nhiều tầng) đơn giản, được hiển thị trong Hình 1, trông giống như Web 2.0 hơn các trang HTML vào khoảng năm 1998:
Hình 1. Một biểu mẫu HTML đơn giản
Như bạn thấy trong Hình 1, biểu mẫu thu giữ một tên, lời mô tả và một ngày tháng. Tuy nhiên, ngày tháng không đơn giản như thế — thực sự có ba thuộc tính về ngày tháng.
Groovlet nhanh
Groovlets làm cho viết mã lệnh trình điều khiển trở thành việc ngon ơ: chúng yêu cầu mã ít hơn và tự động cung cấp các đối tượng cần thiết. Trong một Groovlet, bạn có khả năng truy cập ngầm ẩn đến các yêu cầu HTML và các đáp ứng HTML thông qua các đối tượng
request
và response
tương ứng. Trong Groovlet của tôi, tôi có thể lấy ra nhanh chóng tất cả các thuộc tính của biểu mẫu HTML đã gửi lên thông qua lời gọi request.getParameter("name")
, như thể hiện trong Liệt kê 5: Liệt kê 5. Groovlets hoạt động
def triname = request.getParameter("tri_name") def tridesc = request.getParameter("tri_description") def month = request.getParameter("tri_month") def day = request.getParameter("tri_day") def year = request.getParameter("tri_year") |
JDO mà tôi đã viết mã trên đây sử dụng một đối tượng Java
Date
(Ngày tháng); tuy nhiên, trong Liệt kê 5, tôi đang làm việc với ba thuộc tính khác biệt của Date
. Vì vậy, tôi cần một đối tượng DateFormat
để chuyển đổi tổ hợp tháng, ngày, năm thành đối tượng month
, day
, year
thành đối tượng Date
Java bình thường, như chỉ ra trong Liệt kê 6: Liệt kê 6. Định dạng ngày tháng hoạt động
def formatter = new SimpleDateFormat("MM/dd/yyyy") def tridate = formatter.parse("${month}/${day}/${year}") |
Cuối cùng, với tất cả các tham số thu được từ một biểu mẫu HTML đã gửi đi, trong Liệt kê 7 tôi có thể lưu giữ lâu bền chúng vào cơ sở hạ tầng của Google qua JDO của tôi và đối tượng
PersistenceMgr
từ Liệt kê 4: Liệt kê 7. JDO để lưu giữ lâu bền dễ dàng
def triathlon = new Triathlon(tridate, triname, tridesc) def mgr = PersistenceMgr.manufacture() try { mgr.makePersistent(triathlon) } finally { mgr.close() } |
Vậy là xong! Dĩ nhiên nếu như nhiều trang khác được bổ sung vào ứng dụng đơn giản của tôi (ví dụ như thu giữ các kết quả của một cuộc thi đấu ba môn phối hợp cụ thể), thì tôi có lẽ sẽ chuyển tiếp hoặc chuyển hướng đến một biểu mẫu khác, sau đó biểu mẫu này sẽ nắm bắt thông tin bổ sung, giống như một trình thủ thuật. Dù sao chăng nữa, chỉ bằng một vài đoạn mã ngắn, tôi nhanh chóng sắp đặt thành một ứng dụng Web đơn giản, có thể lưu giữ lâu bền dữ liệu vào cơ sở hạ tầng của Google thông qua JDO (được mã hóa bằng Java thông thường) và một Groovlet (tất nhiên, được mã hóa theo Groovy). Việc triển khai ứng dụng rất dễ dàng, đúng như chỉ định một phiên bản trong tệp appengine-web.xml và nhấn vào nút Deploy.
Mặc dù ứng dụng Web chỉ có một biểu mẫu bắt giữ các sự kiện thi đấu ba môn phối hợp không đun sôi đại dương, phải nói như vậy, nhưng tôi đã triển khai nó tới một môi trường vô định hình, có mặt ở khắp nơi. Tôi đã không phải thực hiện một thùng chứa Web hoặc thậm chí chỉ rõ triển khai ứng dụng ở đâu. (Ổ đĩa cứng của tôi đang ở California, hoặc trên mặt trăng?). Vẻ đẹp là điều không quan trọng — Google đã chăm lo về việc này. Tất cả về việc này. Hơn nữa, đó là một sự đặt cược an toàn vì Google đã tính toán ở quy mô toàn cầu để cho ai đó xem ứng dụng ở Ấn Độ có cũng trải nghiệm tương tự như một người nào đó đang ở, nói ví dụ, Argentina.
Khi nói tất cả những điều này, bạn cần phải ghi nhớ một số điều. Cơ sở hạ tầng của Google hỗ trợ công nghệ Java, nhưng không phải hỗ trợ tất cả mọi thứ; nếu bạn còn nhớ khi J2ME xuất hiện vài năm trước đây, các hạn chế của App Engine hơi giống thế về bản chất. Nghĩa là, không phải tất cả các thư viện Java lõi và các thư viện nguồn mở có liên quan được hỗ trợ. Như tôi đã đề cập, không thể sử dụng Hibernate (chủ yếu là bởi vì bạn không có một cơ sở dữ liệu quan hệ với App Engine). Tôi cũng đã gặp một số thách thức khi sử dụng một số thư viện nguồn mở có nhúng mã hóa base64 (Google yêu cầu bạn sử dụng dịch vụ URL Fetch của mình để thay thế). App Engine là một nền tảng — bạn phải phát triển với nó và, cho đến nay, đó có thể là một đường phố một chiều.
Về đầu trang
Tương lai đã ở đây Alan Kay, một trong những cha đẻ của lập trình hướng đối tượng, được trích dẫn rằng đã nói: "Cách tốt nhất để dự đoán tương lai là phát minh ra nó." Tôi đồng ý với Alan Kay. Bất kể những gì người khác đang giả thuyết là tương lai của công nghệ Java, tôi nghĩ rằng tương lai đã ở đây rồi.
Như bạn đã thấy trong bài viết này, Google App Engine là một nền tảng cho tương lai — đã cung cấp cho bạn trò chơi trong hộp cát (sandbox) của nó. (Hãy nhớ rằng tôi đã trình bày chỉ một vài hạt cát trong hộp cát đó, App Engine có rất nhiều tính năng). Nếu bạn muốn linh hoạt hơn (nghĩa là, bạn muốn có một cơ sở dữ liệu quan hệ và không thể sống mà không có Hibernate) nhưng lại cũng thích ý tưởng vay mượn cơ sở hạ tầng có khả năng mở rộng của người khác, đã có sẵn các sự lựa chọn thay thế. EC2 của Amazon chính xác là một máy chủ ảo trên một cơ sở hạ tầng không định hình mà bạn cũng có thể gọi đến theo yêu cầu. Bạn sẽ đọc nó trong bài viết tiếp theo về Sự phát triển Java 2.0 trong tháng tới.
Tài nguyên
Học tập
- Máy ứng dụng của Google: Truy cập trang chủ của App Engine của Google.
- Sử dụng Trình cắm thêm của Google cho Eclipse: Tìm hiểu cách cài đặt Trình cắm thêm của Google cho Eclipse, tạo ra một dự án App Engine mới và gỡ rối nó bằng cách sử dụng máy chủ phát triển đang chạy bên trong Eclipse.
- "Máy ứng dụng của Google cho Java" (Rick Hightower, developerWorks, 08.2009): Khám phá Máy ứng dụng của Google cho Java kỹ lưỡng hơn trong một loạt bài có ba phần.
- "Chấm dứt việc viết mã nhiều như vậy!" (Andrew Glover, developerWorks, 12.2008): Tìm hiểu cách thức Commons Lang mở rộng API
java.lang
chuẩn.
- "Fluently Groovy" (Andrew Glover, developerWorks, 03.2008): Hướng dẫn này cung cấp cho các nhà phát triển Java chưa quen thuộc với Groovy một nhập môn nhanh chóng và dễ dàng về những điều cơ bản.
- "Bí mật thành công của sự phát triển đơn giản, Phần 6: Các chiến lược lưu giữ lâu bền" (Bruce Tate, developerWorks, 09.2005): Bài viết này khám phá một kho tàng giàu có các tùy chọn lưu giữ lâu bền có sẵn cho nền tảng Java, bao gồm cả JDO.
- "Các đối tượng dữ liệu Java thực hành" (Paul Monday, developerWorks, 07. 2002): Bằng các cuộc thảo luận, các ví dụ mã và các bài tập thực hành, hướng dẫn này giải thích ứng dụng thực tế của JDO.
- Điện toán đám mây: Truy cập trung tâm điện toán đám mây của IBM® với một nguồn tài nguyên dồi dào.
- Duyệt qua hiệu sách công nghệ để tìm các sách về chủ đề kỹ thuật này và các chủ đề khác.
- Vùng công nghệ Java của developerWorks: Tìm hàng trăm bài viết về mọi khía cạnh của lập trình Java.
- Trình cắm thêm Google cho Eclipse: Tải về trình cắm thêm Eclipse cho App Engine của Google.
- Gaelyk: Một khung công tác Groovy gọn nhẹ được thiết kế cho Máy ứng dụng của Google (Google App Engine).
- Trung tâm tài nguyên điện toán đám mây trên developerWorks: Truy cập các sản phẩm phần mềm của IBM trên môi trường ảo Amazon Elastic Compute Cloud (EC2).
Nguồn : http://www.ibm.com/developerworks/vn/library/j-javadev2-1/index.html
Đăng ký:
Bài đăng (Atom)