DataStoreにLow-Level APIを使ってみた
やっぱこっちのほうが速い
実行結果
client
package sample.lowlevel.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.Panel; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; /** * Entry point classes define <code>onModuleLoad()</code>. */ public class GwtSampleLowLevelAPI implements EntryPoint { private final GreetingServiceAsync greetingService = GWT .create(GreetingService.class); private Panel panel = new VerticalPanel(); private Label lbResponce = new Label(); private TextBox name = new TextBox(); private Button btCreate = new Button("create"); private Button btGet = new Button("Get!"); public void onModuleLoad() { this.panel.add(this.lbResponce); this.panel.add(this.name); this.panel.add(this.btCreate); this.panel.add(this.btGet); //Entityを作成するボタンを押したとき this.btCreate.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { greetingService.addEntity(name.getText(), new AsyncCallback<String>(){ @Override public void onFailure(Throwable caught) { lbResponce.setText(caught.toString()); } @Override public void onSuccess(String result) { lbResponce.setText(result); } }); } }); this.btGet.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { greetingService.getEntity(new AsyncCallback<String>(){ @Override public void onFailure(Throwable caught) { lbResponce.setText(caught.toString()); } @Override public void onSuccess(String result) { lbResponce.setText(result); } }); } }); RootPanel.get("panel").add(panel); } }
Service
package sample.lowlevel.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; /** * The client side stub for the RPC service. */ @RemoteServiceRelativePath("greet") public interface GreetingService extends RemoteService { String addEntity(String name); String getEntity(); }
ServiceAsync
package sample.lowlevel.client;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
* The async counterpart of GreetingService
.
*/
public interface GreetingServiceAsync {
void addEntity(String input, AsyncCallback
void getEntity(AsyncCallback
}
ServiceImple
package sample.lowlevel.server; import sample.lowlevel.client.GreetingService; import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.Query; import com.google.gwt.user.server.rpc.RemoteServiceServlet; /** * The server side implementation of the RPC service. */ @SuppressWarnings("serial") public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService { public String addEntity(String input) { DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService(); Entity entity = new Entity("Hoge"); entity.setProperty("name", input); datastoreService.put(entity); return "Data created"; } @Override public String getEntity() { DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService(); Query hogeQuery = new Query("Hoge"); Iterable<Entity> hogeIter = datastoreService.prepare(hogeQuery).asIterable(); StringBuilder result = new StringBuilder(); for (Entity hoge : hogeIter) { result.append((String)hoge.getProperty("name")); result.append(" "); System.out.println(hoge.getKey().getId()); } return result.toString(); } }
html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <!-- The HTML 4.01 Transitional DOCTYPE declaration--> <!-- above set at the top of the file will set --> <!-- the browser's rendering engine into --> <!-- "Quirks Mode". Replacing this declaration --> <!-- with a "Standards Mode" doctype is supported, --> <!-- but may lead to some differences in layout. --> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!-- --> <!-- Consider inlining CSS to reduce the number of requested files --> <!-- --> <link type="text/css" rel="stylesheet" href="GwtSampleLowLevelAPI.css"> <!-- --> <!-- Any title is fine --> <!-- --> <title>Web Application Starter Project</title> <!-- --> <!-- This script loads your compiled module. --> <!-- If you add any GWT meta tags, they must --> <!-- be added before this line. --> <!-- --> <script type="text/javascript" language="javascript" src="gwtsamplelowlevelapi/gwtsamplelowlevelapi.nocache.js"></script> </head> <!-- --> <!-- The body can have arbitrary html, or --> <!-- you can leave the body empty if you want --> <!-- to create a completely dynamic UI. --> <!-- --> <body> <!-- OPTIONAL: include this if you want history support --> <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe> <h1>Web Application Starter Project</h1> <table align="center"> <tr> <td colspan="2" style="font-weight:bold;">Please enter your name:</td> </tr> <tr> <td id="panel"></td> </tr> </table> </body> </html>