Vaadin

Join Vaadin Log In

Vaadin supports running applications as portlets, as defined in the JSR-168 (Java Portlet API) and JSR-286 (Java Portlet API 2.0) standards. While providing generic support for all portals implementing the standards, Vaadin especially supports the Liferay portal and the needed portal-specific configuration is given below for Liferay.

You can deploy the Vaadin demo package WAR (available from the download site) directly to a portal such as Liferay. It contains all the necessary portlet configuration files. For optimal performance with Liferay, you can install the Vaadin library and other needed resources in Liferay as described later in this section.

You can find more documentation and examples from the Vaadin Developer's Site at http://dev.vaadin.com/.

Deploying a Vaadin application as a portlet is essentially just as easy as deploying a regular application to an application server. You do not need to make any changes to the application itself, but only the following:

  • Application packaged as a WAR

    • WEB-INF/portlet.xml descriptor

    • WEB-INF/web.xml descriptor for Portlet 1.0 portlets

    • WEB-INF/liferay-portlet.xml descriptor for Liferay

    • WEB-INF/liferay-display.xml descriptor for Liferay

    • WEB-INF/liferay-plugin-package.properties for Liferay

  • Widget set installed to portal (optional)
  • Themes installed to portal (optional)
  • Vaadin library installed to portal (optional)
  • Portal configuration settings (optional)

Installing the widget set and themes to the portal is required for running two or more Vaadin portlets simultaneously in a single portal page. As this situation occurs quite easily, we recommend installing them in any case.

In addition to the Vaadin library, you will need to copy the portlet.jar to your project. It is included in the Vaadin installation package. Notice that you must not put the portlet.jar in the same WebContent/WEB-INF/lib directory as the Vaadin JAR or otherwise include it in the WAR to be deployed, because it would create a conflict with the internal portlet library of the portal.

How you actually deploy a WAR package depends on the portal. In Liferay, you simply drop it to the deploy subdirectory under the Liferay installation directory. The deployment depends on the application server under which Liferay runs; for example, if you use Liferay bundled with Tomcat, you will find the extracted package in the webapps directory under the Tomcat installation directory included in Liferay.

While you can create the needed deployment descriptors manually for any existing Vaadin application, as described in subsequent sections, the Vaadin Plugin for Eclipse provides a wizard for easy creation of portal application projects.

Creation of a portal application project is almost identical to the creation of a regular application project. For a full treatment of the New Project Wizard and the possible options, please see Section 2.4.1, “Creating the Project”.

  1. Start creating a new project by selecting from the menu FileNewProject....
  2. In the New Project window that opens, select WebVaadin Project and click Next.
  3. In the Vaadin Project step, you need to set the basic web project settings. You need to give at least the project name, the runtime, and select Generic Portlet for the deployment configuration; the default values should be good for the other settings.

    You can click Finish here to use the defaults for the rest of the settings, or click Next.

  4. The settings in the Web Module step define the basic servlet-related settings and the structure of the web application project. All the settings are pre-filled, and you should normally accept them as they are and click Next.

  5. The Vaadin project step page has various Vaadin-specific application settings. These are largely the same as for regular applications. You should not need to change anything as you can change the application titles and other details afterwards. The Create portlet template option should be automatically selected. You can give another portlet title of you want. You can change most of the settings afterward.

    Create project template

    Creates an application class and all the needed portlet deployment descriptors.

    Application name

    The application name is used in the title of the main window (which is usually invisible in portlets) and as an identifier, either as is or with a suffix, in various deployment descriptors.

    Base package name

    Java package for the application class.

    Application class name

    Name of the application class. The default is derived from the project name.

    Portlet version

    Same as in the project settings.

    Portlet title

    The portlet title, defined in portlet.xml, can be used as the display name of the portlet (at least in Liferay). The default value is the project name. The title is also used as a short description in liferay-plugin-package.properties.

    Vaadin version

    Same as in the project settings.

    Finally, click Finish to create the project.

  6. Eclipse may ask you to switch to J2EE perspective. A Dynamic Web Project uses an external web server and the J2EE perspective provides tools to control the server and manage application deployment. Click Yes.

To deploy a portlet WAR in a portal, you need to provide the basic portlet.xml descriptor specified in the Java Portlet standard. In addition, you may need to include possible portal vendor specific deployment descriptors. The ones required by Liferay are described below.

The portlet WAR must include a portlet descriptor located at WebContent/WEB-INF/portlet.xml. A portlet definition includes the portlet name, mapping to a servlet in web.xml, modes supported by the portlet, and other configuration. Below is an example of a simple portlet definition in portlet.xml descriptor.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<portlet-app
  xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  version="2.0"
  xsi:schemaLocation=
    "http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd
     http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd">
  <portlet>
    <portlet-name>Portlet Example portlet</portlet-name>
    <display-name>Vaadin Portlet Example</display-name>
    <!-- Map portlet to a servlet. -->
    <portlet-class>
      com.vaadin.terminal.gwt.server.ApplicationPortlet2
    </portlet-class>
    <init-param>
      <name>application</name>
      <!-- The application class with package name. -->
      <value>com.example.myportlet.MyportletApplication</value>
    </init-param>
    <!-- Supported portlet modes and content types. -->
    <supports>
      <mime-type>text/html</mime-type>
      <portlet-mode>view</portlet-mode>
      <portlet-mode>edit</portlet-mode>
      <portlet-mode>help</portlet-mode>
    </supports>
    <!-- Not always required but Liferay requires these. -->
    <portlet-info>
      <title>Vaadin Portlet Example</title>
      <short-title>Portlet Example</short-title>
    </portlet-info>
  </portlet>
</portlet-app>

Listing supported portlet modes in portlet.xml enables the corresponding portlet controls in the portal user interface that allow changing the mode, as described later.

The portlet deployment descriptor for Portlet 1.0 API is largely the same as for Portlet 2.0. The main differences are:

  1. XML namespace and schema names

  2. Portlet-class: ApplicationPortlet vs ApplicationPortlet2

  3. The application parameter is a name of the servlet (defined in web.xml in Portlet 1.0, but name of the application class in Portlet 2.0. There is no longer a separate web.xml file in Servlet 2.0.

  4. The portlet-name must not be same as the servlet name in Portlet 1.0; in Portlet 2.0 this does not matter.

Below is an example of a complete deployment descriptor for Portlet 1.0:

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app
  version="1.0"
  xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation=
       "http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
        http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
  <portlet>
    <!-- Must not be the same as servlet name. -->
    <portlet-name>Portlet Example portlet</portlet-name>
    <display-name>Vaadin Portlet Example</display-name>
    <!-- Map portlet to a servlet. -->
    <portlet-class>
      com.vaadin.terminal.gwt.server.ApplicationPortlet
    </portlet-class>
    <init-param>
      <name>application</name>
      <!-- Must match the servlet URL mapping in web.xml. -->
      <value>portletexample</value>
    </init-param>
    <!-- Supported portlet modes and content types. -->
    <supports>
      <mime-type>text/html</mime-type>
      <portlet-mode>view</portlet-mode>
      <portlet-mode>edit</portlet-mode>
      <portlet-mode>help</portlet-mode>
    </supports>
    <!-- Not always required but Liferay requires these. -->
    <portlet-info>
      <title>Vaadin Portlet Example</title>
      <short-title>Portlet Example</short-title>
    </portlet-info>
  </portlet>
</portlet-app>

The value of the application parameter must match the context in the <url-pattern> element in the <servlet-mapping> in the web.xml deployment descriptor, without the path qualifiers in the pattern. The above example would match the following servlet mapping in web.xml:

  <servlet-mapping>
      <servlet-name>Portlet Example</servlet-name>
      <url-pattern>/portletexample/*</url-pattern>
  </servlet-mapping>

In fact, it would also match the /* mapping.

If you have just one Vaadin application that you ever need to run in your portal, you can just deploy the WAR as described above and that's it. However, if you have multiple applications, especially ones that use different custom widget sets, you run into problems, because a portal window can load only a single Vaadin widget set at a time. You can solve this problem by combining all the different widget sets in your different applications into a single widget set using inheritance or composition.

For example, the portal demos defined in the portlet.xml in the demo WAR have the following setting for all portlets so that they will all use the same widget set:

<portlet>
  ...
  <!-- Use the portal default widget set for all portal demos. -->
  <init-param>
    <name>widgetset</name>
    <value>com.vaadin.portal.gwt.PortalDefaultWidgetSet</value>
  </init-param>
  ...

The PortalDefaultWidgetSet extends SamplerWidgetSet, which extends the DefaultWidgetSet. The DefaultWidgetSet is therefore essentially a subset of PortalDefaultWidgetSet, which contains also the widgets required by the Sampler demo. Other applications that would otherwise require only the regular DefaultWidgetSet, and do not define their own widgets, can just as well use the larger set, making them compatible with the demos. The PortalDefaultWidgetSet will also be the default Vaadin widgetset bundled in Liferay 5.3 and later.

If your portlets are contained in multiple WARs, which can happen quite typically, you need to install the widget set and theme portal-wide so that all the portlets can use them. See Section 11.8.5, “Installing Vaadin in Liferay” on configuring the widget sets in the portal itself.

Loading widget sets, themes, and the Vaadin JAR from a portlet is possible as long as you have a single portlet, but causes a problem if you have multiple portlets. To solve this, Vaadin portlets need to use a globally installed widget set, themes, and Vaadin JAR. They, and all the required configuration, are bundled with Liferay 5.3 and later, but if you are using an earlier version of Liferay or use a custom widget set, custom themes, or a specific version of Vaadin, you will need to do the configuration manually.

In these instructions, we assume that you use Liferay bundled with Apache Tomcat, although you can use many other application servers with Liferay just as well. The Tomcat installation is included in the Liferay installation package, under the tomcat-x.x.x directory.

The Vaadin JAR should be put in tomcat-x.x.x/webapps/ROOT/WEB-INF/lib/vaadin.jar. The Vaadin version number should normally be left out from the JAR.

The widget set needs to be located at /html/VAADIN/widgetsets/ and themes at /html/VAADIN/themes/ path under the portal context. You simply need to copy the contents from under your WebContent/VAADIN directory to the tomcat-x.x.x/webapps/ROOT/html/VAADIN directory under the Liferay installation directory. If you use a built-in widget set or theme included in Vaadin, such as the PortalDefaultWidgetSet, you should copy it from the Vaadin installation directory, from under WebContent/VAADIN/widgetsets. The default themes are located under WebContent/VAADIN/themes in the installation directory.

You need to define the widget set, the theme, and the JAR in the portal-ext.properties configuration file for Liferay, as described earlier. The file should normally be placed in the Liferay installation directory. See Liferay documentation for details on the configuration file.

Below is an example of a portal-ext.properties file:

# Path under which the VAADIN directory is located.
# (/html is the default so it is not needed.)
# vaadin.resources.path=/html
# Portal-wide widget set
vaadin.widgetset=com.vaadin.portal.gwt.PortalDefaultWidgetSet
# Theme to use
vaadin.theme=reindeer

The allowed parameters are:

vaadin.resources.path

Specifies the resource root path under the portal context. This is /html by default. Its actual location depends on the portal and the application server; in Liferay with Tomcat it would be located at webapps/ROOT/html under the Tomcat installation directory.

vaadin.widgetset

The widget set class to use. Give the full path to the class name in the dot notation. If the parameter is not given, the default widget set is used.

vaadin.theme

Name of the theme to use. If the parameter is not given, the default theme is used, which is reindeer in Vaadin 6.

You will need to restart Liferay after creating or modifying the portal-ext.properties file.

Portals such as Liferay are not AJAX applications but reload the page every time a user interaction requires data from the server. They consider a Vaadin application to be a regular web application that works by HTTP requests. All the AJAX communications required by the Vaadin application are done by the Vaadin Client-Side Engine (the widget set) past the portal, so that the portal is unaware of the communications.

The only way a portal can interact with an application is to load it with a HTTP request; reloading does not reset the application. The Portlet 2.0 API supports four types of requests: render, action, resource, and event requests. The old Portlet 1.0 API supports only the render and action requests. Requests can be caused by user interaction with the portal controls or by clicking action URLs displayed by the portlet. You can handle portlet requests by implementing the PortletListener interface and the handler methods for each of the request types. You can use the request object passed to the handler to access certain portal data, such as user information, the portlet mode, etc.

The PortletListener interface is defined in the PortletApplicationContext2 for Portlet 2.0 API and com.vaadin.terminal.gwt.server.PortletApplicationContext class for the old Portlet 1.0 API. You can get the portlet application context with getContext() method of the application class.

You need to have the portlet.jar in your class path during development. However, you must not deploy the portlet.jar with the portlet, because it would create a conflict with the internal portlet library of the portal. You should put it in a directory that is not deployed with the portlet, for example, if you are using Eclipse, under the lib directory under the project root, not under WebContent/WEB-INF/lib, for example.

You can also define portal actions that you can handle in the handleActionRequest() method of the interface.

You add your portlet request listener to the application context of your application, which is a PortletApplicationContext when (and only when) the application is being run as a portlet.

// Check that we are running as a portlet.
if (getContext() instanceof PortletApplicationContext2) {
    PortletApplicationContext2 ctx =
            (PortletApplicationContext2) getContext();
    // Add a custom listener to handle action and
    // render requests.
    ctx.addPortletListener(this, new MyPortletListener());
} else {
    getMainWindow().showNotification(
            "Not initialized via Portal!",
            Notification.TYPE_ERROR_MESSAGE);
}

The handler methods receive references to request and response objects, which are defined in the Java Servlet API. Please refer to the Servlet API documentation for further details.

The PortletDemo application included in the demo WAR package includes examples of processing mode and portlet window state changes in a portlet request listener.

Portals support three portlet modes defined in the Portlet API: view, edit, and help modes. The view mode is the default and the portal can have buttons to switch the portlet to the other modes. In addition to the three predefined modes, the Portlet API standards allow custom portlet modes, although portals may support custom modes to a varying degree.

You need to define which portlet modes are enabled in the portlet.xml deployment descriptor as follows.

<!-- Supported portlet modes and content types. -->
<supports>
    <mime-type>text/html</mime-type>
    <portlet-mode>view</portlet-mode>
    <portlet-mode>edit</portlet-mode>
    <portlet-mode>help</portlet-mode>
</supports>

Changes in the portlet mode are received as resource requests, which you can handle with a handleResourceRequest(), defined in the PortletListener interface. The current portlet mode can be acquired with getPortletMode() from the request object.

The following complete example (for Portlet 2.0) shows how to handle the three built-modes in a portlet application.

// Use Portlet 2.0 API
import com.vaadin.terminal.gwt.server.PortletApplicationContext2;
import com.vaadin.terminal.gwt.server.PortletApplicationContext2.PortletListener;
public class PortletModeExample extends Application
                                implements PortletListener {
    Window         mainWindow;
    ObjectProperty data; // Data to view and edit
    VerticalLayout viewContent   = new VerticalLayout();
    VerticalLayout editContent   = new VerticalLayout();
    VerticalLayout helpContent   = new VerticalLayout();
    
    @Override
    public void init() {
        mainWindow = new Window("Myportlet Application");
        setMainWindow(mainWindow);
        // Data model
        data = new ObjectProperty("<h1>Heading</h1>"+
                       "<p>Some example content</p>");
        // Prepare views for the three modes (view, edit, help)
        // Prepare View mode content
        Label viewText = new Label(data, Label.CONTENT_XHTML);
        viewContent.addComponent(viewText);
        // Prepare Edit mode content
        RichTextArea editText = new RichTextArea();
        editText.setCaption("Edit the value:");
        editText.setPropertyDataSource(data);
        editContent.addComponent(editText);
        // Prepare Help mode content
        Label helpText = new Label("<h1>Help</h1>" +
                                   "<p>This helps you!</p>",
                                   Label.CONTENT_XHTML);
        helpContent.addComponent(helpText);
        // Start in the view mode
        mainWindow.setContent(viewContent);
        // Check that we are running as a portlet.
        if (getContext() instanceof PortletApplicationContext2) {
            PortletApplicationContext2 ctx =
                (PortletApplicationContext2) getContext();
            // Add a custom listener to handle action and
            // render requests.
            ctx.addPortletListener(this, this);
        } else {
            mainWindow.showNotification("Not running in portal",
                               Notification.TYPE_ERROR_MESSAGE);
        }
    }
    // Dummy implementations for the irrelevant request types
    public void handleActionRequest(ActionRequest request,
                                    ActionResponse response,
                                    Window window) {
    }
    public void handleRenderRequest(RenderRequest request,
                                    RenderResponse response,
                                    Window window) {
    }
    public void handleEventRequest(EventRequest request,
                                   EventResponse response,
                                   Window window) {
    }
    public void handleResourceRequest(ResourceRequest request,
                                      ResourceResponse response,
                                      Window window) {
        // Switch the view according to the portlet mode
        if (request.getPortletMode() == PortletMode.EDIT)
            window.setContent(editContent);
        else if (request.getPortletMode() == PortletMode.VIEW)
            window.setContent(viewContent);
        else if (request.getPortletMode() == PortletMode.HELP)
            window.setContent(helpContent);
    }
}

Figure 11.14, “Portlet Modes in Action” shows the resulting portlet in the three modes: view, edit, and help. In Liferay, the edit mode is shown in the popup menu as a Preferences item.


In some cases, it can be useful to implement certain modes of a portlet as pure HTML or JSP pages instead of running the full Vaadin application user interface in them. Common reasons for this are static pages (e.g. a simple help mode), integrating legacy content to a portlet (e.g. a JSP configuration interface) and providing an ultra-lightweight initial view for a portlet (for users behind slow connections).

Fully static modes that do not require the Vaadin server side application to be running can be implemented by subclassing the portlet class ApplicationPortlet2 (Portlet 2.0). The subclass can either create the HTML content directly or dispatch the request to e.g. a HTML or JSP page via the portal. When using this approach, any Vaadin portlet and portlet request listeners are not called.

Customizing the content for the standard modes (view, edit, and help) can be performed by overriding the methods doView, doEdit and doHelp, respectively. Custom modes can be handled by implementing similar methods with the @javax.portlet.RenderMode(name = "mymode") annotation.

You need to define which portlet modes are enabled in the portlet.xml deployment descriptor as described in Section 11.8.7, “Handling Portlet Mode Changes”. Also, the portlet class in portlet.xml should point to the customized subclass of ApplicationPortlet2.

The following example (for Portlet 2.0) shows how to create a static help page for the portlet.

portlet.xml:

<!-- Supported portlet modes and content types. -->
<supports>
    <mime-type>text/html</mime-type>
    <portlet-mode>view</portlet-mode>
    <portlet-mode>help</portlet-mode>
</supports>

HtmlHelpPortlet.java::

// Use Portlet 2.0 API
import com.vaadin.terminal.gwt.server.ApplicationPortlet2;
public class HtmlHelpPortlet extends ApplicationPortlet2 {
    // override the help mode, let the Vaadin application handle the view mode
    @Override
    protected void doHelp(RenderRequest request, RenderResponse response)
            throws PortletException, IOException {
        // bypass the Vaadin application entirely
        response.setContentType("text/html");
        response.getWriter().println("This is the help text as plain HTML.");
        // alternatively could use the dispatcher for e.g. JSP help pages:
        // PortletRequestDispatcher dispatcher = getPortletContext()
        // .getRequestDispatcher("/html/myhelp.jsp");
        // dispatcher.include(request, response);
    }
}

To produce pure HTML portlet content from a running Vaadin application instead of statically outside an application, the ApplicationPortlet2 method writeAjaxPage should be overridden. This approach allows using the application state in HTML content generation, and all relevant Vaadin portlet request and portlet listeners are called around the portlet content generation. However, the client side engine (widgetset) is not loaded by the browser, which can shorten the initial page display time.

<portlet-class>com.vaadin.demo.portlet.HtmlModePortlet</portlet-class>
<supports>
    <mime-type>text/html</mime-type>
    <portlet-mode>view</portlet-mode>
    <portlet-mode>help</portlet-mode>
</supports>
public class CountApplication extends Application {
    private int count = 0;
    
    public void init() {
        Window window = new Window("Portlet mode example");
        window.addComponent(new Label("This is the Vaadin application."));
        window.addComponent(new Label("Try opening the help mode."));
        setMainWindow(window);
    }
        
    public int incrementCount() {
        return ++count;
    }
}
// Use Portlet 2.0 API
public class HtmlModePortlet extends AbstractApplicationPortlet {
    @Override
    protected void writeAjaxPage(RenderRequest request,
            RenderResponse response, Window window,
            Application application) throws PortletException, IOException {
        if (PortletMode.HELP.equals(request.getPortletMode())) {
            CountApplication app = (CountApplication) application;
            response.setContentType("text/html");
            response.getWriter().println("This is the HTML help, shown "
                + app.incrementCount() + " times so far.");
        } else {
            super.writeAjaxPage(request, response, window, application);
        }
    }
    
    @Override
    protected Class<? extends Application> getApplicationClass() {
        return CountApplication.class;
    }
    
}

The user can freely move between Vaadin and non-Vaadin portlet modes with the user interface provided by the portal (for standard modes) or the portlet (e.g. action links). Once the server side application has been started, it continues to run as long as the session is alive. If necessary, specific portlet mode transitions can be disallowed in portlet.xml.

In the case of Portlet 1.0, both a portlet and a servlet are involved. A render request is received by ApplicationPortlet when the portlet mode is changed, and serving pure HTML in some modes can be achieved by overriding the method render and handling the modes of interest separately while calling super.render() for other modes. As always, when extending the portlet, the reference to the portlet class in portlet.xml needs to be updated.

To serve HTML-only content in the Portlet 1.0 case after starting the server side application and calling the relevant listeners, the servlet class ApplicationServlet should be subclassed instead of the portlet. The method writeAjaxPage can be overridden to produce custom HTML content for certain modes. However, it should be noted that some HTML content (e.g. loading the portal-wide Vaadin theme) is created by the portlet and not the servlet.

Table of Contents

Preface
1. Introduction
1.1. Overview
1.2. Example Application Walkthrough
1.3. Support for the Eclipse IDE
1.4. Goals and Philosophy
1.5. Background
2. Getting Started with Vaadin
2.1. Installing Vaadin
2.2. Setting up the Development Environment
2.3. QuickStart with Eclipse
2.4. Your First Project with Vaadin
3. Architecture
3.1. Overview
3.2. Technological Background
3.3. Applications as Java Servlet Sessions
3.4. Client-Side Engine
3.5. Events and Listeners
4. Writing a Web Application
4.1. Overview
4.2. Managing the Main Window
4.3. Child Windows
4.4. Handling Events with Listeners
4.5. Referencing Resources
4.6. Shutting Down an Application
4.7. Handling Errors
4.8. Setting Up the Application Environment
5. User Interface Components
5.1. Overview
5.2. Interfaces and Abstractions
5.3. Common Component Features
5.4. Label
5.5. Link
5.6. TextField
5.7. RichTextArea
5.8. Date and Time Input
5.9. Button
5.10. CheckBox
5.11. Selecting Items
5.12. Table
5.13. Tree
5.14. MenuBar
5.15. Embedded
5.16. Upload
5.17. Form
5.18. ProgressIndicator
5.19. Slider
5.20. LoginForm
5.21. Component Composition with CustomComponent
6. Managing Layout
6.1. Overview
6.2. Window and Panel Root Layout
6.3. VerticalLayout and HorizontalLayout
6.4. GridLayout
6.5. FormLayout
6.6. Panel
6.7. SplitPanel
6.8. TabSheet
6.9. Accordion
6.10. AbsoluteLayout
6.11. CssLayout
6.12. Layout Formatting
6.13. Custom Layouts
7. Visual User Interface Design with Eclipse (experimental)
7.1. Overview
7.2. Creating a New CustomComponent
7.3. Using The Visual Editor
7.4. Structure of a Visually Editable Component
8. Themes
8.1. Overview
8.2. Introduction to Cascading Style Sheets
8.3. Creating and Using Themes
8.4. Creating a Theme in Eclipse
9. Binding Components to Data
9.1. Overview
9.2. Properties
9.3. Holding properties in Items
9.4. Collecting items in Containers
10. Developing Custom Components
10.1. Overview
10.2. Doing It the Simple Way in Eclipse
10.3. Google Web Toolkit Widgets
10.4. Integrating a GWT Widget
10.5. Defining a Widget Set
10.6. Server-Side Components
10.7. Using a Custom Component
10.8. GWT Widget Development
11. Advanced Web Application Topics
11.1. Special Characteristics of AJAX Applications
11.2. Application-Level Windows
11.3. Embedding Applications in Web Pages
11.4. Debug and Production Mode
11.5. Resources
11.6. Shortcut Keys
11.7. Printing
11.8. Portal Integration
11.9. Google App Engine Integration
11.10. Common Security Issues
11.11. URI Fragment and History Management with UriFragmentUtility
11.12. Capturing HTTP Requests
11.13. Drag and Drop
11.14. Using Add-on Components
A. User Interface Definition Language (UIDL)
A.1. API for Painting Components
A.2. JSON Rendering
B. Songs of Vaadin
Index