<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>Raible Designs</title>
  <link>https://raibledesigns.com/rd/</link>
      <atom:link rel="self" type="application/rss+xml" href="https://raibledesigns.com/rd/feed/entries/rss?tags=ajax" />
    <description>Raible Designs is an Enterprise Open Source Consulting company. We specialize in UI and Full Stack Architectures using HTML5, CSS, JavaScript and Java. We love HTML5, Angular, Bootstrap, Spring Boot, and especially JHipster.</description>
  <language>en-us</language>
  <copyright>Copyright 2026</copyright>
  <lastBuildDate>Mon, 25 May 2026 13:53:18 -0600</lastBuildDate>
  <generator>Apache Roller (incubating) 5.0.3 (1388864191739:dave)</generator>
        <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery</guid>
    <title>Implementing Ajax Authentication using jQuery, Spring Security and HTTPS</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery</link>
        <pubDate>Wed, 23 Feb 2011 16:55:55 -0700</pubDate>
    <category>Java</category>
    <category>springsecurity</category>
    <category>jquery</category>
    <category>spring</category>
    <category>owasp</category>
    <category>authentication</category>
    <category>overstock.com</category>
    <category>springmvc</category>
    <category>ajax</category>
    <category>appfuse-light</category>
    <category>https</category>
            <description>I&apos;ve always had a keen interest in implementing security in webapps. I implemented container-managed authentication (CMA) in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; in 2002, watched &lt;a href=&quot;http://raibledesigns.com/rd/entry/container_managed_authentication_enhancements_in&quot;&gt;Tomcat improve it&apos;s implementation in 2003&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_refactorings_part_iii_remember&quot;&gt;implemented Remember Me with CMA&lt;/a&gt; in 2004. In 2005, I &lt;a href=&quot;http://raibledesigns.com/rd/entry/ann_appfuse_1_8_released&quot;&gt;switched from CMA to Acegi Security&lt;/a&gt; (now &lt;a href=&quot;http://static.springsource.org/spring-security/site/&quot;&gt;Spring Security&lt;/a&gt;) and never looked back. I&apos;ve been very happy with Spring Security over the years, but also hope to learn more about &lt;a href=&quot;http://shiro.apache.org/&quot;&gt;Apache Shiro&lt;/a&gt; and &lt;a href=&quot;http://www.quora.com/Is-OAuth-the-best-way-to-implement-security-for-a-JavaScript-API&quot;&gt;implementing OAuth to protect JavaScript APIs&lt;/a&gt; in the near future.
&lt;/p&gt;
&lt;p&gt;I was recently re-inspired to learn more about security when working on a new feature at &lt;a href=&quot;http://www.overstock.com&quot;&gt;Overstock.com&lt;/a&gt;. The feature hasn&apos;t been released yet, but basically boils down to allowing users to login without leaving a page. For example, if they want to leave a review on a product, they would click a link, be prompted to login, enter their credentials, then continue to leave their review. The login prompt and subsequent review would likely be implemented using a lightbox. While lightboxes are often seen in webapps these days because they look good, it&apos;s also possible &lt;a href=&quot;http://uxexchange.com/questions/1877/the-usability-of-lightbox-uis&quot;&gt;Lightbox UIs provide a poor user experience&lt;/a&gt;. User experience aside, I think it&apos;s interesting to see what&apos;s required to implement such a feature.
&lt;/p&gt;
&lt;p&gt;To demonstrate how we did it, I whipped up an example using AppFuse Light, jQuery and Spring Security. The source is available in my &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;ajax-login&lt;/a&gt; project on GitHub. To begin, I wanted to accomplish a number of things to replicate the Overstock environment:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Force HTTPS for authentication.&lt;/li&gt;
&lt;li&gt;Allow testing HTTPS without installing a certificate locally.&lt;/li&gt;
&lt;li&gt;Implement a RESTful LoginService that allows users to login.&lt;/li&gt;
&lt;li&gt;Implement login with Ajax, with the request coming from an insecure page.&lt;/li&gt;
&lt;/ol&gt;
&lt;p id=&quot;force-https&quot;&gt;&lt;strong&gt;Forcing HTTPS with Spring Security&lt;/strong&gt;&lt;br/&gt;
The first feature was fairly easy to implement thanks to Spring Security. Its configuration supports a &lt;a href=&quot;http://static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html#ns-requires-channel&quot;&gt;requires-channel&lt;/a&gt; attribute that can be used for this. I used this to force HTTPS on the &quot;users&quot; page and it subsequently causes the login to be secure.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/app/users&quot; access=&quot;ROLE_ADMIN&quot; requires-channel=&quot;https&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;testing-https&quot;&gt;&lt;strong&gt;Testing HTTPS without adding a certificate locally&lt;/strong&gt;&lt;br/&gt;
After making the above change in &lt;a href=&quot;https://github.com/mraible/ajax-login/blob/master/src/main/webapp/WEB-INF/security.xml&quot;&gt;security.xml&lt;/a&gt;, I had to modify my &lt;a href=&quot;https://github.com/mraible/ajax-login/blob/master/src/test/java/org/appfuse/examples/web/UserWebTest.java&quot;&gt;jWebUnit test&lt;/a&gt; to work with SSL. In reality, I didn&apos;t have to modify the test, I just had to modify the configuration that ran the test. In my &lt;a href=&quot;http://raibledesigns.com/rd/entry/integration_testing_with_http_https&quot;&gt;last post&lt;/a&gt;, I wrote about &lt;a href=&quot;http://blogs.sun.com/gc/entry/unable_to_find_valid_certification&quot;&gt;adding my &apos;untrusted&apos; cert to my JVM keystore&lt;/a&gt;. For some reason, this works for HttpClient, but not for jWebUnit/HtmlUnit. The good news is I figured out an easier solution - adding the trustStore and trustStore password as system properties to the maven-failsafe-plugin configuration.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;artifactId&amp;gt;maven-failsafe-plugin&amp;lt;/artifactId&amp;gt;
&amp;lt;version&amp;gt;2.7.2&amp;lt;/version&amp;gt;
&amp;lt;configuration&amp;gt;
    &amp;lt;includes&amp;gt;
        &amp;lt;include&amp;gt;**/*WebTest.java&amp;lt;/include&amp;gt;
    &amp;lt;/includes&amp;gt;
    &amp;lt;systemPropertyVariables&amp;gt;
      &amp;lt;javax.net.ssl.trustStore&amp;gt;${project.build.directory}/ssl.keystore&amp;lt;/javax.net.ssl.trustStore&amp;gt;
      &amp;lt;javax.net.ssl.trustStorePassword&amp;gt;appfuse&amp;lt;/javax.net.ssl.trustStorePassword&amp;gt;
    &amp;lt;/systemPropertyVariables&amp;gt;
&amp;lt;/configuration&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The disadvantage to doing things this way is you&apos;ll have to pass these in as arguments when running unit tests in your IDE.&lt;/p&gt;
&lt;p id=&quot;login-service&quot;&gt;&lt;strong&gt;Implementing a LoginService&lt;/strong&gt;&lt;br/&gt;
Next, I set about implementing a LoginService as a Spring MVC Controller that returns JSON thanks to the &lt;a href=&quot;http://blog.springsource.com/2010/01/25/ajax-simplifications-in-spring-3-0/&quot;&gt;@ResponseBody annotation and Jackson&lt;/a&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.web;

import org.appfuse.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping(&quot;/api/login.json&quot;)
public class LoginService {

  @Autowired
  @Qualifier(&quot;authenticationManager&quot;)
  AuthenticationManager authenticationManager;

  @RequestMapping(method = RequestMethod.GET)
  @ResponseBody
  public LoginStatus getStatus() {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null &amp;&amp; !auth.getName().equals(&quot;anonymousUser&quot;) &amp;&amp; auth.isAuthenticated()) {
      return new LoginStatus(true, auth.getName());
    } else {
      return new LoginStatus(false, null);
    }
  }

  @RequestMapping(method = RequestMethod.POST)
  @ResponseBody
  public LoginStatus login(@RequestParam(&quot;j_username&quot;) String username,
                           @RequestParam(&quot;j_password&quot;) String password) {

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
    User details = new User(username);
    token.setDetails(details);

    try {
      Authentication auth = authenticationManager.authenticate(token);
      SecurityContextHolder.getContext().setAuthentication(auth);
      return new LoginStatus(auth.isAuthenticated(), auth.getName());
    } catch (BadCredentialsException e) {
      return new LoginStatus(false, null);
    }
  }

  public class LoginStatus {

    private final boolean loggedIn;
    private final String username;

    public LoginStatus(boolean loggedIn, String username) {
      this.loggedIn = loggedIn;
      this.username = username;
    }

    public boolean isLoggedIn() {
      return loggedIn;
    }

    public String getUsername() {
      return username;
    }
  }
}
&lt;/pre&gt;
&lt;p&gt;To verify this class worked as expected, I wrote a unit test using JUnit and &lt;a href=&quot;http://mockito.org/&quot;&gt;Mockito&lt;/a&gt;. I used Mockito because Overstock is transitioning to it from EasyMock and I&apos;ve found it very simple to use.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.web;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

public class LoginServiceTest {

  LoginService loginService;
  AuthenticationManager authenticationManager;

  @Before
  public void before() {
    loginService = new LoginService();
    authenticationManager = mock(AuthenticationManager.class);
    loginService.authenticationManager = authenticationManager;
  }

  @After
  public void after() {
    SecurityContextHolder.clearContext();
  }

  @Test
  public void testLoginStatusSuccess() {
    Authentication auth = new TestingAuthenticationToken(&quot;foo&quot;, &quot;bar&quot;);
    auth.setAuthenticated(true);
    SecurityContext context = new SecurityContextImpl();
    context.setAuthentication(auth);
    SecurityContextHolder.setContext(context);

    LoginService.LoginStatus status = loginService.getStatus();
    assertTrue(status.isLoggedIn());
  }

  @Test
  public void testLoginStatusFailure() {
    LoginService.LoginStatus status = loginService.getStatus();
    assertFalse(status.isLoggedIn());
  }

  @Test
  public void testGoodLogin() {
    Authentication auth = new TestingAuthenticationToken(&quot;foo&quot;, &quot;bar&quot;);
    auth.setAuthenticated(true);
    when(authenticationManager.authenticate(Matchers.&amp;lt;Authentication&amp;gt;anyObject())).thenReturn(auth);
    LoginService.LoginStatus status = loginService.login(&quot;foo&quot;, &quot;bar&quot;);
    assertTrue(status.isLoggedIn());
    assertEquals(&quot;foo&quot;, status.getUsername());
  }

  @Test
  public void testBadLogin() {
    Authentication auth = new TestingAuthenticationToken(&quot;foo&quot;, &quot;bar&quot;);
    auth.setAuthenticated(false);
    when(authenticationManager.authenticate(Matchers.&lt;Authentication&gt;anyObject()))
        .thenThrow(new BadCredentialsException(&quot;Bad Credentials&quot;));
    LoginService.LoginStatus status = loginService.login(&quot;foo&quot;, &quot;bar&quot;);
    assertFalse(status.isLoggedIn());
    assertEquals(null, status.getUsername());
  }
}
&lt;/pre&gt;
&lt;p id=&quot;ajax-login&quot;&gt;&lt;strong&gt;Implement login with Ajax&lt;/strong&gt;&lt;br/&gt;
The last feature was the hardest to implement and still isn&apos;t fully working as I&apos;d hoped. I used jQuery and jQuery UI to implement a dialog that opens the login page on the same page rather than redirecting to the login page. The &quot;#demo&quot; locator refers to a button in the page.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Passing in the &quot;ajax=true&quot; parameter disables SiteMesh decoration on the login page, something that&apos;s described in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body&quot;&gt;Ajaxified Body&lt;/a&gt; article.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
var dialog = $(&apos;&amp;lt;div&gt;&amp;lt;/div&gt;&apos;);

$(document).ready(function() {
    $.get(&apos;/login?ajax=true&apos;, function(data) {
        dialog.html(data);
        dialog.dialog({
            autoOpen: false,
	       title: &apos;Authentication Required&apos;
        });
    });

    $(&apos;#demo&apos;).click(function() {
      dialog.dialog(&apos;open&apos;);
      // prevent the default action, e.g., following a link
      return false;
    });
});
&lt;/pre&gt;
&lt;p class=&quot;quote&quot;&gt;
Instead of adding a click handler to a specific id, it&apos;s probably better to use a CSS class that indicates authentication is required for a link, or -- even better -- use Ajax to see if the link is secured.
&lt;/p&gt;
&lt;p&gt;The login page then has the following JavaScript to add a click handler to the &quot;login&quot; button that submits the request securely to the LoginService.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
var getHost = function() {
    var port = (window.location.port == &quot;8080&quot;) ? &quot;:8443&quot; : &quot;&quot;;
    return ((secure) ? &apos;https://&apos; : &apos;http://&apos;) + window.location.hostname + port;
};

var loginFailed = function(data, status) {
    $(&quot;.error&quot;).remove();
    $(&apos;#username-label&apos;).before(&apos;&amp;lt;div class=&quot;error&quot;&gt;Login failed, please try again.&amp;lt;/div&gt;&apos;);
};

$(&quot;#login&quot;).live(&apos;click&apos;, function(e) {
    e.preventDefault();
    $.ajax({url: getHost() + &quot;/api/login.json&quot;,
        type: &quot;POST&quot;,
        data: $(&quot;#loginForm&quot;).serialize(),
        success: function(data, status) {
            if (data.loggedIn) {
                // success
                dialog.dialog(&apos;close&apos;);
                location.href= getHost() + &apos;/users&apos;;
            } else {
                loginFailed(data);
            }
        },
        error: loginFailed
    });
});
&lt;/pre&gt;
&lt;p&gt;The biggest secret to making this all work (the HTTP -&gt; HTTPS communication, which is considered cross-domain), is the &lt;a href=&quot;http://www.sitepen.com/blog/2008/07/22/windowname-transport/&quot;&gt;window.name Transport&lt;/a&gt; and the &lt;a href=&quot;http://friedcellcollective.net/outbreak/jsjquerywindownameplugin/&quot;&gt;jQuery plugin&lt;/a&gt; that implements it. To make this plugin work with Firefox 3.6, I had to implement a Filter that adds Access-Control headers. &lt;a href=&quot;http://stackoverflow.com/questions/1099787/jquery-ajax-post-sending-options-as-request-method-in-firefox&quot;&gt;A question on Stackoverflow&lt;/a&gt; helped me figure this out.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public class OptionsHeadersFilter implements Filter {

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;

        response.setHeader(&quot;Access-Control-Allow-Origin&quot;, &quot;*&quot;);
        response.setHeader(&quot;Access-Control-Allow-Methods&quot;, &quot;GET,POST&quot;);
        response.setHeader(&quot;Access-Control-Max-Age&quot;, &quot;360&quot;);
        response.setHeader(&quot;Access-Control-Allow-Headers&quot;, &quot;x-requested-with&quot;);

        chain.doFilter(req, res);
    }

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }
}
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt;&lt;br/&gt;
I encountered a number of issues when implementing this in the &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;ajax-login&lt;/a&gt; project. 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you try to run this with ports (e.g. 8080 and 8443) in your URLs, you&apos;ll get a 501 (Not Implemented) response. Removing the ports by fronting with &lt;a href=&quot;http://raibledesigns.com/rd/entry/apache_2_on_os_x&quot;&gt;Apache and mod_proxy&lt;/a&gt; solves this problem.
&lt;li&gt;If you haven&apos;t accepted the certificate in your browser, the Ajax request will fail. In the example, I solved this by clicking on the &quot;Users&quot; tab to make a secure request, then going back to the homepage to try and login.&lt;/li&gt;
&lt;li&gt;The jQuery window.name version 0.9.1 doesn&apos;t work with jQuery 1.5.0. The error is &quot;$.httpSuccess function not found.&quot;&lt;/li&gt;
&lt;li&gt;Finally, even though I was able to authenticate successfully, I was &lt;a href=&quot;http://stackoverflow.com/questions/5087137/is-it-possible-to-programmatically-authenticate-with-spring-security-and-make-it&quot;&gt;unable to make the authentication persist&lt;/a&gt;.  I tried adding the following to persist the updated SecurityContext to the session, but it doesn&apos;t work. I expect the solution is to create a secure JSESSIONID cookie somehow.
&lt;pre class=&quot;brush: java&quot;&gt;
@Autowired
SecurityContextRepository repository;

@RequestMapping(method = RequestMethod.POST)
@ResponseBody
public LoginStatus login(@RequestParam(&quot;j_username&quot;) String username,
                         @RequestParam(&quot;j_password&quot;) String password,
                         HttpServletRequest request, HttpServletResponse response) {

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
    ...

    try {
        Authentication auth = authenticationManager.authenticate(token);
        SecurityContextHolder.getContext().setAuthentication(auth);
        // save the updated context to the session
        repository.saveContext(SecurityContextHolder.getContext(), request, response);
        return new LoginStatus(auth.isAuthenticated(), auth.getName());
    } catch (BadCredentialsException e) {
        return new LoginStatus(false, null);
    }
}
&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
This article has shown you how to force HTTPS for login, how to do integration testing with a self-generated certificate, how to implement a LoginService with Spring MVC and Spring Security, as well as how to use jQuery to talk to a service cross-domain with the window.name Transport. While I don&apos;t have everything working as much as I&apos;d like, I hope this helps you implement a similar feature in your applications. 
&lt;/p&gt;
&lt;p&gt;
One thing to be aware of is with lightbox/dialog logins and HTTP -&gt; HTTPS is that users won&apos;t see a secure icon in their address bar. If your app has sensitive data, you might want to force https for your entire app. OWASP&apos;s &lt;a href=&quot;http://www.owasp.org/index.php/SSL_Best_Practices#Secure_Login_Pages&quot;&gt;Secure Login Pages&lt;/a&gt; has a lot of good tips in this area.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&apos;ve posted a &lt;a href=&quot;http://demo.raibledesigns.com/ajax-login/&quot;&gt;demo of the ajax-login webapp&lt;/a&gt;. Thanks to &lt;a href=&quot;http://www.contegix.com/&quot;&gt;Contegix&lt;/a&gt; for hosting the demo and helping obtain/install an SSL certificate so quickly.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ajax_framework_analysis_results</guid>
    <title>Ajax Framework Analysis Results</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ajax_framework_analysis_results</link>
        <pubDate>Thu, 23 Apr 2009 20:34:44 -0600</pubDate>
    <category>Java</category>
    <category>ajax</category>
    <category>gxt</category>
    <category>jquery</category>
    <category>smartgwt</category>
    <category>dojo</category>
    <category>yui</category>
    <category>java</category>
    <category>gwt</category>
    <category>extjs</category>
            <description>Way back in January, I wrote about how my colleagues and I were &lt;a href=&quot;http://raibledesigns.com/rd/entry/choosing_an_ajax_framework&quot;&gt;evaluating Ajax frameworks&lt;/a&gt; to build a SOFEA-style architecture. To make our choice, we used the following process:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a short list of frameworks to prototype with.&lt;/li&gt;
&lt;li&gt;Create an application prototype with each framework.&lt;/li&gt;
&lt;li&gt;Document findings and create a matrix with important criteria.&lt;/li&gt;
&lt;li&gt;Create presentation to summarize document.&lt;/li&gt;
&lt;li&gt;Deliver document, presentation and recommendation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;When I wrote that entry, we had just finished step 2 and were starting step 3. I first wrote this blog post a week later, when we delivered step 5. Here is the comparison and conclusion sections of the analysis document we composed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Framework Comparison&lt;/strong&gt;&lt;br/&gt;
In order to evaluate the different frameworks against important criteria, we created a matrix with weights and ranks for each framework. This matrix shows how our weighting and rankings lead us to the winner for our project.  You can &lt;a href=&quot;http://spreadsheets.google.com/ccc?key=p2SLd279MTmShLQdCjfi0OQ&amp;hl=en&quot;&gt;view this matrix online&lt;/a&gt; or see below for a summary.
&lt;/p&gt;

&lt;iframe width=&apos;520&apos; height=&apos;500&apos; frameborder=&apos;0&apos; src=&apos;http://spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;output=html&amp;gid=0&amp;single=true&amp;widget=true&apos; style=&apos;margin: 0 auto&apos;&gt;&lt;/iframe&gt;

&lt;p style=&quot;text-align: left&quot;&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Criteria whose values were identical across all candidates were weighted at zero. 
Charting capability was weighted at zero b/c we decided to use Flash for this.
&lt;/p&gt;

&lt;p&gt;This matrix indicates that &lt;strong&gt;GWT&lt;/strong&gt; is the best candidate for our team to develop SOFEA-style applications with.
In addition to the matrix, below are graphs that illustrate interesting (and possibly meaningless) statistics about each project. 
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=1&amp;amp;output=image&quot; width=&quot;320&quot; alt=&quot;Number of Committers&quot;/&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;!--img src=&quot;//spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=2&amp;amp;output=image&quot; width=&quot;320&quot; alt=&quot;Mailing List Traffic&quot;/&gt;
&lt;br/&gt;&lt;br/--&gt;
&lt;img src=&quot;//spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=3&amp;amp;output=image&quot; width=&quot;320&quot; alt=&quot;Books on Amazon&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;

After working with the various frameworks, we believe that all the frameworks were very good and could be used to write applications with. If all weights are equal, these frameworks were almost even when compared against our evaluation criteria. The graph below illustrates this. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=4&amp;amp;output=image&quot; width=&quot;320&quot; alt=&quot;Ranking with equal criteria weights&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Even after applying the weighted criteria, the evenness doesn&apos;t change a whole lot. &lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//spreadsheets.google.com/pub?key=p2SLd279MTmShLQdCjfi0OQ&amp;amp;oid=5&amp;amp;output=image&quot; width=&quot;320&quot; alt=&quot;Ranking with weighted criteria&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
Without considering the even or weighted criteria, we believe the decision all comes down to what the developers on the project feel they will be most comfortable with. If you&apos;re developing with Dojo or YUI, chances are you&apos;re &lt;em&gt;dressing up&lt;/em&gt; existing HTML and possibly using &lt;a href=&quot;http://www.alistapart.com/articles/understandingprogressiveenhancement&quot;&gt;progressive enhancement&lt;/a&gt; to add more rich functionality. On the other hand, Ext JS and GWT are similar to Swing programming where you build the UI with code (JavaScript for Ext JS, Java for GWT).
&lt;/p&gt;
&lt;p&gt;
The tools available for JavaScript development have gotten increasingly better in recent years. IntelliJ IDEA has a &lt;a href=&quot;http://www.jetbrains.com/idea/features/javascript_editor.html&quot;&gt;JavaScript Editor&lt;/a&gt; that provides many of the same features as its Java editor. &lt;a href=&quot;http://www.aptana.com/studio&quot;&gt;Aptana Studio&lt;/a&gt; also has excellent support for authoring and debugging JavaScript. However, we believe the Java debugging and authoring support in IDEs is much better. Furthermore, we are more familiar with organizing code in Java projects and feel more comfortable in this development environment. 
&lt;/p&gt;
&lt;p&gt;
Based on this evaluation, we believe that GWT is the best framework for our team to develop SOFEA-style applications with. 

&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flash Forward to Today...&lt;/strong&gt;&lt;br/&gt;
The core GWT library from Google doesn&apos;t have a whole lot of widgets, nor do they look
good out-of-the-box.  So early on, we experimented with two alternative implementations
that continue to leverage GWT concepts and tools:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://extjs.com/products/gxt&quot;&gt;GXT&lt;/a&gt;: a GWT version of Ext JS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/smartgwt&quot;&gt;SmartGWT&lt;/a&gt;: a GWT version of SmartClient&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Unfortunately, over the past few months, we&apos;ve found that both of these implementations are too heavy for our requirements, mostly because of the file size of the generated JavaScript code. For example, a feature I wrote generated a 275K *.cache.html file using GXT. After determining that was too slow to give users the initial &quot;pop&quot;, I re-wrote it &lt;em&gt;without&lt;/em&gt; GXT. After a day, we had an application with *.cache.html files of 133K. Yes, that&apos;s over a 50% reduction in size!&lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results#footnote-gxtmvc&quot;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
Because of these findings, we are proceeding with the core GWT library from Google and adding in new components as needed.
It is cool to know you can make a UI &quot;pop&quot; with GWT, as long as you stick to the core - close-to-the-metal - components. For those applications that can afford an initial &quot;loading...&quot; state, I&apos;d definitely recommend looking at GXT and SmartGWT.
&lt;/p&gt;
&lt;p style=&quot;font-size: 90%&quot;&gt;&lt;a name=&quot;footnote-gxtmvc&quot;&gt;*&lt;/a&gt; To make refactoring easier, I copied &lt;a href=&quot;http://raibledesigns.com/rd/entry/gxt_s_mvc_framework&quot;&gt;GXT MVC&lt;/a&gt; into our source tree and modified all imports.&lt;/p&gt;
&lt;p&gt;















</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/my_drunk_on_software_interview</guid>
    <title>My Drunk on Software Interview</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/my_drunk_on_software_interview</link>
        <pubDate>Sun, 5 Apr 2009 22:23:57 -0600</pubDate>
    <category>Java</category>
    <category>sofea</category>
    <category>java</category>
    <category>drunkonsoftware</category>
    <category>ajax</category>
    <category>flex</category>
    <category>interview</category>
            <description>Back in February, I met up with &lt;a href=&quot;http://www.jamesward.com/blog/&quot;&gt;James Ward&lt;/a&gt; and &lt;a href=&quot;http://ectropic.com/wordpress/&quot;&gt;Jon Rose&lt;/a&gt; for a &lt;a href=&quot;http://www.drunkonsoftware.com/2009/04/05/episode-11-matt-raible/&quot;&gt;Drunk on Software interview&lt;/a&gt;. We enjoyed some &lt;a href=&quot;http://www.gordonbiersch.com/restaurants/index.php?pg=beer&quot;&gt;good beer&lt;/a&gt; and had a great conversation about SOFEA, open source and RIA. See larger video &lt;a href=&quot;http://www.drunkonsoftware.com/2009/04/05/episode-11-matt-raible/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;embed src=&quot;//blip.tv/play/AfbqQpHGOw&quot; type=&quot;application/x-shockwave-flash&quot; width=&quot;500&quot; height=&quot;281.25&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/embed&gt; 
&lt;/p&gt;&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ajax_the_state_of_the</guid>
    <title>Ajax: The State of the Art with Dion and Ben</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ajax_the_state_of_the</link>
        <pubDate>Thu, 5 Feb 2009 11:03:10 -0700</pubDate>
    <category>The Web</category>
    <category>frameworks</category>
    <category>firefox</category>
    <category>ben</category>
    <category>bespin</category>
    <category>dion</category>
    <category>canvas</category>
    <category>ajax</category>
    <category>html5</category>
    <category>ajaxian</category>
    <category>opera</category>
    <category>thunderhead</category>
            <description>This morning, I added Dion and Ben&apos;s talk titled &lt;a href=&quot;http://north.webdirections.org/program#ajax-the-state-of-the-art&quot;&gt;Ajax: The State of the Art&lt;/a&gt;. Below are my notes from the event.
&lt;/p&gt;
&lt;p&gt;
Ajax started out as a bunch of hacks. It showed that we could take our web interfaces and do a lot more with them. A hack isn&apos;t necessarily a bad thing. Often, they turn into something much more elegant over time. The new browsers have many amazing capabilities that we haven&apos;t taken advantage of yet. We&apos;ve seen discussions on Ajax go from how to do XHR to frameworks and how rich and mature they are. Dojo is great for Enterprise Development (packing system, namespaces). jQuery is well-suited for lightweight developers (PHP). Prototype is fantastic for people who do a lot of JavaScript development and take it very seriously. 
&lt;/p&gt;
&lt;p&gt;
Today&apos;s Ajax landscape is mature, really rich, and really exciting. Today, Dion and Ben are going to talk about technologies they&apos;re really excited about for the future. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Canvas&lt;/strong&gt;&lt;br/&gt;
The building blocks of the web are text, boxes and images. With canvas, it really makes a lot more things possible. You can do bitmap rendering and image manipulation. They&apos;re showing a slide with Doom and Mario Kart running. Canvas 3D does true 3D rendering. Firefox and Opera have done prototypes of this. Can you do canvas-type things today in a browser? Yes, if you use Flash or Curl. Dion and Ben are excited about canvas over plugins for the following reasons:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No start-up delay&lt;/li&gt;
&lt;li&gt;Available on mobile devices today&lt;/li&gt;
&lt;li&gt;Rendering fidelity with browser (especially important for typography)&lt;/li&gt;
&lt;li&gt;No bridges necessary (no marshalling/unmarshalling)&lt;/li&gt;
&lt;li&gt;Not a plug-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &amp;lt;canvas&amp;gt; tag originally came from Apple&apos;s Dashboard. Dashboard&apos;s programming model was in HTML and JavaScript. Dashboard is using WebKit under the covers. Today, canvas support exists in every major browser except for IE. The good news is there are Flash and Silverlight bridges to add support to IE. There&apos;s also an ActiveX component that wraps the Firefox implementation and allows it to run in IE.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SVG&lt;/strong&gt;&lt;br/&gt;
Dion and Ben aren&apos;t that excited about SVG because it&apos;s such a huge spec. We&apos;ve been struggling with the HTML standard for the last 10 years and the thought of another huge spec for the next 10 years isn&apos;t that appealing.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fast JavaScript&lt;/strong&gt;&lt;br/&gt;
Almost all major browsers have a Fast JavaScript implementation. Chrome has V8, Safari has SquirrelFish Extreme, Firefox has TraceMonkey and Opera has Carakan. This is exciting because of industry trends and how companies are trying to reduce computation cycles in data centers. The more computing that can be put on the client, the better. IE doesn&apos;t have anything, but Dion and Ben believe they are working on something.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web Workers&lt;/strong&gt;&lt;br/&gt;
Interface latency is awful for applications. Jakob Nielsen once said:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
0.1 second is about the limit for having the user feel that the system is reacting instantaneously. 1.0 second is about the limit for the user&apos;s flow of thought to stay uninterrupted, even though the user will notice the delay.&lt;/p&gt;
&lt;p&gt;
Anything that takes longer than a tenth of a second should be pushed to a background thread. Unfortunately, there are no threads in the web. Maybe we can add threads to JavaScript? Brendan Eich has said that &quot;Threads suck&quot; and there&apos;s very little chance for threads getting into JavaScript. Gears brought Worker Pools and this is going into HTML 5 as Web Workers. You could also use Java applets to do this. With the latest Java Plugin, many of applets&apos; long-standing issues have been solved.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Desktop Integration&lt;/strong&gt;&lt;br/&gt;
The ability to build desktop apps as web apps is very exciting. There&apos;s a few technologies that demonstrate this: Fluid, Mozilla Prism, Adobe AIR, Appcelerator Titanium and Gears. The Palm Pre demonstrates the logical extension of this. The Palm Pre uses the web stack as its developer SDK. It&apos;s very cool that web developers don&apos;t have to learn anything new to become a Palm developer. Desktop integration is exciting especially if we can access desktop applications like email and address book. 
&lt;/p&gt;
&lt;p&gt;
The Ajax frameworks that are out there have done a lot to make web development simpler. However, there&apos;s still a lot of pain with CSS and cross-browser issues. What if you took canvas and combined it with a sophisticated grid-based layout in JavaScript? 
&lt;/p&gt;
&lt;p&gt;
There&apos;s a lot of platforms out there: Microsoft Silverlight, Adobe Flash, Apple Cocoa and Sun&apos;s JavaFX. The web often isn&apos;t considered a platform. Dion and Ben believe there should be an &lt;em&gt;Open Web Platform&lt;/em&gt;. The problem right now is there is no central location to find out how to get stuff done. You have to search and find resources from many different locations. Mozilla is putting it&apos;s resources into creating an Open Web Platform. This site will consist of 4 different areas:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Home&lt;/li&gt;
&lt;li&gt;Documentation (for different frameworks, browsers, quirks)&lt;/li&gt;
&lt;li&gt;Dashboard (state of the open web)&lt;/li&gt;
&lt;li&gt;Roadmap (what&apos;s going on)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
This is not just Mozilla, it&apos;s very much a community effort. This is something that Ben and Dion have been working on. But there&apos;s something else they&apos;ve been working on too. They&apos;ve been talking about all these cool things, but what about an interesting application to test all these technologies?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Bespin&lt;/strong&gt;&lt;br/&gt;
As they looked at code editors, most of them provide awful user experiences. Bespin is the Editor of Your Dreams and contains the following features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessible from anywhere - any device in any location&lt;/li&gt;
&lt;li&gt;Simple to use, like Textmate (not heavyweight like Eclipse) - an editor, not an IDE&lt;/li&gt;
&lt;li&gt;Wicked Fast - performance, performance, performance&lt;/li&gt;
&lt;li&gt;Rock-solid real-time collaboration, like SubEthaEdit - it just works&lt;/li&gt;
&lt;li&gt;Integrated command-line, like vi - Fun like Quicksilver, social like Ubiquity&lt;/li&gt;
&lt;li&gt;&quot;Self-hosted&quot; environment, like Emacs - For extreme extensibility, but with JavaScript!&lt;/li&gt;
&lt;/ul&gt;
Dion and Ben are showed a screen shot of Bespin and now they&apos;re doing a demo. The core editor has what you&apos;d expect with syntax highlighting and line numbers. Canvas doesn&apos;t have text-selection by default, so they had to write it from scratch. The command line allows you to get help, run core command and also to subscribe to commands that others write. You can change your keybindings to emacs or vi as well as many other settings. Much of Bespin is event-driven, so you can easily plugin new behavior for different events. 
&lt;/p&gt;
&lt;p&gt;
For viewing files, they couldn&apos;t bring themselves to use a tree. Instead, they developed a file-browsing interface that looks very much like Apple&apos;s Finder. Personally, I like Finder, but wish it had Windows Explorer&apos;s path bar that allows you to simply type in the path without mouse clicks. Back to the command line. They&apos;ve done a lot to make things more discoverable so users can easily find the power of the editor.
&lt;/p&gt;
&lt;p&gt;
Bespin could be used to engage developers more with open source projects. Checking out projects, modifying code and creating patches can be a real pain. Bespin could be used to interface with open source projects in the cloud. You could login, modify code and easily patch/build with the click of a button. One other thing they want to do is to have the server do code-analysis as you&apos;re developing.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Is it OK to love a software tool? You &lt;em&gt;must&lt;/em&gt; love your software tools. What we do as Software Developers is one of the most difficult jobs on the planet. Programmers, like poets, start with a blank slate and create something from nothing. If you don&apos;t love your tools, you&apos;ll start resenting what you do. If you don&apos;t love your tools, it shows in your work. &lt;em&gt;-- Dave Thomas at RubyConf08&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Thunderhead&lt;/strong&gt;&lt;br/&gt;
A GUI Toolkit written with canvas and JavaScript. Allows you to do layouts with very little thought. It&apos;s a lab experiment that&apos;s in progress, stay tuned for more information.
&lt;p&gt;
All users care about is the user interface. Dion and Ben believe there&apos;s a key to creating compelling user experiences. It all has to do with &lt;em&gt;managing expectations&lt;/em&gt;. 
It&apos;s not that different from how you manage relationships in your life. Expectations for movies and games have changes drastically over the years. What used to be the web (animated gifs and awful web pages) has also changed drastically (video of Apple&apos;s online store). What was cool with MapQuest got changed drastically with Google Maps. What we have today isn&apos;t the end of the game - expectations will continue to change. However, users have different expectations for software. 
&lt;/p&gt;
&lt;p&gt;
Alan Cooper has done some interesting work in this area. The software designer needs to focus in on a user&apos;s goals. There are basic things you can apply to all users, for instance &quot;sex sells&quot;. An example of this is Delicious Library. This application allows you to keep track of things in your home such as books, movies, music and games. They made $500K in 3 months and made $54K the first day, with no advertising. 
&lt;/p&gt;
&lt;p&gt;
The quality of any software is determined by the interaction. If the interaction isn&apos;t good, it will poison the entire experience. Donald Norman has a good quote: &quot;Attractive things work better&quot;. In society, this is often called &quot;Dress for Success&quot;. 
&lt;/p&gt;
&lt;p&gt;
The Open Web is hear to stay because it has:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Easy Programming Model&lt;/li&gt;
&lt;li&gt;Easy Remoting&lt;/li&gt;
&lt;li&gt;Extensive Customization Vectors (e.g. GreaseMonkey)&lt;/li&gt;
&lt;li&gt;Easy Deployment&lt;/li&gt;
&lt;li&gt;Great Widgets&lt;/li&gt;
&lt;li&gt;Great Visual Effects&lt;/li&gt;
&lt;li&gt;Great Mobile Story&lt;/li&gt;
&lt;li&gt;Desktop Integration&lt;/li&gt;
&lt;li&gt;State-of-the-Art Plug-ins&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Bespin is a tech preview that they hope to release next week. Thunderhead will be released at the same time.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
This was a great talk and easily the most inspiring of the conference. Dion and Ben always do a great job and the sexiness of their presentation made it all the more appealing. </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/choosing_an_ajax_framework</guid>
    <title>Choosing an Ajax Framework</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/choosing_an_ajax_framework</link>
        <pubDate>Thu, 8 Jan 2009 21:36:22 -0700</pubDate>
    <category>Java</category>
    <category>comparison</category>
    <category>extjs</category>
    <category>gwt</category>
    <category>webframeworks</category>
    <category>dojo</category>
    <category>ajax</category>
    <category>yui</category>
    <category>frameworks</category>
            <description>This past week, my colleagues and I have been researching Ajax Frameworks. We&apos;re working on a project that&apos;s following SOFEA-style architecture principles and we want the best framework for our needs. I&apos;m writing this post to see 1) if you, the community, agree with our selection process and 2) to learn about your experiences with the frameworks we&apos;re evaluating. Below is the process we&apos;re following to make our choice.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose a short list of frameworks to prototype with.&lt;/li&gt;
&lt;li&gt;Create an application prototype with each framework.&lt;/li&gt;
&lt;li&gt;Document findings and create a matrix with important criteria.&lt;/li&gt;
&lt;li&gt;Create presentation to summarize document.&lt;/li&gt;
&lt;li&gt;Deliver document, presentation (with demos) and recommendation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For #1, we chose  &lt;a href=&quot;http://extjs.com/products/extjs/&quot;&gt;Ext JS&lt;/a&gt;, &lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;Dojo&lt;/a&gt;, &lt;a href=&quot;http://developer.yahoo.com/yui/&quot;&gt;YUI&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/intl/nl/webtoolkit/&quot;&gt;GWT&lt;/a&gt; because we feel these Ajax libraries offer the most UI widgets. We also considered Prototype/Scriptaculous, jQuery and MooTools, but decided against them because of their lack of UI widgets.&lt;/p&gt;
&lt;p&gt;For #2, we time-boxed ourselves to 3 days of development. In addition to basic functionality, we added several features (i.e. edit in place, drag and drop, calendar widgets, transitions, charts, grid) that might be used in the production application. We all were able to complete most of the functionality of the application. Of course, there&apos;s still some code cleanup as well as styling to make each app look good for the demo. The nice thing about doing this is we&apos;re able to look at each others code and see how the same thing is done in each framework. None of us are experts in any of the frameworks, so it&apos;s possible we could do things better. However, I think it&apos;s good we all started somewhat green because it shows what&apos;s possible for someone relatively new to the frameworks.&lt;/p&gt;
&lt;p&gt;For #3, we&apos;re creating a document with the following outline:&lt;/p&gt;
&lt;pre style=&quot;font-family: inherit; background: #CDFFCC; border: 1px solid #54FF52; width: 250px; padding-left: 20px&quot;&gt;
Introduction

Ajax Framework Candidates
(intro and explanation)

  Project Information
  (history)
  (license / cost)
  (number of committers)
  (support options)
  (mailing list traffic (nov/dec 2008))

Matrix and Notes

Conclusion
&lt;/pre&gt;
&lt;p&gt;For the Matrix referenced in the outline above, we&apos;re using a table with weights and ranks:&lt;/p&gt;

&lt;table class=&quot;comparison&quot; style=&quot;width: 500px&quot;&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;Weight&lt;/th&gt;
        &lt;th&gt;Criteria&lt;/th&gt;
        &lt;th&gt;Dojo&lt;/th&gt;
        &lt;th&gt;YUI&lt;/th&gt;
        &lt;th&gt;GWT&lt;/th&gt;
        &lt;th style=&quot;white-space: nowrap&quot;&gt;Ext JS&lt;/th&gt;
        &lt;th&gt;Notes&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;#&lt;/td&gt;
        &lt;td&gt;Important Criteria for Customer&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;0..1&lt;/td&gt;
        &lt;td&gt;Notes about rankings&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Our strategy for filling in this matrix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer adjusts the weight for each criteria (removing/adding as needed) so all weights add up to 1.&lt;/li&gt;
&lt;li&gt;We rank each framework with 0, .5 or 1 where 0 = doesn&apos;t satisfy criteria, .5 = partially satisfies, 1 = satisfies.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The list of criteria provided to us by our client is as follows (in no particular order).&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Quality of Documentation/Tutorials/Self Help&lt;/li&gt;
&lt;li&gt;Browser support (most important browsers/versions based on web stats)&lt;/li&gt;
&lt;li&gt;Testability (esp. Selenium compatibility)&lt;/li&gt;
&lt;li&gt;Licensing&lt;/li&gt;
&lt;li&gt;Project health/adoption&lt;/li&gt;
&lt;li&gt;Performance&lt;/li&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Flexibility/extensibility&lt;/li&gt;
&lt;li&gt;Productivity (app dev, web dev)&lt;/li&gt;
&lt;li&gt;Richness of widget/component library&lt;/li&gt;
&lt;li&gt;Charting capability&lt;/li&gt;
&lt;li&gt;Ability to create new widgets&lt;/li&gt;
&lt;li&gt;Match to existing Java team skill-set&lt;/li&gt;
&lt;li&gt;Ease of deployment (on Ops, QA, Users)&lt;/li&gt;
&lt;li&gt;Degree of risk generally&lt;/li&gt;
&lt;li&gt;Ability to integrate with existing site (which includes Prototype)&lt;/li&gt;
&lt;li&gt;Easy to style with CSS&lt;/li&gt;
&lt;li&gt;Validation (esp. marking form elements invalid)&lt;/li&gt;
&lt;li&gt;Component Theme-ing/Decoration&lt;/li&gt;
&lt;li&gt;CDN Availability (i.e. Google&apos;s Ajax Libraries API or Ext CDN)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What do you think? How could this process be improved? Of course, if you have framework answers (0, .5 or 1) for our matrix, we&apos;d love to hear your opinions.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/colorado_software_summit_2008_wrapup</guid>
    <title>Colorado Software Summit 2008 Wrapup</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/colorado_software_summit_2008_wrapup</link>
        <pubDate>Tue, 28 Oct 2008 23:03:23 -0600</pubDate>
    <category>Java</category>
    <category>ajax</category>
    <category>maven</category>
    <category>softwaresummit</category>
    <category>spring</category>
    <category>rest</category>
    <category>java</category>
    <category>appcelerator</category>
    <category>camel</category>
            <description>&lt;a title=&quot;Snowman in Keystone&quot; href=&quot;http://blog.linkedin.com/blog/2008/10/colorado-softwa.html&quot;&gt;&lt;img alt=&quot;Snowman in Keystone&quot; src=&quot;//farm4.static.flickr.com/3057/2980923121_f44dd0dc42_t.jpg&quot; class=&quot;picture&quot; height=&quot;75&quot; width=&quot;100&quot;&gt;&lt;/a&gt;

Last week, I attended the Colorado Software Summit in Keystone and had a great time. Not only was the weather beautiful and the food delicious, the sessions I attended were awesome. If you ever get a chance to go to this conference, I highly recommend it. It&apos;s like being on vacation and learning with a bunch of old friends.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.linkedin.com/in/yan&quot;&gt;Yan Pujante&lt;/a&gt; also attended this conference and documents his experience, photography and presentations in &lt;a href=&quot;http://blog.linkedin.com/blog/2008/10/colorado-softwa.html&quot;&gt;Colorado Software Summit 2008&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;Below is a list of my entries for all the sessions I attended.&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/building_linkedin_s_next_generation&quot;&gt;Building LinkedIn&apos;s Next Generation Architecture with OSGi by Yan Pujante&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/comprehensive_project_intelligence_with_jason&quot;&gt;Comprehensive Project Intelligence with Jason van Zyl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/what_s_coming_in_spring&quot;&gt;What&apos;s Coming in Spring 3.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/applying_flash_to_java_flex&quot;&gt;Applying Flash to Java: Flex and OpenLaszlo with Dustin Marx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/building_rich_applications_with_appcelerator&quot;&gt;Building Rich Applications with Appcelerator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/taking_apache_camel_for_a&quot;&gt;Taking Apache Camel for a Ride with Bruce Snyder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/core_animation_with_bill_dudney&quot;&gt;Core Animation with Bill Dudney&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/restful_web_applications_with_subbu&quot;&gt;RESTful Web Applications with Subbu Allamaraju&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;For next year, I think the conference should shorten its sessions (from 90 to 60 minutes), invite more speakers and cut the price in half (to $999 per person). How do you think the Software Summit could be improved?</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appcelerator_with_matt_quinlan</guid>
    <title>Appcelerator with Matt Quinlan</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appcelerator_with_matt_quinlan</link>
        <pubDate>Tue, 7 Oct 2008 19:08:19 -0600</pubDate>
    <category>Open Source</category>
    <category>appcelerator</category>
    <category>soa</category>
    <category>ajax</category>
    <category>ria</category>
    <category>javascript</category>
    <category>opensource</category>
    <category>ruby</category>
    <category>java</category>
            <description>This evening I attended the Denver Open Source User Group meeting where the Basic Concepts talk was on &lt;a href=&quot;http://appcelerator.org&quot;&gt;Appcelerator&lt;/a&gt;. Matt Quinlan (&lt;a href=&quot;http://twitter.com/MattQuinlan&quot;&gt;Twitter&lt;/a&gt;, &lt;a href=&quot;http://MattQuinlan.com&quot;&gt;Blog&lt;/a&gt;, &lt;a href=&quot;http://www.linkedin.com/in/mattquinlan&quot;&gt;LinkedIn&lt;/a&gt;) was the presenter. I arrived 10 minutes late, so I didn&apos;t hear any of the intro stuff. Below are my notes from the event.
&lt;/p&gt;
&lt;p&gt;The Appcelerator developers liked the &quot;onclick&quot; syntax, but found it was too limited to do everything they wanted. Rather than &lt;em&gt;onclick&lt;/em&gt;, they use an &lt;em&gt;on&lt;/em&gt; attribute. For example:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div on=&quot;click then l:show.box&quot;&gt;
Click me
&amp;lt;div&gt;
&lt;/pre&gt;
&lt;p&gt;&quot;DOM Manipulation is JavaScript cruft.&quot; 
&lt;/p&gt;
&lt;p&gt;Appcelerator allows you to implement the Observer pattern in the browser. In addition to allowing DOM elements to subscribe to messages, server-side objects (in any language) can subscribe as well. In Appcelerator syntax &quot;l:&quot; means local and &quot;r:&quot; means remote. The messages that are passed to the server are JSON and have payloads. JSON is more popular than XML because you can eval() it and create JavaScript objects from it. Appcelerator allows you to do &lt;em&gt;Declarative Ajax&lt;/em&gt;. On the server-side, you can annotation Java and C# classes with @Service to subscribe to messages. In other languages (i.e. PHP), Javadoc-style comments are used.&lt;/p&gt;
&lt;p&gt;Tagline: The seamless fusion of RIA and SOA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web Expression Language&lt;/strong&gt;&lt;br/&gt;
Goal is to eliminate 90% of the JavaScript you write. Example syntax:
&lt;/p&gt;
&lt;pre&gt;
on=&quot;[condition] then [action]&quot;
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Conditions&lt;/em&gt; include DOM events (click, focus, blur, change, mouse events), key events (up, down, press), other (history, drag/drop, selected, resize, iPhone orient, sortXYZ), subscribe to custom message. &lt;em&gt;Actions&lt;/em&gt; include Scriptaculous effects (show/hide, fade, move, drop, grow), set element value (static, dynamic, bind), set CSS class or attribute, execute custom JavaScript, publish custom message.&lt;/p&gt;
&lt;p&gt;Now Matt is doing a demo on &lt;a href=&quot;http://try.appcelerator.org&quot;&gt;http://try.appcelerator.org&lt;/a&gt;. This site consists of a form that allows you to type in Appcelerator code and run it. 3 attributes can be added to any tag: draggable, droppable and resizeable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Client-Side&lt;/strong&gt;&lt;br/&gt;
Add simple tags to your HTML to inject RIA widgets. Add single property to existing HTML elements for dynamic behavior. Eclipse Plugin built on Aptana, but is generally targeted towards web developers moreso than business analysts (no drag and drop of widgets).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server-Side&lt;/strong&gt;&lt;br/&gt;
Server-side development done with your IDE of choices. Based on your server-side tehchnology platform. Easily create services using annotations.&lt;/p&gt;
&lt;P&gt;&lt;strong&gt;App Command&lt;/strong&gt;&lt;br/&gt;
The &lt;em&gt;app&lt;/em&gt; command is similar to Rails&apos; GEM command. Allows you to build scaffolding and deploy to cloud (AppEngine, Amazon S3). It also allows you to pulldown components from the main server and auto-updating.&lt;/p&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://apptunes.appspot.com&quot;&gt;appTunes&lt;/a&gt;: widget that wraps Flex &lt;a href=&quot;http://en.wikipedia.org/wiki/Cover_Flow&quot;&gt;Cover Flow&lt;/a&gt; widget&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://snapshot.appcelerator.org&quot;&gt;Snapshot&lt;/a&gt;: photo editing application&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://radiojavan.com&quot;&gt;Radio Javan&lt;/a&gt;: Persian music online&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://skyblox.com&quot;&gt;SkyBlox&lt;/a&gt;: wireless company&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Appcelerator allows you to create prototypes easily by using a JavaScript file with mocks for the server-side objects. In the next version, you can &quot;annotate&quot; the UI and allow end-users to Ctrl+Click on elements and add feedback. For an example of this, see &lt;a href=&quot;http://dev.appcelerator.com/pearson&quot;&gt;http://dev.appcelerator.com/pearson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When starting with Appcelerator, you can start by crawling (including appcelerator.js for widgets) then move to walking (decouple server-side and client-side) and finally running (developing working prototypes with mocks for server-side).
&lt;/p&gt;
&lt;p&gt;

&quot;Let&apos;s face it, ASP, JSP, PHP and Ruby are just lipstick on CGI.&quot;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ajaxified_body_now_with_back</guid>
    <title>Ajaxified Body: Now with Back Button and Bookmarking Support</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ajaxified_body_now_with_back</link>
        <pubDate>Tue, 7 Oct 2008 00:14:00 -0600</pubDate>
    <category>Java</category>
    <category>rsh</category>
    <category>ajax</category>
    <category>ajaxifiedbody</category>
    <category>prototype</category>
    <category>appfuselight</category>
            <description>I uploaded a new version of &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body&quot;&gt;Ajaxified Body&lt;/a&gt; to its &lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody/&quot;&gt;demo site&lt;/a&gt; a few minutes ago. Changelog:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Added RSH for history and bookmarking and changed to use Prototype and Scriptaculous from Google&apos;s CDN.
&lt;/p&gt;
&lt;p&gt;I found &lt;a href=&quot;http://code.google.com/p/reallysimplehistory/&quot;&gt;Really Simple History&lt;/a&gt; easy to use but poorly documented. Brad Neuberg&apos;s &lt;a href=&quot;http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html&quot;&gt;AJAX: How to Handle Bookmarks and Back Buttons&lt;/a&gt; article was the one that got me over the learning curve. Hat tip to &lt;a href=&quot;http://icoloma.blogspot.com/&quot;&gt;Ignacio&lt;/a&gt; for the &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body#comment-1223322485000&quot;&gt;RSH suggestion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Let me know if you see any issues or have suggestions for improvement.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ajaxified_body</guid>
    <title>Ajaxified Body</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ajaxified_body</link>
        <pubDate>Fri, 3 Oct 2008 14:33:09 -0600</pubDate>
    <category>Java</category>
    <category>appfuselight</category>
    <category>sitemesh</category>
    <category>ajax</category>
    <category>appfuse</category>
            <description>I&apos;ve often wondered if it was possible to use Ajax to reload the main content of a web application without reloading the header, menu and footer. &lt;a href=&quot;http://www.opensymphony.com/sitemesh&quot;&gt;SiteMesh&lt;/a&gt; allows you to move these common elements to a &lt;em&gt;decorator&lt;/em&gt; that gets wrapped around each page. Below is a diagram of how SiteMesh works.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3276/2908373749_1ce4581bba_o.png&quot; title=&quot;SiteMesh&quot; rel=&quot;lightbox[ajaxifiedbody]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3276/2908373749_fff90b124b.jpg&quot; width=&quot;500&quot; height=&quot;344&quot; alt=&quot;SiteMesh&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You can read the &lt;a href=&quot;http://today.java.net/pub/a/today/2004/03/11/sitemesh.html&quot;&gt;Introduction to SiteMesh&lt;/a&gt; article if you&apos;re interested in learning more about SiteMesh&apos;s basic features. By default, SiteMesh decorates &lt;code&gt;text/html&lt;/code&gt; responses and ignores any other content type (e.g. &lt;code&gt;image/gif&lt;/code&gt;). It also contains an &amp;lt;excludes&gt; configuration element that allows you to turn off decoration when a URL matches a certain pattern. For example, the following allows you to disable decoration when &quot;ajax=true&quot; is passed in the URL.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;excludes&amp;gt;
    &amp;lt;pattern&amp;gt;**ajax=true&amp;lt;/pattern&amp;gt;
&amp;lt;/excludes&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
To optimize the loading of an application so the common elements aren&apos;t loaded for each page, it should be possible to create an &lt;strong&gt;Ajaxified Body&lt;/strong&gt; where the primary content area (PCA) of the site is loaded via Ajax rather than refreshing the whole page. The header, footer and navigation bar often stays the same from page-to-page, so it doesn&apos;t seem to make a whole lot of sense to load them each time the page loads. The image below shows the PCA (of an AppFuse Light application) as a grey square with a red border.
&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-bottom: 0&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3107/2909207040_f661f9e60e_o.png&quot; title=&quot;Ajaxified Body - AppFuse Light&quot; rel=&quot;lightbox[ajaxifiedbody]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3107/2909207040_46c379c0ae.jpg&quot; width=&quot;500&quot; height=&quot;432&quot; alt=&quot;Ajaxified Body - AppFuse Light&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Implementing an &lt;strong&gt;Ajaxified Body&lt;/strong&gt; consists of the following steps:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Adding SiteMesh and moving common elements to a decorator.&lt;/li&gt;
&lt;li&gt;Remove common elements from each individual page (if you&apos;re using includes).&lt;/li&gt;
&lt;li&gt;Configure SiteMesh so decoration is disabled when the requested URL contains &quot;ajax=true&quot;.&lt;/li&gt;
&lt;li&gt;Write JavaScript that modifies all &amp;lt;a href=&quot;&quot;&gt; links (and buttons with onclick=&apos;location.href&apos;) in the PCA to have an onclick handler.&lt;/li&gt;
&lt;li&gt;The onclick handler should call a JavaScript function that loads the link&apos;s URL + ajax=true using XMLHttpRequest (XHR).&lt;/li&gt;
&lt;li&gt;Add XHR success handling to replace the PCA with the loaded content.&lt;/li&gt;
&lt;li&gt;Add XHR error handling to go to the URL normally when response.status != 200.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;title&gt; element and replace document.title if exists.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;head&gt; element and append to current &lt;head&gt; if exists.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;script&gt; and &amp;lt;link&gt; elements (JavaScript and CSS) and evaluate them if they exist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
As a proof of concept, I created a prototype using &lt;a href=&quot;https://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; (Prototype/Scriptaculous for Ajax). You can see a demo at the following URL. You can also &lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody/ajaxifiedbody.patch&quot;&gt;download a patch&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody/ajaxifiedbody-1.0.zip&quot;&gt;the source&lt;/a&gt; for this project. &lt;/p&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;
&lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody&quot;&gt;http://demo.raibledesigns.com/ajaxifiedbody&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Below are a number of things I discovered while writing this prototype:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;The hardest part of implementing this seems to be coding the exceptions. It&apos;s possible you&apos;ll have some links with existing onclick handlers and you may have to disable &quot;ajaxifying links&quot; for those links.&lt;/li&gt;
&lt;li&gt;A progress indicator is important or the page might load so fast that the user doesn&apos;t visually detect it changed. This can lead to a worse user experience because they don&apos;t see the flash of the blank page they&apos;re used to when a page load occurs.&lt;/li&gt;
&lt;li&gt;While forms can be submitted via Ajax, there&apos;s no harm in leaving existing form behavior in place where the full site is reloaded after submitting a form.&lt;/li&gt;
&lt;li&gt;If a particular page needs to change the common elements (header, menu, footer), it should be possible to do that with JavaScript after the PCA content loads.&lt;/li&gt;
&lt;li&gt;If the success/error indicator is outside the PCA, it may need to be populated and displayed/hidden with JavaScript after the PCA loads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;m sure my implementation can be improved, but I&apos;m also curious to see what you think of this idea. I know it&apos;s not revolutionary, but it&apos;s something I&apos;m considering adding by default to AppFuse and AppFuse Light. Do any Ajax frameworks do something like this out-of-the-box?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to everyone for the great feedback - keep it coming. I agree that adding history support is a must. I&apos;ll try to do that in the next day or two. This post has also been featured on &lt;a href=&quot;http://java.dzone.com/news/ajaxified-body&quot;&gt;Javalobby&lt;/a&gt; and &lt;a href=&quot;http://ajaxian.com/archives/ajaxified-body-when-to-refresh-the-page&quot;&gt;Ajaxian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body_now_with_back&quot;&gt;Added history support&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_2</guid>
    <title>AppFuse Light 1.8.2 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_2</link>
        <pubDate>Sun, 11 May 2008 22:16:17 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>wicket</category>
    <category>jdo</category>
    <category>hibernate</category>
    <category>springmvc</category>
    <category>freemarker</category>
    <category>springjdbc</category>
    <category>struts</category>
    <category>velocity</category>
    <category>ibatis</category>
    <category>css</category>
    <category>stripes</category>
    <category>myfaces</category>
    <category>acegi</category>
    <category>jpox</category>
    <category>ojb</category>
    <category>ajax</category>
    <category>jsp</category>
            <description>AppFuse Light 1.8.2 is a bug fixes release that includes upgrades for Spring, Spring Security, Hibernate, Wicket, Tapestry and many others. In addition, Spring bean definitions were replaced with annotations (@Repository, @Service and @Controller). See the &lt;a href=&quot;http://tinyurl.com/6m5kjx&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_1&quot;&gt;last release&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=9159&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ext_js_tag_library</guid>
    <title>Ext JS Tag Library</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ext_js_tag_library</link>
        <pubDate>Tue, 22 Jan 2008 10:01:27 -0700</pubDate>
    <category>Java</category>
    <category>extjs</category>
    <category>javascript</category>
    <category>ajax</category>
            <description>James Carr in &lt;a href=&quot;http://blog.james-carr.org/2008/01/22/making-extjs-more-accessible-to-java-developers/&quot;&gt;Making extJS More Accessible to Java Developers&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
With my recent interest in extjs, I was playing with the idea of making a Struts2/WebWork component library or a tag library to handle a lot of the boilerplate extjs code (i.e. creating layouts and such) but, luckily, discovered someone beat me to the punch!
&lt;br/&gt;&lt;br/&gt;
I randomly came across &lt;a href=&quot;http://www.exttld.com/&quot;&gt;ExtTLD&lt;/a&gt; this morning while sifting through my rss feeds, and I must say I am rather impressed. Although I consider myself a pretty good javascript developer, there seems to be a lot of java developers who aren?t that hot at javascript... which is why whenever I attend any java related conference there is always several sessions touting &quot;javascript free ajax!&quot; frameworks like GWT, Ajax4JSF, or IceFaces. Although I&apos;ve always been skeptical of such frameworks, I do see their benefits... especially for the java developer who excels at serverside JEE development but generally sucks when it comes to adding javascript behavior to the presentation layer.
&lt;/p&gt;
&lt;p&gt;I can definitely see how Ajax-with-IDE-code-completion would appeal to many developers. However, I do have to agree with James:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
So far it looks good, but I haven&apos;t had a chance to play with it yet. Basically, I&apos;ll have to see if it passes my &quot;good javascript generator framework&quot; test. I?m a pretty staunch advocate of unobtrusive javascript, and generally hate any presentation layer framework that seeks to dump several hundred (or thousand) lines of javascript inline in the html document.
&lt;/p&gt;
&lt;p&gt;For development shops that have UI-only developers for the front-end and Java developers for the controller/validation part of an application, frameworks that generate JavaScript usually don&apos;t make sense.
&lt;/p&gt;
&lt;p&gt;ExtTLD&apos;s &lt;a href=&quot;http://code.google.com/p/exttld/&quot;&gt;license&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
ExtTLD is published under GPL 3.0 license however restricts use by companies participating in animal abuse, such as animal testing laboratories etc.&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_1</guid>
    <title>AppFuse Light 1.8.1 Released: includes upgrades to Spring 2.5 and Wicket 1.3</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_1</link>
        <pubDate>Thu, 29 Nov 2007 09:28:06 -0700</pubDate>
    <category>Java</category>
    <category>freemarker</category>
    <category>jdo</category>
    <category>struts</category>
    <category>hibernate</category>
    <category>appfuse</category>
    <category>springmvc</category>
    <category>wicket</category>
    <category>springjdbc</category>
    <category>velocity</category>
    <category>ajax</category>
    <category>jsp</category>
    <category>stripes</category>
    <category>css</category>
    <category>jpox</category>
    <category>myfaces</category>
    <category>ojb</category>
    <category>ibatis</category>
    <category>acegi</category>
            <description>&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; 1.8.1 is a bug fixes release that includes an upgrade to Spring 2.5 and Wicket 1.3 RC1. See the &lt;a href=&quot;http://tinyurl.com/2r4fd8&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_released&quot;&gt;last release&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse Light? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuselight&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuselight&quot;&gt;
&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; is a lightweight version of &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;.
        I was inspired to create it while writing &lt;a href=&quot;http://springlive.com&quot;&gt;Spring Live&lt;/a&gt; and 
        looking at the &lt;em&gt;struts-blank&lt;/em&gt; and &lt;em&gt;webapp-minimal&lt;/em&gt; 
        applications that ship with Struts and Spring, respectively.
        These &quot;starter&quot; apps were not robust enough for me, and I wanted 
        something like AppFuse, only simpler. 
&lt;br/&gt;&lt;br/&gt;
AppFuse Light is designed to show Java Web Developers how to start
        a bare-bones webapp using a &lt;a href=&quot;http://www.springframework.org&quot;&gt;
        Spring&lt;/a&gt;-managed middle-tier backend and &lt;a href=&quot;http://www.hibernate.org&quot;&gt;
        Hibernate&lt;/a&gt; for persistence. By default, AppFuse Light uses Spring for
        its MVC framework, but you can change it to 
        &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;JSF/MyFaces&lt;/a&gt;,
        &lt;a href=&quot;http://mc4j.org/confluence/display/stripes/Home&quot;&gt;Stripes&lt;/a&gt;,
        &lt;a href=&quot;http://struts.apache.org&quot;&gt;Struts 1.x&lt;/a&gt;, 
        &lt;a href=&quot;http://struts.apache.org/2.x/&quot;&gt;Struts 2.x&lt;/a&gt;,
        &lt;a href=&quot;http://opensymphony.com/webwork&quot;&gt;WebWork&lt;/a&gt;, 
        &lt;a href=&quot;http://tapestry.apache.org&quot;&gt;Tapestry&lt;/a&gt; or
        &lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Wicket&lt;/a&gt;. In addition, there&apos;s a
        number of extras for Spring MVC, including &lt;a href=&quot;http://velocity.apache.org&quot;&gt;Velocity&lt;/a&gt; and &lt;a href=&quot;http://freemarker.org&quot;&gt;FreeMarker&lt;/a&gt; versions, Ajax
        support and &lt;a href=&quot;http://acegisecurity.org&quot;&gt;Acegi Security&lt;/a&gt; support.
&lt;br/&gt;&lt;br/&gt;
This project was formerly named &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1&quot;&gt;Equinox&lt;/a&gt; and has been under development since April 2004.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=8439&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you&apos;re a developer of one of the frameworks that AppFuse Light uses - I&apos;d love a code review to make sure I&apos;m &quot;up to snuff&quot; on how to use your framework. I&apos;m also more than willing to give commit rights if you&apos;d like to improve the implementation of your framework.
&lt;/p&gt;
&lt;p&gt;Live demos are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;MyFaces + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What&apos;s on tap for AppFuse Light 2.0? Here&apos;s what I&apos;m hoping to do:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drop the seldom-used persistence frameworks: JDBC, JDO and OJB.&lt;/li&gt;
&lt;li&gt;Drop Struts 1.x and WebWork as web frameworks (replaced by Struts 2).&lt;/li&gt;
&lt;li&gt;Support the same persistence frameworks as AppFuse: Hibernate,
iBATIS and JPA.&lt;/li&gt;
&lt;li&gt;Re-use appfuse-service, appfuse-hibernate, appfuse-ibatis and
appfuse-jpa in AppFuse Light. I&apos;ll likely include the core classes
(User, Role) since AppFuse Light is more &quot;raw&quot; than AppFuse.&lt;/li&gt;
&lt;li&gt;Require Java 5.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me know if you disagree with any of these items or would like to see other enhancements.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_released</guid>
    <title>AppFuse Light 1.8 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_released</link>
        <pubDate>Fri, 14 Sep 2007 11:01:46 -0600</pubDate>
    <category>Java</category>
    <category>struts</category>
    <category>stripes</category>
    <category>acegi</category>
    <category>ibatis</category>
    <category>jpox</category>
    <category>ajax</category>
    <category>springjdbc</category>
    <category>myfaces</category>
    <category>jsp</category>
    <category>ojb</category>
    <category>wicket</category>
    <category>hibernate</category>
    <category>jdo</category>
    <category>freemarker</category>
    <category>springmvc</category>
    <category>appfuse</category>
    <category>css</category>
    <category>velocity</category>
            <description>&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; 1.8 adds CSS Framework integration, as well as support
for Stripes (1.4.2) and Wicket (1.2.6). It also has significant upgrades for JSF and Tapestry; to versions 1.2 and 4.1.3 respectively. See the &lt;a href=&quot;http://tinyurl.com/3xuygc&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_beta&quot;&gt;the beta release of 1.8&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse Light? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuselight&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuselight&quot;&gt;
&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; is a lightweight version of &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;.
        I was inspired to create it while writing &lt;a href=&quot;http://springlive.com&quot;&gt;Spring Live&lt;/a&gt; and 
        looking at the &lt;em&gt;struts-blank&lt;/em&gt; and &lt;em&gt;webapp-minimal&lt;/em&gt; 
        applications that ship with Struts and Spring, respectively.
        These &quot;starter&quot; apps were not robust enough for me, and I wanted 
        something like AppFuse, only simpler. 
&lt;br/&gt;&lt;br/&gt;
AppFuse Light is designed to show Java Web Developers how to start
        a bare-bones webapp using a &lt;a href=&quot;http://www.springframework.org&quot;&gt;
        Spring&lt;/a&gt;-managed middle-tier backend and &lt;a href=&quot;http://www.hibernate.org&quot;&gt;
        Hibernate&lt;/a&gt; for persistence. By default, AppFuse Light uses Spring for
        its MVC framework, but you can change it to 
        &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;JSF/MyFaces&lt;/a&gt;,
        &lt;a href=&quot;http://mc4j.org/confluence/display/stripes/Home&quot;&gt;Stripes&lt;/a&gt;,
        &lt;a href=&quot;http://struts.apache.org&quot;&gt;Struts 1.x&lt;/a&gt;, 
        &lt;a href=&quot;http://struts.apache.org/2.x/&quot;&gt;Struts 2.x&lt;/a&gt;,
        &lt;a href=&quot;http://opensymphony.com/webwork&quot;&gt;WebWork&lt;/a&gt;, 
        &lt;a href=&quot;http://tapestry.apache.org&quot;&gt;Tapestry&lt;/a&gt; or
        &lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Wicket&lt;/a&gt;. In addition, there&apos;s a
        number of extras for Spring MVC, including &lt;a href=&quot;http://velocity.apache.org&quot;&gt;Velocity&lt;/a&gt; and &lt;a href=&quot;http://freemarker.org&quot;&gt;FreeMarker&lt;/a&gt; versions, Ajax
        support and &lt;a href=&quot;http://acegisecurity.org&quot;&gt;Acegi Security&lt;/a&gt; support.
&lt;br/&gt;&lt;br/&gt;
This project was formerly named &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1&quot;&gt;Equinox&lt;/a&gt; and has been under development since April 2004.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=8006&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you&apos;re a developer of one of the frameworks that AppFuse Light uses - I&apos;d love a code review to make sure I&apos;m &quot;up to snuff&quot; on how to use your framework. I&apos;m also more than willing to give commit rights if you&apos;d like to improve the implementation of your framework.
&lt;/p&gt;
&lt;p&gt;Live demos are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;MyFaces + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;smokey&quot;&gt;
Yes, I realize that 60 combinations is ridiculous. I didn&apos;t create the frameworks, I&apos;m just integrating them so you don&apos;t have to. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt; 
&lt;br/&gt;&lt;br/&gt;
Unfortunately, it&apos;s a real pain to create Maven archetypes or they&apos;d all be as easy as &lt;strong&gt;mvn archetype:create&lt;/strong&gt;. Rumor is that the archetype plugin will allow you to create-from-project in the future. When that happens, I&apos;ll make sure all the combinations are available as archetypes.
&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_beta</guid>
    <title>AppFuse Light 1.8 Beta Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_beta</link>
        <pubDate>Thu, 26 Apr 2007 02:23:22 -0600</pubDate>
    <category>Java</category>
    <category>stripes</category>
    <category>css</category>
    <category>ibatis</category>
    <category>springmvc</category>
    <category>jpox</category>
    <category>jsp</category>
    <category>ajax</category>
    <category>appfuse</category>
    <category>wicket</category>
    <category>springjdbc</category>
    <category>ojb</category>
    <category>freemarker</category>
    <category>hibernate</category>
    <category>acegi</category>
    <category>myfaces</category>
    <category>struts</category>
    <category>jdo</category>
    <category>velocity</category>
            <description>&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; 1.8 Beta adds CSS Framework integration, as well as support
for Stripes (1.4.2) and Wicket (1.2.6). This is a beta release so we can work out &lt;a href=&quot;http://tinyurl.com/286qjf&quot;&gt;some kinks&lt;/a&gt; before the final release.&lt;br/&gt;&lt;br/&gt;AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=8006&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev&lt;wbr&gt;.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forums&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
If you&apos;re a developer of one of the frameworks that AppFuse Light uses - I&apos;d love a code review to make sure I&apos;m &quot;up to snuff&quot; on how to use your framework. I&apos;m also more than willing to give commit rights if you&apos;d like to improve the implementation of your framework.
&lt;/p&gt;
&lt;p&gt;Live demos are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-jsf&quot;&gt;MyFaces + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-stripes&quot;&gt;Stripes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/appfuse-light-wicket&quot;&gt;Wicket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Based on &lt;a href=&quot;http://martijndashorst.com/blog/2007/04/26/appfuse-light-adds-wicket/&quot;&gt;Martin&apos;s blog post&lt;/a&gt;, I&apos;ve added the version numbers for Stripes and Wicket (1.4.2 and 1.2.6, respectively). While the Wicket guys recommended I use Wicket 1.3.0, I was already knee deep in 1.2.6 when I read their recommendation. If 1.3.0 really is that much better than 1.2.6, it should be a pleasure to upgrade (and a good learning experience too boot!).</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1</guid>
    <title>Equinox (a.k.a. AppFuse Light) 1.7.1 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1</link>
        <pubDate>Sat, 21 Apr 2007 17:27:33 -0600</pubDate>
    <category>Java</category>
    <category>struts2</category>
    <category>webwork</category>
    <category>jsf</category>
    <category>velocity</category>
    <category>hibernate</category>
    <category>acegi</category>
    <category>jdo</category>
    <category>ibatis</category>
    <category>jpox</category>
    <category>ojb</category>
    <category>ajax</category>
    <category>tapestry</category>
    <category>appfuse</category>
    <category>spring</category>
    <category>freemarker</category>
    <category>struts</category>
            <description>Equinox 1.7.1 contains a number of dependency updates, and not much else. This will be the last release with the Equinox name. This project is changing its name to &lt;strong&gt;AppFuse Light&lt;/strong&gt; and will be referred to by that name going forward. The project will be moving its source code to &lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;http://appfuse-light.dev.java.net&lt;/a&gt;. The equinox.dev.java.net project will remain because &lt;a href=&quot;http://www.w3.org/Provider/Style/URI&quot;&gt;Cool URIs don&apos;t change&lt;/a&gt;. In addition to the name change, I&apos;d like to try to merge the AppFuse and Equinox user communities. Since the technologies are so similar, and AppFuse 2.x will use some of Equinox&apos;s Ant scripts, it makes sense to bring these projects closer together.
&lt;/p&gt;
&lt;p&gt;In AppFuse Light 1.8, I plan on adding support for Stripes and Wicket as well as integrating the CSS Framework (like AppFuse uses).&lt;/p&gt;
&lt;p&gt;50 possible combinations are available for &lt;a href=&quot;https://equinox.dev.java.net/servlets/ProjectDocumentList?folderID=7074&quot;&gt;download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with Ajax, Acegi Security, JSP, FreeMarker or Velocity), Struts 1.x, Struts 2.x, Tapestry, WebWork&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
All of the frameworks used in Equinox, as well as most of its build/test system is
explained in &lt;a href=&quot;http://www.springlive.com&quot;&gt;Spring Live&lt;/a&gt;. Going forward, documentation will be put on the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse site&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
A summary of the changes in this release are below:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Removed custom JavaScript and CSS for MyFaces Tomahawk&apos;s &lt;t:inputCalendar&gt;&lt;/li&gt;
    &lt;li&gt;Dependent packages upgraded:
        &lt;ul&gt;
            &lt;li&gt;Ajax4JSF 1.0.6&lt;/li&gt;
            &lt;li&gt;Cargo 0.9&lt;/li&gt;
            &lt;li&gt;Commons Collections 3.2&lt;/li&gt;
            &lt;li&gt;Commons DBCP 1.2.2&lt;/li&gt;
            &lt;li&gt;Commons Lang 2.3&lt;/li&gt;
            &lt;li&gt;Commons Validator 1.3.1&lt;/li&gt;
            &lt;li&gt;DWR 2.0 RC2&lt;/li&gt;
            &lt;li&gt;FreeMarker 2.3.9&lt;/li&gt;
            &lt;li&gt;JPOX 1.1.7&lt;/li&gt;
            &lt;li&gt;JUnit 3.8.2&lt;/li&gt;
            &lt;li&gt;Hibernate 3.2.1&lt;/li&gt;
            &lt;li&gt;iBATIS 2.3.0&lt;/li&gt;
            &lt;li&gt;MyFaces and Tomahawk 1.1.5&lt;/li&gt;
            &lt;li&gt;Spring 2.0.4&lt;/li&gt;
            &lt;li&gt;Spring Modules Validation 0.8&lt;/li&gt;
            &lt;li&gt;Struts 2.0.6&lt;/li&gt;
            &lt;li&gt;Tapestry 4.1.1&lt;/li&gt;
            &lt;li&gt;Velocity 1.5&lt;/li&gt;
            &lt;li&gt;Velocity Tools 1.3&lt;/li&gt;
            &lt;li&gt;WebWork 2.2.5&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For more information about installing the 
various options, see the &lt;a href=&quot;https://equinox.dev.java.net/source/browse/*checkout*/equinox/README.txt?only_with_tag=release-1_7_1&quot;&gt;README.txt&lt;/a&gt; file. Live demos (thanks to &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;!) are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-jsf&quot;&gt;JSF + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo.raibledesigns.com/equinox-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo.raibledesigns.com/equinox-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;If you have any questions, please &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse#comments&quot;&gt;read the comments from the 1.7 release&lt;/a&gt; or ask them on the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;AppFuse mailing list&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/large_sites_powered_by_java</guid>
    <title>Large sites powered by Java web frameworks and Tiles + WebWork</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/large_sites_powered_by_java</link>
        <pubDate>Wed, 15 Feb 2006 11:55:57 -0700</pubDate>
    <category>Java</category>
    <category>ajax</category>
    <category>tapestry</category>
    <category>tiles</category>
    <category>webwork</category>
    <category>sitemesh</category>
            <description>Yesterday, I delivered a Comparing Web Frameworks seminar that included Struts, Spring MVC, WebWork, JSF and Tapestry. This was for a client that&apos;s in the process of re-working an extremely high traffic site (50+ servers currently) from Servlets + JSPs to a web framework.  They love the idea of Tiles (and know how to use it) as well as plan on integrating many Ajax features. 
&lt;br /&gt;&lt;br /&gt;
We quickly eliminated Struts because of ActionForms since they&apos;re planning on moving to persisted POJOs. Spring MVC and JSF had a notch up because they work with Tiles. However, JSF has reportedly had scalability issues. Furthermore, it&apos;s the most-complained about framework out there. One attendee noted how she was impressed with the low number of complaints about WebWork.
&lt;br /&gt;&lt;br /&gt;
WebWork doesn&apos;t integrate with Tiles (but probably will soon) and they were concerned about SiteMesh performance with large pages (1MB + of text). While I believe SiteMesh can do almost everything that Tiles can do, I also agree that Tiles is a good technology. Furthermore, the &quot;advanced features&quot; of SiteMesh to be largely undocumented, which can be a barrier for adopting it as a &quot;development standard&quot;.
&lt;br /&gt;&lt;br /&gt;
Spring MVC was dinged because it doesn&apos;t have built-in Ajax support like WebWork and Tapestry (via Tacos). However, it&apos;s support for Tiles might just make it the one they choose - especially since they plan on using Spring in the middle-tier/backend. While they loved the idea of Tapestry, they didn&apos;t think they could afford the learning curve and I don&apos;t know enough about the @Border component to verify if it has all of Tile&apos;s functionality.
&lt;br /&gt;&lt;br /&gt;
One interesting thing that came up was the list of high-volume sites using these various web frameworks. Tapestry seems to come out on top when you look at the list of well-known sites.  However, I&apos;m sure there are plenty I don&apos;t know about.  If you know of high-volume sites using any of these five frameworks, please let me know. I&apos;m looking for &lt;em&gt;major&lt;/em&gt; sites with millions of hits per day. Here&apos;s my current list (extra points for fancy templating with SiteMesh/Tiles + Ajax widgets):&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;strong&gt;Struts&lt;/strong&gt;: None that I know of off the top of my head, but I&apos;m sure there are plenty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Spring MVC&lt;/strong&gt;: None that I know of.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebWork&lt;/strong&gt;: &lt;a href=&quot;http://javablogs.com&quot;&gt;JavaBlogs&lt;/a&gt; (don&apos;t know if this exactly qualifies as high-volume, there aren&apos;t &lt;em&gt;that&lt;/em&gt; many Java developers). WebWork also has a few products based on it (i.e. Jive, JIRA, Confluence), but these companies also employ WebWork committers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSF&lt;/strong&gt;: None that I know of.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tapestry&lt;/strong&gt;: &lt;a href=&quot;http://nhl.com&quot;&gt;NHL.com&lt;/a&gt;, &lt;a href=&quot;http://theserverside.com&quot;&gt;TheServerSide.com&lt;/a&gt; (similar comments to JavaBlogs) and &lt;a href=&quot;http://zillow.com&quot;&gt;Zillow.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Thanks!&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;Related:&lt;/strong&gt; &lt;a href=&quot;http://jroller.com/page/zlendon?entry=common_struts_tiles_fallacy_exposed&quot;&gt;How To use Tiles like SiteMesh&lt;/a&gt; and SourceLab&apos;s &lt;a href=&quot;http://sandbox.sourcelabs.com/kosta/web_ui_compare/readme/&quot;&gt;Web application technologies comparison&lt;/a&gt; (with performance numbers!).&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Update:&lt;/strong&gt; FWIW, I figured out &lt;a href=&quot;http://raibledesigns.com/page/rd?anchor=how_to_use_tiles_with&quot;&gt;How to use Tiles with WebWork&lt;/a&gt; and wrote a &lt;a href=&quot;http://raibledesigns.com/page/rd?anchor=dependency_injection_with_sitemesh&quot;&gt;short howto for doing dependency injection with SiteMesh&lt;/a&gt;.</description>          </item>
  </channel>
</rss>