您好,欢迎访问三七文档
GoogleAppEngineforJava:第2部分:构建杀手级应用程序--使用AppEngine构建联系人管理应用程序诸如GoogleAppEngineforJava™这样的云平台的关键在于能够设计、构建和部署专业级的应用程序——可以非常容易地进行伸缩。在这个包含三部分的GoogleAppEngineforJava系列文章第二篇中,RickHightower将通过一个分步指南,使用GoogleAppEngineforJava来编写和部署一个简单的联系人管理应用程序,从而超越第1部分中提供的现成示例。在介绍使用AppEngineforJava构建可伸缩Java应用程序的第1部分中,您了解了Google云计算平台(即PAAS)为Java开发人员提供的Eclipse工具和基础设施。该文章中的示例都是预先准备的,这样您可以将精力集中到AppEngineforJava与Eclipse的集成中,并快速构建和部署不同类型的应用程序—即使用GoogleWebToolkit(GWT)构建的应用程序和基于servlet的应用程序。本文将在此基础上展开,并且在本系列第3部分中提供了更加高级的编程实践。您将构建的联系人管理应用程序允许用户存储基本的联系人信息,比如名称、电子邮件地址和电话号码。要创建这个应用程序,将需要使用EclipseGWT项目创建向导。从CRUD到联系人应用程序正如目前您已经了解到的一样,在AppEngineforJava中构建新应用程序的第一步就是在Eclipse启动项目创建向导。之后,您可以打开GWT项目启动向导来创建GWT项目(本文第1部分给出了在AppEngineforJava中创建GWT项目的详细说明)。对于这个练习,您将启动一个简单的CRUD应用程序,并稍后添加实际的存储。我们将使用一个具有模拟实现的数据访问对象(DAO),如清单1所示:清单1.ContactDAO接口packagegaej.example.contact.server;importjava.util.List;importgaej.example.contact.client.Contact;publicinterfaceContactDAO{voidaddContact(Contactcontact);voidremoveContact(Contactcontact);voidupdateContact(Contactcontact);ListContactlistContacts();}ContactDAO添加了各种方法,可以添加联系人、删除联系人、更新联系人,并返回一个所有联系人的列表。它是一个非常基本的CRUD接口,可以管理联系人。Contact类是您的域对象,如清单2所示:清单2.联系人域对象(gaej.example.contact.client.Contact)packagegaej.example.contact.client;importjava.io.Serializable;publicclassContactimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringname;privateStringemail;privateStringphone;publicContact(){}publicContact(Stringname,Stringemail,Stringphone){super();this.name=name;this.email=email;this.phone=phone;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetEmail(){returnemail;}publicvoidsetEmail(Stringemail){this.email=email;}publicStringgetPhone(){returnphone;}publicvoidsetPhone(Stringphone){this.phone=phone;}}对于这个应用程序的第一个版本,您将使用一个模拟对象将联系人存储在一个内存集合中,如清单3所示:清单3.MockDAO类packagegaej.example.contact.server;importgaej.example.contact.client.Contact;importjava.util.ArrayList;importjava.util.Collections;importjava.util.LinkedHashMap;importjava.util.List;importjava.util.Map;publicclassContactDAOMockimplementsContactDAO{MapString,Contactmap=newLinkedHashMapString,Contact();{map.put(rhightower@mammatus.com,newContact(RickHightower,rhightower@mammatus.com,520-555-1212));map.put(scott@mammatus.com,newContact(ScottFauerbach,scott@mammatus.com,520-555-1213));map.put(bob@mammatus.com,newContact(BobDean,bob@mammatus.com,520-555-1214));}publicvoidaddContact(Contactcontact){Stringemail=contact.getEmail();map.put(email,contact);}publicListContactlistContacts(){returnCollections.unmodifiableList(newArrayListContact(map.values()));}publicvoidremoveContact(Contactcontact){map.remove(contact.getEmail());}publicvoidupdateContact(Contactcontact){map.put(contact.getEmail(),contact);}}创建远程服务您现在的目标是创建一个允许您使用DAO的GWTGUI。将使用ContactDAO接口上的所有方法。第一步是将DAP类(未来版本将直接与服务器端的数据存储通信,因此必须位于服务器中)的功能封装到一个服务中,如清单4所示:清单4.ContactServiceImplpackagegaej.example.contact.server;importjava.util.ArrayList;importjava.util.List;importgaej.example.contact.client.Contact;importgaej.example.contact.client.ContactService;importcom.google.gwt.user.server.rpc.RemoteServiceServlet;publicclassContactServiceImplextendsRemoteServiceServletimplementsContactService{privatestaticfinallongserialVersionUID=1L;privateContactDAOcontactDAO=newContactDAOMock();publicvoidaddContact(Contactcontact){contactDAO.addContact(contact);}publicListContactlistContacts(){ListContactlistContacts=contactDAO.listContacts();returnnewArrayListContact(listContacts);}publicvoidremoveContact(Contactcontact){contactDAO.removeContact(contact);}publicvoidupdateContact(Contactcontact){contactDAO.updateContact(contact);}}注意,ContactServiceImpl实现了RemoteServiceServlet,随后定义方法来添加联系人、列出联系人、删除联系人,以及更新联系人。它将所有这些操作委托给ContactDAOMock。ContactServiceImpl不过是一个围绕ContactDAO的包装器,后者将ContactDAO功能公开给GWTGUI。ContactServiceImpl在web.xml文件中被映射到URI/contactlist/contacts,如清单5所示:清单5.web.xml中的ContactServiceservletservlet-namecontacts/servlet-nameservlet-classgaej.example.contact.server.ContactServiceImpl/servlet-class/servletservlet-mappingservlet-namecontacts/servlet-nameurl-pattern/contactlist/contacts/url-pattern/servlet-mapping要使GUI前端访问该服务,需要定义一个远程服务接口和一个异步远程服务接口,如清单6和7所示:清单6.ContactServicepackagegaej.example.contact.client;importjava.util.List;importcom.google.gwt.user.client.rpc.RemoteService;importcom.google.gwt.user.client.rpc.RemoteServiceRelativePath;@RemoteServiceRelativePath(contacts)publicinterfaceContactServiceextendsRemoteService{ListContactlistContacts();voidaddContact(Contactcontact);voidremoveContact(Contactcontact);voidupdateContact(Contactcontact);}清单7.ContactServiceAsyncpackagegaej.example.contact.client;importjava.util.List;importcom.google.gwt.user.client.rpc.AsyncCallback;publicinterfaceContactServiceAsync{voidlistContacts(AsyncCallbackListContactcallback);voidaddContact(Contactcontact,AsyncCallbackVoidcallback);voidremoveContact(Contactcontact,AsyncCallbackVoidcallback);voidupdateContact(Contactcontact,AsyncCallbackVoidca
本文标题:Google App Engine for Java 第 2 部分:构建杀手级应用程序
链接地址:https://www.777doc.com/doc-5503185 .html