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.
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:
- Phát triển Java 2.0 Chào Google App Engine.pdf