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>

■実行
Sub.htmlを選択


テキストに文字入れてSendボタンを押すとエコーバックが返ってくる