1 / 61

Google Web Toolkit

Google Web Toolkit. What is GWT?. GWT is a development toolkit for building and optimizing complex A jax applications Goal is to enable productive development of high-performance web applications without the developer having to be an expert in browser quirks XMLHttpRequest JavaScript.

zeheb
Download Presentation

Google Web Toolkit

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Google Web Toolkit

  2. What is GWT? • GWT is a development toolkit for building and optimizing complex Ajax applications • Goal is to enable productive development of high-performance web applications without the developer having to be an expert in • browser quirks • XMLHttpRequest • JavaScript

  3. GWT versions • GWT 1.0 May 17, 2006 • Google announced GWT at the JavaOne conference, 2006 • GWT 1.1 August 11, 2006 • GWT 1.2 November 16, 2006 • … • GWT 1.6 April 07, 2009 • GWT 1.7 July 13, 2009 • GWT 2.0 December 08, 2009 • Current version: GWT 2.5.1(March 8, 2013)

  4. GWT Overview • GWT allows to develop and debug Ajax applications in Java and then compile the source to highly optimized JavaScript that runs across all browsers • During development - iterate quickly in the same "edit - refresh - view" cycle you're accustomed to with JavaScript • During deployment - the GWT compiler compiles Java source code into optimized, standalone JavaScript files

  5. Why Use Java for Ajax Development? • Static type checking in the Java language allows to increase productivity and reduce errors • Common JavaScript errors (typos, type mismatches) are caught at compile time rather than by users at runtime • Java-based OO designs are easier to communicate and understand, thus making Ajax code base more comprehensible • IDE support • Code prompting/completion • Automated refactoring • And other good stuff

  6. Interesting things about GWT • The GWT SDK provides a core set of Java APIs and libraries • In the end, it's just JavaScript • Don't worry about XMLHttpRequest • GWT can handle all of the client-server communications for you • Optimized JavaScript script downloads based on user profile • E.g. Firefox browser displaying an application in French doesn't need to download extra code for other browsers or languages

  7. Interesting things about GWT • No need to build commonly used Widgets • Most of them come with GWT • Reuse UI components across projects • Create reusable Widgets, package it up in a JAR file for others to use • Use other JavaScript libraries and native JavaScript code • You can write individual JavaScript methods directly in your Java source files

  8. Interesting things about GWT • Easily support the browser's back button and history • Internationalization • Testing with JUnit • GWT is directly integrated with JUnit. You can even unit test asynchronous RPCs. • Free and open source

  9. Two Modes of Running GWT App • Development Mode • GWT application run and can be debugged within JVM in a regular browser with the support of the Google Web Toolkit Developer Plugin • Uses a special engine to run your app as a mix of both Java bytecode and native JavaScript • Production Mode • GWT application is run as pure JavaScript and HTML, compiled from original Java

  10. Plugin for Eclipse • The plugin currently supports Google Web Toolkit and Google App Engine development • New Web Application Wizard • Web Application Launch Configurations • Development Mode View • Recognition of inline JavaScript (JSNI) • Wizards to create entry points, modules and HTML pages • Support for GWT JUnit tests http://code.google.com/eclipse/index.html

  11. Samples • Several samples are included in the GWT SDK • We will take a look to GWT Showcase sample • A showcase of GWT features with accompanying source code and CSS styles • GWT features used: • UI widgets • Internationalization

  12. Getting SDK and Showcase sample • Download GWT SDK from (100 Mb) http://www.gwtproject.org/download.html • Unzip somewhere on disk • \gwt-2.5.1\doc - Javadocs • \gwt-2.5.1\samples – Sample projects • Go to \gwt-2.5.1\samples\Showcase • Read README.txt and follow instructions

  13. Creating a new GWT app in Eclipse • Detailed instructions on GWT web page: http://www.gwtproject.org/usingeclipse.html • StockWatcher application: http://www.gwtproject.org/doc/latest/tutorial/create.html

  14. Notable generated artifacts • Package /src/com/google/gwt/sample/stockwatcher • GWT module definition and initial application files • Directory /war • Static resources that can be served publicly (images, style sheets, HTML host pages) • StockWatcher.gwt.xml • GWT module definition • StockWatcher.html • host page

  15. Notable generated artifacts • StockWatcher.css • application style sheet • StockWatcher.java • GWT entry point class • GreetingService.java, GreetingServiceAsync.java, GreetingServiceImpl.java • GWT sample RPC classes • gwt-servlet.jar • GWT server runtime library

  16. The GWT modules • Individual units of GWT configuration are called modules • Modules are defined in XML, which contains the collection of resources that comprise a GWT application • inherited modules • an entry point application class name • source path entries • public path entries • deferred binding rules

  17. StockWatcher.gwt.xml <?xml version="1.0" encoding="UTF-8"?> <module rename-to='stockwatcher'> <!-- Inherit the core Web Toolkit stuff --> <inherits name='com.google.gwt.user.User'/> <!-- Inherit the default GWT style sheet --> <inherits name='com.google.gwt.user.theme.standard.Standard'/> <!-- Specify the app entry point class --> <entry-point class='com.google.gwt.sample.stockwatcher.client.StockWatcher'/> <!-- Specify the paths for translatable code --> <source path='client'/> </module>

  18. Which GWT modules to inherit ? • The standard GWT modules contain big pieces of functionality designed to work independently of each other • Standard Modules:

  19. Which GWT modules to inherit ? • Themes • To inherit a module, edit your project's module XML file and specify the logical name of the module you want to inherit <inherits name="com.google.gwt.junit.JUnit"/>

  20. Entry-Point Classes • Are optional, although any module referred to in HTML must have at least one entry-point class specified • A module entry-point is any class that is assignable to EntryPoint and that can be constructed without parameters • When a module is loaded, every entry point class is instantiated and its EntryPoint.onModuleLoad() method gets called

  21. Source Path • Specify which subpackages contain translatable source • Only files found on the source path are candidates to be translated into JavaScript • The default source path is the client subpackage underneath where the Module XML File is stored <source path='client'/>

  22. Public Path • The public path is the place in your project where static resources referenced by your GWT module, such as CSS or images, are stored • When referencing public resources in client code, you should construct the URL like this: GWT.getModuleBaseURL() + "resourceName.png“ • The default public path is the public subdirectory underneath where the Module XML File is stored

  23. The HTML Host Page • In order to run the module, it must be loaded from a web page of some sort • Any HTML page can include a GWT application via a SCRIPT tag • A typical HTML host page might not include any visible HTML body content at all • It is also possible to allow the GWT module to selectively insert widgets into specific places in an HTML page

  24. Sample Host Page <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link type="text/css" rel="stylesheet" href="StockWatcher.css"> <title>Web Application Starter Project</title> <!-- This script tag that actually loads the GWT module --> <script language="javascript” src="stockwatcher/stockwatcher.nocache.js"> </script> </head> <body> <!-- Include a history iframe to enable full GWT history support --> <iframe src="javascript:''" id="__gwt_historyFrame" style="width:0;height:0;border:0"></iframe> <div id="application"></div> </body> </html>

  25. Preserving Browser History • GWT provides a mechanism supporting user's ability to use the browser's back button in such situations as a multi-page wizard or a shopping cart/checkout scenario • The host page contains the <iframe> tag necessary for incorporating history support in your GWT application

  26. Standard Directory and Package Layout • GWT projects are overlaid onto Java packages such that most of the configuration can be inferred from the classpath and the module definitions

  27. More about Compile & Debug • In development mode you are interacting with GWT application without it having been translated into JavaScript • The JVM is actually executing the application code as compiled Java bytecode, using GWT plumbing to connect to a browser window • This allows to remain in traditional "code-test-debug" cycle

  28. Development mode session http://www.gwtproject.org/doc/latest/DevGuideCompilingAndDebugging.html

  29. More about Compile & Debug • You do not need to restart development mode after modifying source code • On refresh, your code is recompiled with the changes and the new version is loaded into the browser • If you have made configuration or code changes to server side code, use the Restart Server button in the Jetty tab • All server side classes will be reloaded from scratch with fresh code

  30. Understanding the GWT Compiler • The heart of GWT is a compiler that converts Java source into JavaScript • supports the vast majority of the Java language • The GWT runtime library emulates a relevant subset of the Java runtime library • supports most of the core Java language syntax and semantics • supports only a small subset of the classes available in the Java Standard and EE libraries • java.lang, java.lang.annotation, java.util, java.io, java.sql

  31. Coding Basics - Client-side code • When you write client-side code that is intended to run in the web browser, remember that it ultimately becomes JavaScript • To begin writing a GWT module, subclass the EntryPoint class public class Foo implements EntryPoint {// This is the entry point method. Initialize you GWT module here.  public void onModuleLoad() {// Writes Hello World to the module log window.    GWT.log("Hello World!", null);  }}

  32. Writing the entry point method • The entry point method is onModuleLoad() • Typical things to do in the onModuleLoad() method are: • create new user interface components • set up handlers for events • modify the browser DOM in some way

  33. Another example of EntryPoint public class Hello implements EntryPoint {  public void onModuleLoad() {    Button b = new Button("Click me", new ClickHandler() {      public void onClick(ClickEvent event) {        Window.alert("Hello, AJAX");      }    });    RootPanel.get().add(b);  }}

  34. Building User Interfaces • GWT UI classes are similar to those in existing UI frameworks such as Swing, except that the widgets are rendered using dynamically-created HTML rather than pixel-oriented graphics • While it is possible to manipulate the browser's DOM directly using the DOM interface, it is far easier to use Java classes from the Widget hierarchy • make it easier to quickly build interfaces that will work correctly on all browsers

  35. Panels • Panels contain widgets and other panels • Panels are used to define the layout of the user interface in the browser • Basic Panels • RootPanel, FlowPanel, HTMLPanel, FormPanel, ScrollPanel, PopupPanel... • Layout Panels • RootLayoutPanel, DockLayoutPanel, SplitLayoutPanel, StackLayoutPanel, TabLayoutPanel...

  36. Example: StackLayoutPanel StackLayoutPanel p = new StackLayoutPanel(Unit.EM);p.add(new HTML("this content"), new HTML("this"), 4);p.add(new HTML("that content"), new HTML("that"), 4);p.add(new HTML("the other content"), new HTML("the other"), 4);

  37. Example: TabLayoutPanel TabLayoutPanel p = new TabLayoutPanel(1.5, Unit.EM);p.add(new HTML("this content"), "this");p.add(new HTML("that content"), "that");p.add(new HTML("the other content"), "the other");

  38. Widgets • You construct user interfaces in GWT applications using widgets that are contained within panels • You are not limited to the set of widgets provided by GWT. There are a number of ways to create custom widgets: • You can bundle together existing widgets and create a Composite widget • You can write GWT bindings to an existing JavaScript widget • You can create your own widget from scratch using either Java or JavaScript

  39. Building Composites • A composite is a specialized widget that can contain another component, but behaves as if it were its contained widget • Rather than create complex widgets by subclassing Panel or another Widget type, it's better to create a new composite http://www.gwtproject.org/doc/latest/DevGuideUiCustomWidgets.html

  40. Accessing the Browser's DOM • Sometimes you need to access the DOM, for example to: • provide a feature in your user interface that GWT does not support • write a new Widget class • access an HTML element defined directly in the host page • handle browser Events at a low level • perform some filtering or other processing on an HTML document loaded into the browser

  41. Accessing the Browser's DOM • GWT provides the classes in the com.google.gwt.dom.client package for interacting with the DOM directly • Set a style attribute to change a widget's background color: private HTML htmlWidget; // Other code to instantiate the widget... // Change the description background color. htmlWidget.getElement().getStyle().setBackgroundColor("#ffee80"); The getElement() method returns a DOM Element Object representing a node in the DOM tree structure

  42. Event Handlers • A handler interface defines methods that the widget calls to announce an event • A class wishing to receive events of a particular type • implements the associated handler interface • passes a reference to itself to the widget to subscribe to a set of events • The Button class, for example, publishes click events • The associated handler interface is ClickHandler

  43. Example of Event Listener public class HandlerExample extends Composite implements ClickHandler { private FlowPanel fp = new FlowPanel(); private Button b1 = new Button("Button 1"); private Button b2 = new Button("Button 2"); public HandlerExample() { initWidget(fp); fp.add(b1); fp.add(b2); b1.addClickHandler(this); b2.addClickHandler(this); } public void onClick(ClickEvent event) { // note that in general, events can have sources that are not Widgets. Widget sender = (Widget) event.getSource(); if (sender == b1) { // handle b1 being clicked } else if (sender == b2) { // handle b2 being clicked } } }

  44. Communicate with a Server • GWT provides a couple of different ways to communicate with a server via HTTP • use the GWT RPC (remote procedure call) framework that transparently makes calls to Java servlets • use the GWT's HTTP client classes to build and send custom HTTP requests

  45. Remote Procedure Calls • Mechanism for interacting with the server by invoking a method • For example: for fetching data from the server • Makes it easy for the client and server to pass Java objects back and forth over HTTP • Marshaling/unmarshaling of Java objects are handled by the GWT • When used properly, RPCs give you the opportunity to move all of your UI logic to the client (leaving business logic on the server) • Could result in greatly improved performance, reduced bandwidth, reduced web server load, and a pleasantly fluid user experience

  46. RPC Plumbing Diagram

  47. Creating RPC Services • In order to define your RPC interface, you need to: • Define an interface for your service that extends RemoteService and lists all your RPC methods • Define a class to implement the server-side code that extends RemoteServiceServlet and implements the interface you created above • Define an asynchronous interface to your service to be called from the client-side code

  48. Synchronous Interface & Implementation • Synchronous interface • Implementation @RemoteServiceRelativePath("greet") public interface GreetingService extends RemoteService { public String greetServer(String name); } public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService { public String greetServer(String name) { return "Hello, " + input + "!<br>; } } Every service implementation is ultimately a servlet

  49. Asynchronous interface • It is not possible to call this version of the RPC directly from the client • You must create an asynchronous interface to all your services • Has to be named as <Sync-interface>Async • Has to pass AsyncCallback object as the last parameter that can be notified when a call completes • The return type is always void public interface GreetingServiceAsync { public void greetServer (String input, AsyncCallback<String> callback); }

  50. Service configuration • To automatically load service implementation, configure servlet in web.xml <servlet> <servlet-name>greetServlet</servlet-name> <servlet-class> com.google....server.GreetingServiceImpl </servlet-class> </servlet> <servlet-mapping> <servlet-name>greetServlet</servlet-name> <url-pattern>/stockwatcher/greet</url-pattern> </servlet-mapping>

More Related