Updated the default app created by WebAppCreator so it looks a little better, is a little less complicated, and show how to add GWT functionality to an existing page.
Patch by: jlabanca
Review by: scottb (WebAppCreator.java), bruce (peer programming, TBR)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4711 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
index 6a25968..d18ab20 100644
--- a/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/AppClassTemplate.javasrc
@@ -4,12 +4,17 @@
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.event.dom.client.KeyCodes;
+import com.google.gwt.event.dom.client.KeyUpEvent;
+import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
-import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
/**
@@ -18,66 +23,102 @@
public class @moduleShortName implements EntryPoint {
/**
- * Create a remote service proxy to talk to the server-side Echo service.
+ * Create a remote service proxy to talk to the server-side Greeting service.
*/
- private final EchoServiceAsync echoService = GWT.create(EchoService.class);
+ private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);
/**
* This is the entry point method.
*/
public void onModuleLoad() {
- Image img = new Image("http://code.google.com/webtoolkit/logo-185x175.png");
- Button button = new Button("Click me");
+ final Button sendButton = new Button("Send");
+ final TextBox nameField = new TextBox();
+ nameField.setText("GWT User");
- // We can add style names
- button.addStyleName("pc-template-btn");
- // or we can set an id on a specific element for styling
- img.getElement().setId("pc-template-img");
+ // We can add style names to widgets
+ sendButton.addStyleName("sendButton");
- VerticalPanel vPanel = new VerticalPanel();
- vPanel.setWidth("100%");
- vPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
- vPanel.add(img);
- vPanel.add(button);
+ // Add the nameField and sendButton to the RootPanel
+ // Use RootPanel.get() to get the entire body element
+ RootPanel.get("nameFieldContainer").add(nameField);
+ RootPanel.get("sendButtonContainer").add(sendButton);
- // Add image and button to the RootPanel
- RootPanel.get().add(vPanel);
+ // Focus the cursor on the name field when the app loads
+ nameField.setFocus(true);
+ nameField.selectAll();
- // Create the dialog box
+ // Create the popup dialog box
final DialogBox dialogBox = new DialogBox();
+ dialogBox.setText("Remote Procedure Call");
dialogBox.setAnimationEnabled(true);
- Button closeButton = new Button("close");
+ final Button closeButton = new Button("Close");
+ // We can set the id of a widget by accessing its Element
+ closeButton.getElement().setId("closeButton");
+ final Label textToServerLabel = new Label();
+ final HTML serverResponseLabel = new HTML();
VerticalPanel dialogVPanel = new VerticalPanel();
- dialogVPanel.setWidth("100%");
- dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
+ dialogVPanel.addStyleName("dialogVPanel");
+ dialogVPanel.add(new HTML("<b>Sending name to the server:</b>"));
+ dialogVPanel.add(textToServerLabel);
+ dialogVPanel.add(new HTML("<br><b>Server replies:</b>"));
+ dialogVPanel.add(serverResponseLabel);
+ dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
dialogVPanel.add(closeButton);
+ dialogBox.setWidget(dialogVPanel);
+ // Add a handler to close the DialogBox
closeButton.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
dialogBox.hide();
+ sendButton.setEnabled(true);
+ sendButton.setFocus(true);
}
});
- // Set the contents of the Widget
- dialogBox.setWidget(dialogVPanel);
-
- button.addClickHandler(new ClickHandler() {
+ // Create a handler for the sendButton and nameField
+ class MyHandler implements ClickHandler, KeyUpHandler {
+ /**
+ * Fired when the user clicks on the sendButton.
+ */
public void onClick(ClickEvent event) {
- final String textToServer = "Hello GWT World!";
- final String dialogBoxText = "Sending to the server: " + textToServer;
- dialogBox.setText(dialogBoxText);
- dialogBox.center();
- dialogBox.show();
- echoService.echo(textToServer, new AsyncCallback<String>() {
+ sendNameToServer();
+ }
+
+ /**
+ * Fired when the user types in the nameField.
+ */
+ public void onKeyUp(KeyUpEvent event) {
+ if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) {
+ sendNameToServer();
+ }
+ }
+
+ /**
+ * Send the name from the nameField to the server and wait for a response.
+ */
+ private void sendNameToServer() {
+ sendButton.setEnabled(false);
+ String textToServer = nameField.getText();
+ textToServerLabel.setText(textToServer);
+ serverResponseLabel.setText("");
+ greetingService.greetServer(textToServer, new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
Window.alert("Rpc failure");
+ sendButton.setEnabled(true);
}
public void onSuccess(String result) {
- dialogBox.setText(dialogBoxText + "\n " + result);
+ serverResponseLabel.setHTML(result);
+ dialogBox.center();
+ closeButton.setFocus(true);
}
});
}
- });
+ }
+
+ // Add a handler to send the name to the server
+ MyHandler handler = new MyHandler();
+ sendButton.addClickHandler(handler);
+ nameField.addKeyUpHandler(handler);
}
}
diff --git a/user/src/com/google/gwt/user/tools/AppCss.csssrc b/user/src/com/google/gwt/user/tools/AppCss.csssrc
index 3cf302f..d1e1ad4 100644
--- a/user/src/com/google/gwt/user/tools/AppCss.csssrc
+++ b/user/src/com/google/gwt/user/tools/AppCss.csssrc
@@ -2,11 +2,29 @@
/** Example rules used by the template application (remove for your app) */
-.pc-template-btn {
- display: block;
- font-size: 16pt
+h1 {
+ font-size: 2em;
+ font-weight: bold;
+ color: #777777;
+ margin: 40px 0px 70px;
+ text-align: center;
}
-#pc-template-img {
- margin-top: 20px;
+.sendButton {
+ display: block;
+ font-size: 16pt;
+}
+
+/** Most GWT widgets already have a style name defined */
+.gwt-DialogBox {
+ width: 400px;
+}
+
+.dialogVPanel {
+ margin: 5px;
+}
+
+/** Set ids using widget.getElement().setId("idOfElement") */
+#closeButton {
+ margin: 15px 6px 6px;
}
diff --git a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
index 47a42e3..f3b8917 100644
--- a/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
+++ b/user/src/com/google/gwt/user/tools/AppHtml.htmlsrc
@@ -16,7 +16,7 @@
<!-- -->
<!-- Any title is fine -->
<!-- -->
- <title>@moduleShortName</title>
+ <title>Web Application Starter Project</title>
<!-- -->
<!-- This script loads your compiled module. -->
@@ -36,5 +36,16 @@
<!-- 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="nameFieldContainer"></td>
+ <td id="sendButtonContainer"></td>
+ </tr>
+ </table>
</body>
</html>
diff --git a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
index c15d89b..e91fb2e 100644
--- a/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcAsyncClientTemplate.javasrc
@@ -3,8 +3,8 @@
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
- * The async counterpart of <code>EchoService</code>.
+ * The async counterpart of <code>GreetingService</code>.
*/
-public interface EchoServiceAsync {
- void echo(String input, AsyncCallback<String> callback);
+public interface GreetingServiceAsync {
+ void greetServer(String input, AsyncCallback<String> callback);
}
diff --git a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
index aeeeff7..0402cb6 100644
--- a/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcClientTemplate.javasrc
@@ -6,7 +6,7 @@
/**
* The client side stub for the Rpc service.
*/
-@RemoteServiceRelativePath("echo")
-public interface EchoService extends RemoteService {
- String echo(String input);
+@RemoteServiceRelativePath("greet")
+public interface GreetingService extends RemoteService {
+ String greetServer(String name);
}
diff --git a/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc b/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
index 3f4ae7e..2b122de 100644
--- a/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
+++ b/user/src/com/google/gwt/user/tools/RpcServerTemplate.javasrc
@@ -1,16 +1,18 @@
package @serverPackage;
-import @clientPackage.EchoService;
+import @clientPackage.GreetingService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
* The server side implementation of the Rpc service.
*/
-public class EchoServiceImpl extends RemoteServiceServlet implements
- EchoService {
+public class GreetingServiceImpl extends RemoteServiceServlet implements
+ GreetingService {
- public String echo(String input) {
- return "Server says: " + input;
+ public String greetServer(String input) {
+ String serverInfo = getServletContext().getServerInfo();
+ String userAgent = getThreadLocalRequest().getHeader("User-Agent");
+ return "Hello, " + input + "!<br><br>I am running " + serverInfo
+ + ".<br><br>It looks like you are using:<br>" + userAgent;
}
-
}
diff --git a/user/src/com/google/gwt/user/tools/WebAppCreator.java b/user/src/com/google/gwt/user/tools/WebAppCreator.java
index 552d454..3ded7e8 100644
--- a/user/src/com/google/gwt/user/tools/WebAppCreator.java
+++ b/user/src/com/google/gwt/user/tools/WebAppCreator.java
@@ -29,7 +29,9 @@
import com.google.gwt.util.tools.Utility;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
@@ -237,6 +239,7 @@
File srcDir = Utility.getDirectory(outDir, "src", true);
File warDir = Utility.getDirectory(outDir, "war", true);
File webInfDir = Utility.getDirectory(warDir, "WEB-INF", true);
+ File libDir = Utility.getDirectory(webInfDir, "lib", true);
File moduleDir = Utility.getDirectory(srcDir, modulePackageName.replace(
'.', '/'), true);
File clientDir = Utility.getDirectory(moduleDir, "client", true);
@@ -282,6 +285,7 @@
replacements.put("@antEclipseRule", antEclipseRule);
List<FileCreator> files = new ArrayList<FileCreator>();
+ List<FileCreator> libs = new ArrayList<FileCreator>();
if (!onlyEclipse) {
files.add(new FileCreator(moduleDir, moduleShortName + ".gwt.xml",
"Module.gwt.xml"));
@@ -291,22 +295,24 @@
files.add(new FileCreator(webInfDir, "web.xml", "web.xml"));
files.add(new FileCreator(clientDir, moduleShortName + ".java",
"AppClassTemplate.java"));
- files.add(new FileCreator(clientDir, "EchoService" + ".java",
+ files.add(new FileCreator(clientDir, "GreetingService" + ".java",
"RpcClientTemplate.java"));
- files.add(new FileCreator(clientDir, "EchoServiceAsync" + ".java",
+ files.add(new FileCreator(clientDir, "GreetingServiceAsync" + ".java",
"RpcAsyncClientTemplate.java"));
- files.add(new FileCreator(serverDir, "EchoServiceImpl" + ".java",
+ files.add(new FileCreator(serverDir, "GreetingServiceImpl" + ".java",
"RpcServerTemplate.java"));
files.add(new FileCreator(outDir, "build.xml", "project.ant.xml"));
}
if (!noEclipse) {
assert new File(gwtDevPath).isAbsolute();
+ libs.add(new FileCreator(libDir, "gwt-servlet.jar", gwtServletPath));
files.add(new FileCreator(outDir, ".project", ".project"));
files.add(new FileCreator(outDir, ".classpath", ".classpath"));
files.add(new FileCreator(outDir, moduleShortName + ".launch",
"App.launch"));
}
+ // copy source files, replacing the content as needed
for (FileCreator fileCreator : files) {
File file = Utility.createNormalFile(fileCreator.destDir,
fileCreator.destName, overwrite, ignore);
@@ -320,6 +326,17 @@
Utility.writeTemplateFile(file, data, replacements);
}
}
+
+ // copy libs directly
+ for (FileCreator fileCreator : libs) {
+ File file = Utility.createNormalFile(fileCreator.destDir,
+ fileCreator.destName, overwrite, ignore);
+ if (file != null) {
+ FileInputStream is = new FileInputStream(fileCreator.sourceName);
+ FileOutputStream os = new FileOutputStream(file);
+ Util.copy(is, os);
+ }
+ }
}
protected boolean run() {
diff --git a/user/src/com/google/gwt/user/tools/web.xmlsrc b/user/src/com/google/gwt/user/tools/web.xmlsrc
index 28baff4..15cdaa5 100644
--- a/user/src/com/google/gwt/user/tools/web.xmlsrc
+++ b/user/src/com/google/gwt/user/tools/web.xmlsrc
@@ -8,13 +8,13 @@
<!-- Servlets -->
<servlet>
- <servlet-name>echoServlet</servlet-name>
- <servlet-class>@serverPackage.EchoServiceImpl</servlet-class>
+ <servlet-name>greetServlet</servlet-name>
+ <servlet-class>@serverPackage.GreetingServiceImpl</servlet-class>
</servlet>
<servlet-mapping>
- <servlet-name>echoServlet</servlet-name>
- <url-pattern>/@renameTo/echo</url-pattern>
+ <servlet-name>greetServlet</servlet-name>
+ <url-pattern>/@renameTo/greet</url-pattern>
</servlet-mapping>
</web-app>