Hatena::ブログ(Diary)

脱エンタープライズ志向 このページをアンテナに追加 RSSフィード

2009-07-19

GWT弱者勉強会#1に参加してきた

| 02:09 | GWT弱者勉強会#1に参加してきた - 脱エンタープライズ志向 を含むブックマーク

7月18日(土)にid:hidecheckさん主宰のGWT弱者勉強会に参加してきた。立ち上げは横へなのMLで知ったので、即参加を申し出た。

当日作ったソースコード以外はGWT弱者勉強会グループの議事録を参照。

Error 404 (Not Found)!!1

当日のメニュー

  1. 各自自己紹介テンプレに沿って、1分くらい自己紹介タイム。
  2. GWTとは?
  3. hello, worldをやってみよう。
  4. Eclipseで作ったプロジェクトのパッケージ階層、デフォルト自動生成されるファイルの説明。
  5. 各自hello, world実装。
  6. 続いて各自チェックボックスラジオボタン、タブパネルを使ったアプリ実装。
  7. 余裕ある人はエコーバック(非同期通信)アプリ実装。

ソースコード

自分が作ったもののコードを公開する。

プロジェクト階層。

#全体的に結構雑ですいません。

HelloGwt
        src
           sample.hello
                        client
                              GreetingService.java
                              GreetingServiceAsync.java
                              HelloGwt.java
                        server
                              GreetingServiceImpl
                        HelloGwt.gwt.xml
           META-INF
                   jdoconfig.xml
           log4j.properties
        war
           HelloGwt.css
           HelloGwt.html
           WEB-INF
                  appengine-web.xml
                  logging.properties
                  web.xml

ソースコードはタブパネルまで実装した分しかないので、それを公開する。(一応、チェックボックスラジオボタンは使っている。)

// GreetingService.java
package sample.hello.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 greetServer(String name);
}
// GreetingServiceAsync
package sample.hello.client;

import com.google.gwt.user.client.rpc.AsyncCallback;

/**
 * The async counterpart of <code>GreetingService</code>.
 */
public interface GreetingServiceAsync {
	void greetServer(String input, AsyncCallback<String> callback);
}
// HelloGwt
package sample.hello.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.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TabPanel;
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 HelloGwt implements EntryPoint {

	private static final String GWT_AGREE_MESSAGE = "GWT弱者勉強会に参加する";
	private static final String GWT_NON_AGREE_MESSAGE = "GWT弱者勉強会に参加しない";
	
	private Label hello = new Label("ここに表示されます");
	
	private Button gwtAgreeBtn = new Button("参加");
	
	private RadioButton gwtAgreeRd = new RadioButton("gwtAgree", GWT_AGREE_MESSAGE, true);
	
	private RadioButton gwtNonAgreeRd = new RadioButton("gwtAgree", GWT_NON_AGREE_MESSAGE, true); 
	
	private CheckBox gwtAgreeCb = new CheckBox(GWT_AGREE_MESSAGE, true);
	
	private FlowPanel radioPanel = new FlowPanel();
	
	private HTML debug = new HTML();
	
	private TabPanel gwtAgreeTbPanel = new TabPanel();
	
	private VerticalPanel myNamePanel = new VerticalPanel();
	
	private TextBox myNameTxt = new TextBox();
	
	private Button sayMyNameBtn = new Button("参加表明");
	
	private final GreetingServiceAsync greetingService = GWT
	.create(GreetingService.class);

	/**
	 * This is the entry point method.
	 */
	public void onModuleLoad() {

		initBtHello();
		initSexRadio();
		initGwtAgree();
		initMyNamePanel();
		
		gwtAgreeTbPanel.add(gwtAgreeBtn, "ボタンで");
		gwtAgreeTbPanel.add(gwtAgreeCb, "チェックボックスで");
		gwtAgreeTbPanel.add(radioPanel, "ラジオボタンで");
		gwtAgreeTbPanel.add(myNamePanel, "自分の名前で");
		gwtAgreeTbPanel.selectTab(0);
		initRootPanel();

	}
	
	private void initNameName() {
		
		sayMyNameBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				AsyncCallback<String> asyncCallback = new AsyncCallback<String>() {
					public void onFailure(Throwable caught) {
						hello.setText("エラーが発生してしまいましたーー");
						debug.setHTML(caught.getMessage());
					}

					public void onSuccess(String result) {
						hello.setText(result);
					}
				};
				greetingService.greetServer(myNameTxt.getText(), asyncCallback);
			}
		});
		
	}
	
	private void initMyNamePanel() {
		
		initNameName();
		myNamePanel.add(myNameTxt);
		myNamePanel.add(sayMyNameBtn);
		
	}
	
	private void initBtHello() {
		
		gwtAgreeBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				hello.setText(GWT_AGREE_MESSAGE);
			}
		});
		
	}
	
	private void initGwtAgree() {
		
		gwtAgreeCb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				String result = GWT_NON_AGREE_MESSAGE;
				if (((CheckBox) event.getSource()).getValue()) {
					result = GWT_AGREE_MESSAGE;
				}
				hello.setText(result);
			}
		});
		gwtAgreeCb.setValue(true);
	}
	
	private void initSexRadio() {
		
		ClickHandler radioClickHandler = new ClickHandler() {
			public void onClick(ClickEvent event) {
				String result = ((RadioButton) event.getSource()).getText();
				hello.setText(result);
			}
		};
		gwtAgreeRd.setValue(true);
		gwtAgreeRd.addClickHandler(radioClickHandler);
		gwtNonAgreeRd.addClickHandler(radioClickHandler);
		radioPanel.add(gwtAgreeRd);
		radioPanel.add(gwtNonAgreeRd);
		
	}
	
	private void initRootPanel() {
		
		RootPanel.get("hello").add(hello);
		RootPanel.get("debug").add(debug);
		RootPanel.get("gwtAgreeTbPanel").add(gwtAgreeTbPanel);
		
	}
	
}
// GreetingServiceImpl
package sample.hello.server;

import sample.hello.client.GreetingService;

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 {

	@Override
	protected void onAfterResponseSerialized(String serializedResponse) {
		System.out.println("BRD: " + serializedResponse);
	}

	@Override
	protected void onBeforeRequestDeserialized(String serializedRequest) {
		System.out.println("ARS: " + serializedRequest);
	}

	public String greetServer(String name) {	
		return name + " さんがGWT弱者勉強会に参加表明しました。";
	}
}

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Web Application Starter Project</title>
    <script type="text/javascript" language="javascript" src="hellogwt/hellogwt.nocache.js"></script>
  </head>
  <body>
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>

    <div id="debug"></div>

    <table align="center">
      <tr>
        <td id="hello" align="center"></td>
      </tr>
      <tr>
        <td id="gwtAgreeTbPanel" align="center"></td>
      </tr>
    </table>
  </body>
</html>

次回も参加したい

ということで、当日参加していてちょっと話がでたけど、GWT弱者に限らずとGAEAndroidの弱者も集まって、これら連携した勉強会にしても良いねという話がでた。

んー、それも良いですね。元々GWTGAEAndroidも個々でも動くし、連携してアプリを動作させることもできるから、やりたいこと、やれることの幅が広まっていいかも。ちょっと考えます。

懇親会で

そーいえば、懇親会をやったんだけど、そこがよかったなー。

開店して間もたたないお店で、電源も確保できるし時々注文さえすれば長いできそう。料理もうまいし、女オーナーも店員さんもいい人だし。次回はそこになるんだっけ?んー次回も楽しみだ。

hidecheckhidecheck 2009/07/31 18:56 第1回傘下ありがとうございます。Android弱者期待してます。
また次回もよろしくお願いします。

hkhumanoidhkhumanoid 2009/08/02 18:01 id:hidecheckさん
お疲れさまでした。
新鮮で楽しかったです。
Android弱者(弱者シリーズ)もやりたいですね。
次回もよろしくお願いします。