Phát triển Java 2.0 Chào Google App Engine

Tóm tắt: Các giải pháp nguồn mở và các cơ sở hạ tầng vay mượn đang thay đổi

đặc điểm của việc phát triển Java™, cho phép bạn cung cấp phần mềm tốt hơn,

nhanh chóng hơn và với chi phí thấp. Andrew Glover, khi đặt ra thuật ngữ Java

development 2.0(phát triển Java 2.0) để gói gọn sức mạnh tích lũy của các hiện

tượng này, đã khởi đầu một loạt bài viết mới về một số công cụ và công nghệ có

liên quan. Bài viết đầu tiên này báo hiệu thời kỳ phát triển Java 2.0 đã tới và giải

thích cho bạn cách để có thể làm cho những khái niệm của nó đơm hoa kết trái

nhanh chóng với Google App Engine (Máy ứng dụng của Google) cho Java

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.

pdf18 trang | Chuyên mục: Java | Chia sẻ: dkS00TYs | Lượt xem: 2014 | Lượt tải: 0download
Tóm tắt nội dung Phát triển Java 2.0 Chào Google App Engine, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
ivate 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 setter 
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 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. 
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. 
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. 
Mục lục 
 Nhanh và rẻ 
 Một ngày đơn giản với App Engine của Google 
 Groovy + Java = ứng dụng hoạt động. Rất nhanh chóng. 
 Nắm bắt dữ liệu qua một giao diện Web 
 Tương lai đã ở đây 

File đính kèm:

  • pdfPhát triển Java 2.0 Chào Google App Engine.pdf
Tài liệu liên quan