諸如 Google App Engine for Java™ 這樣的雲平台的關鍵在於能夠設計、構建和部署專業級的應用程序 —— 可以非常容易地進行伸縮。在這個包含三部分的 Google App Engine for Java 系列文章第二篇中,Rick Hightower 將通過一個分步指南,使用 Google App Engine for Java 來編寫和部署一個簡單的聯繫人管理應用程序,從而超越 第 1 部分 中提供的現成示例。
在介紹使用 App Engine for Java 構建可伸縮 Java 應用程序的 第 1 部分 中,您了解了 Google 雲計算平台(即 PAAS)為 Java 開發人員提供的 Eclipse 工具和基礎設施。該文章中的示例都是預先準備的,這樣您可以將精力集中到 App Engine for Java 與 Eclipse 的集成中,並快速構建和部署不同類型的應用程序 — 即使用 Google Web Toolkit (GWT) 構建的應用程序和基於 servlet 的應用程序。本文將在此基礎上展開,並且在本系列第 3 部分中提供了更加高級的編程實踐。
您將構建的聯繫人管理應用程序允許用戶存儲基本的聯繫人信息,比如名稱、電子郵件地址和電話號碼。要創建這個應用程序,將需要使用 Eclipse GWT 項目創建嚮導。
|
從 CRUD 到聯繫人應用程序
正如目前您已經了解到的一樣,在 App Engine for Java 中構建新應用程序的第一步就是在 Eclipse 啟動項目創建嚮導。之後,您可以打開 GWT 項目啟動嚮導來創建 GWT 項目(本文 第 1 部分 給出了在 App Engine for Java 中創建 GWT 項目的詳細說明)。
對於這個練習,您將啟動一個簡單的 CRUD 應用程序,並稍後添加實際的存儲。我們將使用一個具有模擬實現的數據訪問對象(DAO),如清單 1 所示:
package gaej.example.contact.server; import java.util.List; import gaej.example.contact.client.Contact; public interface ContactDAO { void addContact(Contact contact); void removeContact(Contact contact); void updateContact(Contact contact); List<Contact> listContacts(); } |
ContactDAO 添加了各種方法,可以添加聯繫人、刪除聯繫人、更新聯繫人,並返回一個所有聯繫人的列表。它是一個非常基本的 CRUD 介面,可以管理聯繫人。Contact 類是您的域對象,如清單 2 所示:
package gaej.example.contact.client; import java.io.Serializable; public class Contact implements Serializable { private static final long serialVersionUID = 1L; private String name; private String email; private String phone; public Contact() { } public Contact(String name, String email, String phone) { super(); this.name = name; this.email = email; this.phone = phone; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } } |
對於這個應用程序的第一個版本,您將使用一個模擬對象將聯繫人存儲在一個內存集合中,如清單 3 所示:
package gaej.example.contact.server; import gaej.example.contact.client.Contact; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class ContactDAOMock implements ContactDAO { Map<String, Contact> map = new LinkedHashMap<String, Contact>(); { map.put("rhightower@mammatus.com", new Contact("Rick Hightower", "rhightower@mammatus.com", "520-555-1212")); map.put("scott@mammatus.com", new Contact("Scott Fauerbach", "scott@mammatus.com", "520-555-1213")); map.put("bob@mammatus.com", new Contact("Bob Dean", "bob@mammatus.com", "520-555-1214")); } public void addContact(Contact contact) { String email = contact.getEmail(); map.put(email, contact); } public List<Contact> listContacts() { return Collections.unmodifiableList(new ArrayList<Contact>(map.values())); } public void removeContact(Contact contact) { map.remove(contact.getEmail()); } public void updateContact(Contact contact) { map.put(contact.getEmail(), contact); } } |
創建遠程服務
您現在的目標是創建一個允許您使用 DAO 的 GWT GUI。將使用 ContactDAO 介面上的所有方法。第一步是將 DAP 類(未來版本將直接與伺服器端的數據存儲通信,因此必須位於伺服器中)的功能封裝到一個服務中,如清單 4 所示:
package gaej.example.contact.server; import java.util.ArrayList; import java.util.List; import gaej.example.contact.client.Contact; import gaej.example.contact.client.ContactService; import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class ContactServiceImpl extends RemoteServiceServlet implements ContactService { private static final long serialVersionUID = 1L; private ContactDAO contactDAO = new ContactDAOMock(); public void addContact(Contact contact) { contactDAO.addContact(contact); } public List<Contact> listContacts() { List<Contact> listContacts = contactDAO.listContacts(); return new ArrayList<Contact> (listContacts); } public void removeContact(Contact contact) { contactDAO.removeContact(contact); } public void updateContact(Contact contact) { contactDAO.updateContact(contact); } } |
注意,ContactServiceImpl 實現了 RemoteServiceServlet,隨後定義方法來添加聯繫人、列出聯繫人、刪除聯繫人,以及更新聯繫人。它將所有這些操作委託給 ContactDAOMock。ContactServiceImpl 不過是一個圍繞 ContactDAO 的包裝器,後者將 ContactDAO 功能公開給 GWT GUI。ContactServiceImpl 在 web.xml 文件中被映射到 URI /contactlist/contacts,如清單 5 所示:
<servlet> <servlet-name>contacts</servlet-name> <servlet-class>gaej.example.contact.server.ContactServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>contacts</servlet-name> <url-pattern>/contactlist/contacts</url-pattern> </servlet-mapping> |
要使 GUI 前端訪問該服務,需要定義一個遠程服務介面和一個非同步遠程服務介面,如清單 6 和 7 所示:
package gaej.example.contact.client; import java.util.List; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("contacts") public interface ContactService extends RemoteService { List<Contact> listContacts(); void addContact(Contact contact); void removeContact(Contact contact); void updateContact(Contact contact); } |
[火星人 ] Google App Engine for Java: 第 2 部分:構建殺手級應用程序已經有449次圍觀