<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rich Internet Applications (RIA) &#187; AJAX</title>
	<atom:link href="http://www.canoo.com/blog/category/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.canoo.com/blog</link>
	<description></description>
	<lastBuildDate>Wed, 18 Jan 2012 14:30:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>GWT UiBinder: Better Web App Separation of Concerns</title>
		<link>http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/</link>
		<comments>http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 09:44:10 +0000</pubDate>
		<dc:creator>alberto</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[alberto]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=1057</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/";</script>One of the newest features introduced in Google Web Toolkit 2.0 is the &#8220;UiBinder&#8220;. This new way of building views allows the developer to use a declarative approach when doing the layout of a GWT application. In case you have not heard about it, GWT is a set of tools that enables Java developers to [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/";</script><p>One of the newest features introduced in Google Web Toolkit 2.0 is the &#8220;<a href="http://code.google.com/webtoolkit/doc/latest/DevGuideUiBinder.html">UiBinder</a>&#8220;. This new way of building views allows the developer to use a declarative approach when doing the layout of a GWT application. </p>
<p>In case you have not heard about it, GWT is a set of tools that enables Java developers to develop &#8220;rich web applications&#8221; in the Java language. The term &#8220;rich web application&#8221; implies two things:</p>
<ul>
<li>Desktop-like interaction, where a user action has immediate feedback (e.g.: input validation, search box terms suggestions, results highlighting, etc) without requiring a server round-trip (executing an HTTP request with the result of reloading the page being browsed). In the world of web applications, this is typically accomplished using Ajax (what is also what GWT does).</li>
<li>An application running within a browser, but using native browser technologies (HTML, CSS and JavaScript). If we were talking about applications held in browser plug-ins and running out-of-process within their own virtual machines or by mean of run-times, I would prefer to use the more general term &#8220;rich internet applications&#8221;. These are launched from a web browser but behave as black boxes for other user agents (e.g.: web crawlers).</li>
</ul>
<p>GWT allows us is write Ajax-based &#8220;rich web applications&#8221; using the Java language instead of the traditional JavaScript. GWT takes your Java code and compiles into JavaScript, HTML, and CSS. So while you write the program in Java, it is translated into a traditional web application. </p>
<h3>Building user interfaces in GWT</h3>
<p>The most common approach to building desktop application interfaces is using visual components called &#8220;widgets&#8221;. For developers with Swing experience, GWT <em>seems</em> a marvellous step forward because it allows you to leverage most of your knowledge with far less effort than the alternatives. I say seems because this can also be of disadvantage, as I&#8217;ll show with an example.<br />
If we had to create a web interface for a simple web search application, the most common way of doing the interface would be an HTML form for submitting the query and an HTML list to show the results:<br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;html&gt;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Search application&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;searchBox&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Search:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;form action=&quot;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label for=&quot;queryInput&quot;&gt;Query:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input id=&quot;queryInput&quot; type=&quot;text&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;Go!&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;
&lt;/div&gt;
&lt;div id=&quot;searchResults&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Results:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul id=&quot;results&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 1&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 2&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 3&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></pre><br />
In the case of GWT, a Swing developer might write widget and layout code like this:<br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchGwt implements EntryPoint {
&nbsp;&nbsp;&nbsp;&nbsp;public void onModuleLoad() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Widget searchBox = createSearchBox(&quot;Query:&quot;, &quot;Go!&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Panel searchResults = createSearchResults();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerticalPanel mainContainer = new VerticalPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(new Label(&quot;Search:&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(searchBox);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(new Label(&quot;Results:&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(searchResults);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RootPanel.get().add(mainContainer);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private Widget createSearchBox(String inputLabel, String buttonLabel) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HorizontalPanel searchBox = new HorizontalPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new Label(inputLabel));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new TextBox());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new Button(buttonLabel));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return searchBox;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private Panel createSearchResults() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VerticalPanel searchResults = new VerticalPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= 3; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchResults.add(new Label(&quot;Result &quot; + i));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return searchResults;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
This approach is a valid one and, with some CSS styling, produces a neat interface, but it introduces a too complicated DOM structure that does not scale well for bigger applications:<br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;html&gt;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Search GWT application&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- GWT script and iframe tags omitted --&gt;
&lt;div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Search:&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tbody&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;tr&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&quot;left&quot; style=&quot;vertical-align: top;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Query:&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&quot;left&quot; style=&quot;vertical-align: top;&quot;&gt;&lt;input type=&quot;text&quot; tabindex=&quot;0&quot; class=&quot;gwt-TextBox&quot;/&gt;&lt;/td&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;td align=&quot;left&quot; style=&quot;vertical-align: top;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button type=&quot;button&quot; tabindex=&quot;0&quot; class=&quot;gwt-Button&quot;&gt;Go!&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tr&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/tbody&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/table&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Results:&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Result 1&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Result 2&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div class=&quot;gwt-Label&quot;&gt;Result 3&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></pre><br />
Compare the handcrafted HTML tags with the DOM produced using GWT widgets, and the first one is simpler. One of the reasons of the extra verbosity of the GWT one is the use of &#8220;HorizontalPanel&#8221; to layout the search box horizontally. This is a panel based in tables and it introduces a &#8220;too verbose&#8221; HTML table for the layout. In the case of a horizontal layout, we can also use a FlowPanel, altogether with some CSS styles, to avoid the search box components stacking vertically (which is the default layout for the HTML &#8220;div&#8221; elements that a &#8220;FlowPanel&#8221; produces). The problem is that this approach mixes widgets for layout with CSS for layout (not for styling) what stops being a pure widget approach.<br />
The next thing to notice in the DOM produced by GWT is the excessive presence of GWT CSS classes (e.g.: &#8220;gwt-Label&#8221;, &#8220;gwt-TextBox&#8221;). While they are most times useful when it comes to style the widgets, they are many times not used or they do not fit always our CSS selectors strategy.<br />
Lastly, there is a lack of HTML semantics in the DOM produced by GWT. Almost every element is a &#8220;div&#8221;. From the point of view of web standards, it is much more convenient to use an HTML list for the results as it is to use a collection of &#8220;div&#8221; elements. Producing HTML labels associated with form fields (search box label) is also a usability and accessibility improvement. Using tables for layout should be avoided.<br />
For a real-world application that use input fields, trees, tables, &#8220;tab panels&#8221; or splitters, etc&#8230; all in the same screen, it is a good practice to get rid of the intermediate superfluous DOM elements. It reduces drastically the amount of &#8220;glue&#8221; elements, making the DOM much more compact and faster to modify. We should avoid &#8220;glue&#8221; and automatic generated code, because it needs to be compiled, loaded, executed and maintained. In the case of an overly verbose DOM structure, CSS issues may appear because of the complex structure interactions. Fixing them is akin to fixing bugs in generated code: very difficult!</p>
<h3>Mixing HTML and Widgets</h3>
<p>So how can we mix widgets and html properly? Before GWT version 2.0, the most common way was to use &#8220;RootPanel.get(&#8216;someId&#8217;)&#8221; to access an HTML element in the application host page, and then create an object there to attach the widgets to (ie. a &#8220;RootPanel&#8221;). If we need to embed only a few widgets in the host page, this technique suffices. But doing this in a real application with a large number of widgets becomes complex and slow.<br />
UiBinder scales better because it does not inject widgets into the HTML of the host page. Instead, you declare your layout in a stand-alone HTML file that can be composed with other components as many times as necessary to build more complex interfaces. Composition entails componentization, allowing the developer to create subparts of the user interface (UI components) that can be packaged, re-used and tested in isolation.<br />
But let us see how with an example:<br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchGwt implements EntryPoint {
&nbsp;&nbsp;&nbsp;&nbsp;public void onModuleLoad() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearchComponent searchComponent = new SearchComponent();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RootPanel.get().add(searchComponent);
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;ui:UiBinder xmlns:ui=&#039;urn:ui:com.google.gwt.uibinder&#039;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:g=&#039;urn:import:com.google.gwt.user.client.ui&#039;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:HTMLPanel&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchBox&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Search:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form action=&quot;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label for=&quot;queryInput&quot;&gt;Query:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input id=&quot;queryInput&quot; type=&quot;text&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;Go!&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchResults&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Results:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul id=&quot;results&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 1&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 2&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 3&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/g:HTMLPanel&gt;
&lt;/ui:UiBinder&gt;</pre></pre><br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchComponent extends Composite {
&nbsp;&nbsp;&nbsp;&nbsp;interface Binder extends UiBinder&lt;Widget, SearchComponent&gt; {
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private static Binder uiBinder = GWT.create(Binder.class);

&nbsp;&nbsp;&nbsp;&nbsp;public SearchComponent() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initWidget(uiBinder.createAndBindUi(this));
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
Our example has been split into three files: the first one is the GWT entry point, that now only instantiates and inserts our new UI component at the interface top level. The second is an XML file representing the view and is required by UiBinder to act as a mark-up template. The third is the Java class implementing the component logic (that as of now is almost non-existent) and invoking UiBinder.<br />
If you run this code so far, you will notice that now the appearance is exactly the same as in the handcrafted HTML and that there is not yet real integration between the view of the component (mark-up template) and the logic of the component (Java class). Let us fix this by substituting the HTML input field with a GWT &#8220;TextBox&#8221;:<br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;ui:UiBinder xmlns:ui=&#039;urn:ui:com.google.gwt.uibinder&#039;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:g=&#039;urn:import:com.google.gwt.user.client.ui&#039;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:HTMLPanel&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchBox&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Search:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form action=&quot;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label for=&quot;queryInput&quot;&gt;Query:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:TextBox ui:field=&quot;queryInput&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;Go!&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchResults&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Results:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul id=&quot;results&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;Result 1&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;Result 2&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;Result 3&lt;/li&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ul&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/g:HTMLPanel&gt;
&lt;/ui:UiBinder&gt;</pre></pre><br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchComponent extends Composite {
&nbsp;&nbsp;&nbsp;&nbsp;interface Binder extends UiBinder&lt;Widget, SearchComponent&gt; {
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private static Binder uiBinder = GWT.create(Binder.class);

&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;TextBox queryInput;

&nbsp;&nbsp;&nbsp;&nbsp;public SearchComponent() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initWidget(uiBinder.createAndBindUi(this));
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
Notice the changes in the template where the HTML input field has been substituted by &#8220;<g:TextBox...>&#8221; and also the little change in the Java class that now has a field of type &#8220;TextBox&#8221; annotated with &#8220;UiField&#8221;. When the Java class is instantiated, the UiBinder creates and injects the &#8220;TextBox&#8221; using the matching field name and &#8220;ui:field&#8221; attribute. The result is almost the same DOM structure with only some extra attribute values generated by GWT. Note that we also eliminated the &#8220;id&#8221; HTML attribute. This last change is because of a current limitation in UiBinder which does not allow defining both attributes in the same element. This issue can be solved setting the id attribute in the constructor after the UiBinder has been invoked.<br />
As next step, let us now integrate the results list by writing out some simple HTML list elements:<br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;ui:UiBinder xmlns:ui=&#039;urn:ui:com.google.gwt.uibinder&#039;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:g=&#039;urn:import:com.google.gwt.user.client.ui&#039;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:HTMLPanel&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchBox&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Search:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;form action=&quot;&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label for=&quot;queryInput&quot;&gt;Query:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:TextBox ui:field=&quot;queryInput&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type=&quot;submit&quot; value=&quot;Go!&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/form&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchResults&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Results:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul ui:field=&quot;results&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/g:HTMLPanel&gt;
&lt;/ui:UiBinder&gt;</pre></pre><br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchComponent extends Composite {
&nbsp;&nbsp;&nbsp;&nbsp;interface Binder extends UiBinder&lt;Widget, SearchComponent&gt; {
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private static Binder uiBinder = GWT.create(Binder.class);

&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;TextBox queryInput;
&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;UListElement results;

&nbsp;&nbsp;&nbsp;&nbsp;public SearchComponent() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initWidget(uiBinder.createAndBindUi(this));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queryInput.getElement().setId(&quot;queryInput&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= 3; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.appendChild(createResultsItem(&quot;Result &quot; + i));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private Element createResultsItem(String value) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIElement result = Document.get().createLIElement();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.setInnerHTML(value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
The changes in the UI Binder template is almost the same as the previous one with a subtle difference: in the previous step, we integrated a GWT widget (&#8220;TextBox&#8221;) replacing the HTML input element. In this second case, we performed a to &#8220;bind&#8221; the &#8220;ul&#8221; HTML element from the view because there is no GWT list widget that matches a simple HTML list. Instead of using the API of a GWT widget, we are using the GWT DOM API to directly modify it.</p>
<h3>Adding behaviour</h3>
<p>Let us now go back to the first GWT approach and modify it to create the results when clicking the button. This is what your pre-UiBinder code might look like:<br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchGwt implements EntryPoint {
&nbsp;&nbsp;&nbsp;&nbsp;public void onModuleLoad() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Panel searchResults = new FlowPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Widget searchBox = createSearchBox(&quot;Query:&quot;, &quot;Go!&quot;, searchResults);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FlowPanel mainContainer = new FlowPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(new Label(&quot;Search:&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(searchBox);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(new Label(&quot;Results:&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mainContainer.add(searchResults);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RootPanel.get().add(mainContainer);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private Widget createSearchBox(String inputLabel, String buttonLabel,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Panel searchResults) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HorizontalPanel searchBox = new HorizontalPanel();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new Label(inputLabel));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new TextBox());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchBox.add(new Button(buttonLabel,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createClickHandler(searchResults)));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return searchBox;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private ClickHandler createClickHandler(final Panel searchResults) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new ClickHandler() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void onClick(ClickEvent event) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= 3; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchResults.add(new Label(&quot;Result &quot; + i));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
Here we introduced a &#8220;ClickHandler&#8221; that modifies the results container with some fake ones when the search button is clicked.<br />
Doing the same with the UiBinder approach results on the following code:<br />
<pre><pre style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">&lt;ui:UiBinder xmlns:ui=&#039;urn:ui:com.google.gwt.uibinder&#039;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlns:g=&#039;urn:import:com.google.gwt.user.client.ui&#039;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:HTMLPanel&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchBox&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Search:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label for=&quot;queryInput&quot;&gt;Query:&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:TextBox ui:field=&quot;queryInput&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;g:Button ui:field=&quot;searchButton&quot; text=&quot;Go!&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;searchResults&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h2&gt;Results:&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ul ui:field=&quot;results&quot;/&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/g:HTMLPanel&gt;
&lt;/ui:UiBinder&gt;</pre></pre><br />
<pre><code style="border: 1px dashed #999999; padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: #000000; background-color: #eeeeee; font-size: 12px; line-height: 14px; width: 100%;">
public class SearchComponent extends Composite {
&nbsp;&nbsp;&nbsp;&nbsp;interface Binder extends UiBinder&lt;Widget, SearchComponent&gt; {
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private static Binder uiBinder = GWT.create(Binder.class);

&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;TextBox queryInput;
&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;Button searchButton;
&nbsp;&nbsp;&nbsp;&nbsp;@UiField
&nbsp;&nbsp;&nbsp;&nbsp;UListElement results;

&nbsp;&nbsp;&nbsp;&nbsp;public SearchComponent() {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initWidget(uiBinder.createAndBindUi(this));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queryInput.getElement().setId(&quot;queryInput&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;@UiHandler(&quot;searchButton&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;void buttonClick(ClickEvent event) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 1; i &lt;= 3; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results.appendChild(createResultsItem(&quot;Result &quot; + i));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;private Element createResultsItem(String value) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LIElement result = Document.get().createLIElement();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.setInnerHTML(value);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return result;
&nbsp;&nbsp;&nbsp;&nbsp;}
}
</code></pre><br />
We introduced a &#8220;Button&#8221; GWT widget in the mark-up template together with its corresponding field in the Java class. We also moved the code creating the results to its own method annotated with &#8220;UiHandler&#8221; (take into account that the signature must be compatible with a &#8220;ClickHandler&#8221;). Finally, we removed the &#8220;form&#8221; element from the mark-up (which is not required at all in an Ajax application).<br />
One of the core design principles in the development world is the benefits of separating logic and presentation. What would happen if now we wanted to change the place where the results appear in relation to the search box? Or, if we wanted to get rid of the &#8220;Results:&#8221; label because it is not necessary? In the first GWT approach taken, the way in which the widgets are created and nested is reflected in the Java code together with our logic, making necessary changes to this code. Also &#8220;static&#8221; presentational elements, like the &#8220;Results:&#8221; label, are embedded in the code where. Applying the separation of concerns principle tells us that they do not belong there. Making a change to either presentation or logic necessarily requires changing <em>both</em> presentation and logic. In the &#8220;UiBinder&#8221; approach, because of its inherent separation of concerns, these changes would happen only in the mark-up template or in the domain logic, not in both.</p>
<h3>Conclusions</h3>
<ul>
<li>When building a web application, no matter which framework you use, never forget that you are still using HTML, CSS and JavaScript. The simpler the DOM produced, the faster the application will perform and the less CSS issues you will find.</li>
<li>Web applications have web pages! Always try to use the most semantic HTML structure you can. It improves SEO, usability and accessibility and usually produces compact DOM structures.</li>
<li>Even when you program in your favourite language and do everything in code by mean of widgets, do not forget the advantages of principles like presentation and logic separation. Using UiBinder in GWT produces twice the number of files but each is simpler, cleaner, easy to manage, and easier to maintain.</li>
<li>With presentation separation, you can let your design team produce a HTML prototype of the different parts of your application that can be easily reused afterwards or even in parallel. Two teams being able to work in parallel reduces the project time span and using prototypes reduces the project risks.</li>
<li>Because different tasks require different skills, let the developers code and the designers deal with HTML and CSS. They all will be much happier and the application will be and look much better.</li>
</ul>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2010/04/26/gwt-uibinder-better-web-app-separation-of-concerns/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>RIA Forum on GUI Technology</title>
		<link>http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/</link>
		<comments>http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:29:23 +0000</pubDate>
		<dc:creator>Felix Schrape</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Flash, Flex, and Air]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=955</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/";</script>We are happy to announce the second RIA forum which will take place in Darmstadt (close to Frankfurt), 23rd of April 2010! This time, with Canoo Engineering AG as premium sponsor, four well known speakers will talk about the advantages and disadvantages of four different ways to create effective user interfaces (especially in business contexts). [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/";</script><p><img class="alignnone size-full wp-image-956" title="600px-darmstadt_panorama" src="http://canoo.com/blog/wp-content/uploads/2010/01/600px-darmstadt_panorama.jpg" alt="600px-darmstadt_panorama" width="650" height="110" /></p>
<p>We are happy to announce the second RIA forum which will take place in Darmstadt (close to Frankfurt), 23rd of April 2010! This time, with Canoo Engineering AG as premium sponsor, four well known speakers will talk about the advantages and disadvantages of four different ways to create effective user interfaces (especially in business contexts).</p>
<p>Instead of giving details here I recommend to visit the forum page directly: <a style="text-decoration: underline; text-shadow: #ffffff 0px 1px 0px; color: #2563ab;" rel="external" href="http://www.riaforum.com/" target="_blank">http://www.riaforum.com</a> (in German). Please be aware that we can only provide entrance to a limited audience, so if you want to join, make sure you sign up quickly.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2010/01/25/ria-forum-on-gui-technology/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jazoon &#8217;09: Addressing security in the agile process</title>
		<link>http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/</link>
		<comments>http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 13:25:51 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Jazoon]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=571</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/";</script>  Session title: Agile and Secure; Can we do Both? Speakers: Jason Li &#38; Jerry Hoff, Aspect Security  Goal: To try to get developers to think about security early on in the development process. Jason begins with a brief description of a common security flaw (in AJAX apps at least) XSS, which typically involves replacing [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/";</script><p> </p>
<p><strong>Session title</strong>: Agile and Secure; Can we do Both?<br />
<strong> Speakers</strong>: Jason Li &amp; Jerry Hoff, Aspect Security</p>
<p><img class="alignnone size-medium wp-image-573" title="Jerry Hoff and Jason Li of Aspect Security" src="http://canoo.com/blog/wp-content/uploads/2009/06/JasonLiJerryHoff-300x225.jpg" alt="Jerry Hoff and Jason Li of Aspect Security" width="300" height="225" /></p>
<p> <strong>Goal</strong>: To try to get developers to think about security early on in the development process.</p>
<p>Jason begins with a brief description of a common security flaw (in AJAX apps at least) XSS, which typically involves replacing regular text with a malicious piece of JavaScript. Example attack: The JS steals the end-user&#8217;s cookie by querying the DOM. A cross-site request forgery might subsequently be mounted by using the stolen cookie from within a new application context such as mail in order to delete all the users mail.</p>
<p>Another example &#8211; SQL injection &#8211; is when part of a SQL statement is replaced with a semi-colon followed by another statement e.g. DROP TABLE&#8230; which is obviously bad news.</p>
<p>With that whirlwind tour of web security&#8230; how to fix the process which results in such errors?</p>
<p>Speakers refer to the waterfall and explain how in each of the chunky phases activities include (or should include) security; security requirements, security design etc&#8230;</p>
<p>Speakers then argue that embellishing the highly iterative agile process in the same way as was done for waterfall is not practical. Blogger agrees&#8230; the granularity of the activities is too fine to permit the kinds of security analyses which are required. So what&#8217;s the solution?</p>
<p>They recommend&#8230;</p>
<p><strong>Leveraging user stories</strong></p>
<p>Prerequisite step: Ensure that all developers have received adequate security training</p>
<p>Another prerequisite step: Get management to fund this (gets a laugh!)<br />
Alternatively: The OWASP Open Web Application Security Project is an organization providing resources which provides heaps of information on attacks points and solutions for these.</p>
<p><strong>Leverage unit testing&#8230;</strong> and include security tests in the unit tests. This is obviously particularly effective in a continuous integration environment.</p>
<p>To speed up this process, use common security components such as those at <a href="http://www.owasp.org/index.php/ESAPI">Open Enterprise Security</a>. Organizationally, this needs to be communicated across the development team(s).</p>
<p><strong>Leverage and consolidate sprints&#8230;</strong> and ensure that all security stories are included in each sprint. For dealing with security stories which don&#8217;t fit into any particular sprint, run sprints that are focussed solely on security.</p>
<p>Great line (paraphrased): <em>Web apps are a kind of &#8220;perfect storm&#8221; comprising a complex mixture of technologies, which results both in a large attack surface area as well as numerous subtle edge cases which make us more vulnerable.</em></p>
<p>Couldn&#8217;t agree more!!!</p>
<p>I found this talk excellent both stylistically and, more importantly, in terms of content. There are <em>still</em> voices out there which claim that agile in some way incompatible with quality. Talks like this should go some way to quell those remaining voices. Although the pair used AJAX&#8217;s inherent security vulnerabilities to highlight the necessity for a systematic approach to security in agile environments, much of what they recommend applies to any agile environment, whether it is creating AJAX applications or not.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2009/06/25/jazoon-09-addressing-security-in-the-agile-process/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What’s new in JSF 2.0?</title>
		<link>http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/</link>
		<comments>http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 12:23:02 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java RIA]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=463</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/";</script>Session title: A complete Tour of JSF 2.0 Speakers: Ed Burns – Sun Microsystems, Inc Martin Marinschek – IRIAN Solutions My interest in this talk is simple to explain: I used JSF in a really cool project last year, and found it cable but wanting in a number of respects. Lets see if the problems [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/";</script><p><strong>Session title</strong>: A complete Tour of JSF 2.0<br />
<strong> Speakers</strong>: Ed Burns – Sun Microsystems, Inc<br />
Martin Marinschek – IRIAN Solutions</p>
<p>My interest in this talk is simple to explain: I used JSF in a really cool project last year, and found it cable but wanting in a number of respects. Lets see if the problems have been addressed…</p>
<p>The speakers begin with quite a few words about how the JSR was the result of a community effort. Then note that JSF 2.0 doubles the scope and integrates Facelets.<br />
 </p>
<p style="text-align: center;"><img class="size-medium wp-image-467 aligncenter" title="P1010119" src="http://canoo.com/blog/wp-content/uploads/2009/06/P1010119-300x219.jpg" alt="P1010119" width="300" height="219" /></p>
<p>And the new features are&#8230;</p>
<ol>
<li><strong>Composite components</strong>. To a large extent the philosophy is the same as for rails with <em>pay as you go</em> complexity. Goal was to enable true abstractions. Makes heavy use of naming conventions to reduce verbosity. Composite components builds on top of resources and facelets. Nice to know: Mojarra supports Groovy.</li>
<li><strong>AJAX support</strong> inspired by RichFaces, IceFaces, DynamicFaces, ADF Faces. Enables AJAX elements to be specified decleratively or programmatically.</li>
<li><strong>Partial state saving</strong>. Biggest problem for performance to-date was the size of the state. Everything was a state and every request was a post. Pre-view state size is now 25% less than prior to 2.0.</li>
<li><strong>View parameters</strong>. Inspired by Page Parameters from Jboss Seam. Provides a way to map requests parameters to special components within the view. Reduces the need to redeclare all the params across all the pages in the app. I had this problem in the aforementioned app and am glad to hear this issue has been addressed!!!</li>
<li><strong>System Events</strong>. Inspired by Dtrace, influenced by JSFTemplating. This is a publish/subscribe event bus for the JSF app. A suite of events is provided. The list may be extended.</li>
<li><strong>Resources</strong> mechanism is now standardised. Separate Filter or Servlet is now no longer necessary. Resources are now logically related to components. Full “library” support (whatever that means), I18N, versioning,</li>
<li><strong>Behaviours</strong> enabled you to attach a behaviour to a component in a way which I didn&#8217;t quite understand.</li>
<li><strong>Navigation</strong> enables pages to be bookmarked. Uses the View Parameters feature to ensure params are validated before rendering the page.  Implicit Navigation enables pages to be bookmarked.</li>
<li><strong>Exception Handler</strong> enables a single point of failure handling to be defined for a given app.</li>
<li><strong>Validation</strong> is integrated with JSR303 Bean Validation</li>
<li>New <strong>Scopes</strong> have been defined: &#8220;conversation&#8221; (enables wizard-type functionality); &#8220;Flash&#8221; inspired by Ruby on Rails, which is used in Master-Detail situations; &#8230;</li>
<li><strong>FacesConcext</strong> used during startup/shutdown eases the business of keeping things tidy.</li>
</ol>
<p>I may have missed one or two points during this rather information-intense session. Nevertheless <em>interesting stuff</em>. Big take-home: JSF2.0 appears far easier to use than its predecessor. It&#8217;s also much bigger.</p>
<p><em>Conclusion</em>: Valuable information, competently presented.</p>
<p>Having been asked 2-3 times at Jazoon about my JSF experience. I now have the impression that interest in JSF is pretty high &#8211; and growing. I&#8217;d have to go back and look at my notes about the project to see what we could have done better using these new features.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2009/06/24/what%e2%80%99s-new-in-jsf-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jazoon &#8217;09: RIA and Security</title>
		<link>http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/</link>
		<comments>http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 13:54:50 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[Jazoon]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=451</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/";</script>Session title: RIA Security: Broken by Design From: Joonas Lehtinen, CEO IT Mill IT Mill is the creator of Vaadin: A 100% Java tool for RIA. Joonas outlines a spectrum of complexity from Basic site to 3D games examples: Web Sites (Wikipedia), AJAX Sugar (Facebook), Full RIA He divides „Full RIA“ divide into client side [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/";</script><p>Session title: RIA Security: Broken by Design<br />
From: Joonas Lehtinen, CEO IT Mill</p>
<p>IT Mill is the creator of Vaadin: A 100% Java tool for RIA.</p>
<p>Joonas outlines a spectrum of complexity from Basic site to 3D games examples:<br />
Web Sites (Wikipedia), AJAX Sugar (Facebook), Full RIA</p>
<p>He divides „Full RIA“ divide into client side vs. Server driven. Gives a crash course in GWT.</p>
<p>Vaadin: Apparently 100% Java and server driven, which sounds an awful lot like ULC at this stage&#8230; But here’s a difference: It builds on GWT and relies on JavaScript on the client-side.</p>
<p>He goes on to present a bunch of development rules:</p>
<p>Rule #1: Don&#8217;t trust the browser<br />
Rule #2: Complexity is a hiding place for bugs<br />
Rule #3: Large surface give more opportunities for attack. This surface has increased with Web 2.0.</p>
<p> </p>
<p style="text-align: center;"><a href="http://canoo.com/blog/wp-content/uploads/2009/06/p1010092.jpg"><img class="alignnone size-medium wp-image-453" title="p1010092" src="http://canoo.com/blog/wp-content/uploads/2009/06/p1010092-300x200.jpg" alt="" width="300" height="200" /></a></p>
<p> </p>
<p>Difference between GWT and Vaadin architectures is that GWT relies on the client invoking a server-side Web Service API, whereas Vaadin renders the client&#8217;s view on the server.</p>
<p>Erm&#8230; he then offers the cures for the problems (Rules above)&#8230; which I miss because the explanation is compressed into around 5s.</p>
<p>I&#8217;m starting to dislike this presentation at this point. Because here comes another artificial security issue scenario&#8230; which <em>guess which product</em> solves. And I thought product placement in Hollywood movies was irritating.</p>
<p>The issues he raises are legitimate, but the lack of objectivity is obscuring the message. And as I write the presenter is debugging JavaScript which depends on analysing the DOM on the client side &#8211; I&#8217;m not sure if he&#8217;s now analysing the problem or trying to fix it!?</p>
<p>I am formally declaring myself lost at this stage. At least I hope the other attendees are getting something out of this presentation, which has lost focus IMO.</p>
<p>He continues with a discussion about attacking at the transport level, inserting new data on the fly. But come on: A secure transaction in this technical setting will operate under HTTPS, which in most instances will deal with this kind of attack. Unless, of course, that&#8217;s something else I missed.</p>
<p>I think I need a coffee!!!</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2009/06/23/jazoon-09-ria-and-security/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>J1 Session-Blog: Ajax vs. JavaFX Technology</title>
		<link>http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/</link>
		<comments>http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/#comments</comments>
		<pubDate>Wed, 03 Jun 2009 07:50:54 +0000</pubDate>
		<dc:creator>Mike</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaOne]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=394</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/";</script>First note that the speakers Ben Galbraith and Don Almaer are co-founders of ajaxian.com, which is clearly an AJAX-shop. They claim that Web technologies and Java went stagnent in the UI space. Ajax and JavaFX have the characteristics of a renaissance. They structure the talk in the form of a &#8220;discussion&#8221; or a series of arguments, [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/";</script><table border="0" align="right">
<tbody>
<tr>
<td><img class="aligncenter" src="http://canoo.com/blog/wp-content/uploads/2009/05/j1.gif" alt="" width="101" height="101" /></td>
</tr>
</tbody>
</table>
<p>First note that the speakers Ben Galbraith and Don Almaer are co-founders of ajaxian.com, which is clearly an AJAX-shop. They claim that Web technologies and Java went stagnent in the UI space. Ajax and JavaFX have the characteristics of a renaissance. They structure the talk in the form of a &#8220;discussion&#8221; or a series of arguments, where one supposedly pits the advantages of said technology against the other.</p>
<p> </p>
<ul>
<li>   <strong>Argument #1</strong>: Java performs way faster than JavaScript; on the other hand JavaScript is getting faster all the time (V8 team at Google); plus apps like Google wave demonstrate that performance is good enough.</li>
<li>   <strong>Argument </strong><strong>#2</strong>: Responsiveness improved by worker-threads in a Java GUI. Yet using “web workers” we can overcome the limitation of JavaScript to a single thread. Demo of Pictastic proves the point. Having said that, web workers are still 10 times slower than Java; plus the API is extremely limited. In “web worker”, worker threads don’t share state, which is way safer than the totally flexible Java approach.</li>
<li>   <strong>Argument #3</strong>: GC way more advanced in Java. On the other hand, incremental GC in Mozilla is improving all the time. A lousy fact of the JVN is having to determine how much memory the app requires (or how much is available) wherever the app is deployed.</li>
<li>   <strong>Argument #4</strong>: Graphical capabilities of Java surpass what web apps can do. But performance of Bubblemark benchmark app shows that Google chrome achieves 100 frames per second. By comparison JavaFX achieves 24 FPS. With vector graphics Chrome is back down to 30 FPS. What the speakers don&#8217;t consider is that JavaFX is a very new and to-date under-optimised technology.</li>
<li>   <strong>Argument #5</strong>: An Ajax 3D demo “metatunnel” is pretty impressive. Most browsers, apparently, are offering 3D extensions. It’s still at the experimental stage, however. JavaFX, on the other hand, has nothing to show in 3D.</li>
<li>   <strong>Argument </strong><strong>#6</strong>: Java is weak on fonts. The speakers claim that can’t use native fonts in Java (is this true? I seem to remember supplying Java with some additional fonts some years back.) Control over fonts in the Ajax world is even more limited, however.</li>
<li>   <strong>Argument #7</strong>: JavaFX provides “amazing” video support. Counter argument: Flash plugin us ubiquitous and surpasses JavaFX in terms of maturity. Open Web Video offers sophisticated video functions.</li>
<li>   <strong>Argument #8</strong>: Binding in JavaFX is compact and elegant. Web toolkits are very clumsy by comparison. The speakers quickly mention Mixins, Animation and Effects. All of this is way easier in JavaFX&#8230;</li>
<li>   <strong>Argument #9</strong>: Legitimate critisisms are raised about JavaFX syntax. Speakers suggest that JavaScript is actually easier and closer to Java than JavaFX Script. And, of course, JavaFX totally lacks widgets like table/tree. Web toolkits even provide some very cool layout management and tools for constructing GUIs.</li>
<li>   <strong>Argument #10</strong>: Tooling superior in the Java world.</li>
<li>   <strong>Argument #11</strong>: Deployment. Web wins here, obviously, except for significant browser incompatibilities. Applets, Mac etc. are lousy too, however.</li>
</ul>
<p> </p>
<p>Conclusion: A pretty damning result for JavaFX, which is for the most part justified (at least today.) What the speakers fail to do, however, is talk more fairly about the significant problems faced by AJAX developers on a daily basis.</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2009/06/03/j1-session-blog-ajax-vs-javafx-technology/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Canoo CEO to present course on RIA and AJAX at ETH Zürich</title>
		<link>http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/</link>
		<comments>http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 12:52:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>
		<category><![CDATA[ETH Zürich]]></category>
		<category><![CDATA[Hans-Dirk Walter]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Weiterbildungsangebot]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=294</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/";</script>Canoo&#8217;s CEO Hans-Dirk Walter is presenting a one day course on Rich Internet Applications and AJAX on 12th September 2008. The RIA course is part of a three day training &#8220;Web-basierte Informationssysteme&#8221; from 10th to 12th September 2008 and will be held in German at the ETH in Zürich. Participants may choose to attend only [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/";</script><p><a href="http://www.canoo.com/whoiswho.html#hansdirk"><img src="http://canoo.com/blog/wp-content/uploads/2008/09/hans_dirk_walter_large-300x281.jpg" alt="Hans-Dirk Walter, CEO at Canoo Engineering" title="hans_dirk_walter" width="200"  class="alignright size-medium wp-image-295" /></a>Canoo&#8217;s CEO Hans-Dirk Walter is presenting a <a href="http://www.inf.ethz.ch/education/continuing/compact_courses/details/index?cid=53&#038;switch=off">one day course on Rich Internet Applications and AJAX</a> on 12th September 2008. </p>
<p>The RIA course is part of a three day training &#8220;Web-basierte Informationssysteme&#8221; from 10th to 12th September 2008 and will be held in German at the ETH in Zürich. Participants may choose to attend only one day or the entire course. </p>
<blockquote><p>Praktisch alle Menschen haben Zugang zum &#8220;Web&#8221;, sei es privat, dienstlich oder zunehmend auch mobil. Das Web ist damit praktisch jederzeit für jedermann verfügbar. Der große Erfolg des Webs liegt darin begründet, dass das Web die Kosten für das Abrufen und Bereitsstellen von Information stark reduziert hat. Dieser dreitägige Kurs stellt die grundlegenden Technologien des Web und der Entwicklung von Web-basierten Anwendungen vor. Am ersten Tag werden Web Services und dienstorientierte Softwarearchitekturen (SOA) vorgestellt, die die Grundlage für verteilte Informationssysteme bieten. Am zweiten Tag wird XML als eine der grundlegenden Technologie zur Repräsentation, Speicherung, Austausch und Verarbeitung von Information vorgestellt. Am dritten Tag werden Rich Internet Applications und die Programmierung von modernen graphischen Benutzerschnittstellen behandelt.</p></blockquote>
<p><a href="http://www.inf.ethz.ch/education/continuing/compact_courses/details/index_DE?cid=53"></p>
<p><img src="http://canoo.com/blog/wp-content/uploads/2007/12/ethlogo.gif" alt="" title="ETH Zurich" class="alignright size-medium" width="150"  /></a></p>
<p>Here is a summary of the RIA topics that will be presented (<em>in German</em>):</p>
<blockquote><p>Rich Internet Applikationen (RIA) sind die nächste Generation der Webtechnologie. Sie verbessern die Benutzerschnittstellen und erweitern den Anwendungsbereich von Webapplikationen entscheidend. Ihr wesentlicher Beitrag: sie verbinden die Vorteile server-basierter Web-Technologie mit Interaktionsmöglichkeiten für den Benutzer, die man sonst nur von lokal installierten Desktop-Applikationen kennt.</p>
<p>Durch das Schlagwort AJAX und Anwendungen wie Google Maps, Flickr oder e-Opinion, die mit dieser Technologie implementiert sind, wurden Rich Internet Applikationen über die technische Entwickler-Community hinaus bekannt. </p>
<p>Häufig wird übersehen, dass AJAX nur eine (sehr einfache) Implementierungsalternative ist, um das übergeordnete Ziel ergonomischerer Benutzerschnittstellen zu realisieren. Dieser Kurs gibt einen Überblick über die Ziele, die man durch den Einsatz von RIA Technologie verfolgt, die Architektur und Entwurfsmuster für Rich Internet Applikationen sowie einen Überblick über Technologiealternativen, um solche modernen Systeme zu realisieren. Zusätzlich zu den Konzepten werden Demonstrationen und praktische Beispiele geliefert, um eine richtige Erfahrung mit diesen Technologien zu bekommen.</p></blockquote>
<p><br/></p>
<p><strong>Summary of the Course Details:</strong></p>
<p><strong>When:</strong> Wednesday 10th September 2008 to Friday 12th September<br />
<strong>Where:</strong> ETH Zürich, IFW-Gebäude, Hörsaal A 36 , Haldeneggsteig 4<br />
<strong>Lecturers: </strong><br />
Prof. Dr. G. Alonso, ETH Zürich<br />
Prof. Dr. D. Kossmann, ETH Zürich<br />
Dr. H.-D. Walter, Canoo AG<br />
<strong>Course name:</strong> Web-basierte Informationssysteme</p>
<p><a href="http://www.inf.ethz.ch/education/continuing/compact_courses/anmeldung/index_DE" title="ETH Zürich Kompaktkurs zum Thema RIA und AJAX"><img src="http://farm4.static.flickr.com/3022/2824038395_500cb16d10_m.jpg" width="250" alt="ETH Zürich Kompaktkurs zum Thema RIA und AJAX" /></a></p>
<p><a href="http://www.inf.ethz.ch/education/continuing/compact_courses/anmeldung/index_DE"><br />
Register for this course</a> at the ETH Zürich website. </p>
<p>This course is part of an <a href="http://www.inf.ethz.ch/education/continuing/compact_courses/index_DE">ETH Zürich course program for IT professionals called &#8220;Kompaktkurse für Informatiker&#8221;</a>. </p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2008/09/03/canoo-ceo-to-present-course-on-ria-and-ajax-at-eth-zurich/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature Article on Building RIA for Business Users</title>
		<link>http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/</link>
		<comments>http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 13:25:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java RIA]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>
		<category><![CDATA[UltraLightClient]]></category>
		<category><![CDATA[canoo]]></category>
		<category><![CDATA[evaluation criteria]]></category>
		<category><![CDATA[Hans-Dirk Walter]]></category>
		<category><![CDATA[ria]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/?p=274</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/";</script>it management has published an article by Canoo&#8217;s CEO, Hans-Dirk Walter on building Rich Internet Applications (RIA) for business applications (in German only). The article provides a short introduction to RIA and some of the business benefits it offers such as automating global business process, consolidating applications or enabling Software as a Service (SaaS). The [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/";</script><p><a href='http://www.canoo.com/news/itmanagement_ria_mit_java.pdf'><img src="http://canoo.com/blog/wp-content/uploads/2008/07/itm_cover_6_2008.jpg" alt="June Issue includes article by Hans-Dirk Walter " title="it management " width="165" height="234" class="alignright size-full wp-image-275" /></a><br />
<a href="http://it-daily.net/">it management</a> has published <a href="http://www.canoo.com/news/itmanagement_ria_mit_java.pdf">an article by Canoo&#8217;s CEO, Hans-Dirk Walter</a> on building Rich Internet Applications (RIA) for business applications (<em>in German only</em>).</p>
<p>The article provides a short introduction to RIA and some of the business benefits it offers such as automating global business process, consolidating applications or enabling Software as a Service (SaaS). The article discusses the various evaluation criteria that are relevant when selecting a technology. </p>
<blockquote>
<ul>
<li> An welche Benutzer richtet sich die Anwendung – soll sie innerhalb eines Unternehmens oder als B2B-Lösung mit Geschäftspartnern eingesetzt werden oder richtet sich die Anwendung an beliebige Benutzer im Internet? </li>
<li> Wie arbeiten die Benutzer mit der Anwendung? Wird sie gelegentlich aufge-<br />
rufen oder wird sie von Experten täglich und sehr intensiv zur Erledigung<br />
von wichtigen Aufgaben verwendet? </li>
<li> Handelt es sich bei der Anwendung um eine Geschäftsanwendung (z.B. ein CRM- oder ERP-System) oder um eine Anwendung mit Unterhaltungscharakter, in denen Animationen und Multimedia eine grosse Rolle spielen?
</li>
</ul>
</blockquote>
<p><a href="http://www.canoo.com/news/itmanagement_ria_mit_java.pdf">A .pdf</a> is available online in the <a href="http://www.canoo.com/news/canooarticles.html">press section</a> of the Canoo website. </p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2008/07/10/feature-article-on-building-ria-for-business-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails Sample Application: ria-map.net</title>
		<link>http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/</link>
		<comments>http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 08:00:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Grails]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Interview]]></category>
		<category><![CDATA[Sample Apps]]></category>
		<category><![CDATA[ria]]></category>
		<category><![CDATA[riamap]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/2008/04/07/grails-sample-app-riamap/</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/";</script>Canoo has released a new sample application at ria-map.net. The application shows typical Web 2.0 interface elements such as tagging or Flickr-like editing fields. I asked the developer, Jonas Zuberbühler, the following questions on the new Canoo sample application. SW> What is riamap? riamap is a Web 2.0 community site that maps the world of [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/";</script><p>Canoo has released a new sample application at <a href="http://ria-map.net/">ria-map.net</a>. The application shows typical Web 2.0 interface elements such as tagging or Flickr-like editing fields. </p>
<p><a href="http://ria-map.net"><img id="image248" src="http://canoo.com/blog/wp-content/uploads/2008/04/riamap_500px.jpg" alt="Canoo riamap entry screen" /></a></p>
<p>I asked the developer, Jonas Zuberbühler, the following questions on the new Canoo sample application.</p>
<p><strong>SW> What is riamap?</strong></p>
<p><strong>riamap</strong> is a Web 2.0 community site that maps the world of Rich Internet Applications. Unlike mere information aggregators on the topic, it builds on user contributions to assemble not only a list of current RIA technologies, but also how they relate to each other.</p>
<p>Users can explore what technologies are available, what they have in common, how they differentiate, what competitors  they have and how they complement each other. These relations make up a graph that any user can extend by adding new connections or voting how strong any such connection based on his or her own judgment.</p>
<p><strong>SW> What technologies did you use to build it?</strong></p>
<p>We used Grails for the web application framework and Groovy as it is the perfect partner for implementing server-side logic.<br />
In addition, we used Prototype, Scriptaculous and LivePipe to integrate AJAX features and to improve the user interface.</p>
<p><strong>SW> Why did you select Grails?  Why not adapt an existing PHP- or Java-based content management system?</strong></p>
<p>Canoo has a strong footing in Java and Grails is the perfect choice for developing Web 2.0 applications on the Java platform. We can build on our solid understanding of this ecosystem and use all the existing tools for development, deployment and operations. On top of this, Grails provides us with the concise, expressive and interactive development style that modern applications require.</p>
<p>Further screenshots:</p>
<p><a class="imagelink" href="http://canoo.com/blog/wp-content/uploads/2008/04/canoo-riamap-search-results.jpg" title="riamap screen 2"><img id="image247" src="http://canoo.com/blog/wp-content/uploads/2008/04/canoo-riamap-search-results.thumbnail.jpg" alt="riamap screen 2" /></a></p>
<p><a class="imagelink" href="http://canoo.com/blog/wp-content/uploads/2008/04/canoo-riamap-dwr-details.jpg" title="riamap screen 1"><img id="image246" src="http://canoo.com/blog/wp-content/uploads/2008/04/canoo-riamap-dwr-details.thumbnail.jpg" alt="riamap screen 1" /></a></p>
<p>To get a login for riamap, sign up <a href="http://ria-map.net/auth/signUp">here</a> to join riamap. Try out the various Web 2.0 interface features.  If you feel like adding information on a RIA technology, enter the details <a href="http://ria-map.net/technology/create">here</a> or edit an existing entry. </p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2008/06/18/grails-sample-app-riamap/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaPolis 2007 – Desktop RIA and Mobile Apps rock the Scene</title>
		<link>http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/</link>
		<comments>http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 11:56:46 +0000</pubDate>
		<dc:creator>Christian</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[Flash, Flex, and Air]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[Rich Internet Applications]]></category>

		<guid isPermaLink="false">http://canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/</guid>
		<description><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/";</script>This morning, I attended the second keynote at JavaPolis 2007 in Antwerp. Although it was not the &#8220;big&#8221; keynote (that one was held by James Gosling the day before), it was definitely the more interesting one to me. This is why: First, the Java community was hit by two extremely cool Flex demonstrations: at the [...]]]></description>
			<content:encoded><![CDATA[<script type="text/javascript">dzone_url = "http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/";</script><p>This morning, I attended the second keynote at <a target="_blank" href="http://www.javapolis.com">JavaPolis 2007</a> in Antwerp. Although it was not the &#8220;big&#8221; keynote (that one was held by James Gosling the day before), it was definitely the more interesting one to me. This is why:</p>
<p>First, the Java community was hit by two extremely cool Flex demonstrations: at the beginning, Bruce Eckel and his co-speakers showed a Flex-based data manager framework that allows transparent and smooth synchronization of client-side and server-side business data, even between multiple clients and with clustered server nodes. Data changed on one client gets synchronized to the server (for example: to all cluster nodes) and then back to all connected clients. Not only does it allow the application to determine the &#8220;transaction commit point&#8221;, but it also provides support for conflict handling (again, the conflict reconciliation handling can be fully controlled by the application). Whenever a client goes offline, data changes are locally tracked and synched back to the server as soon as the connection is re-established. Failed cluster nodes get updated as soon as they rejoin the cluster. In addition, the data manager can also be used with Ajax applications. Although the demo application looked quite &#8220;ugly&#8221; (for a Flex demo &#8230;), the technical brilliance led to spontaneous applause &#8230;</p>
<p>The second rocking Flex demo was <a target="_blank" href="http://www.parleys.com">Parleys.com</a> beta: well-know for slick and smooth video and slide show streaming, Parleys.com is about to get a face-up. Well it&#8217;s more like a revolution. While it was based on Ajax in version 1.0, the new technology chosen is Flex. Of course, the visual effects are extremely slick and appealing. But what is way more interesting to me from a RIA point of view is the integration of the online, browser-based version with an offline Parleys.com client application based on AIR. When both clients are running, the browser-based one automatically gets enhanced by features available in the offline client &#8211; such as offline video availability &#8211; by smoothly adding new buttons and actions to the online client. That really rocks from a user experience and integration point of view! The new Parleys.com version is about to be released in Q1/2008.</p>
<p>But there is a fight-back from the Java side: also worth mentioning here is the Java approach of browser-based RIA that was demonstrated in the <a target="_blank" href="http://swinglabs.java.sun.com/iris">IRIS sample application</a>. First showed to the public at the last JavaOne, this application does not stand behind the Flex-based ones in any way when it comes to visual effects. The IRIS approach smoothly integrates Java applets with an ajaxified Web application. It was almost impossible to say what feature was powered by the applet and what was done using Ajax &#8211; and what was done by tightly combining these two technologies even for a single user interaction. The revival of the applets!</p>
<p>To me, all these demos really show to me that RIA is still steadily increasing in importance. There is way more than just adding a few fancy Ajax effects to static web page &#8211; and the big vendors and technology owners are pushing the car forward. And the desktop is really moving back into the RIA world &#8211; it is no longer all about pure (and old) browser technologies, but about JNLP, applets, AIR &#038; Co.</p>
<p>But there was also another unexpected &#8220;flasher&#8221; in that keynote: JavaME. JavaME? Isn&#8217;t it dead? No, it&#8217;s not! Sun showed up with the new Netbeans Mobility 6.0 that extremely simplifies the development of JavaME-based games. But not only games, also business applications are finally showing up in the JavaME space (and are supported in a graphical way by the mobility tool). Using the SVG-rendering facility available in the MSA (Mobile Service Architecture), these UIs now can really look awesome (forget these old and ugly &#8220;text-based&#8221; mobile UIs &#8230;). And by adding JavaFX Mobile to the scene, Sun is pushing the Java mobile stack even further. As with Google&#8217;s Android, Sun aims to provide a complete software stack based on a Linux kernel that offers Java-based APIs to all phone capabilities which are then used by all the device vendors, third party RIA software service providers and the community to develop new-class mobile RIA applications. It will be very interesting to see whether Sun or Google (or both?) will make the deal with their approach. In the end, I think the device vendors are going to decide this battle: every cool software platform is only worth noting if there are a big bunch of devices available that ship the software by default.</p>
<p>A few resources:</p>
<ul>
<li><a target="_blank" href="#%20http://meapplicationdevelopers.dev.java.net">http://meapplicationdevelopers.dev.java.net</a></li>
<li><a target="_blank" href="http://community.java.net/mobileandembedded">http://community.java.net/mobileandembedded</a></li>
</ul>
<p>All this mobile stuff now really seems to shake a leg. Very exciting!</p>
<script>var dzone_style="2";</script><script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script><div style="float: left; width: 140px; height: 21px; overflow: hidden; position: relative; left: 8px;"><script>//<![CDATA[
reddit_url="http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/";
//]]&gt;
</script><script language="javascript" src="http://reddit.com/button.js?t=1"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.canoo.com/blog/2007/12/13/javapolis-2007-desktop-ria-and-mobile-apps-rock-the-scene/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

