GWTの既存プロジェクトにModule,EntryPointを追加する
プロジェクトに新規Module、EntryPointの追加の仕方
追加したページでEchoBackを実行するサンプルを作成
既に以下のプロジェクトが存在することを前提
既存プロジェクトはEclipseがデフォルトで用意するものを使う
変更は一切加えていない
既存Project概要
- プロジェクト名:GwtAddModuleSample
- package:gwt.addmodule.main
■ソース
■新規モジュールの作成
プロジェクト右クリック→New→Module
以下のように設定する
package:gwt.addmodule.sub
Module name:NewModule
Inherited modules:「com.google.gwt.user.User」「com.google.gwt.user.theme.standard.Standard」
※com.google.gwt.user.theme.standard.Standardを追加すること
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 1.6.4//EN" "http://google-web-toolkit.googlecode.com/svn/tags/1.6.4/distro-source/core/src/gwt-module.dtd"> <module> <inherits name="com.google.gwt.user.User" /> <inherits name="com.google.gwt.user.theme.standard.Standard" /> </module>
■HTMLの作成
プロジェクト右クリック→New→HTML
以下のように設定する
File name:Sub
Module:NewModuleのみ「GwtAddModuleSample」を削除する
Support for borwser...のチェック:OFF
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Sub</title> <script type="text/javascript" language="javascript" src="gwt.addmodule.sub.NewModule/gwt.addmodule.sub.NewModule.nocache.js"></script> </head> <body> <h1>Sub</h1> <div id="panel"></div> </body> </html>
■EntryPointの作成
プロジェクト右クリック→New→EntryPoint
以下のように設定する
Module:gwt.addmodule.sub.NewModule
Package:gwt.addmodule.sub.client
ソースは後述
■Serviceを作成
プロジェクト右クリック→New→Interface
以下のように設定する
Package:gwt.addmodule.sub.client
Name:SubService
Extended Interface:com.google.gwt.user.client.rpc.RemoteService
package gwt.addmodule.sub.client; import com.google.gwt.user.client.rpc.RemoteService; import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; @RemoteServiceRelativePath("sub") public interface SubService extends RemoteService { String echoBack(String input); }
■ServiceAsyncを作成
プロジェクト右クリック→New→Interface
以下のように設定する
Package:gwt.addmodule.sub.client
Name:SubServiceAsync
Extended Interface:com.google.gwt.user.client.rpc.RemoteService
package gwt.addmodule.sub.client; import com.google.gwt.user.client.rpc.AsyncCallback; public interface SubServiceAsync { void echoBack(String input, AsyncCallback<String> callback); }
■Servieインタフェース実装クラスの作成
プロジェクト右クリック→New→Class
以下のように設定する
Package:gwt.addmodule.sub.server
Name:SubServiceImpl
Extends:SubService
package gwt.addmodule.sub.server; import gwt.addmodule.sub.client.SubService; import com.google.gwt.user.server.rpc.RemoteServiceServlet; public class SubServiceImpl extends RemoteServiceServlet implements SubService { @Override public String echoBack(String input) { return input; } }
■EntryPointにコードを書く
package gwt.addmodule.sub.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; public class Sub implements EntryPoint { private Panel panel = new VerticalPanel(); private TextBox input = new TextBox(); private Button buttonSend = new Button("Send"); private Label lbResult = new Label("responce"); private final SubServiceAsync service = GWT.create(SubService.class); @Override public void onModuleLoad() { // TODO Auto-generated method stub this.panel.add(this.input); this.panel.add(this.buttonSend); this.panel.add(this.lbResult); this.buttonSend.addClickHandler(new ClickHandler(){ @Override public void onClick(ClickEvent event) { service.echoBack(input.getText(), new AsyncCallback<String>(){ @Override public void onFailure(Throwable caught) { lbResult.setText(caught.getMessage()); } @Override public void onSuccess(String result) { lbResult.setText(result); } }); } }); RootPanel.get("panel").add(this.panel); } }
■web.xml
url-patternタグにNewModuleを指定する
※今回は新規模ジュールとEntryPointクラスの名前が違うが、同じ名前にしたほうが楽
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- Default page to serve --> <welcome-file-list> <welcome-file>GwtAddModuleSample.html</welcome-file> </welcome-file-list> <!-- Servlets --> <servlet> <servlet-name>greetServlet</servlet-name> <servlet-class>gwt.addmodule.main.server.GreetingServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>greetServlet</servlet-name> <url-pattern>/gwtaddmodulesample/greet</url-pattern> </servlet-mapping> <servlet> <servlet-name>subServlet</servlet-name> <servlet-class>gwt.addmodule.sub.server.SubServiceImpl</servlet-class> </servlet> <servlet-mapping> <servlet-name>subServlet</servlet-name> <url-pattern>/gwt.addmodule.sub.NewModule/sub</url-pattern> </servlet-mapping> </web-app>
テキストに文字入れてSendボタンを押すとエコーバックが返ってくる