<?xml version="1.0" encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom">
    <title type="html">Raible Designs</title>
    <subtitle type="html">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.</subtitle>
    <id>https://raibledesigns.com/rd/feed/entries/atom</id>
            <link rel="self" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?tags=springmvc" />
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/" />
        <updated>2026-04-30T03:43:46-06:00</updated>
    <generator uri="http://roller.apache.org" version="5.0.3 (1388864191739:dave)">Apache Roller (incubating)</generator>
        <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_3_5_released</id>
        <title type="html">AppFuse 3.5 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_3_5_released"/>
        <published>2015-02-20T09:08:53-07:00</published>
        <updated>2015-02-20T17:24:22-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;p&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;http://static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 3.5. This release contains a number of improvements.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;XML reduced by 8x in projects generated with AppFuse&lt;/li&gt;&lt;li&gt;CRUD generation&amp;nbsp;support for Wicket, as well as AppFuse Light archetypes (Spring Security, Spring FreeMarker and Stripes)&lt;/li&gt;&lt;li&gt;Upgraded Tapestry to 5.4&lt;/li&gt;&lt;li&gt;Integrated&amp;nbsp;Spring IO Platform for dependency management&lt;/li&gt;&lt;li&gt;Refactored unit tests to use JUnit 4&lt;/li&gt;&lt;li&gt;Renamed maven-warpath-plugin to warpath-maven-plugin&lt;/li&gt;&lt;li&gt;Upgraded to jWebUnit 3 for AppFuse Light integration tests&lt;/li&gt;&lt;li&gt;Updated all AppFuse Light modules to be up-to-date&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;For more details on specific changes
    see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+3.5.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;alert alert-info&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br&gt;
    AppFuse is a full-stack framework for building web applications on the JVM. It was
    originally developed to eliminate the ramp-up time when building new web applications. Over
    the years, it has matured into a very testable and secure system for creating Java-based
    webapps.
&lt;/p&gt;
&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see
    the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to
    get started with this release. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the
    &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any
    issues, please report them on the users mailing list. You can also post them to &lt;a href=&quot;http://stackoverflow.com/questions/tagged/appfuse&quot;&gt;Stack Overflow&lt;/a&gt; with the &quot;appfuse&quot; tag.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing
    lists.&lt;/p&gt;

&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our
    sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;,
    &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, and &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;.
    Atlassian and Contegix are especially awesome:
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all
        its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. &lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/documenting_your_spring_api_with</id>
        <title type="html">Documenting your Spring API with Swagger</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/documenting_your_spring_api_with"/>
        <published>2014-03-25T13:07:18-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="swagger" scheme="http://roller.apache.org/ns/tags/" />
        <category term="swagger-springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;
    Over the last several months, I&apos;ve been developing a &lt;a href=&quot;http://www.infoq.com/articles/webber-rest-workflow&quot;&gt;
    REST&lt;/a&gt; API using &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;.
    My client hired an outside company
    to develop a native iOS app, and my development team was responsible for developing its API. Our main task involved
    integrating with &lt;a href=&quot;http://www.epic.com/&quot;&gt;Epic&lt;/a&gt;, a popular software system used in Health care. We also
    developed a &lt;a href=&quot;https://www.atlassian.com/software/crowd/overview&quot;&gt;Crowd&lt;/a&gt;-backed authentication system,
    based loosely on &lt;a href=&quot;https://github.com/philipsorst/angular-rest-springsecurity&quot;&gt;Philip Sorst&apos;s Angular
    REST Security&lt;/a&gt;.

&lt;/p&gt;

&lt;p&gt;To document our API, we used &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;Spring MVC integration for
    Swagger&lt;/a&gt; (a.k.a. swagger-springmvc). I briefly looked into &lt;a
        href=&quot;https://github.com/wkennedy/swagger4spring-web&quot;&gt;swagger4spring-web&lt;/a&gt;,
    but gave up quickly when it didn&apos;t recognize Spring&apos;s @RestController. We started with swagger-springmvc 0.6.5 and
    found it fairly easy to integrate. Unfortunately, it didn&apos;t allow us to annotate our model objects and tell clients
    which fields were required. We were quite pleased when a new version (0.8.2) was released that supports Swagger 1.3
    and its @ApiModelProperty.
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;strong&gt;What is Swagger?&lt;/strong&gt;&lt;br/&gt;
    The goal of &lt;a href=&quot;https://helloreverb.com/developers/swagger&quot;&gt;Swagger&lt;/a&gt; is to define a standard, language-agnostic interface to REST APIs which allows both humans and
    computers to discover and understand the capabilities of the service without access to source code, documentation,
    or through network traffic inspection.
&lt;/blockquote&gt;
&lt;p&gt;
    To demonstrate how Swagger works, I integrated it into Josh Long&apos;s
    &lt;a href=&quot;https://github.com/joshlong/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security&lt;/a&gt; project. If you
    have a Boot-powered project, you should be able to use the same steps.
&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;
    Over the last several months, I&apos;ve been developing a &lt;a href=&quot;http://www.infoq.com/articles/webber-rest-workflow&quot;&gt;
    REST&lt;/a&gt; API using &lt;a href=&quot;http://projects.spring.io/spring-boot/&quot;&gt;Spring Boot&lt;/a&gt;.
    My client hired an outside company
    to develop a native iOS app, and my development team was responsible for developing its API. Our main task involved
    integrating with &lt;a href=&quot;http://www.epic.com/&quot;&gt;Epic&lt;/a&gt;, a popular software system used in Health care. We also
    developed a &lt;a href=&quot;https://www.atlassian.com/software/crowd/overview&quot;&gt;Crowd&lt;/a&gt;-backed authentication system,
    based loosely on &lt;a href=&quot;https://github.com/philipsorst/angular-rest-springsecurity&quot;&gt;Philip Sorst&apos;s Angular
    REST Security&lt;/a&gt;.

&lt;/p&gt;

&lt;p&gt;To document our API, we used &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;Spring MVC integration for
    Swagger&lt;/a&gt; (a.k.a. swagger-springmvc). I briefly looked into &lt;a
        href=&quot;https://github.com/wkennedy/swagger4spring-web&quot;&gt;swagger4spring-web&lt;/a&gt;,
    but gave up quickly when it didn&apos;t recognize Spring&apos;s @RestController. We started with swagger-springmvc 0.6.5 and
    found it fairly easy to integrate. Unfortunately, it didn&apos;t allow us to annotate our model objects and tell clients
    which fields were required. We were quite pleased when a new version (0.8.2) was released that supports Swagger 1.3
    and its @ApiModelProperty.
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
    &lt;strong&gt;What is Swagger?&lt;/strong&gt;&lt;br/&gt;
    The goal of &lt;a href=&quot;https://helloreverb.com/developers/swagger&quot;&gt;Swagger&lt;/a&gt; is to define a standard, language-agnostic interface to REST APIs which allows both humans and
    computers to discover and understand the capabilities of the service without access to source code, documentation,
    or through network traffic inspection.
&lt;/blockquote&gt;
&lt;p&gt;
    To demonstrate how Swagger works, I integrated it into Josh Long&apos;s
    &lt;a href=&quot;https://github.com/joshlong/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security&lt;/a&gt; project. If you
    have a Boot-powered project, you should be able to use the same steps.
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;1. Add swagger-springmvc dependency to your project.&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;com.mangofactory&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;swagger-springmvc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;0.8.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Note: on my client&apos;s project, we had to exclude &quot;org.slf4j:slf4j-log4j12&quot; and add &quot;jackson-module-scala_2.10:2.3.1&quot;
    as a dependency. I did not need to do either of these in this project.
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;2. Add a SwaggerConfig class to configure Swagger.&lt;/strong&gt;

&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc&quot;&gt;swagger-springmvc documentation&lt;/a&gt; has an example of
    this
    with a bit more XML.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package example.config;

import com.mangofactory.swagger.configuration.JacksonScalaSupport;
import com.mangofactory.swagger.configuration.SpringSwaggerConfig;
import com.mangofactory.swagger.configuration.SpringSwaggerModelConfig;
import com.mangofactory.swagger.configuration.SwaggerGlobalSettings;
import com.mangofactory.swagger.core.DefaultSwaggerPathProvider;
import com.mangofactory.swagger.core.SwaggerApiResourceListing;
import com.mangofactory.swagger.core.SwaggerPathProvider;
import com.mangofactory.swagger.scanners.ApiListingReferenceScanner;
import com.wordnik.swagger.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static com.google.common.collect.Lists.newArrayList;

@Configuration
@ComponentScan(basePackages = &quot;com.mangofactory.swagger&quot;)
public class SwaggerConfig {

    public static final List&amp;lt;String&amp;gt; DEFAULT_INCLUDE_PATTERNS = Arrays.asList(&quot;/news/.*&quot;);
    public static final String SWAGGER_GROUP = &quot;mobile-api&quot;;

    @Value(&quot;${app.docs}&quot;)
    private String docsLocation;

    @Autowired
    private SpringSwaggerConfig springSwaggerConfig;
    @Autowired
    private SpringSwaggerModelConfig springSwaggerModelConfig;

    /**
     * Adds the jackson scala module to the MappingJackson2HttpMessageConverter registered with spring
     * Swagger core models are scala so we need to be able to convert to JSON
     * Also registers some custom serializers needed to transform swagger models to swagger-ui required json format
     */
    @Bean
    public JacksonScalaSupport jacksonScalaSupport() {
        JacksonScalaSupport jacksonScalaSupport = new JacksonScalaSupport();
        //Set to false to disable
        jacksonScalaSupport.setRegisterScalaModule(true);
        return jacksonScalaSupport;
    }


    /**
     * Global swagger settings
     */
    @Bean
    public SwaggerGlobalSettings swaggerGlobalSettings() {
        SwaggerGlobalSettings swaggerGlobalSettings = new SwaggerGlobalSettings();
        swaggerGlobalSettings.setGlobalResponseMessages(springSwaggerConfig.defaultResponseMessages());
        swaggerGlobalSettings.setIgnorableParameterTypes(springSwaggerConfig.defaultIgnorableParameterTypes());
        swaggerGlobalSettings.setParameterDataTypes(springSwaggerModelConfig.defaultParameterDataTypes());
        return swaggerGlobalSettings;
    }

    /**
     * API Info as it appears on the swagger-ui page
     */
    private ApiInfo apiInfo() {
        ApiInfo apiInfo = new ApiInfo(
                &quot;News API&quot;,
                &quot;Mobile applications and beyond!&quot;,
                &quot;https://helloreverb.com/terms/&quot;,
                &quot;matt@raibledesigns.com&quot;,
                &quot;Apache 2.0&quot;,
                &quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;
        );
        return apiInfo;
    }

    /**
     * Configure a SwaggerApiResourceListing for each swagger instance within your app. e.g. 1. private  2. external apis
     * Required to be a spring bean as spring will call the postConstruct method to bootstrap swagger scanning.
     *
     * @return
     */
    @Bean
    public SwaggerApiResourceListing swaggerApiResourceListing() {
        //The group name is important and should match the group set on ApiListingReferenceScanner
        //Note that swaggerCache() is by DefaultSwaggerController to serve the swagger json
        SwaggerApiResourceListing swaggerApiResourceListing = new SwaggerApiResourceListing(springSwaggerConfig.swaggerCache(), SWAGGER_GROUP);

        //Set the required swagger settings
        swaggerApiResourceListing.setSwaggerGlobalSettings(swaggerGlobalSettings());

        //Use a custom path provider or springSwaggerConfig.defaultSwaggerPathProvider()
        swaggerApiResourceListing.setSwaggerPathProvider(apiPathProvider());

        //Supply the API Info as it should appear on swagger-ui web page
        swaggerApiResourceListing.setApiInfo(apiInfo());

        //Global authorization - see the swagger documentation
        swaggerApiResourceListing.setAuthorizationTypes(authorizationTypes());

        //Every SwaggerApiResourceListing needs an ApiListingReferenceScanner to scan the spring request mappings
        swaggerApiResourceListing.setApiListingReferenceScanner(apiListingReferenceScanner());
        return swaggerApiResourceListing;
    }

    @Bean
    /**
     * The ApiListingReferenceScanner does most of the work.
     * Scans the appropriate spring RequestMappingHandlerMappings
     * Applies the correct absolute paths to the generated swagger resources
     */
    public ApiListingReferenceScanner apiListingReferenceScanner() {
        ApiListingReferenceScanner apiListingReferenceScanner = new ApiListingReferenceScanner();

        //Picks up all of the registered spring RequestMappingHandlerMappings for scanning
        apiListingReferenceScanner.setRequestMappingHandlerMapping(springSwaggerConfig.swaggerRequestMappingHandlerMappings());

        //Excludes any controllers with the supplied annotations
        apiListingReferenceScanner.setExcludeAnnotations(springSwaggerConfig.defaultExcludeAnnotations());

        //
        apiListingReferenceScanner.setResourceGroupingStrategy(springSwaggerConfig.defaultResourceGroupingStrategy());

        //Path provider used to generate the appropriate uri&apos;s
        apiListingReferenceScanner.setSwaggerPathProvider(apiPathProvider());

        //Must match the swagger group set on the SwaggerApiResourceListing
        apiListingReferenceScanner.setSwaggerGroup(SWAGGER_GROUP);

        //Only include paths that match the supplied regular expressions
        apiListingReferenceScanner.setIncludePatterns(DEFAULT_INCLUDE_PATTERNS);

        return apiListingReferenceScanner;
    }

    /**
     * Example of a custom path provider
     */
    @Bean
    public ApiPathProvider apiPathProvider() {
        ApiPathProvider apiPathProvider = new ApiPathProvider(docsLocation);
        apiPathProvider.setDefaultSwaggerPathProvider(springSwaggerConfig.defaultSwaggerPathProvider());
        return apiPathProvider;
    }


    private List&amp;lt;AuthorizationType&amp;gt; authorizationTypes() {
        ArrayList&amp;lt;AuthorizationType&amp;gt; authorizationTypes = new ArrayList&amp;lt;&amp;gt;();

        List&amp;lt;AuthorizationScope&amp;gt; authorizationScopeList = newArrayList();
        authorizationScopeList.add(new AuthorizationScope(&quot;global&quot;, &quot;access all&quot;));

        List&amp;lt;GrantType&amp;gt; grantTypes = newArrayList();

        LoginEndpoint loginEndpoint = new LoginEndpoint(apiPathProvider().getAppBasePath() + &quot;/user/authenticate&quot;);
        grantTypes.add(new ImplicitGrant(loginEndpoint, &quot;access_token&quot;));

        return authorizationTypes;
    }

    @Bean
    public SwaggerPathProvider relativeSwaggerPathProvider() {
        return new ApiRelativeSwaggerPathProvider();
    }

    private class ApiRelativeSwaggerPathProvider extends DefaultSwaggerPathProvider {
        @Override
        public String getAppBasePath() {
            return &quot;/&quot;;
        }

        @Override
        public String getSwaggerDocumentationBasePath() {
            return &quot;/api-docs&quot;;
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;ApiPathProvider&lt;/code&gt; class referenced above is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package example.config;

import com.mangofactory.swagger.core.SwaggerPathProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.util.UriComponentsBuilder;

import javax.servlet.ServletContext;

public class ApiPathProvider implements SwaggerPathProvider {
    private SwaggerPathProvider defaultSwaggerPathProvider;
    @Autowired
    private ServletContext servletContext;

    private String docsLocation;

    public ApiPathProvider(String docsLocation) {
        this.docsLocation = docsLocation;
    }

    @Override
    public String getApiResourcePrefix() {
        return defaultSwaggerPathProvider.getApiResourcePrefix();
    }

    public String getAppBasePath() {
        return UriComponentsBuilder
                .fromHttpUrl(docsLocation)
                .path(servletContext.getContextPath())
                .build()
                .toString();
    }

    @Override
    public String getSwaggerDocumentationBasePath() {
        return UriComponentsBuilder
                .fromHttpUrl(getAppBasePath())
                .pathSegment(&quot;api-docs/&quot;)
                .build()
                .toString();
    }

    @Override
    public String getRequestMappingEndpoint(String requestMappingPattern) {
        return defaultSwaggerPathProvider.getRequestMappingEndpoint(requestMappingPattern);
    }

    public void setDefaultSwaggerPathProvider(SwaggerPathProvider defaultSwaggerPathProvider) {
        this.defaultSwaggerPathProvider = defaultSwaggerPathProvider;
    }
}
&lt;/pre&gt;
&lt;p&gt;In &lt;em&gt;src/main/resources/application.properties&lt;/em&gt;, add an &quot;app.docs&quot; property. This will need
    to be changed as you move your application from local -&gt; test -&gt; staging -&gt; production. Spring Boot&apos;s
    &lt;a href=&quot;http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files&quot;&gt;externalized
        configuration&lt;/a&gt; makes this fairly simple.
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
app.docs=http://localhost:8080
&lt;/pre&gt;
&lt;p&gt;
    &lt;strong&gt;3. Verify Swagger produces JSON.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
After completing the above steps, you should be able
    to see the JSON Swagger generates for your API. Open &lt;a href=&quot;http://localhost:8080/api-docs&quot;&gt;http://localhost:8080/api-docs&lt;/a&gt;
    in your browser or &lt;code&gt;curl http://localhost:8080/api-docs&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
{
    &quot;apiVersion&quot;: &quot;1&quot;,
    &quot;swaggerVersion&quot;: &quot;1.2&quot;,
    &quot;apis&quot;: [
        {
            &quot;path&quot;: &quot;http://localhost:8080/api-docs/mobile-api/example_NewsController&quot;,
            &quot;description&quot;: &quot;example.NewsController&quot;
        }
    ],
    &quot;info&quot;: {
        &quot;title&quot;: &quot;News API&quot;,
        &quot;description&quot;: &quot;Mobile applications and beyond!&quot;,
        &quot;termsOfServiceUrl&quot;: &quot;https://helloreverb.com/terms/&quot;,
        &quot;contact&quot;: &quot;matt@raibledesigns.com&quot;,
        &quot;license&quot;: &quot;Apache 2.0&quot;,
        &quot;licenseUrl&quot;: &quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;
    }
}
&lt;/pre&gt;
&lt;p&gt;
    &lt;strong&gt;4. Copy Swagger UI into your project.&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/wordnik/swagger-ui&quot;&gt;Swagger UI&lt;/a&gt; is a good-looking JavaScript client for Swagger&apos;s
    JSON. I integrated it using the following steps:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
git clone https://github.com/wordnik/swagger-ui
cp -r swagger-ui/dist ~/dev/x-auth-security/src/main/resources/public/docs
&lt;/pre&gt;
&lt;p&gt;
    I modified docs/index.html, deleting its header (&amp;lt;div id=&apos;header&apos;&gt;) element, as well as made its url
    dynamic.
&lt;/p&gt;
&lt;pre class=&quot;brush: js&quot;&gt;
...
$(function () {
  var apiUrl = window.location.protocol + &quot;//&quot; + window.location.host;
  if (window.location.pathname.indexOf(&apos;/api&apos;) &gt; 0) {
    apiUrl += window.location.pathname.substring(0, window.location.pathname.indexOf(&apos;/api&apos;))
  }
  apiUrl += &quot;/api-docs&quot;;
  log(&apos;API URL: &apos; + apiUrl);
  window.swaggerUi = new SwaggerUi({
    url: apiUrl,
    dom_id: &quot;swagger-ui-container&quot;,
...
&lt;/pre&gt;
&lt;p&gt;
    After making these changes, I was able to open fire up the app with &quot;mvn spring-boot:run&quot; and view
    &lt;a href=&quot;http://localhost:8080/docs/index.html&quot;&gt;http://localhost:8080/docs/index.html&lt;/a&gt; in my browser.
&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3732/13409312164_feb72e7b8f_b.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13409312164/&quot; title=&quot;Swagger UI News by mraible, on Flickr&quot;
       rel=&quot;lightbox[swagger]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3732/13409312164_feb72e7b8f.jpg&quot; width=&quot;500&quot; height=&quot;278&quot;
            alt=&quot;Swagger UI News&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;5. Annotate your API.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;There are two services in x-auth-security: one for authentication and one for
    news. To provide more
    information to the &quot;news&quot; service&apos;s documentation, add @Api and @ApiOperation annotations. These annotations aren&apos;t
    necessary to get a service
    to show up in Swagger UI, but if you don&apos;t specify the @Api(&quot;user&quot;), you&apos;ll end up with an ugly-looking class name
    instead
    (e.g. example_xauth_UserXAuthTokenController).
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@RestController
@Api(value = &quot;news&quot;, description = &quot;News API&quot;)
class NewsController {

    Map&amp;lt;Long, NewsEntry&amp;gt; entries = new ConcurrentHashMap&amp;lt;Long, NewsEntry&amp;gt;();

    @RequestMapping(value = &quot;/news&quot;, method = RequestMethod.GET)
    @ApiOperation(value = &quot;Get News&quot;, notes = &quot;Returns news items&quot;)
    Collection&amp;lt;NewsEntry&amp;gt; entries() {
        return this.entries.values();
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.DELETE)
    @ApiOperation(value = &quot;Delete News item&quot;, notes = &quot;Deletes news item by id&quot;)
    NewsEntry remove(@PathVariable Long id) {
        return this.entries.remove(id);
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.GET)
    @ApiOperation(value = &quot;Get a news item&quot;, notes = &quot;Returns a news item&quot;)
    NewsEntry entry(@PathVariable Long id) {
        return this.entries.get(id);
    }

    @RequestMapping(value = &quot;/news/{id}&quot;, method = RequestMethod.POST)
    @ApiOperation(value = &quot;Update News&quot;, notes = &quot;Updates a news item&quot;)
    NewsEntry update(@RequestBody NewsEntry news) {
        this.entries.put(news.getId(), news);
        return news;
    }
...
}
&lt;/pre&gt;
&lt;p&gt;
    You might notice
    the screenshot above only shows news. This is because &lt;code&gt;SwaggerConfig.DEFAULT_INCLUDE_PATTERNS&lt;/code&gt; only
    specifies news. The following
    will include all APIs.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public static final List&amp;lt;String&gt; DEFAULT_INCLUDE_PATTERNS = Arrays.asList(&quot;/.*&quot;);
&lt;/pre&gt;
&lt;p&gt;After adding these annotations and modifying &lt;code&gt;SwaggerConfig&lt;/code&gt;, you should see all available services.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm8.staticflickr.com/7366/13408960855_8407d286a8_b.jpg&quot; rel=&quot;lightbox[swagger]&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13408960855/&quot; title=&quot;Swagger UI Complete by mraible, on Flickr&quot;&gt;&lt;img
            src=&quot;//farm8.staticflickr.com/7366/13408960855_8407d286a8.jpg&quot; width=&quot;500&quot; height=&quot;325&quot;
            alt=&quot;Swagger UI Complete&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;In swagger-springmvc 0.8.x, the ability to use @ApiModel and @ApiModelProperty annotations was added. This means you
    can annotate &lt;code&gt;NewsEntry&lt;/code&gt; to specify which fields are required.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@ApiModel(&quot;News Entry&quot;)
public static class NewsEntry {
    @ApiModelProperty(value = &quot;the id of the item&quot;, required = true)
    private long id;
    @ApiModelProperty(value = &quot;content&quot;, required = true)
    private String content;

    // getters and setters
}
&lt;/pre&gt;
&lt;p&gt;This results in the model&apos;s documentation showing up in Swagger UI. If &quot;required&quot; isn&apos;t specified, a property shows
    up as &lt;em&gt;optional&lt;/em&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://farm4.staticflickr.com/3771/13409312244_27f72688d1_b.jpg&quot;
       data-href=&quot;https://www.flickr.com/photos/mraible/13409312244/&quot; title=&quot;Swagger UI Model by mraible, on Flickr&quot;
       rel=&quot;lightbox[swagger]&quot;&gt;&lt;img
            src=&quot;//farm4.staticflickr.com/3771/13409312244_27f72688d1_n.jpg&quot; width=&quot;320&quot; height=&quot;247&quot;
            alt=&quot;Swagger UI Model&quot;&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;strong&gt;Parting Thoughts&lt;/strong&gt;&lt;br/&gt;
    The QA Engineers and 3rd Party iOS Developers have been very pleased with our API documentation. I believe this is
    largely
    due to Swagger and its nice-looking UI. The Swagger UI also provides an interface to test
    the endpoints by entering parameters (or JSON) into HTML forms and clicking buttons. This could benefit those QA
    folks
    that prefer using Selenium to test HTML (vs. raw REST endpoints).
&lt;/p&gt;

&lt;p&gt;I&apos;ve been quite pleased with swagger-springmvc, so kudos to its developers. They&apos;ve been very responsive in
    &lt;a href=&quot;https://github.com/martypitt/swagger-springmvc/issues/created_by/mraible?page=1&amp;amp;state=closed&quot;&gt;fixing
        issues I&apos;ve reported&lt;/a&gt;.
    The only thing I&apos;d like is support for recognizing JSR303 annotations (e.g. @NotNull) as required fields.
&lt;/p&gt;

&lt;p&gt;To see everything running locally, checkout my modified &lt;a
        href=&quot;https://github.com/mraible/boot-examples/tree/master/x-auth-security&quot;&gt;x-auth-security project on
    GitHub&lt;/a&gt;
    and the &lt;a href=&quot;https://github.com/mraible/boot-examples/commits/master&quot;&gt;associated commits&lt;/a&gt; for this article.
&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at</id>
        <title type="html">Comparing JVM Web Frameworks at vJUG</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_jvm_web_frameworks_at"/>
        <published>2014-02-06T10:54:17-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="angularjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <summary type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;</summary>
        <content type="html">&lt;p&gt;A couple months ago, I was invited to &lt;a href=&quot;http://www.meetup.com/virtualJUG/events/153096902/&quot;&gt;speak at Virtual JUG&lt;/a&gt; - an online-only Java User Group organized by the &lt;a href=&quot;http://zeroturnaround.com/&quot;&gt;ZeroTurnaround&lt;/a&gt; folks. They chose my Comparing JVM Web Frameworks presentation and we agreed I&apos;d speak yesterday morning. They used a combination of Google Hangouts, live streaming on YouTube and IRC to facilitate the meeting. It all went pretty smoothly and produced a comfortable speaking environment. To practice for vJUG, I delivered the same talk on Tuesday night at the &lt;a href=&quot;http://www.meetup.com/DOSUG1/events/155080452/&quot;&gt;Denver Open Source Users Group&lt;/a&gt;.
&lt;p&gt;
The last time I delivered this talk was at &lt;a href=&quot;http://raibledesigns.com/rd/entry/devoxx_france_a_great_conference&quot;&gt;Devoxx France&lt;/a&gt; in March 2013. I didn&apos;t change any of the format this time, keeping with referencing the Paradox of Choice and encouraging people to define constraints to help them make their decision. I did add a few new slides regarding RebelLabs&apos; &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-curious-coders-java-web-frameworks-comparison-spring-mvc-grails-vaadin-gwt-wicket-play-struts-and-jsf/&quot;&gt;Curious Coder&#8217;s Java Web Frameworks Comparison: Spring MVC, Grails, Vaadin, GWT, Wicket, Play, Struts and JSF&lt;/a&gt; and &lt;a href=&quot;http://zeroturnaround.com/rebellabs/the-2014-decision-makers-guide-to-java-web-frameworks/&quot;&gt;The 2014 Decision Maker&#8217;s Guide to Java Web Frameworks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also updated all the pretty graphs (which may or may not have any significance) with the latest stats from Dice.com, LinkedIn, StackOverflow and respective mailing lists. Significant changes I found compared to one year ago:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Job Listings on Dice.com
&lt;ul&gt;
&lt;li&gt;Play Framework job listings increased almost 4x&lt;/li&gt;
&lt;li&gt;Tapestry jobs are 1/3 of what they were a year ago&lt;/li&gt;
&lt;li&gt;Wicket jobs are 1/2 of what they were a year ago&lt;/li&gt;
&lt;li&gt;JavaScript framework jobs are up quite a bit: Ember.js up ~300%, AngularJS up 900%, Backbone up 160%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn Skills
&lt;ul&gt;
&lt;li&gt;Rails down ~30%&lt;/li&gt;
&lt;li&gt;Grails up 25%&lt;/li&gt;
&lt;li&gt;Play Framework up 200%&lt;/li&gt;
&lt;li&gt;Spring Roo up 40%&lt;/li&gt;
&lt;li&gt;Ember.js up 300%&lt;/li&gt;
&lt;li&gt;AngularJS up 840%&lt;/li&gt;
&lt;li&gt;Backbone up 200%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can tell from these findings, AngularJS has gained quite a bit of mindshare in the last year. There&apos;s a lot of companies looking for JavaScript skills and quite a few folks have added JavaScript frameworks to their LinkedIn profiles.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://www.youtube.com/watch?v=ygW8fJVlDxQ&quot;&gt;watch the recording on YouTube&lt;/a&gt; or click play in the embedded video below.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;//www.youtube.com/embed/ygW8fJVlDxQ&quot; frameborder=&quot;0&quot; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;You can also quickly browse the slide deck below, &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Comparing_JVM_Web_Frameworks_February2014.pdf&quot;&gt;download the PDF&lt;/a&gt; or &lt;a href=&quot;http://www.slideshare.net/mraible/comparing-jvm-web-frameworks-february-2014&quot;&gt;view it on SlideShare&lt;/a&gt;.&lt;/li&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/30861557?rel=0&quot; width=&quot;512&quot; height=&quot;325&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px&quot; allowfullscreen webkitallowfullscreen mozallowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to all the folks who attended these talks. And thanks to &lt;a href=&quot;http://twitter.com/dosug&quot;&gt;@dosug&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/virtualjug&quot;&gt;@virtualjug&lt;/a&gt; for giving me the opportunity to speak.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with</id>
        <title type="html">Refreshing AppFuse&apos;s UI with Twitter Bootstrap</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with"/>
        <published>2012-01-31T17:12:17-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="twitter" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="bootstrap" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ui" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The last time AppFuse had an update done to its look and feel was in way back in 2006. I&apos;ve done a lot of consulting since then, which has included a fair bit of page speed optimization, HTML5 development and integrating smarter CSS. It was way back in &apos;05 when we first started looking at adding a CSS Framework to AppFuse.  It was Mike Stenhouse&apos;s &lt;a href=&quot;http://www.contentwithstyle.co.uk/content/a-css-framework/&quot;&gt;CSS Framework&lt;/a&gt; that provided the &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_css_framework&quot;&gt;inspiration&lt;/a&gt; and my &lt;a href=&quot;http://raibledesigns.com/rd/entry/css_framework_design_contest_final&quot;&gt;CSS Framework Design Contest&lt;/a&gt; that provided its current themes (&lt;a href=&quot;http://css.appfuse.org/themes/puzzlewithstyle&quot;&gt;puzzlewithstyle&lt;/a&gt;, &lt;a href=&quot;http://css.appfuse.org/themes/andreas01&quot;&gt;andreas01&lt;/a&gt; and &lt;a href=&quot;http://css.appfuse.org/themes/simplicity&quot;&gt;simplicity&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;Since then, a lot of CSS Frameworks have been invented, including &lt;a href=&quot;http://www.blueprintcss.org/&quot;&gt;Blueprint&lt;/a&gt; in 2007 and &lt;a href=&quot;http://compass-style.org/&quot;&gt;Compass&lt;/a&gt; in 2008. However, neither has taken the world by storm like &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Twitter Bootstrap&lt;/a&gt;. From &lt;a href=&quot;http://www.alistapart.com/articles/building-twitter-bootstrap/&quot;&gt;Building Twitter Bootstrap&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
A year-and-a-half ago, a small group of Twitter employees set out to improve our team&#8217;s internal analytical and administrative tools. After some early meetings around this one product, we set out with a higher ambition to create a toolkit for anyone to use within Twitter, and beyond. Thus, we set out to build a system that would help folks like us build new projects on top of it, and Bootstrap was conceived.&lt;br/&gt;
...&lt;br/&gt;
Today, it has grown to include dozens of components and has become the most popular project on GitHub with more than 13,000 watchers and 2,000 forks.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;The fact that Bootstrap has become the most popular project on GitHub says a lot. For &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/AppFuse-next-td3634415.html&quot;&gt;AppFuse.next&lt;/a&gt;, I&apos;d like to integrate a lot of my learnings over the past few years, as well as support HTML5 and modern browsers as best we can. This means &lt;a href=&quot;http://code.google.com/speed/page-speed/docs/rules_intro.html&quot;&gt;page speed optimizations&lt;/a&gt;, getting rid of Prototype and Scriptaculous in favor of jQuery, adding &lt;a href=&quot;http://code.google.com/p/wro4j/&quot;&gt;wro4j&lt;/a&gt; for resource optimization and integrating &lt;a href=&quot;http://html5boilerplate.com/&quot;&gt;HTML5 Boilerplate&lt;/a&gt;. I&apos;ve used Twitter Bootstrap for my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_html5_with_play_scala&quot;&gt;&lt;em&gt;Play More!&lt;/em&gt; app&lt;/a&gt;, as well as some recent client projects. Its excellent documentation has made it easy to use and I love the way you can simply add classes to elements to make them transform into something beautiful.
&lt;/p&gt;
&lt;p&gt;Last week, I spent a couple late nights integrating &lt;a href=&quot;http://thinkvitamin.com/design/twitter-bootstrap-2-0/&quot;&gt;Twitter Bootstrap 2.0&lt;/a&gt; into the Struts 2 and Spring MVC versions of AppFuse. The layout was pretty straightforward thanks to &lt;a href=&quot;http://markdotto.com/bs2/docs/scaffolding.html&quot;&gt;Scaffolding&lt;/a&gt;. Creating the Struts Menu Velocity template to produce &lt;a href=&quot;http://markdotto.com/bs2/docs/javascript.html#dropdowns&quot;&gt;dropdowns&lt;/a&gt; wasn&apos;t too difficult. I added &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#tables&quot;&gt;class=&quot;table table-condensed&quot;&lt;/a&gt; to the list screen tables, &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#forms&quot;&gt;class=&quot;well form-horizontal&quot;&lt;/a&gt; to forms and &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#buttons&quot;&gt;class=&quot;btn primary&quot;&lt;/a&gt; to buttons. 
&lt;/p&gt;
&lt;p&gt;  
I also added validation errors with the &quot;help-inline&quot; class. This is also where things got tricky with Struts and Spring MVC. For the form elements in Bootstrap, they recommend you use a &quot;control-group&quot; element that contains your label and a &quot;controls&quot; element. The control contains the input/select/textarea and also the error message if there is one. Here&apos;s a sample element waiting for data: 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div class=&quot;control-group&quot;&amp;gt;
    &amp;lt;label for=&quot;name&quot; class=&quot;control-label&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Below is what that element should look like to display a validation error:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div class=&quot;control-group error&quot;&amp;gt;
    &amp;lt;label for=&quot;name&quot; class=&quot;control-label&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; value=&quot;&quot;&amp;gt;
        &amp;lt;span class=&quot;help-inline&quot;&amp;gt;Please enter your name.&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You can see this markup is pretty easy, you just need to add an &quot;error&quot; class to &lt;em&gt;control-group&lt;/em&gt; and span to show the error message. With Struts 2, this was pretty easy thanks to its customizable templates for its &lt;a href=&quot;http://struts.apache.org/2.x/docs/struts-tags.html&quot;&gt;tags&lt;/a&gt;. All I had to do was create a &quot;template/css_xhtml&quot; directory in &lt;em&gt;src/main/webapp&lt;/em&gt; and modify checkbox.ftl, controlfooter.ftl, controlheader-core.ftl and controlheader.ftl to match Bootstrap&apos;s conventions. 
&lt;/p&gt;
&lt;p&gt;
Spring MVC was a bit trickier. Since its tags don&apos;t have the concept of writing an entire control (label and field), I had to do a bit of finagling to get things to work. In the current implementation, Struts 2 forms have a single line for a &lt;em&gt;control-group&lt;/em&gt; and its &lt;em&gt;control-label&lt;/em&gt; and &lt;em&gt;controls&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;s:textfield key=&quot;user.firstName&quot; required=&quot;true&quot;/&gt;&lt;/pre&gt;
&lt;p&gt;With Spring MVC, it&apos;s a bit more complex:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;spring:bind path=&quot;user.firstName&quot;&amp;gt;
&amp;lt;fieldset class=&quot;control-group${(not empty status.errorMessage) ? &apos; error&apos; : &apos;&apos;}&quot;&amp;gt;
&amp;lt;/spring:bind&amp;gt;
    &amp;lt;appfuse:label styleClass=&quot;control-label&quot; key=&quot;user.firstName&quot;/&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;form:input path=&quot;firstName&quot; id=&quot;firstName&quot; maxlength=&quot;50&quot;/&amp;gt;
        &amp;lt;form:errors path=&quot;firstName&quot; cssClass=&quot;help-inline&quot;/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You could probably overcome this verbosity with &lt;a href=&quot;http://today.java.net/pub/a/today/2003/11/14/tagfiles.html&quot;&gt;Tag Files&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Figuring out if a &lt;em&gt;control-group&lt;/em&gt; needed an error class before the input tag was rendered was probably the hardest part of this exercise. This was mostly due to Bootstrap&apos;s great documentation and useful examples (viewed by inspecting the markup). Below are some screenshots of the old screens and new ones. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center; vertical-align: top&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7173/6787781357_c4c65c7c74_b.jpg&quot; title=&quot;Old UI - Login&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7173/6787781357_c4c65c7c74_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;Old UI - Login&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm8.staticflickr.com/7142/6787781421_0c7851b414_b.jpg&quot; title=&quot;Old UI - Users&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7142/6787781421_0c7851b414_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;Old UI - Users&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm8.staticflickr.com/7035/6787781725_3a1f0218c1_b.jpg&quot; title=&quot;Old UI - Edit Profile&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7035/6787781725_3a1f0218c1_t.jpg&quot; width=&quot;100&quot; height=&quot;82&quot; alt=&quot;Old UI - Edit Profile&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;p&gt;  
&lt;p style=&quot;text-align: center; vertical-align: top&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_b.jpg&quot; title=&quot;New UI - Login&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;New UI - Login&quot;&gt;&lt;/a&gt;
  
&lt;a href=&quot;http://farm8.staticflickr.com/7015/6787781597_6558d94bb5_b.jpg&quot; title=&quot;New UI - Users&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7015/6787781597_6558d94bb5_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;New UI - Users&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
  
  &lt;a href=&quot;http://farm8.staticflickr.com/7010/6787781681_81b7977414_b.jpg&quot; title=&quot;New UI - Edit Profile&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7010/6787781681_81b7977414_t.jpg&quot; width=&quot;100&quot; height=&quot;82&quot; alt=&quot;New UI - Edit Profile&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #666; text-align: center&quot;&gt;Check out the &lt;a style=&quot;color: #666&quot; href=&quot;http://www.flickr.com/photos/mraible/sets/72157629094630763/&quot;&gt;full set on Flickr&lt;/a&gt; if you&apos;d like a closer look.
  &lt;/p&gt;
  &lt;p&gt;
Even though I like the look of the old UI, I can&apos;t help but think a lot of the themes are designed for blogs and content sites, not webapps. The old &lt;a href=&quot;http://wufoo.com/&quot;&gt;Wufoo&lt;/a&gt; forms were a lot better looking though. And if you&apos;re going to develop &lt;a href=&quot;http://blogs.atlassian.com/2012/01/modern-principles-in-web-development/&quot;&gt;kick-ass webapps&lt;/a&gt;, you need to make them look good. Bootstrap goes a long way in doing this, but it certainly doesn&apos;t replace a good UX Designer. Bootstap simply helps you get into HTML5-land, start using CSS3 and it takes the pain out of making things work cross-browser. Its fluid layouts and responsive web design seems to work great for business applications, which I&apos;m guessing AppFuse is used for the most. 
&lt;/p&gt;
&lt;p&gt;
I can&apos;t thank the Bootstrap developers enough for helping me make this all look good. With Bootstrap 2 &lt;a href=&quot;http://www.markdotto.com/2012/01/24/bootstrap-2-ready-for-testing-and-feedback/&quot;&gt;dropping this week&lt;/a&gt;, I can see myself using this more and more on projects. In the near future, I&apos;ll be helping integrate Bootstrap into AppFuse&apos;s &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Tapestry-5-3-2-td4339578.html&quot;&gt;Tapestry 5 and JSF versions&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;What do you think of this CSS change? Do you change your CSS and layout a fair bit when starting with AppFuse archetypes? What can we do to make AppFuse apps look better out-of-the-box?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse/?cs=3593&quot;&gt;updated&lt;/a&gt; AppFuse to the final &lt;a href=&quot;http://raibledesigns.com/rd/entry/twitter_s_open_source_summit&quot;&gt;Bootstrap 2.0 release&lt;/a&gt;. Also, Johannes Geppert wrote a &lt;a href=&quot;http://www.jgeppert.com/2012/02/new-struts2-bootstrap-plugin-released/&quot;&gt;Struts 2 Bootstrap Plugin&lt;/a&gt;. I hope to integrate this into AppFuse in the near future.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_1_released</id>
        <title type="html">AppFuse 2.1 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_1_released"/>
        <published>2011-04-04T09:38:05-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="javaee" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are JPA 2, JSF 2, Tapestry 5 and Spring 3. In addition, we&apos;ve migrated from XFire to CXF and enabled REST for web services. There&apos;s even a new &lt;b&gt;appfuse-ws&lt;/b&gt; archetype that leverages &lt;a href=&quot;http://enunciate.codehaus.org&quot;&gt;Enunciate&lt;/a&gt; to generate web service endpoints, documentation and downloadable clients. This release fixes many issues with archetypes, improving startup time and allowing jetty:run to be used for quick turnaround while developing. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0&quot; title=&quot;Release Notes 2.1.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;AppFuse is an open source project and application that uses open source frameworks to help you develop Web applications with Java quickly and efficiently. It was originally developed to eliminate the ramp-up time when building new web applications. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project. If you use &lt;a href=&quot;http://appfuse.org/display/APF/Using+JRebel+with+IntelliJ+IDEA&quot;&gt;JRebel with IntelliJ&lt;/a&gt;, you can achieve zero-turnaround in your project and develop features without restarting the server.
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Release Details&lt;/b&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Archetypes&lt;/a&gt; now include all the source for the web modules so using jetty:run and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose with persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &quot;appfuse:full-source&quot;. &lt;/p&gt;

&lt;p&gt;AppFuse comes in a number of different flavors. It offers &quot;light&quot;, &quot;basic&quot; and &quot;modular&quot; and archetypes. Light archetypes use an embedded H2 database and contain a simple CRUD example. Light archetypes allow code generation and full-source features, but do not currently support Stripes or Wicket. Basic archetypes have web services using CXF, authentication from Spring Security and features including signup, login, file upload and CSS theming. Modular archetypes are similar to basic archetypes, except they have multiple modules which allows you to separate your services from your web project.&lt;/p&gt;

&lt;p&gt;AppFuse provides archetypes for JSF, Spring MVC, Struts 2 and Tapestry 5. The light archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket. You can see demos of these archetypes at &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;http://demo.appfuse.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any issues, please report them on the mailing list or &lt;a href=&quot;http://issues.appfuse.org/secure/CreateIssue%21default.jspa&quot;&gt;create an issue in JIRA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot; style=&quot;color: #666&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; style=&quot;color: #666&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot; style=&quot;color: #666&quot;&gt;Contegix&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com&quot; style=&quot;color: #666&quot;&gt;JetBrains&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; style=&quot;color: #666&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project.&lt;/p&gt;&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/livin_it_up_in_vegas</id>
        <title type="html">Livin&apos; it up in Vegas at TSSJS 2011</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/livin_it_up_in_vegas"/>
        <published>2011-03-22T09:04:17-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="vegas" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tssjs" scheme="http://roller.apache.org/ns/tags/" />
        <category term="perfbench" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="liftweb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="video" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="onlinevideo" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Last Wednesday, Trish and I traveled to Las Vegas for &lt;a href=&quot;http://javasymposium.techtarget.com/&quot;&gt;TheServerSide Java Symposium 2011 conference&lt;/a&gt;. We had a free room from TechTarget, but opted to upgrade to a suite with a view over the Bellagio Fountains. Trish won a trip to Vegas as a sales award earlier in the year and cleverly exchanged it for cash, so our upgrade was sort of free. 
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5305/5550023760_e8f128457a.jpg&quot; title=&quot;Caesars Pool&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5305/5550023760_e8f128457a_m.jpg&quot; width=&quot;240&quot; height=&quot;159&quot; alt=&quot;Caesars Pool&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5053/5550024190_b272c2f012.jpg&quot; title=&quot;The Bellagio Fountains&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5053/5550024190_b272c2f012_m.jpg&quot; width=&quot;240&quot; height=&quot;159&quot; alt=&quot;The Bellagio Fountains&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;/p&gt;
My first talk was on Online Video and my experience at Time Warner Cable. With my former team&apos;s &lt;a href=&quot;http://justanotheripadblog.com/ipad-app-reviews/quick-look-twcable-tv-for-ipad-time-warner-cables-new-live-streaming-app-looks-good&quot;&gt;iPad app releasing the day before&lt;/a&gt;, it was a fun session. The attendance was kind of sparse, but I had some good competition so wasn&apos;t surprised.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;object id=&quot;__sse7299514&quot; width=&quot;425&quot; height=&quot;355&quot;&gt; &lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=everythingonlinevideotssjs2011-110317161814-phpapp02&amp;rel=0&amp;stripped_title=everything-you-ever-wanted-to-know-about-online-video-tssjs-2011&amp;userName=mraible&quot; /&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt; &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt; &lt;embed name=&quot;__sse7299514&quot; src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=everythingonlinevideotssjs2011-110317161814-phpapp02&amp;rel=0&amp;stripped_title=everything-you-ever-wanted-to-know-about-online-video-tssjs-2011&amp;userName=mraible&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt; &lt;/object&gt;&lt;/p&gt;
&lt;p&gt;After I finished speaking, we headed to happy hour and met up with some friends that happened to be in town. We had dinner at the &lt;a href=&quot;http://www.toddenglishpub.com/&quot;&gt;Todd English Pub&lt;/a&gt; and headed to the &lt;a href=&quot;http://www.pennandteller.com/&quot;&gt;Penn &amp;amp; Teller&lt;/a&gt; show at the Rio. We closed the night after Trish had a 45-minute roll at the craps table at &lt;a href=&quot;http://www.harrahs.com/osheas/&quot;&gt;O&apos;Sheas&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;We slept in on Thursday and I gave my Comparing JVM Web Frameworks talk that afternoon. I made sure to mention some other methods to choosing web frameworks: doing &lt;a href=&quot;http://code.google.com/p/perfbench/&quot;&gt;performance comparisons&lt;/a&gt; like Peter Thomas has done or &lt;a href=&quot;http://lift.la/my-take-on-matt-raibles-spreadsheet&quot;&gt;choosing Lift&lt;/a&gt; because one of its developers says it&apos;s the best. While Vaadin did sneak into the #5 spot, I made sure and mentioned that Wicket and Tapestry seem to belong there moreso (based on stats, mailing list traffic, etc.).
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;object id=&quot;__sse7299545&quot; width=&quot;425&quot; height=&quot;355&quot;&gt; &lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingjvmwebframeworkstssjs2011-110317162242-phpapp02&amp;rel=0&amp;stripped_title=comparing-jvm-web-frameworks-tssjs-2011&amp;userName=mraible&quot; /&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt; &lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt; &lt;embed name=&quot;__sse7299545&quot; src=&quot;//static.slidesharecdn.com/swf/ssplayer2.swf?doc=comparingjvmwebframeworkstssjs2011-110317162242-phpapp02&amp;rel=0&amp;stripped_title=comparing-jvm-web-frameworks-tssjs-2011&amp;userName=mraible&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt; &lt;/object&gt; 
&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.mcginityphoto.com/&quot;&gt;Trish&lt;/a&gt; took a bunch of pictures during my talk, which had a great turnout and lots of participation.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5131/5550024506_e90c77ff59.jpg&quot; title=&quot;Getting Intro&apos;d&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5131/5550024506_e90c77ff59_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;Getting Intro&apos;d&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5266/5549441719_057d56a957.jpg&quot; title=&quot;My Intro&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5266/5549441719_057d56a957_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;My Intro&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5149/5550024786_52a3f6aaea.jpg&quot; title=&quot;My Dream Bus on Display&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5149/5550024786_52a3f6aaea_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;My Dream on Display&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://farm6.static.flickr.com/5051/5549442047_5defbb12d0.jpg&quot; title=&quot;The Problem&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5051/5549442047_5defbb12d0_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;The Problem&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5173/5550025074_d8af7137ba.jpg&quot; title=&quot;How do you choose?&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5173/5550025074_d8af7137ba_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;How do you choose?&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm6.static.flickr.com/5140/5550025200_a32831f218.jpg&quot; title=&quot;Choosing a Framework&quot; rel=&quot;lightbox[tssjs2011]&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5140/5550025200_a32831f218_t.jpg&quot; width=&quot;100&quot; height=&quot;66&quot; alt=&quot;Choosing a Framework&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot; /&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;That evening, we celebrated St. Patty&apos;s Day with some college buddies of mine, ate great sushi at &lt;a href=&quot;http://www.mandalaybay.com/dining/casual-restaurants/mizuya.aspx&quot;&gt;Mizuya&lt;/a&gt; and experienced the joys of three card poker. Thanks to TechTarget for inviting me to TSSJS 2011; we had an awesome time. You can find all the pictures we took &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157626325120502/&quot;&gt;on Flickr&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; color: #666; padding-top: 5px&quot;&gt;
P.S. If you can&apos;t see the presentations in this post (a.k.a. you don&apos;t have Flash), you can &lt;a href=&quot;http://www.slideshare.net/mraible&quot; style=&quot;color: #666&quot;&gt;view them on on Slideshare&lt;/a&gt; or &lt;a href=&quot;http://raibledesigns.com/rd/page/publications&quot; style=&quot;color: #666&quot;&gt;download the PDFs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/jsr_303_and_web_framework</id>
        <title type="html">JSR 303 and JVM Web Framework Support</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/jsr_303_and_web_framework"/>
        <published>2011-03-08T11:33:24-07:00</published>
        <updated>2012-11-08T14:30:37-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsr303" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lift" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Emmanuel Bernard recently sent an email to the JSR 303 Experts Group about the next revision of the Bean Validation JSR (303). Rather than sending the proposed changes privately, he &lt;a href=&quot;http://in.relation.to/Bloggers/JSRBeanValidation11WhatToPutIn&quot;&gt;blogged about them&lt;/a&gt;. I left a comment with what I&apos;d like to see:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
+1 for Client-side validation. I&apos;d love to see an API that web frameworks can hook into to add &quot;required&quot; to their tags for HTML5. Or some service that can be registered so the client can make Ajax requests to an API to see if an object is valid.
&lt;/p&gt;
&lt;p&gt;Emmanuel replied that most of the necessary API already exists for this, but frameworks have been slow to adopt it.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Hi Matt,
&lt;br/&gt;&lt;br/&gt;
The sad thing is that the API is present on the Bean Validation side but presentation frameworks are slow to adopt it and use it :(
&lt;br/&gt;&lt;br/&gt;
RichFaces 4 now has support for it but I wished more presentation frameworks had worked on the integration. If you can convince a few people or have access to a few people, feel free to send them by me :)
&lt;br/&gt;&lt;br/&gt;
The integration API is &lt;a href=&quot;http://people.redhat.com/~ebernard/validation/#constraintmetadata&quot;&gt;described here&lt;/a&gt;. Let me know if you think some parts are missing or should be improved. We should definitely do some more buzz around it.
&lt;/p&gt;
&lt;p&gt;In the interest of generating more buzz around it, I decided to do some research and see what JVM Frameworks support JSR 303. Here&apos;s what I&apos;ve come up with so far (in no particular order):
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://relation.to/Bloggers/RichFaces4ClientSideValidation&quot;&gt;RichFaces 4 - Client Side Validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tapestry.apache.org/bean-validation.html&quot;&gt;Tapestry&apos;s JSR 303 - Bean Validation Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.zenika.com/index.php?post/2010/02/24/Wicket-JSR-303-Validators&quot;&gt;Wicket JSR-303 Validators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://static.springsource.org/spring/docs/3.0.x/reference/validation.html#validation-mvc-jsr303&quot;&gt;Configuring a JSR-303 Validator for use by Spring MVC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/gwt-validation/&quot;&gt;GWT Validation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.vaadin.com/ticket/3156&quot;&gt;Vaadin Bean Validation JSR 303 support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wstrange.wordpress.com/2009/12/07/inline-field-validation-in-scalalift-using-jpa-and-jsr-303/&quot;&gt;Inline field validation in Scala/Lift using JPA and JSR 303&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Struts 2 has an &lt;a href=&quot;https://issues.apache.org/jira/browse/WW-2563&quot;&gt;open issue&lt;/a&gt;, but doesn&apos;t seem to support JSR 303. Since I did a quick-n-dirty google search for most of these, I&apos;m not sure if they support client-side JavaScript or HTML5&apos;s required. If you know of other JVM-based web frameworks that support JSR 303, please let me know in the comments. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery</id>
        <title type="html">Implementing Ajax Authentication using jQuery, Spring Security and HTTPS</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/implementing_ajax_authentication_using_jquery"/>
        <published>2011-02-23T16:55:55-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="springsecurity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jquery" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="owasp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="authentication" scheme="http://roller.apache.org/ns/tags/" />
        <category term="overstock.com" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="https" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">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.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry</id>
        <title type="html">Implementing Extensionless URLs with Tapestry, Spring MVC, Struts 2 and JSF</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry"/>
        <published>2011-02-10T16:53:27-07:00</published>
        <updated>2011-02-11T00:04:52-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="tapestry5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="extensionlessurls" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">For the past couple of weeks, I&apos;ve spent several evening hours implementing extensionless URLs in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. I&apos;ve been wanting to do this ever since I &lt;a href=&quot;http://raibledesigns.com/rd/entry/extensionless_urls_in_java_web&quot;&gt;wrote about how to do it&lt;/a&gt; a few years ago. This article details my experience and will hopefully help others implement this feature in their webapps.
&lt;/p&gt;
&lt;p&gt;First of all, I used the &lt;a href=&quot;http://www.tuckey.org/urlrewrite/&quot;&gt;UrlRewriteFilter&lt;/a&gt;, one of my favorite Java open source projects. Then I followed a pattern I found in Spring&apos;s &quot;mvc-basic&quot; sample app from &lt;a href=&quot;http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/&quot;&gt;MVC Simplifications in Spring 3.0&lt;/a&gt;. The app has since changed (because SpringSource integrated UrlRewriteFilter-type functionality in Spring MVC), but the pattern was basically path-matching instead of extension-mapping. That is, the &quot;dispatcher&quot; for the web framework was mapped to /app/* instead of *.html. 
&lt;/p&gt;
&lt;p&gt;
Prior to the move to extensionless URLs, AppFuse used *.html for its mapping and this seemed to cause users problems when they wanted to serve up static HTML files. To begin with, I removed all extensions from URLs in tests (&lt;a href=&quot;http://webtest.canoo.com&quot;&gt;Canoo WebTest&lt;/a&gt; is used for testing the UI). I also did this for any links in the view pages and redirects in the Java code. This provided a decent foundation to verify my changes worked. Below are details about each framework I did this for, starting with the one that was easiest and moving to hardest.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tapestry 5&lt;/strong&gt;&lt;br/&gt;
Tapestry was by far the easiest to integrate extensionless URLs into. This is because it&apos;s a native feature of the framework and was already integrated as part of &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1116&quot;&gt;Serge Eby&apos;s Tapestry 5 implementation&lt;/a&gt;. In the end, the only things I had to do where 1) add a couple entries for CXF (mapped to /services/*) and DWR (/dwr/*) to my urlrewrite.xml and 2) change the UrlRewriteFilter so it was only mapped to REQUEST instead of both REQUEST and FORWARD. Below are the mappings I added for CXF and DWR.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;urlrewrite default-match-type=&quot;wildcard&quot;&amp;gt;
    ...
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/dwr/**&amp;lt;/from&amp;gt;
        &amp;lt;to&amp;gt;/dwr/$1&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/services/**&amp;lt;/from&amp;gt;
        &amp;lt;to&amp;gt;/services/$1&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring MVC&lt;/strong&gt;&lt;br/&gt;
I had a fair amount of experience with Spring MVC and extensionless URLs. Both the Spring MVC applications we developed last year at Time Warner Cable used them. To change from a *.html mapping to /app/* was pretty easy and involved removing more code than I added. Previously, I had a &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/common/src/main/java/org/appfuse/webapp/filter/StaticFilter.java?r=3250&quot;&gt;StaticFilter&lt;/a&gt; that looked for HTML files and if it didn&apos;t find them, it dispatched to Spring&apos;s DispatcherServlet. I was able to remove this class and make the web.xml file quite a bit cleaner. 
&lt;/p&gt;
&lt;p&gt;To make UrlRewriteFilter and Spring Security play well together, I had to move the securityFilter so it came &lt;em&gt;after&lt;/em&gt; the rewriteFilter and add an INCLUDE dispatcher so included JSPs would have a security context available to them. 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The only other things I had to change were &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/security.xml?r2=3458&amp;r1=3379&quot;&gt;security.xml&lt;/a&gt; and &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/dispatcher-servlet.xml?r2=3458&amp;r1=3334&quot;&gt;dispatcher-servlet.xml&lt;/a&gt; to remove the .html extensions. The urlrewrite.xml file was fairly straightforward. I used the following at the bottom as a catch-all for dispatching to Spring MVC.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/**&amp;lt;/from&amp;gt;
    &amp;lt;to&amp;gt;/app/$1&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule&amp;gt;
    &amp;lt;from&amp;gt;/app/**&amp;lt;/from&amp;gt;
    &amp;lt;to&amp;gt;/$1&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Then I added a number of other rules for j_security_check, DWR, CXF and static assets (/images, /scripts, /styles, /favicon.ico). You can view the &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;current urlrewrite.xml in FishEye&lt;/a&gt;. The only major issue I ran into was that Spring Security recorded protected URLs as /app/URL so I had to add a rule to redirect when this happened after logging in.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/app/**&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot; type=&quot;redirect&quot;&amp;gt;%{context-path}/$1&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Struts 2&lt;/strong&gt;&lt;br/&gt;
Using extensionless URLs with Struts 2 is likely pretty easy thanks to the &lt;a href=&quot;http://struts.apache.org/2.1.8/docs/convention-plugin.html&quot;&gt;Convention Plugin&lt;/a&gt;. Even though this plugin is included in AppFuse, it&apos;s not configured with the proper &lt;a href=&quot;http://struts.apache.org/2.1.8/docs/converting-application-from-codebehind-to-convention-plugin.html&quot;&gt;constants&lt;/a&gt; and I have struts.convention.action.disableScanning=true in struts.xml. It looks like I had to do this when I &lt;a href=&quot;http://appfuse.markmail.org/thread/ktbqtx2mslvrkjkq&quot;&gt;upgraded from Struts 2.0.x to Struts 2.1.6&lt;/a&gt;. It&apos;s true AppFuse&apos;s Struts 2 support could use a bit of love to be aligned with Struts 2&apos;s recommended practices, but I didn&apos;t want to spend the time doing it as part of this exercise. 
&lt;/p&gt;
&lt;p&gt;With Struts 2, I tried the path-mapping like I did with Spring MVC, but ran into issues. Instead, I opted to use an &quot;.action&quot; extension by changing &lt;code&gt;struts.action.extension&lt;/code&gt; from &quot;html&quot; to &quot;action,&quot; in struts.xml. Then I had to do a bunch of filter re-ordering and dispatcher changes. Before, with a .html extension, I had all filters mapped to /* and in the following order.&lt;/p&gt;
&lt;table class=&quot;comparison&quot; style=&quot;width: 250px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter Name&lt;/th&gt;&lt;th&gt;Dispatchers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;securityFilter&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rewriteFilter&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts-prepare&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemesh&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;staticFilter&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Similar to Spring MVC, I had to remove the rewriteFilter in front of the securityFilter and I was able to remove the staticFilter. I also had to map the struts filter to *.action instead of /* to stop Struts from trying to catch static asset and DWR/CXF requests. Below is the order of filters and their dispatchers that seems to work best.
&lt;table class=&quot;comparison&quot; style=&quot;width: 250px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter Name&lt;/th&gt;&lt;th&gt;Dispatchers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rewriteFilter&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;securityFilter&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts-prepare&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemesh&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts&lt;/td&gt;
&lt;td&gt;forward&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;From there, it was a matter of modifying &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/struts/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;urlrewrite.xml&lt;/a&gt; to have the following catch-all and rules for static assets, j_security_check and DWR/CXF.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(&amp;#91;^?&amp;#93;*)/(&amp;#91;^?/\.&amp;#93;+)(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot;&amp;gt;$1/$2.action$3&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(.*)\.action(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;false&quot;&amp;gt;$1$2&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JSF&lt;/strong&gt;&lt;br/&gt;
JSF was by far the most difficult to get extensionless URLs working with. I&apos;m not convinced it&apos;s impossible, but I spent a several hours over a few days and was unsuccessful in completely removing them. I was able to make things work so I could request pages without an extension, but found when clicking buttons and links, the extension would often show up in the URL. I&apos;m also still using JSF 1.2, so it&apos;s possible that upgrading to 2.0 would solve many of the issues I encountered. &lt;/p&gt;
&lt;p&gt;For the time being, I&apos;ve changed my FacesServlet mapping from *.html to *.jsf. As with Struts, I had issues when I tried to map it to /app/*. Other changes include &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/web.xml?r1=3384&amp;r2=3458#l188&quot;&gt;changing the order of dispatchers and filters&lt;/a&gt;, the good ol&apos; catch-all in &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;urlrewrite.xml&lt;/a&gt; and &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/security.xml?r1=3384&amp;r2=3458#l188&quot;&gt;modifying security.xml&lt;/a&gt;. For some reason, I wasn&apos;t able to get file upload working without adding an exception to the outbound-rule.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(&amp;#91;^?&amp;#93;*)/(&amp;#91;^?/\.&amp;#93;+)(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot;&amp;gt;$1/$2.jsf&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule match-type=&quot;regex&quot;&amp;gt;
  &amp;lt;!-- TODO: Figure out how to make file upload work w/o using *.jsf --&amp;gt;
    &amp;lt;condition type=&quot;path-info&quot;&amp;gt;selectFile&amp;lt;/condition&amp;gt;
    &amp;lt;from&amp;gt;^(.*)\.jsf(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;false&quot;&amp;gt;$1$2&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also spent a couple hours trying to get &lt;a href=&quot;http://ocpsoft.com/prettyfaces/&quot;&gt;Pretty Faces&lt;/a&gt; to work. I wrote about my issues &lt;a href=&quot;http://ocpsoft.com/support/topic/rewrite-every-jsf&quot;&gt;on the forums&lt;/a&gt;. I tried writing a custom Processor to strip the extension, but found that I&apos;d get into an infinite loop where the processor kept getting called. To workaround this, I tried using Spring&apos;s RequestContextHolder to ensure the processor only got invoked once, but that proved fruitless. Finally, I tried inbound &lt;em&gt;and&lt;/em&gt; outbound custom processors, but failed to get those working. The final thing I tried was url-mappings for each page in pretty-config.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/admin/users&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/admin/users.jsf&quot;/&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/mainMenu&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/mainMenu.jsf&quot;/&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The issue with doing this was that some of the navigation rules in my faces-config.xml stopped working. I didn&apos;t spend much time trying to diagnose the problem because I didn&apos;t like having to add an entry for each page in the application. The one nice thing about Pretty Faces is it did allow me to do things like the following, which I formerly did with a form that auto-submitted when the page loaded.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/passwordHint/#{username}&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/passwordHint.jsf&quot;/&amp;gt;
  &amp;lt;action&amp;gt;#{passwordHint.execute}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
My journey implementing extensionless URLs was an interesting one, and I solidified my knowledge about ordering of filters, dispatchers and the UrlRewriteFilter. I still think I have more to learn about properly implementing extensionless URLs in Struts 2 and JSF and I hope to do that in the near future. I believe Struts&apos; Convention Plugin will help me and JSF 2 + Pretty Faces will hopefully work nicely too. Of course, it&apos;d be great if all Java Web Frameworks had an easy mechanism for producing and consuming extensionless URLs. In the meantime, thank goodness for the UrlRewriteFilter.
&lt;/p&gt;
&lt;p&gt;If you&apos;d like to try AppFuse and its shiny new URLs, see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; and choose the 2.1.0-SNAPSHOT version.

</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/how_i_calculated_ratings_for</id>
        <title type="html">How I Calculated Ratings for My JVM Web Frameworks Comparison</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/how_i_calculated_ratings_for"/>
        <published>2010-12-06T11:55:18-07:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="devoxx2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lift" scheme="http://roller.apache.org/ns/tags/" />
        <category term="comparingwebframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworksmatrix" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">When I re-wrote my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks&quot;&gt;Comparing JVM Web Frameworks presentation&lt;/a&gt; from scratch, I decided to add a &lt;a href=&quot;http://bit.ly/jvm-frameworks-matrix&quot;&gt;matrix&lt;/a&gt; that allows you to rate a framework based on &lt;a href=&quot;https://docs.google.com/document/pub?id=1jAGPWwlEcYikqOPg8faYgRV7cQNS_iCCoJ1VNc_99M4&quot;&gt;20 different criteria&lt;/a&gt;. The reason I did this was because I&apos;d used this method when &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results&quot;&gt;choosing an Ajax framework for Evite&lt;/a&gt; last year. The matrix seemed to work well for selecting the top 5 frameworks, but it also inspired a lot of discussion in the community that my &lt;a href=&quot;http://ptrthomas.wordpress.com/2010/12/04/comparing-jvm-web-frameworks-a-response-to-matt-raible/&quot;&gt;ratings&lt;/a&gt; &lt;a href=&quot;http://blog.frankel.ch/critical-analysis-of-frameworks-comparison&quot;&gt;were&lt;/a&gt; &lt;a href=&quot;http://basementcoders.com/2010/12/episode-27-hudson-oracle-raible-and-astycrapper/&quot;&gt;wrong&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;I expected this, as I certainly don&apos;t know every framework as well as I&apos;d like. The mistake I made was asking for the community to provide feedback on my ratings without describing how I arrived at them. From &lt;a href=&quot;http://ptrthomas.wordpress.com/2010/12/04/comparing-jvm-web-frameworks-a-response-to-matt-raible/&quot;&gt;Peter Thomas&apos;s blog&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
What you are doing is adjusting ratings based on who in the community shouts the loudest. I can&apos;t help saying that this approach comes across as highly arrogant and condescending, you seem to expect framework developers and proponents to rush over and fawn over you to get better ratings, like waiters in a restaurant trying to impress a food-critic for Michelin stars.
&lt;/p&gt;
&lt;p&gt;
I apologize for giving this impression. It certainly wasn&apos;t my intent. By having simple numbers (1.0 == framework does well, 0.5 == framework is OK and 0 == framework not good at criteria) with no rationalization, I can see how the matrix can be interpreted as useless (or to put it bluntly, as &lt;a href=&quot;http://basementcoders.com/2010/12/episode-27-hudson-oracle-raible-and-astycrapper/&quot;&gt;something you should wipe your ass with&lt;/a&gt;). I don&apos;t blame folks for getting angry.&lt;/p&gt;
&lt;p&gt;For my Rich Web Experience presentation, I documented why I gave each framework the rating I did. Hopefully this will allow folks to critique my ratings more constructively and I can make the numbers more accurate. You can view this document below or &lt;a href=&quot;http://bit.ly/jvm-webfwk-ratings-logic&quot;&gt;on Google Docs&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;//docs.google.com/document/pub?id=1X_XvpJd6TgEAMe4a6xxzJ38yzmthvrA6wD7zGy2Igog&amp;amp;embedded=true&quot; style=&quot;width: 100%; border: 1px solid silver; height: 400px&quot;&gt;&lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;In the end, what I was hoping to do with this matrix was to simply highlight a &lt;em&gt;technique&lt;/em&gt; for choosing a web framework. Furthermore, I think adding a &quot;weight&quot; to each criteria is important because things like books often aren&apos;t as important as REST support. To show how this might be done, I added a second sheet to the matrix and made up some weighting numbers. I&apos;d expect anyone that wants to use this to &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/JVM_Web_Framework_Matrix_20101206.xls&quot;&gt;downloaded the matrix&lt;/a&gt;, verify the ratings are accurate for your beliefs and weight the criteria accordingly.
&lt;/p&gt;
&lt;p&gt;
Of course, as I and many others have said, the best way to choose a web framework is to try them yourself. I emphasized this at the end of my presentation with the following two slides.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5238846712/&quot; title=&quot;Slide #77 from Comparing JVM Web Frameworks Talk at RWX2010&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5281/5238846712_375a63e4c6.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Slide #77 from Comparing JVM Web Frameworks Talk at RWX2010&quot; /&gt;&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.flickr.com/photos/mraible/5238846740/&quot; title=&quot;Slide #76 from Comparing JVM Web Frameworks Talk at RWX2010&quot;&gt;&lt;img src=&quot;//farm6.static.flickr.com/5129/5238846740_29b06ee0eb.jpg&quot; width=&quot;500&quot; height=&quot;375&quot; alt=&quot;Slide #76 from Comparing JVM Web Frameworks Talk at RWX2010&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks</id>
        <title type="html">My Comparing JVM Web Frameworks Presentation from Devoxx 2010</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/my_comparing_jvm_web_frameworks"/>
        <published>2010-11-18T05:23:10-07:00</published>
        <updated>2015-08-23T18:57:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rubyonrails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jvm" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx2010" scheme="http://roller.apache.org/ns/tags/" />
        <category term="playframework" scheme="http://roller.apache.org/ns/tags/" />
        <category term="lift" scheme="http://roller.apache.org/ns/tags/" />
        <category term="devoxx" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="gwt" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="vaadin" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="flex" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This week, I&apos;ve been having a great time in Antwerp, Belgium at the &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Home&quot;&gt;Devoxx&lt;/a&gt; Conference. This morning, I had the pleasure of delivering my &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Comparing+JVM+Web+Frameworks&quot;&gt;Comparing JVM Web Frameworks&lt;/a&gt; talk. I thoroughly enjoyed giving this presentation, especially to such a large audience. You can view the presentation below (if you have Flash installed) or &lt;a href=&quot;http://static.raibledesigns.com/repository/presentations/Comparing_JVM_Web_Frameworks_Devoxx2010.pdf&quot;&gt;download it here&lt;/a&gt;.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/uBZoC22SGdjpFy&quot; width=&quot;510&quot; height=&quot;420&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt;
&lt;/p&gt;
&lt;p&gt;
Unlike previous years, I chose to come up with a &lt;a href=&quot;http://bit.ly/jvm-frameworks-matrix&quot;&gt;spreadsheet matrix&lt;/a&gt; that shows why I chose the 5 I did. This spreadsheet and rankings given to each framework are likely to be debated, as I don&apos;t know all the frameworks as well as I&apos;d like to. Also, the missing column on this spreadsheet is a &quot;weighting&quot; column where you can prioritize certain criteria like I&apos;ve done in the past when &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajax_framework_analysis_results&quot;&gt;Comparing Ajax Frameworks&lt;/a&gt;. If you believe there are incorrect numbers, please let me know and I&apos;ll try to get those fixed before I do this talk again at &lt;a href=&quot;http://www.therichwebexperience.com/conference/fort_lauderdale/2010/11/home&quot;&gt;The Rich Web Experience&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
One thing that doesn&apos;t come across in this presentation is that I believe &lt;em&gt;anyone&lt;/em&gt; can use this matrix, and weightings, to make &lt;em&gt;any&lt;/em&gt; of these frameworks come out on top. I also believe web frameworks are like spaghetti sauce in &lt;a href=&quot;http://www.gladwell.com/2004/2004_09_06_a_ketchup.html&quot;&gt;The Ketchup Conundrum&lt;/a&gt;. That is, the only way to make more happy spaghetti sauce lovers was to make more &lt;em&gt;types&lt;/em&gt; of spaghetti sauce. You can read more about this in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/there_is_no_best_web&quot;&gt;There is no &quot;best&quot; web framework&lt;/a&gt; article.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If you disagree with the various ratings I gave to web frameworks in this presentation, please provide your opinions by &lt;a href=&quot;http://bit.ly/webmatrixsurvey&quot;&gt;filling out this survey&lt;/a&gt;. Thanks to &lt;a href=&quot;http://twitter.com/sarbogast&quot;&gt;Sebastien Arbogast&lt;/a&gt; for setting this up.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Sebastien has posted his survey results at &lt;a href=&quot;http://sebastien-arbogast.com/2010/11/19/jvm-web-framework-survey-first-results/&quot;&gt;JVM Web Framework Survey, First Results&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 12/6:&lt;/strong&gt; A video of this presentation is &lt;a href=&quot;http://parleys.com/d/2118&quot;&gt;now available on Parleys.com&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;
P.S. My current gig is ending in mid-December. If you&apos;re looking for a UI Architect with a passion for open source frameworks, please &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;let me know&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_2</id>
        <title type="html">AppFuse 2.1 Milestone 2 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_2"/>
        <published>2010-11-15T15:28:57-07:00</published>
        <updated>2010-11-15T22:37:10-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="archetypes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven3" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I&apos;m pleased to announce the 2nd milestone release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are Spring 3 and Struts 2.1. This release fixes many issues with archetypes and contains many improvements to support Maven 3. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0+M2&quot;&gt;2.1.0 M2 release notes&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;
AppFuse is an open source project and application that uses open source frameworks to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time when building new web applications. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project. If you use &lt;a href=&quot;http://raibledesigns.com/rd/entry/using_jrebel_with_intellij_idea&quot;&gt;JRebel with AppFuse&lt;/a&gt;, you can achieve zero-turnaround in your project and develop features without restarting the server.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;
Release Details&lt;/strong&gt;&lt;br/&gt;
Archetypes now include all the source for the web modules so using jetty:run and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose with persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &quot;appfuse:full-source&quot;.
&lt;/p&gt;
&lt;p&gt;
AppFuse comes in a number of different flavors. It offers &quot;light&quot;, &quot;basic&quot; and &quot;modular&quot; and archetypes. Light archetypes use an embedded H2 database and contain a simple CRUD example. In the final 2.1.0 release, the light archetypes will allow code generation like the basic and modular archetypes. Basic archetypes have web services using CXF, authentication from Spring Security and features including signup, login, file upload and CSS theming. Modular archetypes are similar to basic archetypes, except they have multiple modules which allows you to separate your services from your web project.
&lt;/p&gt;
&lt;p&gt;
AppFuse provides &lt;a href=&quot;http://static.appfuse.org/archetype.html&quot;&gt;archetypes&lt;/a&gt; for JSF, Spring MVC, Struts 2 and Tapestry 5. The light archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket.
&lt;/p&gt;
&lt;p&gt;
Please note that this release does not contain updates to the documentation. Code generation will work, but it&apos;s likely that some content in the &lt;a href=&quot;http://appfuse.org/display/APF/Tutorials&quot;&gt;tutorials&lt;/a&gt; won&apos;t match. For example, you can use annotations (vs. XML) for Spring MVC and Tapestry is a whole new framework. I&apos;ll be working on documentation over the next several weeks in preparation for the 2.1 final release.
&lt;/p&gt;
&lt;p&gt;
For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find bugs, please &lt;a href=&quot;http://issues.appfuse.org/browse/APF&quot;&gt;create an issue in JIRA&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_1</id>
        <title type="html">AppFuse 2.1 Milestone 1 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_1"/>
        <published>2009-11-19T07:16:36-07:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="archetypes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse-light" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the first milestone release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_hibernate_to_3_4&quot;&gt;Hibernate&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/moving_from_spring_s_xml&quot;&gt;Spring&lt;/a&gt; and Tapestry 5. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;
AppFuse is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Release Details&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Archetypes&lt;/a&gt; now include all the source for the web modules so using &lt;em&gt;jetty:run&lt;/em&gt; and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose which persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &lt;em&gt;appfuse:full-source&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;
In addition, AppFuse Light has been &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;converted to Maven&lt;/a&gt; and has archetypes available. AppFuse provides archetypes for JSF, Spring MVC, Struts 2 and Tapestry 5. The &lt;em&gt;light&lt;/em&gt; archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket.
&lt;/p&gt;
&lt;p&gt;Other notable improvements:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Added &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;Compass support&lt;/a&gt; thanks to a patch from &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded from &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1125&quot;&gt;XFire to CXF&lt;/a&gt; for Web Services.&lt;/li&gt;
&lt;li&gt;Moved Maven repository to &lt;a href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;Sonatype&apos;s OSS Repository Hosting&lt;/a&gt; for snapshots and releasing to Maven Central. There are no longer any AppFuse-specific artifacts, all are available in central. Thanks to &lt;a href=&quot;http://sonatype.com&quot;&gt;Sonatype&lt;/a&gt; for this great service and its &lt;a href=&quot;http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass&quot;&gt;excellent repository manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded to Canoo WebTest 3.0. &lt;em&gt;Now if we could just get its &lt;a href=&quot;http://people.apache.org/~sgoeschl/download/maven-plugins/webtest-maven-plugin/site/index.html&quot;&gt;Maven Plugin&lt;/a&gt; moved to Codehaus.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body&quot;&gt;Ajaxified Body&lt;/a&gt; to AppFuse Light archetypes.&lt;/li&gt;
&lt;li&gt;Infrastructure upgrades, including &lt;a href=&quot;http://issues.appfuse.org/&quot;&gt;JIRA 4&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org/&quot;&gt;Confluence 3&lt;/a&gt;, &lt;a href=&quot;http://source.appfuse.org&quot;&gt;FishEye 2&lt;/a&gt;, &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;Bamboo 2&lt;/a&gt; and &lt;a href=&quot;http://login.appfuse.org&quot;&gt;Crowd 1.6&lt;/a&gt;. Many thanks to &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt; and &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; for their excellent products and services.&lt;/li&gt;
&lt;li&gt;For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0+M1&quot; title=&quot;Release Notes 2.1.0 M1&quot;&gt;release notes&lt;/a&gt;.
&lt;/ul&gt;
&lt;p&gt;Please note that this release does not contain updates to the documentation. Code generation will work, but it&apos;s likely that some content in the &lt;a href=&quot;http://appfuse.org/display/APF/Tutorials&quot;&gt;tutorials&lt;/a&gt; won&apos;t match. For example, you can use annotations (vs. XML) for dependency injection and Tapestry is a whole new framework. I&apos;ll be working on documentation over the next several weeks in preparation for Milestone 2.
&lt;/p&gt;
&lt;p&gt;AppFuse is available as several Maven archetypes. For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
To learn more about AppFuse, please read Ryan Withers&apos; &lt;a href=&quot;http://www.ociweb.com/jnb/jnbMay2008.html&quot;&gt;Igniting your applications with AppFuse&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;The 2.x series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find bugs, please &lt;a href=&quot;http://issues.appfuse.org/secure/CreateIssue!default.jspa&quot;&gt;create an issue in JIRA&lt;/a&gt;.&lt;/p&gt; 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. </content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/re_which_is_the_hottest</id>
        <title type="html">RE: Which is the Hottest Java Web Framework?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/re_which_is_the_hottest"/>
        <published>2008-06-10T22:39:08-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://www.breakitdownblog.com&quot;&gt;The &quot;Break it Down&quot; Blog&lt;/a&gt; has a lengthy post on &lt;a href=&quot;http://www.breakitdownblog.com/which-is-the-hottest-java-web-framework-or-maybe-not-java/&quot;&gt;Which is the Hottest Java Web Framework? Or Maybe Not Java?&lt;/a&gt; Comparing Java Web Frameworks is hard because so many people are passionate about the framework they know best. Add a couple more like Flex and Ruby on Rails and its downright difficult. Nevertheless, this post is good in that it contains a lot of pretty trend graphs and it looks like the author has done some good research. It&apos;s likely the folks that will scream foul are the ones that did poor in the comparison (Tapestry and Stripes, I&apos;m talking about you).
&lt;/p&gt;
&lt;p&gt;
Surprising among the top Java Web Frameworks is the rise of Struts 2:&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.google.com/trends?q=(apache+wicket)+|+wicket%2C+(jboss+seam)%2C+(spring+mvc)+|+(spring+webflow)+|+(spring+web+flow)%2C+(struts+2)+|+(struts2)&amp;amp;ctab=0&amp;amp;geo=all&amp;amp;date=all&amp;amp;sort=0&quot;&gt;
&lt;img src=&quot;//farm4.static.flickr.com/3273/2569872382_c230627f2d.jpg&quot; alt=&quot;Google Trends Graph&quot; width=&quot;500&quot; height=&quot;270&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;To quote:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Which is much more interesting I think is how Wicket adoption has stayed almost flat while Struts 2 adoption has spiked. Spring MVC/WebFlow seems to be going no where fast and racing JBoss Seam there.
&lt;br/&gt;&lt;br/&gt;
The popularity of Struts 2 really caught me off guard with it being quite a bit different from Struts 1, I figured it got thrown into the &quot;just another web framework&quot; category, but I guess there is something in a name and it&apos;s doing quite well.
&lt;/p&gt;
&lt;p&gt;Regardless of what you think of the post and trends, you have to appreciate the amount of time the author put into it.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/spring_mvc_vs_jsf_and</id>
        <title type="html">Spring MVC vs. JSF and The State of Spring Web</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/spring_mvc_vs_jsf_and"/>
        <published>2008-05-16T18:17:52-06:00</published>
        <updated>2012-11-08T14:34:44-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://altadult.blogspot.com&quot;&gt;Alternative Adult&lt;/a&gt; has only posted a couple times in 2008, but his entries have peaked my interest.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://altadult.blogspot.com/2008/05/spring-mvc-or-jsf.html&quot;&gt;Spring MVC or JSF+?&lt;/a&gt;&lt;br/&gt;My business unit is trying to standardize if we can on a single Java-based Web framework going forward to simplify the Web development process, especially as individual developers move from one division to another, or centralized support groups need to maintain multiple applications from multiple divisions.
&lt;br/&gt;&lt;br/&gt;
At the enterprise level within my company, the architecture group says that they will provide support for either Spring MVC or JSF+ (where the + represents the accompanying technologies you would use to provide a more maintainable application and a more rich user experience, e.g. Facelets, Richfaces, etc.).
&lt;br/&gt;&lt;br/&gt;
Now my business unit is trying to decide which of these two frameworks, Spring MVC or JSF+, is the most appropriate to standardize upon for our development community. [&lt;a href=&quot;http://altadult.blogspot.com/2008/05/spring-mvc-or-jsf.html&quot;&gt;Read More&lt;/a&gt;]&lt;br/&gt;
&lt;br/&gt;...and...&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://altadult.blogspot.com/2008/05/state-of-spring-web.html&quot;&gt;State of Spring Web&lt;/a&gt;&lt;br/&gt;
For those that are interested, the following is a summary of the notes I captured from a conversation with SpringSource on the state of Spring Web. [&lt;a href=&quot;http://altadult.blogspot.com/2008/05/state-of-spring-web.html&quot;&gt;Read More&lt;/a&gt;]
&lt;/p&gt;
&lt;p&gt;Good stuff Michael - keep it coming.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_2_released</id>
        <title type="html">AppFuse 2.0.2 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_2_released"/>
        <published>2008-05-11T23:25:40-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0.2. This release includes upgrades to Spring Security 2.0, jMock 2.4, the ability to customize code generation templates and many bug fixes.&lt;/p&gt;

&lt;p&gt;For information on upgrading from 2.0.1, see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.2&quot; title=&quot;Release Notes 2.0.2&quot;&gt;Release Notes&lt;/a&gt; or &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.2#ReleaseNotes2.0.2-changelog&quot;&gt;changelog&lt;/a&gt;. AppFuse 2.0.2 is available as a Maven archetype. For information on creating a new project using AppFuse, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;demos and videos&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
To learn more about AppFuse, please read Ryan Withers&apos; &lt;a href=&quot;http://www.ociweb.com/jnb/jnbMay2008.html&quot;&gt;Igniting your applications with AppFuse&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Please post any issues you have with this release to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0.2-Released-td17181660s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_1_8_2</id>
        <title type="html">AppFuse Light 1.8.2 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_1_8_2"/>
        <published>2008-05-11T22:16:17-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jdo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springjdbc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="velocity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ojb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsp" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">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;.
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/running_spring_mvc_web_applications</id>
        <title type="html">Running Spring MVC Web Applications in OSGi</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/running_spring_mvc_web_applications"/>
        <published>2008-04-30T00:42:34-06:00</published>
        <updated>2008-04-30T06:51:04-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="osgi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="equinox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">For the past couple of weeks, I&apos;ve been developing a web application that deploys into an OSGi container (Equinox) and uses Spring DM&apos;s &lt;a href=&quot;http://static.springframework.org/osgi/docs/1.1.0-m2/reference/html/web.html#web:spring-mvc&quot;&gt;Spring MVC support&lt;/a&gt;. The first thing I discovered was that Spring MVC&apos;s annotations weren&apos;t supported in the M1 release. This was apparently caused by a &lt;a href=&quot;http://groups.google.com/group/spring-osgi/browse_thread/thread/cf1fa802f846feac/b0f7483ea63b8f8e?lnk=gst#b0f7483ea63b8f8e&quot;&gt;bug &lt;/a&gt; in Spring 2.5.3 and not Spring DM. Since Spring DM 1.1.0 M2 was released with Spring 2.5.4 &lt;a href=&quot;http://www.springframework.org/node/646&quot;&gt;today&lt;/a&gt;, I believe this is fixed now.
&lt;/p&gt;
&lt;p&gt;The story below is about my experience getting a Spring MVC application up and running in Equinox 3.2.2, Jetty 6.1.9 and Spring DM 1.1.0 M2 SNAPSHOT (from last week). If you want to read more about why Spring MVC + OSGi is cool, see Costin Leau&apos;s &lt;a href=&quot;http://blog.springsource.com/main/2008/04/29/web-applications-and-osgi/&quot;&gt;Web Applications and OSGi&lt;/a&gt; article.&lt;/p&gt;
&lt;p&gt;To get a simple &quot;Hello World&quot; Spring MVC application working in OSGi is pretty easy. The hard part is setting up a container with all the Spring and Jetty bundles installed and started. I imagine &lt;a href=&quot;http://www.infoq.com/news/2008/04/springsource-app-platform&quot;&gt;SSAP&lt;/a&gt; might solve this. Luckily for me, this was done by another member of my team.&lt;/p&gt;
&lt;p&gt;After you&apos;ve done this, it&apos;s simply a matter of creating a MANIFEST.MF for your WAR that contains the proper information for OSGi to recognize. Below is the one that I used when I first tried to get my application working. 
&lt;/p&gt;
&lt;pre&gt;
Manifest-Version: 1
Bundle-ManifestVersion: 2
Spring-DM-Version: 1.1.0-m2-SNAPSHOT
Spring-Version: 2.5.2
Bundle-Name: Simple OSGi War
Bundle-SymbolicName: myapp
Bundle-Classpath: .,WEB-INF/classes,WEB-INF/lib/freemarker-2.3.12.jar,
 WEB-INF/lib/sitemesh-2.3.jar,WEB-INF/lib/urlrewritefilter-3.0.4.jar,
 WEB-INF/lib/spring-beans-2.5.2.jar,WEB-INF/lib/spring-context-2.5.2.jar,
 WEB-INF/lib/spring-context-support-2.5.2.jar,WEB-INF/lib/spring-core-2.5.2.jar,
 WEB-INF/lib/spring-web-2.5.2.jar,WEB-INF/lib/spring-webmvc-2.5.2.jar 
Import-Package: javax.servlet,javax.servlet.http,javax.servlet.resources,javax.swing.tree,
 javax.naming,org.w3c.dom,org.apache.commons.logging,javax.xml.parsers;resolution:=optional,
 org.xml.sax;resolution:=optional,org.xml.sax.helpers;resolution:=optional
&lt;/pre&gt;
&lt;p class=&quot;smokey&quot;&gt;Ideally, you could generate this MANIFEST.MF using the &lt;a href=&quot;http://felix.apache.org/site/maven-bundle-plugin-bnd.html&quot;&gt;maven-bundle-plugin&lt;/a&gt;. However, it &lt;a href=&quot;http://www.nabble.com/Is-it-possible-to-use-the-maven-bundle-plugin-on-a-WAR-project--ts16763483.html&quot;&gt;doesn&apos;t support WARs&lt;/a&gt; in its 1.4.0 release.&lt;/p&gt;

&lt;p&gt;You can see this is an application that uses Spring MVC, FreeMarker, SiteMesh and the URLRewriteFilter. You should be able to &lt;a href=&quot;http://static.raibledesigns.com/downloads/myapp-noosgi.zip&quot;&gt;download it&lt;/a&gt;, unzip it, run &quot;mvn package&quot; and install it into Equinox using &quot;install file://&amp;lt;path to war&gt;&quot;.&lt;/p&gt;
&lt;p&gt;That&apos;s all fine and dandy, but doesn&apos;t give you any benefits of OSGi. This setup works great until you try to import OSGi services using a context file with an &lt;strong&gt;&amp;lt;osgi:reference&gt;&lt;/strong&gt; element. After adding such a reference, it&apos;s likely you&apos;ll get the following error:
&lt;/p&gt;
&lt;pre&gt;
SEVERE: Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
Configuration problem: Unable to locate Spring NamespaceHandler for
XML schema namespace [http://www.springframework.org/schema/osgi]
&lt;/pre&gt;
&lt;p&gt;To fix this, add the following to your web.xml (if you&apos;re using ContextLoaderListener, as an &amp;lt;init-parameter&amp;gt; on DispatcherServlet if you&apos;re not):&lt;/p&gt;
&lt;pre&gt;
  &amp;lt;context-param&amp;gt;
    &amp;lt;param-name&amp;gt;contextClass&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext&amp;lt;/param-value&amp;gt;
  &amp;lt;/context-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After doing this, you might get the following error on startup:&lt;/p&gt;
&lt;pre&gt;
SEVERE: Context initialization failed
org.springframework.context.ApplicationContextException: Custom
context class [org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext]
is not of type [org.springframework.web.context.ConfigurableWebApplicationContext] 
&lt;/pre&gt;
&lt;p&gt;To fix this, I change from referencing the Spring JARs in WEB-INF/lib
to importing the packages for Spring (which were already installed in my
Equinox container).
&lt;/p&gt;
&lt;pre&gt;
Bundle-Classpath: .,WEB-INF/classes,WEB-INF/lib/freemarker-2.3.12.jar,
 WEB-INF/lib/sitemesh-2.3.jar,WEB-INF/lib/urlrewritefilter-3.0.4.jar
Import-Package:
javax.servlet,javax.servlet.http,javax.servlet.resources,javax.swing.tree,
 javax.naming,org.w3c.dom,org.apache.commons.logging,javax.xml.parsers;resolution:=optional,
 org.xml.sax;resolution:=optional,org.xml.sax.helpers;resolution:=optional,
 org.springframework.osgi.web.context.support,
 org.springframework.context.support,
 org.springframework.web.context,
 org.springframework.web.context.support,
 org.springframework.web.servlet,
 org.springframework.web.servlet.mvc,
 org.springframework.web.servlet.mvc.support,
 org.springframework.web.servlet.view,
 org.springframework.ui,
 org.springframework.web.servlet.view.freemarker 
&lt;/pre&gt;
&lt;p&gt;After rebuilding my WAR and reloading the bundle in Equinox, I was confronted with the following error message:&lt;/p&gt;
&lt;pre&gt;
SEVERE: Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error
creating bean with name &apos;freemarkerConfig&apos; defined in ServletContext
resource [/WEB-INF/myapp-servlet.xml]: Instantiation of bean failed;
nested exception is java.lang.NoClassDefFoundError:
freemarker/cache/TemplateLoader
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:851) 
&lt;/pre&gt;
&lt;p&gt;As far as I can tell, this is because the version of Spring MVC installed in Equinox
cannot resolve the FreeMarker JAR in my WEB-INF/lib directory.
&lt;/p&gt;
&lt;p&gt;To prove I wasn&apos;t going insane, I commented out my &quot;freemarkerConfig&quot; and &quot;viewResolver&quot; beans in myapp-servlet.xml and changed to a regular ol&apos; InternalResourceViewResolver:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;bean id=&quot;viewResolver&quot; class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
    &amp;lt;property name=&quot;prefix&quot; value=&quot;/&quot;/&amp;gt;
    &amp;lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;/&amp;gt;
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This worked and I was able to successfully see &quot;Hello World&quot; from a JSP in my browser. FreeMarker/SiteMesh worked too, but FreeMarker didn&apos;t work as a View for Spring MVC.
&lt;/p&gt;
&lt;p&gt;
To attempt to solve this, I create a &lt;a href=&quot;http://static.raibledesigns.com/downloads/freemarker-2.3.12-bundle.jar&quot;&gt;bundle for FreeMarker&lt;/a&gt; using &quot;java -jar
bnd-0.0.249.jar wrap freemarker-2.3.12.jar&quot; and installed it in Equinox.
I then change my MANIFEST.MF to use FreeMarker imports instead of
referencing the JAR in WEB-INF/lib.
&lt;/p&gt;
&lt;pre&gt;
Bundle-Classpath:
.,WEB-INF/classes,WEB-INF/lib/sitemesh-2.3.jar,WEB-INF/lib/urlrewritefilter-3.0.4.jar
Import-Package:
javax.servlet,javax.servlet.http,javax.servlet.resources,javax.swing.tree,
 javax.naming,org.w3c.dom,org.apache.commons.logging,javax.xml.parsers;resolution:=optional,
 org.xml.sax;resolution:=optional,org.xml.sax.helpers;resolution:=optional,
 org.springframework.osgi.web.context.support,
 org.springframework.context.support,
 org.springframework.web.context,
 org.springframework.web.context.support,
 org.springframework.web.servlet,
 org.springframework.web.servlet.mvc,
 org.springframework.web.servlet.mvc.support,
 org.springframework.web.servlet.view,
 org.springframework.ui,
 org.springframework.web.servlet.view.freemarker,
 freemarker.cache,freemarker.core,freemarker.template,freemarker.ext.servlet 
&lt;/pre&gt;
&lt;p&gt;Unfortunately, this still doesn&apos;t work and I still haven&apos;t been able to get FreeMarker to work with Spring MVC in OSGi. The crazy thing is I actually solved this at one point a week ago. Shortly after, I rebuilt Equinox from scratch and I&apos;m been banging my head against the wall over this issue ever since. Last week, I entered an &lt;a href=&quot;http://jira.springframework.org/browse/OSGI-461&quot;&gt;issue in Spring&apos;s JIRA&lt;/a&gt;, but thought I&apos;d fixed it a few hours later.
&lt;/p&gt;
&lt;p&gt;
I&apos;ve uploaded the final project that&apos;s not working to the following URL:&lt;/p&gt;
&lt;p style=&quot;padding-left: 15px&quot;&gt;&lt;a href=&quot;http://static.raibledesigns.com/downloads/myapp-osgi.zip&quot;&gt;http://static.raibledesigns.com/downloads/myapp-osgi.zip&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;If you&apos;d like to see this project work with Spring MVC + JSP, simply modify myapp-servlet.xml to remove the FreeMarker references and use the InternalResourceViewResolver instead.&lt;/p&gt;
&lt;p&gt;I hope Spring DM + Spring MVC supports more than just JSP as a view technology. I hope I can&apos;t get FreeMarker working because of some oversight on my part. 
If you have a Spring DM + Spring MVC application working with Velocity or FreeMarker, I&apos;d love to hear about it.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/spring_mvc_s_conventions_get</id>
        <title type="html">Spring MVC&apos;s Conventions get even better</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/spring_mvc_s_conventions_get"/>
        <published>2008-04-07T09:43:42-06:00</published>
        <updated>2008-04-07T15:45:58-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Spring 2.5.3 was &lt;a href=&quot;http://www.springframework.org/node/622&quot;&gt;released this morning&lt;/a&gt; and contains a &lt;a href=&quot;http://jira.springframework.org/browse/SPR-4129&quot;&gt;new feature&lt;/a&gt; I really like. When I first started working with Spring MVC&apos;s annotations (way back in November of last year), I found it awkward that I had to hard-code the URLs for my controllers into @RequestMappings on methods. Previous to annotations, I was using Spring&apos;s &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/web/servlet/mvc/support/ControllerClassNameHandlerMapping.html&quot;&gt;ControllerClassNameHandlerMapping&lt;/a&gt; which allows for more conventions-based URL-mappings. 
&lt;/p&gt;
&lt;p&gt;
With 2.5.3, @Controller and ControllerClassNameHandlerMapping have been synced up so you don&apos;t have to specify URLs in your annotations anymore. &lt;em&gt;Thanks guys!&lt;/em&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/david_sachdev_on_web_framework</id>
        <title type="html">David Sachdev on Web Framework Proliferation</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/david_sachdev_on_web_framework"/>
        <published>2008-02-22T14:47:44-07:00</published>
        <updated>2008-02-22T21:49:54-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="rails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jruby" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">David Sachdev left the following &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_framework_smackdown_at#comment-1203718076000&quot;&gt;comment&lt;/a&gt; in my post about the &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_framework_smackdown_at&quot;&gt;Java Web Framework Smackdown at TSSJS in Vegas&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;smokey&quot; style=&quot;padding: 10px; margin-bottom: 10px&quot;&gt;
&lt;p&gt;The number of web frameworks out there is just astonishing, and in alot of ways I think that there is need for some consolidation in some way, shape or form. If you work in the Java world there is a sense of consolidation in the ORM space these days with JPA (the Java Persistence API). Sure if you are working strictly with JPA it is a bit more limiting then working directly with Hibernate, iBatis, or TopLink - but you no longer worry that you have made a critical misstep in your architecture by tying yourself do a particular ORM implementation. Similarly Spring gives you that similar &quot;loosely coupled&quot; feel that if Google&apos;s Guice because appealing to you, you don&apos;t feel like you&apos;ve wasted all your framework foo on Spring. But web frameworks....that&apos;s another story.
&lt;/p&gt;
&lt;p&gt;
I think if you had asked me a few months ago, I would have told you that the industry is promoting JSF (Java Server Faces). Everything from support in the IDEs to the availability of AJAX frameworks...and of course a flexible life cycle that allows for alternate implementations and various code to plug or be weaved in to the life cycle. And that while JSF on its own left quite a bit to be desired, the JBoss Seam project really has filled in the gaps in JSF, and in fact brought Java web development closer in agility to the Rails and Grails of the world that tout quickly built and deployed web applications.
&lt;/p&gt;
&lt;p&gt;
But the thing that you continue to hear is that programming in JSF is painful. And you hear that EVERYONE used to use Struts. And that it is time to move past Struts. And given that, you have to consider Webwork and the merger of Struts2 into that framework - and their claims of rapid development. But you also have to consider Spring WebFlow and how that may help solve your JSF ills given that everyone is building off of the Spring Framework and they have been so good about keeping the framework updated and integrating the best of what is out there while innovating themselves. And then if you are looking at Spring WebFlow, you kinda have to go &quot;Wait, but what about Spring MVC?&quot;
&lt;/p&gt;

&lt;p&gt;
Given its age, you might quickly dismiss Spring MVC until you realize that Grails is build upon it. Grails, that web platform that every java developer is either working with, or intends to work with soon. (Come on, you all have made the Ruby/Rails, Groovy/Grails, JRuby decision in favor of G2, right? I mean all the flexibility of what is out there in the Java world on top of the JVM, with a language that doesn&apos;t suck the life outta you....) And then you have to wonder that if you build upon Spring MVC as well as using Groovy and Grails where appropriate, might you be able to make that killer app in half the time.
&lt;/p&gt;
&lt;p&gt;
But wait, you didn&apos;t think your choices were nearly that simple did you? There is this wonderful software company out in Mountain View that we need to pay attention too. In Google We Trust, right? And even if you don&apos;t worship at the Temple of the G (TOTG) like Sprout, you don&apos;t want to ignore them. And, if you&apos;ve looked at the Google Web Toolkit (GWT) and weren&apos;t at least slightly impressed, I would be surprised. And if you are looking at the GWT, you can&apos;t totally ignore Yahoo&apos;s YUI - maybe with some of the what Prototype, Scriptaculous, or DoJo offer you. And then someone will come over and point out Echo2 to you, and well you have to admit, their demo looks nice. And well, there is Adobe Flex, and OpenLaszlo - I mean after all isn&apos;t Web 2.0 all about Rich Internet Applications. And surely you&apos;ve heard that the performance of Swing is so much better these days and the &quot;power of the modern Java applet&quot;
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 5px&quot;&gt;
So at the end of it all, you&apos;ve got yourself alot of R&amp;amp;D to do, and just as you thing you&apos;ve got a good grasp for the offerings out there, new and improved versions are out. And don&apos;t worry, someone else is also busy working on a new and greater web framework that you have to consider.
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Wow - that&apos;s quite a mouthful David. &lt;em&gt;Well written!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;P.S. The &lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=48454&quot;&gt;Early Bird Deadline for TSSJS is today&lt;/a&gt;.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/freemarker_vs_jsp_2</id>
        <title type="html">FreeMarker vs. JSP 2</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/freemarker_vs_jsp_2"/>
        <published>2008-01-17T12:37:12-07:00</published>
        <updated>2008-01-17T19:38:11-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I&apos;ve been doing quite a bit of prototyping with Spring MVC and Struts 2
with both JSP and FreeMarker in the last few months. I&apos;m trying to
migrate a proprietary servlet-based framework with a proprietary JSP
compiler to something that&apos;s open source. There&apos;s a couple of important
features that the proprietary view framework has:
&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;It&apos;s expression language allows methods to be called with arguments.
	&lt;/li&gt;
	&lt;li&gt;Templates can be loaded from a JAR on a remote server.&lt;/li&gt;
	&lt;li&gt;XML in variables is escaped by default.
	&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
For #1, I&apos;ve found this to be impossible with JSP EL or JSTL.
I&apos;ve created JSP functions that allow argument passing, but they don&apos;t
allow overloading of functions. FreeMarker solves #1.
&lt;/p&gt;
&lt;p&gt;
For #2, JSPs again fail because the templates have to be on the file system or in a WAR. FreeMarker solves this problem as well.
&lt;/p&gt;
&lt;p&gt;
For #3, neither JSP or FreeMarker solve this problem. I realize
it can be fixed in FreeMarker by &lt;a href=&quot;http://www.nabble.com/Is-it-possible-to-make--html-the-default--to13996402.html#a14011133&quot;&gt;hacking the code&lt;/a&gt; - I&apos;ve &lt;a href=&quot;http://raibledesigns.com/rd/entry/proposed_tomcat_enhancement_add_flag&quot;&gt;done the same
with Tomcat&lt;/a&gt; and solved it for JSP as well.
&lt;/p&gt;
&lt;p&gt;
So based on the requirements in this project, FreeMarker is the clear winner. Here&apos;s some problems that I see with using it:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;No XML escaping of expressions by default&lt;/li&gt;
	&lt;li&gt;No compile-time checking of expressions&lt;/li&gt;
	&lt;li&gt;IDE support is limited to Eclipse (meaning very little in the way of code-completion)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
FreeMarker users - are there other problems you&apos;ve experienced when using FreeMarker in your applications? 
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/java_web_framework_smackdown_at</id>
        <title type="html">Java Web Framework Smackdown at TSSJS in Vegas</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/java_web_framework_smackdown_at"/>
        <published>2008-01-11T12:06:24-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="seam" scheme="http://roller.apache.org/ns/tags/" />
        <category term="smackdown" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="grails" scheme="http://roller.apache.org/ns/tags/" />
        <category term="comparison" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webframeworks" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">This year&apos;s TSSJS is &lt;a href=&quot;http://www.theserverside.com/news/thread.tss?thread_id=48082&quot;&gt;starting to look&lt;/a&gt; like an &lt;a href=&quot;http://javasymposium.techtarget.com/lasvegas/caag.html&quot;&gt;excellent conference&lt;/a&gt;. I&apos;m particularly excited to be moderating the following &lt;a href=&quot;http://javasymposium.techtarget.com/lasvegas/frameworks.html#Panel&quot;&gt;Expert Panel&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;strong&gt;Java Web Framework Smackdown: Struts 2, Spring MVC, Grails, Seam/JSF and Wicket&lt;/strong&gt;&lt;br/&gt;
The leading advocates of today&apos;s popular Web frameworks will duel under the Vegas Lights. Come and learn when to use your favorite framework and to see if it can live up to its hype.
&lt;br/&gt;&lt;br/&gt;
We&apos;re talking about productivity, scalability and maintainability of Java-based Web applications. The emerging trend is that simplicity is better and productivity matters. Furthermore, if maintainability is the most costly part of any application -- how do these frameworks perform?
&lt;br/&gt;&lt;br/&gt;
Attend if you&apos;re a Java Web developer, or if you simply like good entertainment. A working knowledge of the popular Java Web framework options will make this session more fun. If you haven&apos;t worked with any framework, come and learn who has the best spokesman.
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/thevenetian.jpg&quot; rel=&quot;lightbox&quot; title=&quot;The Venetian&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/thevenetian_sm.jpg&quot; width=&quot;130&quot; height=&quot;98&quot; class=&quot;picture&quot; alt=&quot;The Venetian&quot; /&gt;&lt;/a&gt;
I plan on bringing the &lt;a href=&quot;http://raibledesigns.com/rd/entry/oscon_spring_mvc_vs_webwork&quot;&gt;boxing bell from OSCON 2005&lt;/a&gt; to make this session one of the best in the show. I&apos;ll be coming up with a list of questions for these experts in the next couple of months. In the meantime, if you have any suggestions, please let me know.&lt;/p&gt;
&lt;p&gt;With a venue like &lt;a href=&quot;http://www.venetian.com&quot;&gt;The Venetian&lt;/a&gt;, why wouldn&apos;t you go? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_1_8_1</id>
        <title type="html">AppFuse Light 1.8.1 Released: includes upgrades to Spring 2.5 and Wicket 1.3</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_1_8_1"/>
        <published>2007-11-29T09:28:06-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jdo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springjdbc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="velocity" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ojb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&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.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_1_released</id>
        <title type="html">AppFuse 2.0.1 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_1_released"/>
        <published>2007-11-26T09:29:43-07:00</published>
        <updated>2007-11-26T16:51:27-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">The AppFuse Team is pleased to announce the release of AppFuse 2.0.1. This release squashes a number of bugs and includes an upgrade to Spring 2.5. To learn more about Spring 2.5&apos;s features, see InfoQ&apos;s &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.infoq.com/articles/spring-2.5-part-1&quot; rel=&quot;nofollow&quot;&gt;What&apos;s New in Spring 2.5: Part 1&lt;/a&gt;&lt;/span&gt; article.&lt;/p&gt;

&lt;p&gt;For information on upgrading from 2.0, see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1&quot; title=&quot;Release Notes 2.0.1&quot;&gt;2.0.1 Release Notes&lt;/a&gt; or &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1#ReleaseNotes2.0.1-changelog&quot;&gt;changelog&lt;/a&gt;. AppFuse 2.0.1 is available as a Maven archetype. For information on creating a new project using AppFuse, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;demos and videos&lt;/a&gt;. &lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&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;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; rel=&quot;nofollow&quot;&gt;Atlassian&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://contegix.com&quot; rel=&quot;nofollow&quot;&gt;Contegix&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.jetbrains.com&quot; rel=&quot;nofollow&quot;&gt;JetBrains&lt;/a&gt;&lt;/span&gt;, and &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.java.net&quot; rel=&quot;nofollow&quot;&gt;Java.net&lt;/a&gt;&lt;/span&gt;. Atlassian and Contegix are especially awesome: &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; rel=&quot;nofollow&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt;&lt;/span&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Please post any issues you have with this release to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0.1-Released-tf4876194s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_released</id>
        <title type="html">AppFuse 2.0 Released!</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_released"/>
        <published>2007-09-18T15:22:20-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="java" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="java5" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpa" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
I&apos;m extremely happy to announce we&apos;ve finally finished developing AppFuse 2.0. The road to AppFuse 2.0 has been a long journey through Mavenland, annotations and generics. Thanks to all the developers, contributors and users for helping test, polish and prove that AppFuse 2 is an excellent solution for developing Java-based applications. Your time, patience and usage of AppFuse has made it the strong foundation it is today. Last but certainly not least, thanks to all the great Java developers who wrote the frameworks that AppFuse uses - we&apos;re truly standing on the shoulders of giants.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&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;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot;&gt;demos and videos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll might want to read our &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;Frequently Asked Questions&lt;/a&gt;.  If you have any questions or issues, please post them to the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt;. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 contains over 200 pages of &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt;, downloadable as a &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68818/appfuse-documentation-2.0.pdf&quot;&gt;PDF&lt;/a&gt; (3 MB). You can also download all its &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68819/appfuse-dependencies-2.0.zip&quot;&gt;dependencies&lt;/a&gt; and install them in your local repository if you want to work offline.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0&quot; title=&quot;Release Notes 2.0&quot;&gt;2.0 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New features in AppFuse 2.0 include:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Maven 2 Integration&lt;/li&gt;
	&lt;li&gt;Upgraded WebWork to Struts 2&lt;/li&gt;
	&lt;li&gt;JDK 5, Annotations, JSP 2.0, Servlet 2.4&lt;/li&gt;
	&lt;li&gt;JPA Support&lt;/li&gt;
	&lt;li&gt;Generic CRUD backend&lt;/li&gt;

	&lt;li&gt;Full Eclipse, IDEA and NetBeans support&lt;/li&gt;
	&lt;li&gt;Fast startup and no deploy with Maven Jetty Plugin&lt;/li&gt;
	&lt;li&gt;Testable on multiple appservers and databases with Cargo and profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We&apos;re also grateful for the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-Released%21-tf4477191s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_1_8_released</id>
        <title type="html">AppFuse Light 1.8 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_1_8_released"/>
        <published>2007-09-14T11:01:46-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springjdbc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ojb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jdo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="velocity" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&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;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/does_struts_2_suck</id>
        <title type="html">Does Struts 2 suck?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/does_struts_2_suck"/>
        <published>2007-09-05T11:21:57-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">As far as I can tell, Struts 2 sucks. To be fair, so does Stripes. Why? Because there&apos;s no developer feedback for invalid properties or OGNL Expressions. What does this mean? It means if you fat-finger a property name, nothing happens. The OGNL exception is swallowed and you never know you did anything wrong. Furthermore, &lt;a href=&quot;http://www.nabble.com/How-can-I-tell-Struts-2-to-throw-log-exceptions-for-invalid-OGNL-Expressions-tf4100102.html#a11659700&quot;&gt;no one seems to care&lt;/a&gt;. The XWork folks will &lt;a href=&quot;http://forums.opensymphony.com/thread.jspa?messageID=187545&quot;&gt;help you build&lt;/a&gt;, but not &lt;a href=&quot;http://www.nabble.com/Re%3A-How-can-I-tell-Struts-2-to-throw-log-exceptions-for-invalid-OGNL-Expressions-p12373437.html&quot;&gt;solve the problem&lt;/a&gt;. This seems like a major deal-breaker to me, However, I also believe it can be fixed - so maybe there&apos;s hope. 
&lt;/p&gt;
&lt;p&gt;
To demonstrate the problem, I did an experiment. I used the &quot;user details&quot; page in &lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; to fat-finger a property name for the following frameworks: Struts 1, WebWork, Struts 2, JSF, Spring MVC, Stripes, Tapestry and Wicket. First, I tried changing the &quot;lastName&quot; property to &quot;LastName&quot; to see if the framework&apos;s property evaluation was case-sensitive. I found that with WebWork/Struts 2, Stripes and Tapestry, the property is &lt;em&gt;not&lt;/em&gt; case-sensitive. I prefer case-sensitivity, but maybe that&apos;s because I prefer Unix over Windows. 
&lt;/p&gt;
&lt;p&gt;The 2nd thing I tried was changing &quot;lastName&quot; to &quot;pastName&quot; to see if I&apos;d get an error. An error occurred for all the frameworks mentioned, except for WebWork/Struts 2 and Stripes. This makes me believe these frameworks suck. The both use OGNL, so they &lt;em&gt;could&lt;/em&gt; blame it on that, but Tapestry uses OGNL and it presents an error message. After this small experiment, my conclusion is the following frameworks have the best developer feedback:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Struts 1&lt;/li&gt;
&lt;li&gt;JSF&lt;/li&gt;
&lt;li&gt;Spring MVC&lt;/li&gt;
&lt;li&gt;Tapestry&lt;/li&gt;
&lt;li&gt;Wicket*&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;smokey&quot;&gt;* Wicket seems like it needs some work as all it presents is &quot;Internal Error&quot; and makes you dig through your log files to find the problem.&lt;/p&gt;
&lt;p&gt;Without good developer feedback, how can you have good productivity? 
&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot;&gt;
Dear Struts 2 and Stripes Developers,&lt;br/&gt;&lt;br/&gt;What do you think about improving your error messages for invalid properties and expressions? Is this a feature you think you could add? We&apos;d love it if you did. 
&lt;br/&gt;&lt;br/&gt;
Sincerely, &lt;br/&gt;&lt;br/&gt;
Your Users
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;?&quot; onclick=&quot;$(&apos;#errorpagescreenshots&apos;).fadeIn(); return false&quot;&gt;Click here for some screenshots&lt;/a&gt;  of how a fat-fingered property looks in various frameworks:&lt;/p&gt;
&lt;div id=&quot;errorpagescreenshots&quot; style=&quot;display:none&quot;&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: maroon; color: white&quot;&gt;JSF&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-jsf.png&quot;  alt=&quot;JSF&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: blue; color: white&quot;&gt;Struts 1&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-struts1.png&quot;  alt=&quot;Struts 1&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: green; color: white&quot;&gt;WebWork&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0; text-align: center&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-webwork2.png&quot; width=&quot;321&quot; height=&quot;144&quot; alt=&quot;WebWork 2&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: red; color: white&quot;&gt;Struts 2&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-struts2.png&quot;  alt=&quot;Struts 2&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: orange&quot;&gt;Spring MVC&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-springmvc.png&quot;  alt=&quot;Spring MVC&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: yellow&quot;&gt;Tapestry&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-tapestry.png&quot;  alt=&quot;Tapestry&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: maroon; color: white&quot;&gt;Stripes&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-stripes.png&quot;  alt=&quot;Stripes&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-bottom: 10px&quot;&gt;
&lt;div class=&quot;smokey&quot; style=&quot;font-weight: bold; background-color: purple; color: white&quot;&gt;Wicket&lt;/div&gt;
&lt;div style=&quot;width: 528; overflow: hidden; border: 1px solid black; border-top: 0&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/invalidfield-wicket.png&quot;  alt=&quot;Wicket&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Stripes doesn&apos;t suck and Wicket has excellent error reporting. See &lt;a href=&quot;http://raibledesigns.com/rd/entry/does_struts_2_suck#comment6&quot;&gt;my comment below&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; I&apos;ve created &lt;a href=&quot;http://jira.opensymphony.com/browse/XW-557&quot;&gt;a patch&lt;/a&gt; to (hopefully) solve this issue in XWork. If you have any feedback on ways to improve this patch, I&apos;d love to hear about it.&lt;/p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released</id>
        <title type="html">AppFuse 2.0 RC1 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released"/>
        <published>2007-09-04T01:42:15-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 RC1! This release marks a huge step in the march to releasing AppFuse 2.0. This release puts the finishing touches on the &lt;a href=&quot;http://static.appfuse.org/plugins/appfuse-maven-plugin&quot;&gt;AppFuse Maven Plugin&lt;/a&gt; (AMP), which offers CRUD generation, as well as the ability to change AppFuse from &quot;embedded mode&quot; to &quot;full source&quot; (like 1.x). In addition, we&apos;ve addressed over 100 issues in preparation for the final 2.0 release. We hope to fix any bugs related to this release and release 2.0 Final in the next week or two.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;videos&lt;/a&gt; still represent how M5 works, but things have been simplified (now you don&apos;t need to run &lt;em&gt;appfuse:install&lt;/em&gt; after &lt;em&gt;appfuse:gen&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot;&gt;Hello World video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+RC1&quot; title=&quot;Release Notes 2.0 RC1&quot;&gt;2.0 RC1 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-RC1-Released%21-tf4376078s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&apos;ve uploaded a &lt;a href=&quot;http://tinyurl.com/2qlst4&quot;&gt;247-page PDF version of the RC1 documentation&lt;/a&gt; to java.net. This PDF contains the relevant pages from the wiki that help you develop with AppFuse 2.0. Who knew I&apos;d end up writing another book? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_m5_released</id>
        <title type="html">AppFuse 2.0 M5 Released - now with CRUD generation and XFire support</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_m5_released"/>
        <published>2007-05-23T17:49:10-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 M5! 
This release marks a milestone in the features of AppFuse 2.x. This release adds CRUD code generation, full source support (just like 1.x) and XFire integration. In addition, we&apos;ve fixed all the issues related to switching persistence frameworks, and you should now be able to easily switch from using Hibernate to to iBATIS or JPA. The &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;videos&lt;/a&gt; have been updated for M5. The &lt;a href=&quot;http://static.appfuse.org/movies/2.0/struts2-crud.mov&quot; title=&quot;14.2 MB, 6 minutes 6 seconds&quot;&gt;Easy CRUD with Struts 2 video&lt;/a&gt; shows how code generation currently works.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot; title=&quot;13.2 MB, 6 minutes 14 seconds&quot;&gt;Hello World video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; and join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2#Maven2-Antvs.Maven&quot;&gt;Ant &amp;raquo; Maven commands&lt;/a&gt;. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+M5&quot; title=&quot;Release Notes 2.0 M5&quot;&gt;2.0 M5 Release Notes&lt;/a&gt;. If you&apos;d like to use AppFuse offline (or download everything at once), you may want to &lt;a href=&quot;https://appfuse.dev.java.net/servlets/ProjectDocumentList?folderID=7516&quot;&gt;grab the dependencies&lt;/a&gt; and extract them into your ~/.m2/repository directory.&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minumum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JavaServer Pages (JSP) 2.0&lt;/li&gt;
	&lt;li&gt;Java 5 for Development (Java 1.4 for deployment using the &lt;a href=&quot;http://mojo.codehaus.org/retrotranslator-maven-plugin/examples/project-translation.html&quot;&gt;Retrotranslator Plugin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-M5-Released%21-tf3807216s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://cenqua.com/&quot;&gt;Cenqua&lt;/a&gt;, &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;, &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt; and &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGBInternet&lt;/a&gt;.  Without them, working on this project wouldn&apos;t be nearly as much fun.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; The videos are much lower quality than the ones I originally recorded (13 MB vs. 70 MB). If you want to view the high quality videos (they&apos;re much clearer), you can &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/58384/appfuse-2.0-videos.zip&quot;&gt;download them from java.net&lt;/a&gt;. If someone has a better way to compress these (I just used QuickTime&apos;s Export feature), please let me know.&lt;/p&gt;
&lt;p&gt;Also, this release contains the first release of the &lt;a href=&quot;http://static.appfuse.org/plugins/appfuse-maven-plugin&quot;&gt;AppFuse Maven Plugin&lt;/a&gt;. This plugin is largely based on &lt;a href=&quot;http://tools.hibernate.org&quot;&gt;Hibernate Tools&lt;/a&gt;. We modified many of the FreeMarker templates from Hibernate Tools to default to certain annotations, as well as clean up the formatting. These templates are currently available in &lt;a href=&quot;http://fisheye4.cenqua.com/browse/appfuse/trunk/plugins/appfuse-maven-plugin/src/main/resources/appfuse/model&quot;&gt;AppFuse&apos;s SVN&lt;/a&gt;. Hopefully making them available is enough to satisfy Hibernate&apos;s LGPL license.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/help_me_help_you_market</id>
        <title type="html">Help me help you (market your web framework)</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/help_me_help_you_market"/>
        <published>2007-04-26T13:58:30-06:00</published>
        <updated>2007-04-27T08:45:59-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Rather than trolling through google searches, mailing list archives and Amazon book searches, I&apos;d like to try something new. For those projects represented in my Comparing Java Web Frameworks talks (MyFaces, Spring MVC, Stripes, Struts 2, Tapestry and Wicket), would you be interested in helping me gather statistics? I think by allowing projects to gather their own statistics, we&apos;ll get a more accurate number of their statistics.  Here&apos;s the questions I need you to answer:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How many tools (i.e. IDE plugins) are available for your web framework?&lt;/li&gt;
&lt;li&gt;How many jobs are available for your framework on &lt;a href=&quot;http://www.dice.com&quot;&gt;Dice.com&lt;/a&gt;? What about &lt;a href=&quot;http://indeed.com&quot;&gt;Indeed.com&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;How many messages where posted to your &lt;strong&gt;user&lt;/strong&gt; mailing list (or forum) in March 2007?&lt;/li&gt;
&lt;li&gt;How many books are available for your framework?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Of course, if you don&apos;t have time, I&apos;ll be more than happy to gather these statistics myself. However, those that do answer might get some extra marketing love during my talk. Answering in a comment or &lt;a href=&quot;http://raibledesigns.com/contact.jsp&quot;&gt;sending me an e-mail&lt;/a&gt; are the best ways to provide your findings. &lt;em&gt;Thanks!&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href=&quot;http://herebebeasties.com/2007-04-27/lies-damned-lies-and-statistics/&quot;&gt;Alastair&lt;/a&gt; asks for further clarification. Here goes:&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&gt; If you have lots of IDE tooling available, it probably means the configuration for the framework is overly complex and unmanageable without tooling.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;
While this may be true, if your framework is &lt;a href=&quot;http://code.google.com/webtoolkit/&quot;&gt;hot&lt;/a&gt; or &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;uber productive&lt;/a&gt;, people want tools. Especially new developers. Remember there&apos;s a plethora of new Java developers every year and a lot of them prefer tool-based solutions. Good or bad, IDEs are nice and people like to use them. I&apos;ve had many clients dismiss frameworks simply because no tools were available.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; The framework with the largest number of jobs available is probably Struts 1. Enough said.&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
Yes, you&apos;re definitely right. However, Struts 1 is not in this comparison - I dropped it because I don&apos;t want to recommend it to anyone.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; People only post to user lists when they are stuck. If the framework is hard to use, there will be lots of e-mails. If it has a steep learning curve, and/or the documentation is poor, this will be particularly so. On the other hand, an active list might point to a large active user base. Who knows which is which from a raw figure?&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
What about community? Mailing lists and their activity is a sign of an active community. Even though SiteMesh is a mature and good solution, its community sucks. There&apos;s little support, no new features, no bug fixes. An open source project w/o a community is tough for a company to adopt. Also, the best communities do a lot more than answer questions on mailing lists. They develop their applications, get advice, offer advice and sometimes even &lt;em&gt;hang out&lt;/em&gt;. The Struts list used to have threads 30-50 messages long about development philosophies. When you joined the mailing list, you felt like you were a part of something, not just a user of a product.
&lt;/p&gt;&lt;p&gt;
&lt;em&gt;&gt; If your framework is fairly stable, and someone has written a fabulous tome on it that is universally acknowledged as &quot;the bible&quot;, few people would bother writing another book for it.&lt;/em&gt;
&lt;/p&gt;&lt;p&gt;
I don&apos;t agree - this just means there&apos;s no market for other books because not that many people are using it. Look at Grails, Groovy, GWT and Rails - there&apos;s been quite a few books on each and no slowdown in sight. Then again, there weren&apos;t many Ant books and that was/is hugely popular. I&apos;m willing to change this question to &quot;How many &lt;strong&gt;good&lt;/strong&gt; does your framework have?&quot;, but that&apos;s up to everyone&apos;s own interpretation. Again, lots of books means there&apos;s an active community outside the immediate mailing list - it&apos;s a sign the general &quot;market&quot; is interested and the framework fills a need.
&lt;/p&gt;&lt;p&gt;
Of course, I &lt;strong&gt;am&lt;/strong&gt; interested in asking the questions that developers want to see answered.  Do you have suggestions for replacement (or new) questions? Remember, people like hard facts, not wishy washy statements about how productive and OO your framework is. Every framework can be uber productive if you have the right developer(s) and they&apos;re genuinely interested in getting stuff done.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_light_1_8_beta</id>
        <title type="html">AppFuse Light 1.8 Beta Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_light_1_8_beta"/>
        <published>2007-04-26T02:23:22-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="css" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ibatis" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jpox" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsp" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ajax" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springjdbc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="ojb" scheme="http://roller.apache.org/ns/tags/" />
        <category term="freemarker" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="acegi" scheme="http://roller.apache.org/ns/tags/" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jdo" scheme="http://roller.apache.org/ns/tags/" />
        <category term="velocity" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&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!).</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/what_web_framework_are_you</id>
        <title type="html">What web framework are you using with AppFuse?</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/what_web_framework_are_you"/>
        <published>2007-04-25T11:05:04-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="webwork" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">As part of my upcoming &lt;a href=&quot;http://www.eu.apachecon.com/program/talk/75&quot;&gt;Comparing Java Web Frameworks&lt;/a&gt; talk, I&apos;d like to show some statistics of web framework usage in AppFuse. Please vote for the one you&apos;re using by clicking on the link below. I&apos;m mostly looking for current AppFuse users. By that, I mean folks that have used 1.x or 2.x on a project in the last 6 months, or plan on using it in the next month or two.
&lt;br/&gt;&lt;br/&gt;
You&apos;ll need to create an account and login to vote. To do this, go to View &gt; Account &gt; Sign Up (after clicking on the link below). 
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://appfuse.org/pages/viewpage.action?pageId=986&quot;&gt;http://appfuse.org/pages/viewpage.action?pageId=986&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I&apos;ll compile the results of this poll on Friday morning (April 27th), so you have until then for your vote to be counted!
&lt;br/&gt;&lt;br/&gt;
On a related note, if anyone knows how to get the monthly posting statistics from &lt;a href=&quot;http://forum.springframework.org/forumdisplay.php?f=25&quot;&gt;Spring MVC&apos;s forums&lt;/a&gt;, I&apos;d love to hear about it. My &quot;mailing list traffic&quot; slide has excluded them for the past couple of years because I&apos;ve been unable to get a count of monthly postings.
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;NOTE:&lt;/strong&gt; If you vote by adding a comment to this entry, it won&apos;t be counted. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to the 64 of you that voted. Here&apos;s the results of the poll:&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//static.raibledesigns.com/repository/images/webframework-usage-200704.gif&quot; alt=&quot;AppFuse Web Framework Usage&quot; width=&quot;500&quot; height=&quot;313&quot; /&gt;
&lt;/p&gt;&lt;p&gt;As I said &lt;a href=&quot;http://raibledesigns.com/rd/entry/spring_mvc_the_most_popular&quot;&gt;last time&lt;/a&gt;, I find the results interesting because AppFuse lowers the barriers and reduces the learning curve for all of these frameworks.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/comparing_java_web_frameworks_proposed</id>
        <title type="html">Comparing Java Web Frameworks: Proposed Outline</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/comparing_java_web_frameworks_proposed"/>
        <published>2007-04-17T09:13:22-06:00</published>
        <updated>2012-11-08T15:42:03-07:00</updated> 
        <category term="/Java" label="Java" />
        <category term="myfaces" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="stripes" scheme="http://roller.apache.org/ns/tags/" />
        <category term="wicket" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">I&apos;m just now starting to create my &lt;a href=&quot;http://www.eu.apachecon.com/program/talk/75&quot;&gt;Comparing Java Web Frameworks&lt;/a&gt; presentation for &lt;a href=&quot;http://www.eu.apachecon.com/&quot;&gt;ApacheCon Europe&lt;/a&gt;. According to &lt;a href=&quot;http://rollerweblogger.org/roller/entry/apacheconeu_roller_and_blogs_as&quot;&gt;Dave&lt;/a&gt;, I&apos;m &lt;em&gt;way late&lt;/em&gt; on submitting my presentation. However, I haven&apos;t received any late notifications from ApacheCon&apos;s organizing committee, so I don&apos;t feel too bad.
&lt;/p&gt;
&lt;blockquote style=&quot;font-style: italic; color: #666&quot;&gt;
I think it&apos;s interesting how most conferences don&apos;t spend much time organizing from a speaker&apos;s perspective. The Colorado Software Summit and NFJS are two exceptions. As a speaker, you always know exactly what&apos;s going on, what the deadlines are and where you&apos;re supposed to be when. With ApacheCon, I feel like I&apos;m in the dark on almost everything - including if I have a hotel room or not. I guess that&apos;s the difference between a volunteer organization and conferences where the organizers make money.
&lt;/blockquote&gt;
&lt;p&gt;Luckily, I&apos;ve done this presentation quite a few times in the past, so it&apos;s mostly an update rather than a rewrite. The biggest changes: dropping Struts 1 and adding Stripes and Wicket. Of course, I could keep Struts 1 since it&apos;s not much additional work, but since I only have 50 minutes for the talk (10 minutes for QA), it makes sense to drop it. And yes, I know many of you&apos;d like to see Grails, Seam, GWT, RIFE and Click added to this presentation - but no one wants to sit through a presentation on 11 web frameworks in 45 minutes.
&lt;br/&gt;&lt;br/&gt;
Here&apos;s the abstract for the session:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
One of the most difficult things to do (in Java web development)
today is pick which web framework to use when development an
application.  The Apache Software foundation hosts most of the
popular Java web frameworks: &lt;strong&gt;Struts&lt;/strong&gt;, &lt;strong&gt;MyFaces&lt;/strong&gt;, &lt;strong&gt;Tapestry&lt;/strong&gt; and
&lt;strong&gt;Wicket&lt;/strong&gt;. This session will compare these different web
frameworks, as well as &lt;strong&gt;Spring MVC&lt;/strong&gt; and &lt;strong&gt;Stripes&lt;/strong&gt;. It will briefly
explain how each works and the strengths and weaknesses of each.
 Tips, tricks and gotcha&apos;s will be plentiful. Lastly, it will
provide attendees with a sample application that utilizes all 6
frameworks, so they can compare line-by-line how the frameworks
are different.  This sample application will include the
following features: sortable/pageable list, client and
server-side validation, success and error messages as well as
some Ajax functionality. The frameworks will be rated on how
easy they make it to implement these features.
&lt;/p&gt;
&lt;p&gt;
Without further ado, here&apos;s my proposed outline:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Introductions (5 minutes)&lt;/li&gt;
&lt;li&gt;Pros and Cons (15 minutes, ~2 minutes for each)&lt;/li&gt;
&lt;li&gt;Sweetspots (10 minutes)&lt;/li&gt;
&lt;li&gt;Smackdown - evaluation criteria includes (15 minutes)
    &lt;ul class=&quot;glassList&quot; style=&quot;margin-bottom: 0&quot;&gt;
    &lt;li&gt;Ajax support&lt;/li&gt;
    &lt;li&gt;Bookmark-ability&lt;/li&gt;
    &lt;li&gt;Validation (including client-side)&lt;/li&gt;
    &lt;li&gt;Testability (esp. out-of-container)&lt;/li&gt;
    &lt;li&gt;Post and redirect&lt;/li&gt;
    &lt;li&gt;Internationalization&lt;/li&gt;
    &lt;li&gt;Page decoration&lt;/li&gt;
    &lt;li&gt;Community and Support&lt;/li&gt;
    &lt;li&gt;Tools&lt;/li&gt;
    &lt;li&gt;Marketability of skills (can it help you get a job)&lt;/li&gt;
    &lt;li&gt;Job count (is there a demand for skills on Dice)&lt;/li&gt;
    &lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion (5 minutes)&lt;/li&gt;
&lt;li&gt;Q and A (10 minutes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
During the Pros and Cons, I won&apos;t be showing any code like I usually do - there&apos;s just not enough time. I&apos;m also adding in a discussion on these frameworks&apos; &lt;a href=&quot;http://www.virtuas.com/articles/webframework-sweetspots.html&quot;&gt;sweetspots&lt;/a&gt;. The Pros and Cons section is largely my opinion, and I think it&apos;s important to hear the framework authors&apos; opinions as well.
&lt;br/&gt;&lt;br/&gt;
In evaluation criteria, I&apos;m dropping List screens and Spring Integration. All these frameworks have good Spring support and most support some sort of page-able/sortable list. I can add either of those back in based on your suggestions.
&lt;br/&gt;&lt;br/&gt;
Any feedback is greatly appreciated.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/appfuse_2_0_m4_released</id>
        <title type="html">AppFuse 2.0 M4 Released</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/appfuse_2_0_m4_released"/>
        <published>2007-03-24T16:33:21-06:00</published>
        <updated>2014-05-08T19:47:26-06:00</updated> 
        <category term="/Java" label="Java" />
        <category term="maven2" scheme="http://roller.apache.org/ns/tags/" />
        <category term="struts" scheme="http://roller.apache.org/ns/tags/" />
        <category term="springmvc" scheme="http://roller.apache.org/ns/tags/" />
        <category term="jsf" scheme="http://roller.apache.org/ns/tags/" />
        <category term="appfuse" scheme="http://roller.apache.org/ns/tags/" />
        <category term="tapestry" scheme="http://roller.apache.org/ns/tags/" />
        <category term="hibernate" scheme="http://roller.apache.org/ns/tags/" />
        <category term="spring" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 M4! This release marks a milestone in the usability of AppFuse 2.x. A lot of folks (including myself) have been using AppFuse 2.0 on projects and have fixed quite a few issues. In addition to polishing the tutorials, we&apos;ve fixed a fair amount of i18n bugs and packaging issues with modular archetypes. &lt;/p&gt;

&lt;p&gt;We were hoping to get AMP&apos;s code generation and XFire integrated in M4, but were it&apos;s going to have to wait until M5.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; and join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2#Maven2-Antvs.Maven&quot;&gt;Ant &amp;raquo; Maven commands&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minumum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JavaServer Pages (JSP) 2.0&lt;/li&gt;
	&lt;li&gt;Java 5 for Development (Java 1.4 for deployment using the &lt;a href=&quot;http://mojo.codehaus.org/retrotranslator-maven-plugin/examples/project-translation.html&quot;&gt;Retrotranslator Plugin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+M4&quot; title=&quot;Release Notes 2.0 M4&quot;&gt;2.0 M4 Release Notes&lt;/a&gt;. To see how AppFuse 2.x works, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot;&gt;video demos&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be sent to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-M4-Released-tf3460541s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://cenqua.com/&quot;&gt;Cenqua&lt;/a&gt;, &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;, &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt; and &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGBInternet&lt;/a&gt;.  Without them, working on this project wouldn&apos;t be nearly as much fun.</content>
    </entry>
</feed>

