<?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" 
      xmlns:app="http://www.w3.org/2007/app"
      xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">

    <title type="html">Search for [TSE] in weblog rd</title>
    <subtitle type="html">Search results for [TSE] within weblog Raible Designs</subtitle>
    <id>https://raibledesigns.com/rd/feed/entries/atom?q=TSE</id>

    <link rel="self" type="application/atom+xml" 
        href="https://raibledesigns.com/rd/feed/entries/atom?q=TSE" />

    <link rel="alternate" type="text/html" 
        href="https://raibledesigns.com/rd/search?q=TSE" />

    <link rel="search" type="application/opensearchdescription+xml" 
        href="https://raibledesigns.com/roller-services/opensearch/rd" />
    <opensearch:Query role="request" searchTerms="TSE" startPage="1" />

    <link rel="first" type="application/atom+xml" href="https://raibledesigns.com/rd/feed/entries/atom?q=TSE" />
    <updated>2026-05-09T04:29:55-06:00</updated>
    <generator uri="http://roller.apache.org" version="5.0.3 (1388864191739:dave)">Apache Roller</generator>

        <entry>
        <id>https://raibledesigns.com/rd/entry/2006_a_year_in_review</id>
        <title type="html">2006 - A Year in Review</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/2006_a_year_in_review"/>
        <published>2006-12-31T15:05:56-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/Roller" label="Roller" />
        <category term="blogging" scheme="http://roller.apache.org/ns/tags/" />
        <category term="newyear" scheme="http://roller.apache.org/ns/tags/" />
        <category term="yearinreview" scheme="http://roller.apache.org/ns/tags/" />
        <category term="roller" scheme="http://roller.apache.org/ns/tags/" />
        <content type="html">Looking back at 2006, it&apos;s amazing to see everything that happened.  One of the main reasons I started this blog was to provide a history of my life.  Now it&apos;s time to cash in on that cool feature and look back at the last 12 months.
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.flickr.com/28/89768686_e645e0126b_o.jpg&quot; title=&quot;Beach by Villas Nizuc&quot; rel=&quot;lightbox[review2006]&quot;&gt;&lt;img src=&quot;//static.flickr.com/28/89768686_e645e0126b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Beach by Villas Nizuc&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
In early January, I finished working on the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=vongo&quot;&gt;Vongo&lt;/a&gt; project. I eventually had to shut off comments for my post on Vongo because there were so many complaints. The good news is I didn&apos;t work on the UI or service part of it, just the Spring/Hibernate/XFire backend. A week later, Apple announced the MacBook Pro and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=macbook_pro&quot;&gt;I purchased one immediately&lt;/a&gt;.  I still have the same machine and couldn&apos;t be happier. A week after that, I quietly released AppFuse 1.9, went to the Broncos vs. Patriots game, then left the next morning for &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=off_to_cancun&quot;&gt;Cancun&lt;/a&gt; to celebrate my dad&apos;s 60th. I got to watch the Broncos season end after &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_from_cancun&quot;&gt;returning from Cancun&lt;/a&gt;. January 2006 is one for the books - I scored good tickets to &lt;em&gt;two&lt;/em&gt; playoff games and spent a week in Cancun! I&apos;d relive that month without hesitation.&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://farm1.static.flickr.com/39/102157574_1a7709e5b6_o.jpg&quot; title=&quot;The Ride to Work&quot; rel=&quot;lightbox[review2006]&quot;&gt;&lt;img src=&quot;//farm1.static.flickr.com/39/102157574_1a7709e5b6_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;The Ride to Work&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;

In February, I began &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=weekend_update2&quot;&gt;playing with Maven 2&lt;/a&gt; , figured out &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=how_to_use_tiles_with&quot;&gt;how to use Tiles with WebWork&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=fundraiser_for_css_framework_design&quot;&gt;did a fundraiser for the CSS Framework design contest&lt;/a&gt;. I even &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=css_fundraiser_brrrrrrrr&quot;&gt;posted some pictures&lt;/a&gt; of my ride to work. Prior to freezing my ass off, Jack had a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=rough_week_for_jack&quot;&gt;rough week with Rotavirus&lt;/a&gt; and ended up in the Emergency Room.&lt;br/&gt;&lt;br/&gt;
At the end of February, I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=macbook_pro_kicking_ass_and&quot;&gt;received my MacBook Pro&lt;/a&gt; and fell in love with everything but the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=macbook_pro_and_wireless&quot;&gt;wireless&lt;/a&gt;. My posts on the MacBook Pro and wireless issues still get comments weekly from other folks having similar problems.&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://dearelena.wordpress.com/&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/dearelena.png&quot; width=&quot;62&quot; height=&quot;41&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;
On February 22nd, Daniel Steinberg&apos;s daughter Elena &lt;a href=&quot;http://dearelena.wordpress.com/2006/02/23/dear-elena/&quot;&gt;died of bacterial meningitis&lt;/a&gt;. Julie made me stop reading Daniel&apos;s &lt;a href=&quot;http://dearelena.wordpress.com/&quot;&gt;Dear Elena&lt;/a&gt; blog because I was such an emotional wreck. I saw Daniel at a couple of conferences this year, but didn&apos;t talk to him until The Spring Experience in December. I didn&apos;t know what to say to him.  He erased all my apprehensions with a simple &quot;Thanks&quot;, a smile and a handshake.  It&apos;s good to see you&apos;re still writing about Elena Daniel.  I still have a hard time reading your posts.
&lt;br/&gt;&lt;br/&gt;
February ended with a beautiful &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=nice_weather&quot;&gt;72&amp;deg;F day&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
In March, I started the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=css_framework_design_contest&quot;&gt;CSS Framework design contest&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=riding_to_work_in_the&quot;&gt;rode to work in the rain&lt;/a&gt; and flew to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_from_boston_getting_ready&quot;&gt;Boston&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_from_vegas&quot;&gt;Vegas&lt;/a&gt;. Memories of St. Patrick&apos;s Day in Boston with friends still brings a smile to my face. TheServerSide show in Vegas was a lot of fun and it was the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=java_web_frameworks_sweet_spots&quot;&gt;first BOF I hosted with free beer&lt;/a&gt;. I later got to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_building_modern_web_applications&quot;&gt;meet Mike Stenhouse&lt;/a&gt;  (the inventor of The CSS Framework) in December and hosted two more &quot;BOFs with Beer&quot; at the Colorado Software Summit and The Spring Experience. Cost difference? Vegas: $800, Keystone: $350, Hollywood, FL: $220.
&lt;br/&gt;&lt;br/&gt;
At the end of March, I came down with a nasty case of &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=carpal_tunnel1&quot;&gt;Carpal Tunnel&lt;/a&gt;. After seeing a specialist that massaged the hell out of my arm, everything was back to normal.  I haven&apos;t had any issues since - but I also haven&apos;t had many multiple-no-sleep-night coding sprints in a while either.
&lt;br/&gt;&lt;br/&gt;

&lt;a href=&quot;http://static.flickr.com/51/130332785_9f9c9f2c8a_o.jpg&quot; title=&quot;Off to The Shop&quot; rel=&quot;lightbox[review2006]&quot;&gt;&lt;img src=&quot;//static.flickr.com/51/130332785_9f9c9f2c8a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Off to The Shop&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;


In April, I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=done_with_appfuse_moving_to&quot;&gt;quit working on AppFuse and moved to Rails&lt;/a&gt;. I posted my &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tips_for_productivity_and_happiness&quot;&gt;Tips for Productivity and Happiness at Work&lt;/a&gt; (my most popular blog entry of all time), shipped my bus &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=off_to_the_shop&quot;&gt;off to the shop&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=6_years&quot;&gt;celebrated Julie and I&apos;s 6th anniversary&lt;/a&gt;. Then I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=rebooted&quot;&gt;rebooted&lt;/a&gt; this site and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=livin_it_up_in_nyc&quot;&gt;lived it up in New York City&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
May brought &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=css_design_contest_runoff&quot;&gt;CSS Design Contest winners&lt;/a&gt; and a 2-week trip to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=san_francisco_here_i_come&quot;&gt;San Francisco&lt;/a&gt; for The Ajax Experience and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=javaone_2006_begins&quot;&gt;JavaOne&lt;/a&gt;. The highlight of that trip was the weekend I spent in &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=wine_country&quot;&gt;Wine Country&lt;/a&gt;.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://hansfahden.com&quot;&gt;&lt;img src=&quot;//www.hansfahden.com/images/digital/pondlookingfront2v.jpg&quot; style=&quot;border: 0&quot; alt=&quot;Hans Fahden&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;In June, &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=ann_appfuse_1_9_21&quot;&gt;AppFuse 1.9.2&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=seam_1_0&quot;&gt;Seam 1.0&lt;/a&gt; were unleashed.                                                                    Tim O&apos;Brien had an interesting post titled &lt;a href=&quot;http://www.oreillynet.com/onjava/blog/2006/06/isnt_rails_supposed_to_change.html&quot;&gt;What Web Application framework should you use?&lt;/a&gt;. I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=re_what_web_application_framework&quot;&gt;responded&lt;/a&gt; and Struts became a more focused project.  Shale moved to a TLP shortly after. We started planning &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=raible_road_trip_10&quot;&gt;Raible Road Trip #10&lt;/a&gt; and I began &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=washington_d_c&quot;&gt;traveling to Washington, DC&lt;/a&gt; for a project. Going for beers at &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=fun_in_dc&quot;&gt;Brickskeller&lt;/a&gt; was the highlight of our trip that week.
&lt;br/&gt;&lt;br/&gt;
July introduced me to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=the_dark_side_of_business&quot;&gt;cancelled flights and redeyes&lt;/a&gt; and Jason Carreira &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=validation_framework_consolidation&quot;&gt;started JSR 303&lt;/a&gt;. &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=appfuse_1_9_3_released&quot;&gt;AppFuse 1.9.3&lt;/a&gt; was released and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=julie_s_house&quot;&gt;Julie sold her house&lt;/a&gt; to the first people that looked at it. At the end of the month, Jim Goodwill and I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=driving_to_oscon_day_1&quot;&gt;drove&lt;/a&gt; to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=driving_to_oscon_day_1&quot;&gt;OSCON&lt;/a&gt; in Portland. Having beers with Bryan and Scott at &lt;a href=&quot;http://www.mcmenamins.com/index.php?loc=57&quot;&gt;The Kennedy School&lt;/a&gt; was a highlight of that trip. Following OSCON, the family and I &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=going_off_the_grid&quot;&gt;headed to Montana for a week&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://static.flickr.com/63/208272614_6b57aaf7d4.jpg&quot; rel=&quot;lightbox[review2006]&quot; title=&quot;August 2006 at The Cabin&quot;&gt;&lt;img src=&quot;//static.flickr.com/63/208272614_6b57aaf7d4_t.jpg&quot; alt=&quot;The Cabin&quot; class=&quot;picture&quot; height=&quot;75&quot; width=&quot;100&quot;&gt;&lt;/a&gt;
August was great, probably because I&apos;d just hit &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_from_the_hills&quot;&gt;7 states in 7 days&lt;/a&gt;. I published &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=7_simple_reasons_to_use&quot;&gt;an article&lt;/a&gt; on IBM developerWorks&lt;/a&gt; and had a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=a_device_free_weekend&quot;&gt;device-free weekend&lt;/a&gt; (which I definitely need to do more often). I began &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=appfuse_roadmap_updated_for_2&quot;&gt;working on AppFuse 2.0&lt;/a&gt;, a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=the_neighborhood_just_keeps_getting&quot;&gt;new sushi restaurant moved into our neighborhood&lt;/a&gt; and I got a new &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=verizon_v640_expresscard_works_like&quot;&gt;EVDO&lt;/a&gt; card (which I later lost in November). Jack turned 2 on August 28th.
&lt;br/&gt;&lt;br/&gt;
In September, we got a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=new_puppy&quot;&gt;new puppy&lt;/a&gt;. I traveled to the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=headed_to_the_drunkest_city&quot;&gt;drunkest city in America&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=there_s_nothing_like_finishing&quot;&gt;Las Vegas&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=on_the_road_again&quot;&gt;New England&lt;/a&gt;. Julie met me in Boston and we had a blast at our good friends&apos; (Chris and Julie&apos;s) wedding.&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://raibledesigns.com/repository/images/abbieandjack-20061019.jpg&quot; rel=&quot;lightbox[review2006]&quot; title=&quot;Abbie and Jack - October 2006&quot;&gt;&lt;img src=&quot;//raibledesigns.com/repository/images/abbieandjack-20061019_t.jpg&quot; alt=&quot;Abbie and Jack&quot; class=&quot;picture&quot; height=&quot;97&quot; width=&quot;75&quot;/&gt;&lt;/a&gt;

October brought the &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=spring_2_0_appfuse_and&quot;&gt;release of Spring 2.0&lt;/a&gt; and a 2-week project for me at &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=openlogic_sponsors_appfuse_development&quot;&gt;OpenLogic&lt;/a&gt;. Abbie and Jack got &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=abbie_and_jack_october_2006&quot;&gt;their pictures taken&lt;/a&gt; at school and I spent at week in Keystone at &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=the_colorado_software_summit_in&quot;&gt;The Colorado Software Summit&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
In November, my sister Kalin &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=chelan_hard_cider&quot;&gt;brought some hard cider&lt;/a&gt; to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=happy_birthday_abbie2&quot;&gt;Abbie&apos;s 4th birthday&lt;/a&gt;. I attended &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=why_nofluff_rocks&quot;&gt;Denver&apos;s NoFluff&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=hug_your_kids&quot;&gt;hugged my kids&lt;/a&gt;. Jack and I had a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=boys_weekend&quot;&gt;boys weekend&lt;/a&gt; and we headed to The Cabin on &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_in_denver1&quot;&gt;Raible Road Trip #11&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://farm1.static.flickr.com/125/333288963_d4f83c79f8_o.jpg&quot; title=&quot;Helmets on and ready to go&quot; rel=&quot;lightbox[review2006]&quot;&gt;&lt;img src=&quot;//farm1.static.flickr.com/125/333288963_d4f83c79f8_t.jpg&quot; alt=&quot;Helmets on and ready to go&quot; class=&quot;picture&quot; height=&quot;75&quot; width=&quot;100&quot; /&gt;&lt;/a&gt;
To end the year, I did a bit more travel - first to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=in_boise_heading_to_florida&quot;&gt;Boise&lt;/a&gt; then to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=florida_bound&quot;&gt;Florida&lt;/a&gt; for The Spring Experience. After a &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=back_in_denver2&quot;&gt;week of vacation&lt;/a&gt; in Florida, we returned to Denver for &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=snowed_in&quot;&gt;The Blizzard of 2006&lt;/a&gt;. Finally, we drove up to Steamboat for Christmas and &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=teaching_the_kids_to_ski&quot;&gt;took the kids skiing&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;
All in all, it&apos;s been a fabulous year. Watching the kids grow up, start to play together and even have conversations with each other has been very cool.  I traveled more than I wanted to, but I also got to visit a lot of cities that I&apos;d never been to. My goals for the year? To be happy, ski more and enjoy a few car bombs with family and friends. &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/back_in_denver2</id>
        <title type="html">Back in Denver</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/back_in_denver2"/>
        <published>2006-12-18T08:43:15-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/General" label="General" />
        <content type="html">After living out of a suitcase for most of December, it was nice to arrive back in Denver last night.  I left here on December 3rd to travel to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=in_boise_heading_to_florida&quot;&gt;Boise, Idaho&lt;/a&gt; to teach a Spring course.  From there, I flew to &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=florida_bound&quot;&gt;Ft. Lauderdale, Florida&lt;/a&gt; to attend &lt;a href=&quot;http://thespringexperience.com/show_view.jsp?showId=45&quot;&gt;The Spring Experience&lt;/a&gt;.  This was an excellent show, and I &lt;a href=&quot;http://raibledesigns.com/search/rd?q=TSE&quot;&gt;blogged&lt;/a&gt; most of the sessions I attended.  To read about my AppFuse talk on Saturday night, see my &lt;a href=&quot;http://jroller.com/page/raible?anchor=the_spring_experience_day_2&quot;&gt;Spring Live blog&lt;/a&gt;. &lt;br/&gt;&lt;br/&gt;
After TSE, I spent the next week with my family in Florida.  We drove up to &lt;a href=&quot;http://disneyworld.disney.go.com&quot;&gt;Disney World&lt;/a&gt; on the 2nd day of our vacation and had a blast.  No one was there, so lines where short and the kids couldn&apos;t stop smiling.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://static.flickr.com/141/326116554_031c84273e.jpg&quot; title=&quot;Abbie and Jack with Stitch at Disney&quot; rel=&quot;lightbox&quot;&gt;&lt;img src=&quot;//static.flickr.com/141/326116554_031c84273e_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Stitch at Disney&quot; style=&quot;border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;While watching the kids&apos; faces light up at Disney was cool, driving Julie&apos;s Mom&apos;s &lt;a href=&quot;http://www.porsche.com/usa/models/cayenne/cayenne-turbo-s/&quot;&gt;Cayenne Turbo S&lt;/a&gt; around all week was a highlight for me.  It was definitely a gas-guzzler, but 520 horses is an awful lot of fun. It rained a lot the remainder of the week - almost &lt;a href=&quot;http://www.palmbeachpost.com/search/content/local_news/epaper/2006/12/15/m1a_RAIN_MAIN_1215.html&quot;&gt;8 inches in 12 hours&lt;/a&gt; one day. Even when raining, the temperature still hovered around 80&amp;deg;F all week long.  As crazy as it sounds, I&apos;m actually happy to get back to the cool weather in Denver (high of 30&amp;deg;F today).
&lt;br/&gt;&lt;br/&gt;
I&apos;ll be in the office all week, trying to tie up some loose ends before the end of the year.  This weekend, it&apos;s back to vacation mode for another week. This time we&apos;ll be heading up to &lt;a href=&quot;http://www.steamboat.com&quot;&gt;Steamboat&lt;/a&gt; for skiing, holiday cheer and (hopefully) lots of snow.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_hop_into_real_object</id>
        <title type="html">[TSE] Hop into Real Object Oriented (ROO) with Ben Alex</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_hop_into_real_object"/>
        <published>2006-12-10T10:32:04-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">This session&apos;s goals are to:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;To detail the &quot;ROO&quot; DDD architecture&lt;/li&gt;
&lt;li&gt;To show you how productive ROO can be&lt;/li&gt;
&lt;li&gt;To profile an Australian project using ROO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ROO is more of an implementation than an architecture.  So what is ROO? It&apos;s not an Australian marsupial or an Australian airline. It&apos;s a Domain-Driven Design (DDD) implementation.
&lt;br/&gt;&lt;br/&gt;
Real Object Oriented (ROO) is both an architectural approach and a framework with code generation.</summary>
        <content type="html">This session&apos;s goals are to:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;To detail the &quot;ROO&quot; DDD architecture&lt;/li&gt;
&lt;li&gt;To show you how productive ROO can be&lt;/li&gt;
&lt;li&gt;To profile an Australian project using ROO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ROO is more of an implementation than an architecture.  So what is ROO? It&apos;s not an Australian marsupial or an Australian airline. It&apos;s a Domain-Driven Design (DDD) implementation.
&lt;br/&gt;&lt;br/&gt;
Real Object Oriented (ROO) is both an architectural approach and a framework with code generation.
ROO uses 4 (UI, middle-tier, domain model and persistence) layers instead of 3.  Most of of the code is in the domain model.  In the persistence layer, most DAOs only differ in finder methods.  Rather than DAOs, &quot;Repositories&quot; (from DDD) are used.
&lt;br/&gt;&lt;br/&gt;
Since most of the code is in the &lt;span style=&quot;text-decoration: line-through&quot;&gt;middle-tier&lt;/span&gt; DO layer (including business), the middle-tier is primarily used to &quot;export&quot; interfaces for remoting, the middle-tier facade and DTOs.  Almost all of the interfaces in the ROO architecture are &lt;i&gt;generated&lt;/i&gt; or require trivial coding.
&lt;br/&gt;&lt;br/&gt;
Compare ROO to Traditional Approach (normal way people develop with Spring).&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Transparent persistence usually not used , it is in ROO&lt;/li&gt;
&lt;li&gt;Persistence layer name: DAO, Repository in ROO&lt;/li&gt;
&lt;li&gt;Finder method location: DAO, Finders in ROO&lt;/li&gt;
&lt;li&gt;State integrity: None, DO layer in ROO&lt;/li&gt;
&lt;li&gt;Business logic: Service Layer, DO Layer in ROO&lt;/li&gt;
&lt;li&gt;Form backing objects: &quot;DO&quot; layer, DTO layer in ROO&lt;/li&gt;
&lt;li&gt;DO and SL pattern names: Misused, Correct in ROO&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
ROO uses more layers and types than traditional Java. Traditional Java isn&amp;rsquo;t a fair comparison (patterns are not very OO, and can be less efficient). Ben believes the ROO approach is justifiable for 3 reasons:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Layers have well-defined purpose (OO justification)&lt;/li&gt;
&lt;li&gt;Types mostly auto-generated (efficiency justification)&lt;/li&gt;
&lt;li&gt;Architecture uses patterns (precedence justification)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
Patterns used in ROO:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Strategy&lt;/li&gt;
&lt;li&gt;Fa&amp;ccedil;ade &lt;/li&gt;
&lt;li&gt;Domain Object (&amp;ldquo;DO&amp;rdquo;) &lt;/li&gt;
&lt;li&gt;Data Transfer Object (&amp;ldquo;DTO&amp;rdquo;) &lt;/li&gt;
&lt;li&gt;DTO Assembler &lt;/li&gt;
&lt;li&gt;Repository&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There are many problem with code generation, but &lt;i&gt;quality&lt;/i&gt; code generation &lt;u&gt;is&lt;/u&gt; attainable.  
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;How is ROO different from other things?&lt;/strong&gt;
&lt;br/&gt;
It was designed to scratch an itch. Ben wrote it because he was tired of writing code using the same old architecture patterns.  He didn&apos;t write it because he wanted to start another open source project.  It was also designed to scratch other people&apos;s itch (do we really need the service layer?).  ROO is founded on a few philosophies: domain first, infrastructure 2nd, convention over configuration, embrace OO and modern capabilities.
&lt;br/&gt;&lt;br/&gt;
Ben is now doing a video demo of ROO.  In the video, he&apos;s created a project using a Maven 2 archetype (I&apos;ve seen this used a lot at this conference) and imported it into Eclipse. From there, he creates Entity classes and shows how Eclipse generates Hibernate mapping files and DTOs (as well as tests) for the entities.  The one pain (currently) is you do have to copy the generated mapping files back into your classpath. Most of the POJOs that Ben is creating for his domain model extend some ROO parent classes (i.e. AbstractDomainObjectLong).  While he does write getters in these classes, he only provides setters for those fields that can change.  Then he creates a public constructor that contains the required fields.  
&lt;br/&gt;&lt;br/&gt;
It looks like Ben has wired up some sort of external tool (or maybe a Maven plugin) to do the code generation. &lt;em&gt;Later I found out it&apos;s Java class that&apos;s merely run from Eclipse or Maven&lt;/em&gt;. ROO is Java 1.3 compatible.
&lt;br/&gt;&lt;br/&gt;
For the tests that ROO generates, it creates abstract methods for any business logic methods that need testing.  It&apos;s then up to you to subclass this test and implement the abstract test method. ROO also seems to generate population classes that populate your database for tests.  I don&apos;t know how it figures out sample address information, but I&apos;m assuming this data somehow existed in the Maven archetype.
&lt;br/&gt;&lt;br/&gt;
To create Finders with ROO, you implement a FinderSpecification class and implement a public FinderDetails[] getFinderDetails() method.  The code in this method is more like EasyMock&apos;s API than Hibernate&apos;s Criteria API.
&lt;br/&gt;&lt;br/&gt;
For the code generation, the life of a type is very important. Not only are types created initially, they&apos;re updated when you touch them. Some class are generated as Abstract classes when they need you to provide additional information.
&lt;br/&gt;&lt;br/&gt;
ROO generates custom finders, classes, and the Spring XML.  It does not generate Hibernate User Type interfaces, but it does generate classes for user types.  It generates DTOs, middle-tier facades, classes and Spring XML.  It also generates test data and tests for all the generated code.
&lt;br/&gt;&lt;br/&gt;
Ben just did a survey of the room asking who&apos;s using Ant vs. Maven.  Surprisingly, Ant only &lt;i&gt;slightly&lt;/i&gt; beats Maven. 
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Persistence in ROO&lt;/strong&gt;&lt;br/&gt;
&lt;br/&gt;
Key Principles:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Think of them as DAOs with transparent persistence &lt;/li&gt;
&lt;li&gt;Transparent persistence engine is essential &lt;/li&gt;
&lt;li&gt;Domain objects always attached to unit of work (UoW) &lt;/li&gt;
&lt;li&gt;Persistence layer may be injected into domain objects (although mostly finder types will be injected, not repositories)&lt;/li&gt;
&lt;li&gt;Persistence layer is unaware of DTOs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The Repository:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Global, shared repository &lt;/li&gt;
&lt;li&gt;Transparent persistence, API agnostic interface &lt;/li&gt;
&lt;li&gt;Method naming convention (read*, find* and make*)&lt;/li&gt;
&lt;li&gt;Some methods exported to middle tier facade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Finders:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;
Typically fine grained and domain object specific 
&lt;ul&gt;&lt;li&gt;public User[] findUserBySurname(String surname) )&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Easy to dynamically mock and DI &lt;/li&gt;
&lt;li&gt;Returns domain objects attached to UoW &lt;/li&gt;
&lt;li&gt;ROO generates finder via criteria-like API&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Middle Tier Exporting&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Repository contributes its read* methods to facade &lt;/li&gt;
&lt;li&gt;Finders contribute all methods &lt;/li&gt;
&lt;li&gt;Facades returns DTOs 
&lt;ul&gt;
&lt;li&gt;Not domain objects &lt;/li&gt;
&lt;li&gt;Conversion via DTO Assembler &lt;/li&gt;
&lt;li&gt;DTOs are normal JavaBeans &lt;/li&gt;
&lt;li&gt;DTOs lack lazy loading semantics&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Domain Objects&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Key Principles:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Most of your work and code occurs in domain objects &lt;/li&gt;
&lt;li&gt;Domain objects are your only 1st class citizens &lt;/li&gt;
&lt;li&gt;Code generation is mostly driven by domain objects &lt;/li&gt;
&lt;li&gt;DI is certainly possible&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Encapsulation:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Fully encapsulated &lt;/li&gt;
&lt;li&gt;Distinguish state managed fields &lt;/li&gt;
&lt;li&gt;Persistence layer uses field-level access &lt;/li&gt;
&lt;li&gt;Public constructors reflect mandatory fields&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For the DTO Assembler in ROO, they use &lt;a href=&quot;http://dozer.sourceforge.net/&quot;&gt;Dozer&lt;/a&gt;. Initially, they had a fair amount of issues with it, but the latest releases have solved all of those.
&lt;br/&gt;&lt;br/&gt;
In addition to the code generation for DTOs, Facades, etc., ROO generates middle-tier metadata that&apos;s all available via JMX. There is enough information provided by this metadata to build a Naked Objects implementation (or possibly even a web UI).
&lt;br/&gt;&lt;br/&gt;
Interestingly enough - it looks like the Maven archetype for this project is able to manipulate the launchers and external tools that are configured in Eclipse. &lt;em&gt;I confirmed with Ben afterwards that Maven&apos;s archetypes (or maybe it&apos;s the Eclipse plugin) are capable of configuring Eclipse&apos;s launcher configurations.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
Woolworths in Australia (not the same as Woolworths in the US) is using this system.  They&apos;ve used ROO on 3 different projects, from simple to very complex projects. For the complex project, ROO had to add support for composite primary keys. Many of the issues ROO had with Dozer were fixed and contributed back to the project by Woolworth&apos;s developers.
&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;My Thoughts&lt;/strong&gt;&lt;br/&gt;
ROO looks like a pretty cool system. It reminds me a lot of Grails&apos; &lt;a href=&quot;http://docs.codehaus.org/display/GRAILS/GORM&quot;&gt;GORM&lt;/a&gt; except that it requires more tooling. Ben said most of the code generation is driven by a Java class.  I wonder if it has templates (i.e. FreeMarker) that can be modified? If ROO ever becomes an open source project, I&apos;m guessing it will be very polished and well-received.  I&apos;m sure we could use ROO in AppFuse and make a lot of Java developers &lt;em&gt;very&lt;/em&gt; happy.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_building_modern_web_applications</id>
        <title type="html">[TSE] Building Modern Web Applications with Mike Stenhouse</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_building_modern_web_applications"/>
        <published>2006-12-10T08:51:40-07:00</published>
        <updated>2012-11-11T02:00:40-07:00</updated> 
        <category term="/The Web" label="The Web" />
        <summary type="html">&lt;a href=&quot;http://donotremove.co.uk&quot;&gt;Mike Stenhouse&lt;/a&gt; is the creator of the CSS Framework we use in AppFuse. Mike is going to talk about the tools he uses to develop web applications.  Mike works solely on the front-end, no backend work.
&lt;/p&gt;
&lt;p class=&quot;quote&quot; style=&quot;color: #666&quot;&gt;
&quot;In 2007 we&amp;rsquo;ll witness the increasing dominance of open internet standards. As 
web access via mobile phones grows, these standards will sweep aside the 
proprietary protocols promoted by individual companies striving for technical 
monopoly. Today&amp;rsquo;s desktop software will be overtaken by internet-based services that 
enable users to choose the document formats, search tools and editing capability 
that best suit their needs.&quot; &lt;em&gt;-- Eric Schmidt, CEO Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Web Standards is a methodology and philosophy, not just valid CSS and XHTML. The main philosophy behind web standards is &lt;i&gt;progressive&lt;/i&gt; enhancement.  The methodology behind web standards is a 3-step process.</summary>
        <content type="html">&lt;a href=&quot;http://donotremove.co.uk&quot;&gt;Mike Stenhouse&lt;/a&gt; is the creator of the CSS Framework we use in AppFuse&lt;sup&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_building_modern_web_applications#appfusecss&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Mike is going to talk about the tools he uses to develop web applications.  Mike works solely on the front-end, no backend work.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&quot;In 2007 we&amp;rsquo;ll witness the increasing dominance of open internet standards. As 
web access via mobile phones grows, these standards will sweep aside the 
proprietary protocols promoted by individual companies striving for technical 
monopoly. Today&amp;rsquo;s desktop software will be overtaken by internet-based services that 
enable users to choose the document formats, search tools and editing capability 
that best suit their needs.&quot; &lt;em&gt;-- Eric Schmidt, CEO Google&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Web Standards is a methodology and philosophy, not just valid CSS and XHTML. The main philosophy behind web standards is &lt;i&gt;progressive&lt;/i&gt; enhancement.  The methodology behind web standards is a 3-step process.
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Figure out what the content means&lt;/li&gt;
&lt;li&gt;Code the HTML accordingly, ignoring the design&lt;/li&gt;
&lt;li&gt;Then write your CSS to realise the design&lt;/li&gt;
&lt;li&gt;Finally, add a sprinkling of Javascript to tune the interaction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;HTML&lt;/strong&gt;&lt;br/&gt;
X/HTML is where you get most of your benefits from. It should be content only, nothing else.  If your content and XHTML sucks, CSS is probably not going to be able to help a whole lot.  HTML vs. XHTML have small syntax differences, the main differences show up with the mode of the doctype. HTML 4 Strict, XHTML Transitional and XHTML Strict are all good. HTML 4 Loose sucks.
&lt;br/&gt;&lt;br/&gt;
HTML is the skeleton and isn&apos;t as easy as people think it is.  Tables and nested tables are some of the worst offenders of bad HTML.  When people move from table-based layouts to standards-based layouts, it&apos;s usually a disaster because of meaningless classes on div tags.  A lot of times, adding classes to HTML elements is completely meaningless.  The less classes and ids, generally the better. By removing classes, your HTML becomes much more readable (save for input tags and such).
&lt;br/&gt;&lt;br/&gt;
This is what&apos;s called semantic HTML. It has nothing to do with the Semantic Web.  Using HTML for what it&apos;s designed for. Headings are in order, paragraphs, lists, inputs, labels, fieldsets. Tables are used only for tabular data.
&lt;br/&gt;&lt;br/&gt;
To write semantic HTML, use the following guidlines:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Look at your content and figure out its meaning&lt;/li&gt;
&lt;li&gt;Think of the document outline mode in Word -the headings are used to navigate&lt;/li&gt;
&lt;li&gt;Group form elements and work out what order they should be filled in&lt;/li&gt;
&lt;li&gt;If it&amp;rsquo;s too tricky there might be a problem with the design&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Using these guidelines will help you write cleaner code.  The &lt;a href=&quot;http://www.csszengarden.com/&quot;&gt;CSS Zen Garden&lt;/a&gt; is a poor example of semantic HTML - there&apos;s just too many classes. You should try to push classes and ids upwards.  For example, you can convert the following HTML from:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a class=&quot;navlink&quot; href=&quot;x&quot;&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a class=&quot;navlink&quot; href=&quot;y&quot;&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a class=&quot;navlink&quot; href=&quot;z&quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;ul class=&quot;nav&quot;&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href=&quot;x&quot;&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href=&quot;y&quot;&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;a href=&quot;z&quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
The first example only allows you to style with &quot;a.navlink&quot;, whereas the 2nd gives you more elements to style (ul.nav a, ul.nav, ul.nav li).
&lt;br/&gt;&lt;br/&gt;
Another suggestion is to use multiple classes on your HTML elements.
&amp;lt;body class=&quot;order final sales&quot;&gt; can be controlled with body.sales, body.final and body.order.final CSS classes. CSS class names should be almost like metadata - they should relate more to the content to the design.
&lt;br/&gt;&lt;br/&gt;
By using web standards-based design, you get the benefits of debugging (W3C Validator). In addition, you get SEO benefits from good HTML.  If you use proper semantic HTML, machines can make better sense of your HTML.  Headings are one of the most important things for SEO.  It&apos;s amazing how simple this stuff is and how few people understand it.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Microformats&lt;/strong&gt;&lt;br/&gt;
Microformats are a way of adding metadata to your HTML.  They basically say to use classes, rels and refs, and use them in a specific way.  The Semantic Web community has recently started forming ties with the microformats community.  A few uses are currently in existence: hCard, hReview, hCalender, hResume, XFN, XOXO, rel-directory, rel-pavatar, rel-nofollow, rel-tag and xFolk.
&lt;br/&gt;&lt;br/&gt;
To conform to a microformat, you simply need to add add certain classes to your existing markup.  For example, here&apos;s an address in hCard format:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;div class=&quot;box vcard&quot;&amp;gt;
   &amp;lt;h3&amp;gt;Contact Details&amp;lt;/h3&amp;gt; 
   &amp;lt;a class=&quot;fn url&quot; href=&quot;ttp://adactio.com/&quot;&amp;gt;
       &amp;lt;span class=&quot;given-name&quot;&amp;gt;Jeremy&amp;lt;/span&amp;gt; 
       &amp;lt;span class=&quot;family-name&quot;&amp;gt;Keith&amp;lt;/span&amp;gt;
    &amp;lt;/a&amp;gt; 
    &amp;lt;p class=&quot;adr&quot;&amp;gt;
        &amp;lt;span class=&quot;street-address&quot;&amp;gt;57/58 Brunswick Road&amp;lt;/span&amp;gt; 
        &amp;lt;span class=&quot;locality&quot;&amp;gt;Hove&amp;lt;/span&amp;gt;
        &amp;lt;a class=&quot;postal-code&quot; 
           href=&quot;http://maps.google.co.uk/maps?q=bn3+1dh&quot; title=&quot;map&quot;&amp;gt;BN3 1DH&amp;lt;/a&amp;gt; 
        &amp;lt;span class=&quot;country-name&quot;&amp;gt;England&amp;lt;/span&amp;gt;
    &amp;lt;/p&amp;gt; 
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;If you feed this into Technorati, it can give you back a vCard.  It can also work by specifying a URL that contains HTML with this microformat.
&lt;br/&gt;&lt;br/&gt;
Even Bill Gates said &quot;We need microformats&quot;. They&apos;re definitely starting to get a lot of traction.  The beauty is they&apos;re very simple to use and implement.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;CSS&lt;/strong&gt;&lt;br/&gt;
What&apos;s important about CSS is it allows you to redefine how your HTML elements behave and display on a page. Firefox actually uses CSS (including some CSS 3.0 stuff) to control how HTML renders.  With CSS, you can extract your design from the HTML.  It&apos;s the icing on the HTML cake.  
&lt;br/&gt;&lt;br/&gt;
CSS allows you to separate the front from the back.  It can very useful for designers and developers.  Developers do the HTML, designers do the CSS. The CSS Zen Garden is the best example of how powerful CSS is.
&lt;br/&gt;&lt;br/&gt;
CSS allows you to retask-content.  For example, supplying a different CSS file for printing is a great use.  There&apos;s also support for mobile devices and projectors, but they&apos;re not as well supported.
&lt;br/&gt;&lt;br/&gt;
CSS allows you to define your display once and reuse more. DRY for HTML.  You can even get re-use between sites by using &quot;modular CSS&quot;.  Mike generally breaks his CSS down into groups using @import:
&lt;/p&gt;
&lt;pre&gt;
@import url(&quot;tools.css&quot;);
@import url(&quot;typo.css&quot;); 
@import url(&quot;forms.css&quot;);
@import url(&quot;tables.css&quot;); 
@import url(&quot;layout.css&quot;);
&lt;/pre&gt;
&lt;p&gt;
Other breakdowns: site sections, color, old browsers vs. new browsers and layout (CSS Framework). Basically, use a different stylesheet to separate these different breakdowns.
&lt;/p&gt;
&lt;p&gt;
Mike invented the &lt;a href=&quot;http://www.contentwithstyle.co.uk/Articles/17/&quot;&gt;CSS Framework&lt;/a&gt; as a &quot;set of standard naming conventions for the HTML and an example set of layout stylesheets&quot;.
&lt;br/&gt;&lt;br/&gt;
The CSS Framework gives you a massive head start on small projects, but may not be as useful for large projects.  Mike is working with &lt;a href=&quot;http://www.killersoft.com/randomstrings/&quot;&gt;Clay Loveless&lt;/a&gt; to create an updated version of The CSS Framework. &lt;em&gt;The first thing I&apos;d suggest is a new name, while &quot;the CSS Framework&quot; is a descriptive name, it&apos;s too much of a mouthful.  Look at what the term &quot;Ajax&quot; did for XHTML, JavaScript, CSS and XHR.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
Hacks for the different browsers: the only one that Mike uses regularly is &quot;* html&quot; for IE.  He generally applies &quot;height: 1%&quot;.  Occasionally he needs \ for IE 5.x. 
&lt;/p&gt;
&lt;pre&gt;
w\idth: 50px; 
width: 40px;
&lt;/pre&gt;
&lt;p&gt;The final hack is to put your IE-specific rules in ie.css, but Mike&apos;s not a big fan of it.
&lt;br/&gt;&lt;br/&gt;
Rules of thumb to avoid browser-compatibility issues:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Avoid margins and padding on elements with a width&lt;/li&gt;
&lt;li&gt;Use % font-size on the body and ems for everything else&lt;/li&gt;
&lt;li&gt;Avoid PNG and alpha transparency&lt;/li&gt;
&lt;li&gt;Avoid too much styling on form elements (can be a nightmare to do cross-browser)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
IE7 fixed the * html parsing error so filter doesn&apos;t work in IE7.  They haven&apos;t fixed &quot;hasLayout&quot; or conditional comments. &quot;hasLayout&quot; is a bug in IE that adds padding around list elements whenever they have any CSS styles applied to them. &lt;em&gt;I&apos;m sure there&apos;s more too this, but I didn&apos;t get a chance to write it down.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
Triggering hasLayout cures similar problems to height: 1% in previous versions. You can manipulate programmatically using object.currentStyle.hasLayout.
&lt;br/&gt;&lt;br/&gt;
Conditional comments are still a problem.  Mike likes it because it allows you to put all your IE hacks in one place.  He doesn&apos;t like it because it requires you keep an extra things in your head.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;JavaScript&lt;/strong&gt;&lt;br/&gt;
JavaScript has gotten a bad name because it was used to add a lot of crap to web pages for so many years.  It used to be used to create atrocities, whereas now it&apos;s used to create very elegant sites.  
&lt;br/&gt;&lt;br/&gt;
The first thing that brought back Ajax is &quot;DOM Scripting&quot;.
DOM Scripting is methods for accessing and modifying the DOM.  The DOM is an HTML page represented as a tree of objects.
&lt;br/&gt;&lt;br/&gt;
History: DOM0 was not a standard.  DOM1 is a standard for navigation and manipulation.  DOM2 is XML and events (onclick, onblur, etc.).
&lt;br/&gt;&lt;br/&gt;
The 2nd thing that brought back JavaScript is Ajax.  There&apos;s a number of different Ajax techniques:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;XmlHttpRequest object&lt;/li&gt;
&lt;li&gt;IFrames&lt;/li&gt;
&lt;li&gt;Flash Remoting&lt;/li&gt;
&lt;li&gt;Applets&lt;/li&gt;
&lt;li&gt;Comet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Mike is using applets on a project right now for heavy visualization. They use Ajax with applets so it doesn&apos;t unload the VM and they&apos;re calling it &quot;AppleJax&quot;.
&lt;br/&gt;&lt;br/&gt;
The main problems with Ajax when it first came out where: network latency, usability, JavaScript off, SEO and Accessibility.
&lt;br/&gt;&lt;br/&gt;
Frameworks can help you get around a lot of the issues with Ajax.  The problems with frameworks is there are so many.  A few of the best: Dojo, Prototype, YUI, MochiKit, Moo Tools and jQuery.  Mike&apos;s favorite is &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Dojo is great, but almost does &lt;i&gt;too much&lt;/i&gt;.  Mike is afraid to use it because he doesn&apos;t understand how they do some things. 
&lt;br/&gt;&lt;br/&gt;
Dojo:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Devilishly clever &lt;/li&gt;
&lt;li&gt;Application-like functionality in the browser &lt;/li&gt;
&lt;li&gt;Includes stuff like client-side storage &lt;/li&gt;
&lt;li&gt;Massive &lt;/li&gt;
&lt;li&gt;Not much documentation&lt;/li&gt; 
&lt;li&gt;Black magic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
YUI:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;The full weight of Yahoo! behind it&lt;/li&gt; 
&lt;li&gt;Extremely well documented &lt;/li&gt;
&lt;li&gt;Modular &lt;/li&gt;
&lt;li&gt;Lacking in sex-appeal&lt;/li&gt; 
&lt;li&gt;Can get very heavy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
MochiKit:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Modeled after Python &lt;/li&gt;
&lt;li&gt;Quite heavy &lt;/li&gt;
&lt;li&gt;Highly rated but hasn&amp;rsquo;t experienced the sort of adoption the other frameworks have seen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Prototype:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Built into Rails (the main reason Mike used it)&lt;/li&gt;
&lt;li&gt;Good Ajax &lt;/li&gt;
&lt;li&gt;Quite heavy, especially with Scriptaculous &lt;/li&gt;
&lt;li&gt;Dispersed documentation but readable source code &lt;/li&gt;
&lt;li&gt;Missing some basic helpers (addressed by &lt;a href=&quot;http://www.danwebb.net/2006/9/3/low-pro-unobtrusive-scripting-for-prototype&quot;&gt;Low Pro&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Moo Tools:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Modular &lt;/li&gt;
&lt;li&gt;Functional &lt;/li&gt;
&lt;li&gt;Very compact&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;margin-left: 30px; font-style: italic&quot;&gt;Mike mentions Moo Tools because friends have recommended it that are &quot;in the know&quot;.&lt;/p&gt;
&lt;p&gt;jQuery:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Lightweight &lt;/li&gt;
&lt;li&gt;Uses CSS syntax &lt;/li&gt;
&lt;li&gt;Perfectly suited to progressive enhancement &lt;/li&gt;
&lt;li&gt;Functional design &lt;/li&gt;
&lt;li&gt;Well documented &lt;/li&gt;
&lt;li&gt;Basic Ajax&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
However, Ajax frameworks can be dangerous. It&apos;s the problem of leaky abstractions - if you don&apos;t understand what the framework is doing, it can be difficult to debug and refactor.  Mike recommends writing JavaScript the long way and then refactor it to use a framework after you understand it.
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Unobtrusive JavaScript&lt;/b&gt; is why Mike came here to talk today.  It allows you do &quot;progressive enhancement for your applications&quot;. To use &lt;i&gt;progressive enhancement&lt;/i&gt;, your JavasSript should be kept separate from your HTML and CSS. Everything should work without JavaScript. It should be possible to use progressive enhancement with full-blown Ajax applications.
&lt;br/&gt;&lt;br/&gt;

Inline JavaScript sucks:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;a href=&quot;#&quot; onclick=&quot;lightbox(&apos;/show_email/224899&apos;); return false;&quot;&amp;gt;Daily Call&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;#&quot; onclick=&quot;lightbox(&apos;/show_email/138512&apos;); return false;&quot;&amp;gt;Access Card Information&amp;lt;/a&amp;gt; 
&amp;lt;a href=&quot;#&quot; onclick=&quot;lightbox(&apos;/show_email/83407&apos;); return false;&quot;&amp;gt;Can UBS Tame Enron&apos;s Wild Traders?&amp;lt;/a&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;A better solution is:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;a href=&quot;/show_email/224899&quot;&amp;gt;Daily Call&amp;lt;/a&amp;gt;
&amp;lt;a href=&quot;/show_email/138512&quot;&amp;gt;Access Card Information&amp;lt;/a&amp;gt; 
&amp;lt;a href=&quot;/show_email/83407&quot;&amp;gt;Can UBS Tame Enron&apos;s Wild Traders?&amp;lt;/a&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
window.onload = function() { 
    if (!document.getElementsByTagName) return;
    var links = document.getElementsByTagName(&amp;amp;lsquo;A&amp;amp;rsquo;); 
    each (link in links) {
        link.onclick = function() { lightbox(this.href); return false; }; 
    }
}; 
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
&lt;a href=&quot;http://dean.edwards.name/weblog/2005/09/busted/?full&quot;&gt;onready&lt;/a&gt; is a better way to do window.onload as it will fire as soon as the HTML has come down.  &lt;a href=&quot;http://domscripting.com/presentations/xtech2006/&quot;&gt;Hijax&lt;/a&gt; embraces this idea.  The approach is as follows:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Make a rock-solid, Web 1.0 app&lt;/li&gt;
&lt;li&gt;Good, old fashioned GETs and POSTs that will work in any browser and on any platform &lt;/li&gt;
&lt;li&gt;Just HTML styled with CSS &lt;/li&gt;
&lt;li&gt;Add a layer of Javascript attached via the DOM to enhance the experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It might take a little more work to develop this way, but it&apos;s a much more solid foundation.  If your JavaScript/Ajax starts to break, the app should still work.  A good example is &lt;a href=&quot;http://odeo.com/&quot;&gt;Odeo&lt;/a&gt;.  Apparently, one of their releases, they forgot to deploy the JavaScript and the whole site continued to work - no one even told them.
&lt;/p&gt;&lt;p&gt;
Other benefits: your app doesn&apos;t depend on JavaScript so it&apos;ll work on devices that don&apos;t support it.  There&apos;s no way you can possibly account for every use someone might put your site to (mobile phone, accessibility devices, set top boxes, etc.).
&lt;/p&gt;&lt;p&gt;
Keep your JavaScript and CSS separate.  Don&apos;t manipulate styles with JavaScript, just switch CSS classes.
&lt;/p&gt;&lt;p&gt;
Back to Eric Schmidt&apos;s quote.  If you use &quot;progressive enhancement&quot;, it&apos;s an excellent way to leverage web standards.  The better the browser, the better the experience.
&lt;/p&gt;
&lt;a name=&quot;appfusecss&quot;&gt;&lt;/a&gt;
&lt;p class=&quot;quote&quot;&gt;
1. At the end of his talk, Mike mentioned that he got invited to this conference &lt;em&gt;because&lt;/em&gt; we use the CSS Framework in AppFuse.  &lt;em&gt;Cool!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;My Thoughts&lt;/strong&gt;&lt;br/&gt;
After Mike&apos;s talk, I walked up and introduced myself. I thanked him for the CSS Framework and we chatted a bit about his talk.  I really like his recommendations of &lt;i&gt;progressive enhancement&lt;/i&gt; (or &lt;a href=&quot;http://domscripting.com/presentations/xtech2006/&quot;&gt;Hijax&lt;/a&gt;) and plan to use it a lot more when developing UIs.  Mike was an excellent speaker and one of those guys you instantly want to have a beer with.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_keynote_the_bigger_picture</id>
        <title type="html">[TSE] Keynote: The Bigger Picture with Adrian Colyer</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_keynote_the_bigger_picture"/>
        <published>2006-12-09T19:26:49-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">We&apos;ve seen a lot of things over the last few days, but what about the big picture? It&apos;s not just about the Spring Framework anymore, but there&apos;s also a lot of sub-projects: SFW, SWF, SWS, S-OSGi.  Then there&apos;s Enterprise services: clustering, persistence, messaging and scheduling.  Industry trends: SOA, Web 2.0/RIA, RAD stacks.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Agenda&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Spring portfolio: unifying themes, fitting the pieces together (by layer) and future direction&lt;/li&gt;
&lt;li&gt;Facing the feature: my boss says I need a SOA, from auto-suggest to RIA and the quest for ever-increasing productivity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;</summary>
        <content type="html">We&apos;ve seen a lot of things over the last few days, but what about the big picture? It&apos;s not just about the Spring Framework anymore, but there&apos;s also a lot of sub-projects: SFW, SWF, SWS, S-OSGi.  Then there&apos;s Enterprise services: clustering, persistence, messaging and scheduling.  Industry trends: SOA, Web 2.0/RIA, RAD stacks.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Agenda&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Spring portfolio: unifying themes, fitting the pieces together (by layer) and future direction&lt;/li&gt;
&lt;li&gt;Facing the feature: my boss says I need a SOA, from auto-suggest to RIA and the quest for ever-increasing productivity&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The first thing that&apos;s Spring has done is to give you a &lt;i&gt;triangular&lt;/i&gt; simple object.  Because a triangle is one of the strongest shapes, this is why Spring holds up to heavy loads and lots of users.  Triangles work much better than circles.  
&lt;/p&gt;
&lt;p&gt;Spring is built on &quot;simple objects&quot; and 3 principles: Dependency Injection, AOP and Portable Service Abstractions.
&lt;/p&gt;
&lt;p&gt;
The &quot;blueprints&quot; that Spring provides are a great way to understand applications.  If a a team uses simple objects + blueprints, chances are an experienced Spring developer can understand how most of the application works.
&lt;/p&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Data Access Layer&lt;/strong&gt;&lt;br/&gt;
Spring supports JDBC, iBATIS, JDO, Hibernate, TopLink. In addition, Spring 2.0 has JPA Support, including OpenJPA, TopLink Essentials and Hibernate. Further enhancements coming for 2.1: JPA namespace and support for common non-standard features (for example, criteria API and user types).
&lt;/p&gt;
&lt;p&gt;
Other backends: Spring also has support for accessing enterprise systems, CICS and IMS.  Spring has JCA CCI support with the &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/jca/cci/core/CciTemplate.html&quot;&gt;CCiTemplate&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.springframework.org/ldap&quot;&gt;Spring LDAP&lt;/a&gt; project adds support for interacting with LDAP servers. I&apos;ve worked with Spring LDAP and it certainly does work nice.  The only thing I found painful was that it didn&apos;t support transactions, but neither does LDAP, so that&apos;s to be expected. If you&apos;ve never used Spring LDAP, you probably already know a lot about &lt;a href=&quot;http://static.springframework.org/spring-ldap/docs/1.1/api/org/springframework/ldap/LdapTemplate.html&quot;&gt;LdapTemplate&lt;/a&gt;, even if you haven&apos;t used it.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Service Layer&lt;/strong&gt;&lt;br/&gt;
You all know how to define business services, but what about scheduling, asynchronous messaging, ESBs, etc?  Spring has support for scheduling with JDK Timer and Quartz.  You can run jobs in background with cron expressions or simple triggers.  &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/scheduling/quartz/MethodInvokingJobDetailFactoryBean.html&quot;&gt;MethodInvokingJobDetailFactoryBean&lt;/a&gt; makes it trivial to execute an operation on a bean.
&lt;br/&gt;&lt;br/&gt;
Asynchronous tasks can be run by &lt;a href=&quot;http://www.springframework.org/docs/reference/scheduling.html#scheduling-task-executor&quot;&gt;TaskExecutor&lt;/a&gt;.  It can be kicked off programmatically or by a scheduler.  Simple confugiration change to switch from thread pool to &lt;a href=&quot;http://dev2dev.bea.com/wlplatform/commonj/&quot;&gt;commonj&lt;/a&gt; work manager.
&lt;br/&gt;&lt;br/&gt;
Messaging: 
Spring 2.0 extended Spring&apos;s JMS support.  JmsTemplate + Message-driven POJOs.  It&apos;s fully Java EE compliant, can participate in a transaction and process a message and send a reply in one unit of work.
&lt;br/&gt;&lt;br/&gt;
For XML payloads, you can use &lt;a href=&quot;http://www.springframework.org/spring-ws&quot;&gt;Spring Web Services&lt;/a&gt; to do OXM (Object XML Mapping).
&lt;br/&gt;&lt;br/&gt;
Is all this heading towards an ESB-like system?  In a sense, so why not just use a full-blown ESB like Mule.  Mule 2.0 is being re-written to be entirely based on Spring. 
&lt;br/&gt;&lt;br/&gt;
ESB - Mule integration: 
Spring application context support simple event framework: ApplicationEventPublisher and ApplicationEventPublisherAware, ApplicationEvent and ApplicationListener.  Simple for a bean to publish and listen to events.  Mule can integrate into this as a custom event multi-caster.
&lt;br/&gt;&lt;br/&gt;
Configure a bean to listen only to events of interest using MuleSubscriptionEventListener.  You can publish events to mule using a normal ApplicationEventPublisher interface and create a MuleApplicationEvent to publish.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Clustering&lt;/strong&gt;&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.tangosol.com/html/coherence-overview.shtml&quot;&gt;Tangosol Coherence&lt;/a&gt; and Coherence Data Grid for Spring:
You can use a &amp;lt;datagrid:member&gt; to register application context as a member of a DataGrid.  Application events are grid-wide.  &amp;lt;bean id=&quot;...&quot; scope=&quot;datagrid&quot;&gt;: bean operations &quot;in-place&quot; in the grid.  There&apos;s no need for cluster-wide locking (b/c it&apos;s fast).  DataGridBean transaction management.  &amp;lt;datagrid:cache/&gt; allows you to define a datagrid as a bean.  Furthermore, there&apos;s Java and .NET interoparability for DataGrid beans.&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;http://gigaspaces.com&quot;&gt;GigaSpaces&lt;/a&gt; 5.2 was announced last week.  Use POJOs as space entries, full Spring transaction integration.  There&apos;s also a PlatformTransactionManager implementation.  You can access their DataGrid using a JdbcTemplate and GigaSpaces&apos; JDBC Driver, or you can use the GigaSpacesTemplate.  You can access the GigaSpaces MessageGrid via Spring&apos;s JMS abstraction.  You can submit jobs to the ComputeGrid, which is a parallel processing engine.  It works with Spring AOP to create proxy to remove service and uses a DelegratingWorker from Spring modules for task execution.&lt;/li&gt;
&lt;li&gt;
&lt;a href=&quot;http://www.terracotta.org/&quot;&gt;Terracotta&lt;/a&gt;:
Allows you to cluster any singleton Spring bean.  Beans named in Terracotta configuration file, and clustering is completely transparent to Spring and to your application. The state of that bean will be shared across the cluster.  You can publish ApplicationEvents across the cluster - where application events are propogated to all listers in each JVM.  Terracotta allows clustering Spring Web Flow to enable failover of conversation state.  AOP + clustered beans + Spring JMX = cluster management view (view local vs. clustered data). &lt;i&gt;Now free and open source!&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Security impacts all layers. It starts in remote and web interfaces and can be useful for role-based method-invocations in service layer and data layer.  Furthermore, Acegi&apos;s ACLs can be very useful for fine-grained security on domain objects. &quot;Spring Security is one of the hidden jewels in the bunch here.&quot;
&lt;/p&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;
Presentation Layer&lt;/strong&gt;&lt;br/&gt;
Spring Rich Client is another member of the Spring family that allows you to leverage Spring ideas in a Swing application. Has support for GUI builders and many other features that allow you to write Swing easier.
&lt;br/&gt;&lt;br/&gt;
Spring MVC is great for free navigation and has a nice Controller hierarchy.  Supports many more view options than just JSP.  When developing wizards, it gets a bit more complicated. If you&apos;re stressing AbstractWizardFormController even a little bit, it&apos;s time for Spring Web Flow.
&lt;br/&gt;&lt;br/&gt;
Spring Web Flow is for controlled navigation. You can model a web interaction as a flow and declare states and transitions between them.  By modeling that flow in a blueprint and declaring the various states and transitions, you can easily abstract and compose how to navigate between pages. SWF can be used with servlets, portlets and multiple web frameworks.  It supports post-redirect-get automatically and browser buttons &quot;just work&quot;.
&lt;br/&gt;&lt;br/&gt;
Where is future for SWF: even simpler flow definitions for common patterns (higher level of abstraction in configuration.  Also, first class JSF support.  Apparently, the JSF support is not as good as they&apos;d like it to be.
&lt;br/&gt;&lt;br/&gt;
Spring IDE has support for code-completion in XML, the &quot;p&quot; namespace and composing web flows graphically. Spring IDE also will have AOP support, much like AJT gives you for AspectJ (this is &lt;i&gt;very&lt;/i&gt; cool IMO). With the AOP support, you can navigate between an Aspect and the XML configuration that defines it.
&lt;br/&gt;&lt;br/&gt;
Web 2.0 / Ajax / RIA - what about creating the better using experience with these tools?  Ajax ingredients are UI toolkits, effects and a means of communicating with the server.  To return XML from Spring MVC, you can use AbstractXsltView (with no styleSheetLocation set).  For converting model objects to XML, you can use Spring Web Services OXM stuff.  It can get simpler than that - just use DWR and JSON-RPC.  If you want to secure DWR, Spring Security will allow you to do that.  Acegi is apparently looking at doing better support for Ajax and DWR.  DWR 2.0 has a new Spring &amp;lt;dwr:*&amp;gt; namespace that allows you to easily nest a &amp;lt;dwr:remote&amp;gt; tag in a bean definition and expose that bean as a JavaScript object.
&lt;br/&gt;&lt;br/&gt;
If you need a real web service, Spring supports that. Use XFireExporter for simple RPC style services.  For everything else, there&apos;s Spring Web Services.  It has an Object/XML mapping abstraction, a framework that resembles Spring MVC and it supports WS-Security with Spring Security. Interface21 has heard from many customers that Spring WS is one of their favorite pieces of the Spring portfolio.
&lt;br/&gt;&lt;br/&gt;
OSOA (Open SOA Collaboration) is made up of a number of companies: BEA, IBM, Oracle, SAP, Sun ... and ... Interface21.
&lt;br/&gt;&lt;br/&gt;
Service Component Architecture - course grained SOA.  It has an assembly model with service components, references and wires everything together.  It also contains a policy framework that supports QoS.  Service implementation and client API can be Java, C++, BPEL, EJB or Spring.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;AOP&lt;/strong&gt;&lt;br/&gt;
Spring 2.0 delivered close integration between AspectJ and Spring AOP.  It&apos;s also easy to use the full power of AspectJ with Spring application if you need it. AOP + JMX is particularly compelling - take a look at the &lt;a href=&quot;http://www.glassbox.com&quot;&gt;Glassbox&lt;/a&gt; project for an example of this.  Juergen has also been working on integrating load-time weaving as your application context is being initialized.
&lt;br/&gt;&lt;br/&gt;
Spring-OSGi - allows you to use a SOA across application context within the same application.  Allows a very strong module system, versioning, concurrent deployment (of different versions) and hot re-deploy.
&lt;br/&gt;&lt;br/&gt;
Rapid Application Development: 
Spring 2.0 supports beans written in alternative languages: JRuby, Groovy and Beanshell.  
ROO (Real Object Oriented) application.  Domain first, infrastructure second.  Full static rapid development and has been validated with clients to great success.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Summary&lt;/strong&gt;&lt;br/&gt;
Spring has consistent themes and approach. More than just &quot;The Spring Framework&quot;.  There&apos;s over 20 projects &lt;i&gt;in addition&lt;/i&gt; to core Spring that allow you to do great things and build applications easier.  Eight of these projects are lead by Interface21.  Next year, they&apos;re hoping to do something like Callisto where &lt;i&gt;all&lt;/i&gt; Spring-related projects can do a simultaneous release. 
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;My Thoughts&lt;/strong&gt;&lt;br/&gt;
Interestingly enough, many of the web frameworks that build on Spring aren&apos;t listed here (AppFuse, Grails, Trails, etc.).  That makes sense since these projects are most useful when doing greenfield development and I doubt Interface21 does much of that. 
&lt;br/&gt;&lt;br/&gt;
With all of the Spring projects, Interface21 is starting to look like JBoss.  However, one of the major differences between I21 and JBoss is the majority of Spring projects are actually &lt;em&gt;not&lt;/em&gt; lead by Interface21.
&lt;br/&gt;&lt;br/&gt;
This was one of my favorite talks of the show because it talked about the future of Spring and what&apos;s on the roadmap for many sub-projects.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_spring_osgi_with_adrian</id>
        <title type="html">[TSE] Spring-OSGI with Adrian Colyer</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_spring_osgi_with_adrian"/>
        <published>2006-12-09T14:29:58-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">One of the first questions people ask about OSGi is &quot;what the heck is it?&quot;&lt;br/&gt;&lt;br/&gt;
Most people don&apos;t even know what it is. OSGi stands for &lt;b&gt;O&lt;/b&gt;pen &lt;b&gt;S&lt;/b&gt;ervices &lt;b&gt;G&lt;/b&gt;ateway &lt;b&gt;i&lt;/b&gt;nitiative. From the very beginning, it was designed to be lightweight and dynamic. This is the major difference between it and other containers.  It&apos;s always been designed to have things added and removed.  Now it&apos;s tagline is: &quot;The Dynamic Module System for Java&quot;.
&lt;br/&gt;&lt;br/&gt;
It&apos;s designed to allow you to partition a system into a number of modules (a.k.a. bundles).  There&apos;s strict visibility rules (similar to protected and private).  There&apos;s a resolution process (dependencies are satisfied) and it understands versioning.
&lt;br/&gt;&lt;br/&gt;
It&apos;s dynamic! Modules can be installed, started, stopped, uninstalled and updated - all at runtime.</summary>
        <content type="html">Adrian has &lt;i&gt;CTO&lt;/i&gt; as his title on his slides.  Wasn&apos;t he hired as &quot;Chief Scientist&quot; &lt;a href=&quot;http://www.aspectprogrammer.org/blogs/adrian/2005/09/joining_interfa.html&quot;&gt;originally&lt;/a&gt;? I wonder why his title changed?  Maybe having the CTO title is a better way of getting more cash when the buyout happens?  What buyout you ask?  I don&apos;t know, but I can&apos;t help but think that Interface21 is on the radar of major organizations like Oracle and BEA.  While it might suck for those guys to answer to a larger organization, it would be nice to see Rod, Juergen, et. al. benefit ($$) from all their hard work.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Agenda&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot; style=&quot;margin-top: 0&quot;&gt;
&lt;li&gt;What is OSGi?&lt;/li&gt;
&lt;li&gt;What problems does it help us to solve?&lt;/li&gt;
&lt;li&gt;How does it work?&lt;/li&gt;
&lt;li&gt;Where does Spring fit in?&lt;/li&gt;
&lt;li&gt;Spring-OSGi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
One of the first questions people ask about OSGi is &quot;what the heck is it?&quot;
&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;
 The 2nd question is &quot;what&apos;s with the lowercase i?&quot; Seriously - does anyone know?&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;
Most people don&apos;t even know what it is. OSGi stands for &lt;b&gt;O&lt;/b&gt;pen &lt;b&gt;S&lt;/b&gt;ervices &lt;b&gt;G&lt;/b&gt;ateway &lt;b&gt;i&lt;/b&gt;nitiative. From the very beginning, it was designed to be lightweight and dynamic. This is the major difference between it and other containers.  It&apos;s always been designed to have things added and removed.  Now it&apos;s tagline is: &quot;The Dynamic Module System for Java&quot;.
&lt;br/&gt;&lt;br/&gt;
It&apos;s designed to allow you to partition a system into a number of modules (a.k.a. bundles).  There&apos;s strict visibility rules (similar to protected and private).  There&apos;s a resolution process (dependencies are satisfied) and it understands versioning.
&lt;br/&gt;&lt;br/&gt;
It&apos;s dynamic! Modules can be installed, started, stopped, uninstalled and updated - all at runtime.
&lt;br/&gt;&lt;br/&gt;
It&apos;s even service oriented (no wonder IBM loves it). Bundles can &lt;i&gt;publish&lt;/i&gt; services (dynamically).  The Service Registry allows other bundles to &lt;i&gt;find&lt;/i&gt; services and &lt;i&gt;bind&lt;/i&gt; to them.  Services come and go at runtime, all taken care of for you.
&lt;br/&gt;&lt;br/&gt;
Where does OSGi come from?  It&apos;s backed by the &lt;a href=&quot;http://www.osgi.org&quot;&gt;OSGi Alliance&lt;/a&gt;. Unfortunately, this site makes it difficult to figure out exactly what OSGi is.  The founders of OSGi understood it needed to be lightweight and dynamic from day one.  It started in 1999, and was originally focues on embedded Java nd networked devices.  In 2003 it was exteneded to support to mobile devices.  In 2004, it had significant ope source community opttion with Eclipse.  In 2006 and 2007, it&apos;s moving into server-side Java.
&lt;br/&gt;&lt;br/&gt;
Who&apos;s doing OSGi containers?&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Open-source implementations: Equinox, Felix (Apache), Knopflerfish&lt;/li&gt;
&lt;li&gt;Significant Enterprise usage: Eclipse, IBM (WebSphere, Lotus), JOnAS, interest from BEA and Oracle&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong&gt;So what?&lt;/strong&gt; What problems does OSGi solve?
&lt;br/&gt;&lt;br/&gt;
&lt;b style=&quot;color:#666&quot;&gt;Visibility&lt;/b&gt;
By default, a bundle is a black box.  It&apos;s completely protected and you can&apos;t see inside it, not even with reflection or any other classloading trickery. Only exported packages are visible outside of the exporting bundle. This stops unintended coupling between modules, enables independent development, faster development cycles and security.
&lt;br/&gt;&lt;br/&gt;
&lt;b style=&quot;color:#666&quot;&gt;Operational Control&lt;/b&gt;&lt;br/&gt;
An OSGi container allows you to see all modules and their status - using the OSGi console or JMX.  You can get information on wiring, install new bundles, activate bundles (and publish services), deactivate bundles (and unregister services), refresh bundles, stop bundles and uninstall bundles.  The beauty?  You can do all of this &lt;i&gt;without stopping or restarting the application!&lt;/i&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;b style=&quot;color:#666&quot;&gt;What is an OSGi bundle?&lt;/b&gt;&lt;br/&gt;
It&apos;s just a jar file.  There&apos;s no complicated tools or sophisticated packaging required.  All you need is a symbolic name in your META-INF/MANIFEST.MF file.  For example:
&lt;/p&gt;
&lt;pre&gt;
Bundle-SymbolicName: org.swf.beans
&lt;/pre&gt;
&lt;p&gt;There are a number of other attributes you can specify, but the SymbolicName is the only &lt;i&gt;required&lt;/i&gt; one. 
&lt;br/&gt;&lt;br/&gt;
There&apos;s a Maven OSGi Plugin.  The major change from a regular JAR project is &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&gt; -&gt; &amp;lt;packaging&gt;&lt;b&gt;osgi-bundle&lt;/b&gt;&amp;lt;/packaging&gt;.
&lt;/p&gt;
&lt;blockquote&gt;
Sidenote: You have to love how Maven is so Google un-friendly.  &lt;a href=&quot;http://www.google.com/search?q=Maven+OSGi+Plugin&quot;&gt;Searching for Maven OSGi Plugin&lt;/a&gt; doesn&apos;t seem to provide a definitive answer to the Maven plugin that Adrian is talking about.  I&apos;m guessing Maven has OSGi support natively?
&lt;/blockquote&gt;
&lt;p&gt;
Eclipse has fantastic tooling support for OSGi via &quot;plug-ins&quot;.  You can create a new &quot;plug-in project&quot; and use Eclipse to create/edit your OSGi manifest.  Eclipse calls bundles &quot;plug-ins&quot; - so creating a plug-in project is the same thing as creating a new bundle.
&lt;br/&gt;&lt;br/&gt;
Export-Package is a header (a.k.a. manifest entry) used to export types for other bundles to use.  If it&apos;s not exported, it&apos;s not visible. For example:
&lt;/p&gt;
&lt;pre&gt;
Export-Package: org.xyz.m1.service, 
                org.xyz.m2.service, 
                org.xyz.m3.service
&lt;/pre&gt;
&lt;p&gt;
You can also specify a version by adding a semicolon after the package and specifying &quot;version=#&quot;.  For example:
&lt;/p&gt;
&lt;pre&gt;
Export-Package: org.xyz.m1.service; version=1.0, 
                org.xyz.m2.service; version=1.0, 
                org.xyz.m3.service; version=1.0
&lt;/pre&gt;
&lt;p&gt;
In addition to specifying specific versions, there&apos;s syntax to control a specific versions.  For the examples above, OSGi will actually get any version 1.0 and above.  
&lt;br/&gt;&lt;br/&gt;
For the next 10 minutes, Adrian talked about how class-loading and resolution works.  He also pointed out how to bootstrap a bundle (using the BundleActivator interface) and the basics of the Service Registry. The BundleContext allows you to get and remove services.
&lt;br/&gt;&lt;br/&gt;
What about JSR 277 (Java Module System)? It&apos;s a very crude version of OSGi with its &quot;RequireBundle&quot; mechanism.  The key problem is the lack of dynamics (loading/unloading of modules). Peter Kriens (of the OSGi Alliance) shares his thoughts on this in his &lt;a href=&quot;http://www.osgi.org/blog/2006/10/jsr-277-review.html&quot;&gt;JSR 277 Review&lt;/a&gt;. JSR 291 (Dynamic Component Support for Java SE) may kill 277 because it relies on OSGi. Its goal:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
Establish a JCP specification for a dynamic component 
framework supporting existing Java SE environments based 
on the OSGi dynamic component model specifications. &quot; 
&lt;/p&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #333&quot;&gt;What about Spring?&lt;/strong&gt;
&lt;br/&gt;
OSGi offers an excellent foundation for building enterprise applications.  How can you exploit the power and sophistication of OSGi w/o adding complexity?  How can you split your application into a number of OSGi bundles? Between bundles, you need an easy way to expose bundles as services and wire service references b/w them.  What about testing?  How can you test bundles w/o running them inside an OSGi container?
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://www.springframework.org/osgi&quot;&gt;Spring-OSGi&lt;/a&gt; hopes to allow you to build on OSGi, but deploy in Tomcat, WebSphere, WebLogic or any other application server.  Basically, it gives you an &quot;OSGi powered Web Application&quot;.
&lt;br/&gt;&lt;br/&gt;
&lt;b style=&quot;color: #666&quot;&gt;Project Goals:&lt;/b&gt; Bring the benefits of OSGi to enterprise applications and use Spring to configure modules/bundles. In addition, make it easy to code your applications w/o depending on OSGi APIs and make it easy to unit and integration test.
&lt;br/&gt;&lt;br/&gt;

&lt;b style=&quot;color: #666&quot;&gt;Project Collaborators&lt;/b&gt;: Adrian is the lead, and there&apos;s active committers from BEA and Oracle. Input to the project&apos;s specification has been gathered from OSGi Alliance (technical director and CTO), BEA, Oracle, IBM, Eclipse Equinox, Felix and many individuals.
&lt;br/&gt;&lt;br/&gt;
Spring modules (spring-core, spring-beans, spring-aop) will be shipped as OSGi bundles in Spring 2.1.  All the necessary import and export package headers will be pre-defined.  This will enable an OSGi application to import and use Spring packages and services.
&lt;br/&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.springframework.org/maven2/spring-osgi/apidocs/org/springframework/osgi/context/support/OsgiBundleXmlApplicationContext.html&quot;&gt;OsgiBundleXmlApplicationContext&lt;/a&gt; is a Spring application context based on an OSGi bundle.  It uses the bundle context and classloader to load resources and implements Spring&apos;s resource abstraction for OSGi. There is a &quot;bundle:&quot; prefix for specifying an explicit path.
&lt;br/&gt;&lt;br/&gt;
To do integration testing with Spring-OSGi, you can extend &lt;a href=&quot;http://static.springframework.org/maven2/spring-osgi/apidocs/org/springframework/osgi/test/ConfigurableBundleCreatorTests.html&quot;&gt;ConfigurableBundleCreatorTests&lt;/a&gt;.  This automatically creates an OSGi bundle containing the tests on the fly.  This class handles starting an OSGi container, installs all bundles and runs tests inside OSGi.  Currently, it supports Equinox, Felix and Knopflerfish.  If you&apos;re using Maven, it&apos;s simple to switch containers with profiles (i.e. -Pfelix).  Adrian did a demo in Eclipse.  I didn&apos;t seem the OSGi container starting (or him specify which one to use) but the test seemed to finish rather quickly.
&lt;br/&gt;&lt;br/&gt;
To interact with OSGi, there are a number of conveniences that Spring-OSGi provides: BundleContextAware, &amp;lt;osgi:property-placeholder&gt;, &amp;lt;osgi:bundle&amp;gt; (starts other bundles), &amp;lt;osgi:virtual-bundle&gt; (bundle created on the fly).
&lt;br/&gt;&lt;br/&gt;
&lt;b style=&quot;color: #666&quot;&gt;OSGi-based web applications&lt;/b&gt;
&lt;br/&gt;
It&apos;s entirely possible to run an OSGi container embedded in another container. Remember it&apos;s lightweight enough to run in a phone! Even &lt;i&gt;OSGi in OSGi&lt;/i&gt; is supported.
&lt;br/&gt;&lt;br/&gt;
Equinox is the only OSGi container that currently supports web applications.  It uses a &quot;bridge servlet&quot; that acts as a front controller and dispatches servlet requests to bundles. To package your application as and deploy it to Equinox, you basically have to create a WAR with the bridge servlet as the only entry in web.xml and the only JAR in WEB-INF/lib is servletbridge.jar.  Everything else is packaged under /WEB-INF/eclipse.  Here&apos;s what that looks like:
&lt;/p&gt;
&lt;pre&gt;
WEB-INF 
    web.xml  
    lib/servletbridge.jar 
    eclipse 
        launch.ini 
        configuration/config.ini 
        features 
        plugins 
            &amp;lt;your-bundles&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Adrian did a demo showing a simple &quot;Hello World&quot; example deployed into an OSGi container.  The output from the demo in the browser wasn&apos;t much.  However, he showed how you could use an OSGi Console to interact (start/stop/refresh) all the different bundles.  The fact that you can do this all at runtime has some pretty interesting implications. 
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color:#333&quot;&gt;My Thoughts&lt;/strong&gt;&lt;br/&gt;
The demo makes Servlet/EJB containers look somewhat primitive. Will OSGi containers be the next generation of application servers? It seems somewhat likely, but as Adrian said, most of this stuff is on the bleeding edge (or even &quot;razors edge&quot; to quote Adrian). My guess is OSGi will be a very interesting space in 2007.  However, I don&apos;t see myself deploying WARs to OSGi containers anytime soon. Maybe in 2008.
&lt;br/&gt;&lt;br/&gt;
Can OSGi power a web application&apos;s plugin architecture?  It doesn&apos;t seem like it. The web application would have to be deployed in an OSGi container to make this possible.  Either that, or the web application would have to be an OSGi container itself.

</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_the_holy_grails_of</id>
        <title type="html">[TSE] The Holy Grails of Web Frameworks with Guillaume LaForge</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_the_holy_grails_of"/>
        <published>2006-12-09T12:31:25-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">Under the hood, Grails uses Spring MVC.  It has support for &quot;flash scope&quot; between requests. 
&lt;/p&gt;
&lt;blockquote&gt;
I find it funny that flash scope is so popular these days, we&apos;ve had this in AppFuse for four years.  However, web frameworks didn&apos;t add native support for it until it had a name (provided by Rails).  To be fair to Struts Classic, they had support for it before Rails was even invented.
&lt;/blockquote&gt;
&lt;p&gt;Rather than JSPs, Grails uses Grails Server Pages, which look much like JSPs. Grails uses SiteMesh by default and allows you to easily change the layout used with a meta tag.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;meta name=&quot;layout&quot; content=&quot;main&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;Most of the dynamic attributes in a GSP are rendered using the various &quot;g&quot; tags.  There&apos;s dynamic taglibs for logic (if, else, elseif), iterating, linking, ajax (remoteFunction, remoteLink, formRemote, submitToRemote), form (select, currencySelect, localeSelect, datePicker, checkBox), rendering (render*, layout*, paginate), validation (eachError, hasError, message) and UI (i.e. richtexteditor). </summary>
        <content type="html">&lt;em&gt;I only made it to the 2nd half of this talk because I got &lt;a href=&quot;http://raibledesigns.com/page/rd?entry=good_ol_i_95&quot;&gt;stuck in traffic on I-95&lt;/a&gt;.&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;
Under the hood, Grails uses Spring MVC.  It has support for &quot;flash scope&quot; between requests. 
&lt;/p&gt;
&lt;blockquote&gt;
I find it funny that flash scope is so popular these days, we&apos;ve had this in AppFuse for four years.  However, web frameworks didn&apos;t add native support for it until it had a name (provided by Rails).  To be fair to Struts Classic, they had support for it before Rails was even invented.
&lt;/blockquote&gt;
&lt;p&gt;Rather than JSPs, Grails uses Grails Server Pages, which look much like JSPs. Grails uses SiteMesh by default and allows you to easily change the layout used with a meta tag.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;meta name=&quot;layout&quot; content=&quot;main&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;Most of the dynamic attributes in a GSP are rendered using the various &quot;g&quot; tags.  There&apos;s dynamic taglibs for logic (if, else, elseif), iterating, linking, ajax (remoteFunction, remoteLink, formRemote, submitToRemote), form (select, currencySelect, localeSelect, datePicker, checkBox), rendering (render*, layout*, paginate), validation (eachError, hasError, message) and UI (i.e. richtexteditor). 
&lt;br/&gt;&lt;br/&gt;
Grails also allows you to write your own taglibs with a much simpler syntax. For example:
&lt;/p&gt;
&lt;!-- ======================================================== --&gt;
&lt;!-- = Java Sourcecode to HTML automatically converted code = --&gt;
&lt;!-- =   Java2Html Converter V3.5 2003 by Markus Gebhard  markus@jave.de   = --&gt;
&lt;!-- =     Further information: http://www.java2html.de     = --&gt;
&lt;div class=&quot;java&quot; style=&quot;margin-left: 30px&quot;&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot; bgcolor=&quot;#ffffff&quot;&gt;
   &lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td nowrap=&quot;nowrap&quot; valign=&quot;top&quot; align=&quot;left&quot;&gt;
    &lt;code&gt;
&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;MyTagLib&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt; {&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;def&amp;nbsp;isAdmin=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;attrs,&amp;nbsp;body-&amp;gt;&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;def&amp;nbsp;user&amp;nbsp;=&amp;nbsp;attrs&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;[&lt;/font&gt;&lt;font color=&quot;#2a00ff&quot;&gt;&amp;#34;user&amp;#34;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;]&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;if&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;user!=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;null&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;&amp;amp;&amp;amp;&amp;nbsp;checkUserPrivs&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;user&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;))&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;body&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;}&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;}&amp;nbsp;&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;!-- =       END of automatically generated HTML code       = --&gt;
&lt;!-- ======================================================== --&gt;

&lt;p&gt;Then you can use it in your GSP:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;g:isAdmin user=&quot;${myUser}&quot;&gt; 
    some restricted content 
&amp;lt;/g:isAdmin&gt; 
&lt;/pre&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Is Grails Enterprise Ready?&lt;/strong&gt;
&lt;br/&gt;
Yes, because it uses existing Java libraries.  Since you can create a WAR from your Grails project (using &quot;grails war&quot;), you can &quot;protect your investment&quot; and deploy it to your expensive app server.  Although Grails is based on Groovy, it&apos;s a very easy language to learn for Java developers.  In fact, there&apos;s hardly anything to learn.  Most of the learning involves learning &lt;i&gt;simpler&lt;/i&gt; ways of doing things. You can also use GORM (and its dynamic finder methods) outside of Grails.  You can re-use the EJB3 annotated mapped beans and even the taglibs in your JSPs - it&apos;s all Java bytecode in the end.
&lt;br/&gt;&lt;br/&gt;
More to come! On the roadmap: DSL for scripting Spring, plugins, flow/conversation concept with Spring Web Flow, JPA support, Web Services convention, customized URL mapping, JSP custom taglib support and finer-grained DB schema control. &quot;It&apos;s up to you to vote for and prioritize new features!&quot;
&lt;br/&gt;&lt;br/&gt;
Books: &lt;a href=&quot;http://www.manning.com/koenig/&quot;&gt;Groovy in Action&lt;/a&gt; will be printing next week and &lt;a href=&quot;http://www.apress.com/book/bookDisplay.html?bID=10205&quot;&gt;The Definitive Guide to Grails&lt;/a&gt; will be out early next year.  The existing documentation for Grails is 224 pages - so there&apos;s lots of information freely available as well.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;My Thoughts&lt;/strong&gt;&lt;br/&gt;
I didn&apos;t know that Grails allows you to generate Canoo WebTest tests for your UI.  I agree that WebTest is an excellent way to test UIs, but I think Selenium is better.  The major reason they&apos;re using WebTest seems to be because one of the WebTest guys happens to be a Groovy committer. I plan on learning (and hopefully using) Groovy and Grails in 2007.  
&lt;br/&gt;&lt;br/&gt;
The reasons for the Groovy and Grails projects seem kinda strange. I created AppFuse to solve my needs when starting new Java projects. Rails was extracted from Basecamp because it solved problems for DHH. Grails seems to be invented as a Rails clone.  It doesn&apos;t actually solve a problem - except that Groovy needs a &quot;killer app&quot; like Ruby has with Rails. 
&lt;br/&gt;&lt;br/&gt;
Regardless of Grails&apos; reason for living, I still plan on adding it to my toolbox as it seems like a very nice way to develop web applications. Maybe that&apos;s its reason for living?  My question is this: do its developers use it to write real-world applications, or is this another project (like Craig McClanahan and Struts) where the lead guys don&apos;t actually write real-world applications? &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/good_ol_i_95</id>
        <title type="html">[TSE] Good ol&apos; I-95</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/good_ol_i_95"/>
        <published>2006-12-09T11:44:34-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <content type="html">I left West Palm Beach at 11:30 this morning, seemingly plenty of time in order to make the afternoon sessions at The Spring Experience.  Unfortunately, a truck caught on fire on the side of the freeway and stopped traffic for a good hour.  So it took me two hours to get here. Damn. I just walked into Guillaume LaForge&apos;s talk on &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=263&quot;&gt;Grails&lt;/a&gt;, hopefully I can learn something in the last 30 minutes of his presentation.
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Update:&lt;/strong&gt; It looks like I missed a &lt;a href=&quot;http://www.stephan-schwab.com/2006/12/09/1165682594369.html&quot;&gt;good talk on testing&lt;/a&gt; this morning.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_designing_stateful_web_application</id>
        <title type="html">[TSE] Designing Stateful Web Application Control Flow with Erwin Vervaet</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_designing_stateful_web_application"/>
        <published>2006-12-08T15:47:49-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">Spring Web Flow (SWF) does not fit into an application or a feature where free-flow navigation is required. It works best where you need to lock down and control navigation. SWF is not designed to be a web framework, but rather to solve the specific problem of navigation and state management between many pages.
&lt;br/&gt;&lt;br/&gt;
Erwin is a Senior consultant at &lt;a href=&quot;http://www.ervacon.com/&quot;&gt;Ervacon&lt;/a&gt; and has extensive experience using Java SE and Java EE. He is the inventor and co-lead of the Spring Web Flow project.</summary>
        <content type="html">Spring Web Flow (SWF) does not fit into an application or a feature where free-flow navigation is required. It works best where you need to lock down and control navigation. SWF is not designed to be a web framework, but rather to solve the specific problem of navigation and state management between many pages.
&lt;br/&gt;&lt;br/&gt;
Erwin is a Senior consultant at &lt;a href=&quot;http://www.ervacon.com/&quot;&gt;Ervacon&lt;/a&gt; and has extensive experience using Java SE and Java EE. He is the inventor and co-lead of the Spring Web Flow project.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Core Functionality&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Navigation is controlled by a flow (complete navigational control)&lt;/li&gt;
&lt;li&gt;Automatic state management (scoping, cleanup)&lt;/li&gt;
&lt;li&gt;A flow is a reusable application module (fully encapsulated: input/output contract, black box)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Spring Web Flow provides Navigational Control.  A &lt;i&gt;flow definition&lt;/i&gt; controls the entire conversation.  The flow &lt;i&gt;is&lt;/i&gt; the controller and drives all navigation.  When user input is required, the flow &lt;i&gt;pauses&lt;/i&gt; and a view is rendered. Clients &lt;i&gt;signal&lt;/i&gt; events and are unaware of overall navigation rules.  The flow reacts to user events and decides what to do next. A flow is a simple Finite State Machine (a set of states with transitions b/w them).  SWF is &lt;i&gt;not&lt;/i&gt; a general purpose workflow engine.  It&apos;s simplified for use with web conversations and lacks features like split and join.
&lt;/p&gt;
&lt;p&gt;SWF provides state management with web continuations. What is a web continuation you ask?
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;A continuation is a saved snapshot of the executable state of a program at any given point in time.  It is possible to restore this state and restart the execution of the program from that point onward.&lt;/p&gt;
&lt;p&gt;The flow execution repository takes a snapshot of flow execution for each request. In a sense, the flow execution &lt;i&gt;becomes&lt;/i&gt; a continuation.
&lt;/p&gt;
&lt;p&gt;Spring Web Flow is a very advanced state management mechanism.  It has fully automatic state management with scopes (converstation, flow, flash, request), cleanup, compatible with browser buttons (back, forward, refresh, new window).  Finally, flows are observable using &lt;code&gt;FlowExecutionListener&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;To link to services (or call service-level beans), you can simply use your normal bean ids. You can subclass SWF&apos;s &lt;a href=&quot;http://static.springframework.org/spring-webflow/docs/1.0.x/api/org/springframework/webflow/execution/Action.html&quot;&gt;Action&lt;/a&gt; and inject your services into it.  However, in most cases, you can simply use SWF&apos;s FormAction class.  SWF can bind to any POJO method.  For example:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;bean-action bean=&quot;phonebook&quot; method=&quot;search&quot;&amp;gt; 
    &amp;lt;method-arguments&amp;gt; 
        &amp;lt;argument expression=&quot;flowScope.searchCriteria&quot;/&amp;gt; 
    &amp;lt;/method-arguments&amp;gt; 
    &amp;lt;method-result name=&quot;results&quot;/&amp;gt; 
&amp;lt;/bean-action&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This might bind to the following interface, which is wired up as the &quot;phonebook&quot; bean.&lt;/p&gt;
&lt;div class=&quot;java&quot; style=&quot;margin-left: 30px&quot;&gt;
&lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot; bgcolor=&quot;#ffffff&quot;&gt;
   &lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td nowrap=&quot;nowrap&quot; valign=&quot;top&quot; align=&quot;left&quot;&gt;
    &lt;code&gt;
&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Phonebook&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;List&amp;lt;Person&amp;gt;&amp;nbsp;search&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;SearchCriteria&amp;nbsp;criteria&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Person&amp;nbsp;getPerson&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Long&amp;nbsp;id&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Person&amp;nbsp;getPerson&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;String&amp;nbsp;userId&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;;&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;

&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;To deploy a flow definition, you first have to define your flows in a &lt;i&gt;flow registry&lt;/i&gt;.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;flow:registry id=&quot;flowRegistry&quot;&amp;gt; 
    &amp;lt;flow:location path=&quot;/WEB-INF/flows/**-flow.xml&quot;/&amp;gt; 
&amp;lt;/flow:registry&amp;gt;
&lt;/pre&gt;
&lt;p&gt;A flow id is assigned by convention. For example, &lt;code&gt;/WEB-INF/flows/search-flow.xml&lt;/code&gt; becomes &quot;search-flow&quot;.&lt;/p&gt;
&lt;p&gt;To execute a flow, you need to define a &lt;i&gt;flow executor&lt;/i&gt; that manages flow on behalf of the client.  It loads flow definitions (from flowRegistry), drives flow executions (launch, resume, refresh) and saves/loads flow execution b/w requests (execution repository and state management).
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;flow:executor id=&quot;flowExecutor&quot; registry-ref=&quot;flowRegistry&quot; 
    repository-type=&quot;continuation&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Finally, you&apos;ll need to configure a &quot;Flow Controller&quot;.  This is specific to the web framework you&apos;re using.  Below is an example for Spring MVC:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;bean name=&quot;/phonebook.htm&quot; class=&quot;org.springframework.webflow.executor.mvc.FlowController&quot;&amp;gt; 
    &amp;lt;property name=&quot;flowExecutor&quot; ref=&quot;flowExecutor&quot;/&amp;gt; 
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;
&lt;p&gt;SWF exposes some variables to the view model, namely &quot;flowExecutionContext&quot; and &quot;flowExecutionKey&quot;. To participate in a flow execution, you have to submit  &lt;code&gt;_flowExecutionKey&lt;/code&gt; and &lt;code&gt;_eventId&lt;/code&gt; parameters in every request.  For a form, these can be hidden fields:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;form:form action=&quot;phonebook.htm&quot; commandName=&quot;searchCriteria&quot; method=&quot;post&quot;&amp;gt; 
    &amp;lt;input type=&quot;hidden&quot; name=&quot;_flowExecutionKey&quot; value=&quot;${flowExecutionKey}&quot;&amp;gt; 
    &amp;lt;input type=&quot;submit&quot; class=&quot;button&quot; name=&quot;_eventId_search&quot; value=&quot;Search&quot;&amp;gt; 
    ... 
&amp;lt;/form:form&amp;gt; 
&lt;/pre&gt;
&lt;p&gt;For links, you&apos;ll need to include these parameters as well:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;a href=&quot;phonebook.htm?_flowExecutionKey=${flowExecutionKey}&amp;amp;amp;_eventId=select&amp;amp;amp;id=${colleague.id}&quot;&amp;gt; 
${colleague.firstName} ${colleague.lastName}&amp;lt;/a&amp;gt;
&lt;/pre&gt;
&lt;blockquote&gt;NOTE: This morning, I asked Rob Harrop if the _flowExecutionKey hidden field will ever be auto-generated by the &amp;lt;form:form&amp;gt; tag. His response was that they are doing something to make this more automatic, but it may not happen in the context of the &amp;lt;form:form&amp;gt; tag.&lt;/blockquote&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;Best Practices&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By default, SWF does redirect after POST. To change it, you can configure the flowExecutor bean a bit differently.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;flow:executor id=&quot;flowExecutor&quot; registry-ref=&quot;flowRegistry&quot; repository-type=&quot;continuation&quot;&amp;gt; 
    &amp;lt;flow:execution-attributes&amp;gt; 
        &amp;lt;flow:alwaysRedirectOnPause value=&quot;false&quot;/&amp;gt; 
    &amp;lt;/flow:execution-attributes&amp;gt; 
&amp;lt;/flow:executor&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You can also explicitly use the &quot;redirect:&quot; prefix in the view name. In other words, the best practice of &quot;Redirect after POST&quot; has been built-in for you.&lt;/p&gt;
&lt;p&gt;SWF comes with 4 repository (storage) implementations:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;b&gt;simple&lt;/b&gt;: single flow execution per converstation (flowExecutionKey changes on every request), low resource usage, no browser button support.  Use when you can lock down the browser and resources (memory) are scarce. By default, displays a nice stack trace (&lt;a href=&quot;http://static.springframework.org/spring-webflow/docs/1.0.x/api/org/springframework/webflow/execution/repository/PermissionDeniedFlowExecutionAccessException.html&quot;&gt;PermissionDeniedFlowExecutionAccessException&lt;/a&gt;) when you click back. Use case: your company has removed the back and forward buttons from end-user&apos;s customized browsers.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;singleKey&lt;/b&gt;: same as simple repository, but keeps same flowExecutionKey over the lifecycle of the flow. Tricks the browser into thinking it keeps refreshing the same exact page - there is no browser history. They do this by using the exact same URL for every page. The nice thing about using this repository is it really does disable the back and forward buttons.  Use case: low memory available and want to block back/forward button usage.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;continuation&lt;/b&gt;: the default implementation if you don&apos;t specify the &quot;repository-type&quot; attribute on your flowExecutor. Allows free browsing in a controlled way.  The downside is high memory usage because many snapshots are taken.  Snapshots contain all the data associated with the conversation; more than just request parameters. Use when you have enough resources available and browser buttons need to be supported. The flowExecutionKey is different for each and every request in order to record the unique id of the snapshot.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;client&lt;/b&gt;: flow execution stored &lt;i&gt;in&lt;/i&gt; the flowExecutionKey and on the client. It&apos;s nice because there&apos;s low resource usage on the server.  However, it only supports POST (b/c of GET URL length limits).  It also requires more bandwidth, has security concerns and has no support for double submit out-of-the-box.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Best practice? Use the correct repository for your situation! Somebody asked if SWF provides the information to build a &quot;breadcrumbs&quot; type of menu.  Erwin says &quot;yes&quot;, but there&apos;s no way to easily access that information (i.e. with JSP tags). Another audience member asks if it&apos;s possible to invalid snapshots?  Erwin says &quot;no&quot;, but it is possible to configure the maximum number of snapshots to store.  They are considering adding support for invalidating certain snapshots after you pass a certain state in the flow.&lt;/p&gt;
&lt;p&gt;Even though I knew a lot about SWF going into this talk, I was very impressed with Erwin&apos;s presentation. He did an excellent job at doing live demos that showed the different features of SWF.  Even better, he did them with SWF&apos;s &quot;phonebook&quot; application, so it should be possible to reproduce many of his demos.  At the end of his presentation, Erwin listed a number of resources for Spring Web Flow:&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.springframework.org/webflow&quot;&gt;Spring Web Flow Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forum.springframework.org/forumdisplay.php?f=36&quot;&gt;Community Forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ervacon.com/products/swf/&quot;&gt;Ervacon Spring Web Flow Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://spring.ervacon.com&quot;&gt;Test the sample applications on-line&lt;/a&gt; 
&lt;li&gt;Books: &lt;a href=&quot;http://www.amazon.com/Expert-Spring-MVC-Web-Flow/dp/159059584X&quot;&gt;Expert Spring MVC and Web Flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I recently updated &lt;a href=&quot;http://springlive.com&quot;&gt;Spring Live&apos;s&lt;/a&gt; Chapter 13 for SWF 1.0, but &lt;span style=&quot;text-decoration: line-through&quot;&gt;Erwin and Keith&apos;s&lt;/span&gt; Expert Spring MVC and Web Flow (by Seth Ladd, Darren Davison, Steven Devijver and Colin Yates) is much better than my 10-page example. My updated chapter is currently in tech edit, so you may have to wait another couple weeks before it&apos;s in a released version.</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_using_dynamic_languages_with</id>
        <title type="html">[TSE] Using Dynamic Languages with Spring with Rod Johnson and Guillaume LaForge</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_using_dynamic_languages_with"/>
        <published>2006-12-08T13:27:43-07:00</published>
        <updated>2008-05-26T18:30:32-06:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">Spring 2.0 has dynamic language support.  To make it work, you do need a Java interface as a contract between callers and dynamic beans.  There&apos;s no special requirements on the interface. It&apos;s a &quot;POJI&quot; and doesn&apos;t have to extend or implement anything. For example:
&lt;/p&gt;
&lt;div class=&quot;java&quot; style=&quot;margin-left: 30px&quot;&gt;
&lt;table bgcolor=&quot;#ffffff&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;
   &lt;tbody&gt;&lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td align=&quot;left&quot; nowrap=&quot;nowrap&quot; valign=&quot;top&quot;&gt;
    &lt;code&gt;

&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Messenger&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;String&amp;nbsp;getMessage&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;

&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;There&apos;s 3 ways of configuring &lt;a href=&quot;http://groovy.codehaus.org&quot;&gt;Groovy&lt;/a&gt; beans:
&lt;/p&gt;
&lt;ol style=&quot;margin-bottom: 3px&quot;&gt;
&lt;li&gt; &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/scripting/groovy/GroovyScriptFactory.html&quot;&gt;GroovyScriptFactory&lt;/a&gt; &amp;lt;bean&amp;gt; element defining source location and properties
&lt;/li&gt;
&lt;li&gt; &amp;lt;lang:groovy&amp;gt; element from a &amp;lt;lang&amp;gt; namespace
&lt;/li&gt;
&lt;li&gt; POBD (Plain old &amp;lt;bean&amp;gt; definition) - this is unique for Groovy since it can be compiled into Java bytecode
&lt;/li&gt;
&lt;/ol&gt;&lt;p style=&quot;margin-top: 0&quot;&gt;</summary>
        <content type="html">Spring 2.0 has dynamic language support.  To make it work, you do need a Java interface as a contract between callers and dynamic beans.  There&apos;s no special requirements on the interface. It&apos;s a &quot;POJI&quot; and doesn&apos;t have to extend or implement anything. For example:
&lt;/p&gt;
&lt;div class=&quot;java&quot; style=&quot;margin-left: 30px&quot;&gt;
&lt;table bgcolor=&quot;#ffffff&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;
   &lt;tbody&gt;&lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td align=&quot;left&quot; nowrap=&quot;nowrap&quot; valign=&quot;top&quot;&gt;
    &lt;code&gt;

&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;public&amp;nbsp;interface&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Messenger&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;String&amp;nbsp;getMessage&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;

&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;There&apos;s 3 ways of configuring &lt;a href=&quot;http://groovy.codehaus.org&quot;&gt;Groovy&lt;/a&gt; beans:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt; &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/scripting/groovy/GroovyScriptFactory.html&quot;&gt;GroovyScriptFactory&lt;/a&gt; &amp;lt;bean&amp;gt; element defining source location and properties
&lt;/li&gt;
&lt;li&gt; &amp;lt;lang:groovy&amp;gt; element from a &amp;lt;lang&amp;gt; namespace
&lt;/li&gt;
&lt;li&gt; POBD (Plain old &amp;lt;bean&amp;gt; definition) - this is unique for Groovy since it can be compiled into Java bytecode
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Any of these three options can take injected properties.
&lt;/p&gt;
&lt;p&gt;To configure a dynamic language component using the &lt;tt&gt;GroovyScriptFactory&lt;/tt&gt;, you need to do the following:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; You need a &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/scripting/support/ScriptFactoryPostProcessor.html&quot;&gt;ScriptFactoryPostProcessor&lt;/a&gt; to ensure that dynamic bean definitions are processed at startup 
&lt;/li&gt;
&lt;li&gt; Create bean definitions using generic &lt;tt&gt;GroovyScriptFactory&lt;/tt&gt; or other language-specific factory 

&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&amp;lt;bean class=&quot;org.sfw.scripting.support.ScriptFactoryPostProcessor&quot;/&amp;gt; 

&amp;lt;bean id=&quot;messenger&quot; class=&quot;org.sfw.scripting.groovy.GroovyScriptFactory&quot;&amp;gt; 
    &amp;lt;constructor-argvalue=&quot;classpath:org/sfw/scripting/groovy/Messenger.groovy&quot;/&amp;gt; 
    &amp;lt;property name=&quot;message&quot; value=&quot;Hello World&quot;/&amp;gt; 
&amp;lt;/bean&amp;gt;
&lt;/pre&gt;

&lt;p&gt;The 2nd way to configure Spring to use a bean from a dynamic language is to use the &amp;lt;lang&amp;gt; namespace. A namespace handler is appropriate when you need to create multiple beans to configure a single feature.  Another indication that a namespace is appropriate is when your bean definitions follow a certain pattern (i.e. GroovyScriptFactory always requires a constructor argument). Using the &amp;lt;lang&amp;gt; namespace allows the &lt;tt&gt;ScriptFactoryPostProcessor&lt;/tt&gt; to be registered automatically.

&lt;/p&gt;
&lt;pre&gt;&amp;lt;lang:groovy id=&quot;refreshableMessenger&quot; 
    script-source=&quot;classpath:org/fw/scripting/groovy/Messenger.groovy&quot;&amp;gt; 
    &amp;lt;lang:property name=&quot;message&quot; value=&quot;Hello World!&quot;/&amp;gt; 
&amp;lt;/lang:groovy&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Using the namespace, it&apos;s also possible to tell Spring to refresh the bean definition periodically.  With this, callers can hold a reference to the bean, which is thread-safe. It&apos;s possible to do this because Spring uses its AOP and proxy system to dynamically replace the &quot;target&quot; object. Refreshing is made possibly by using the &quot;refresh-check-delay&quot; attribute.
&lt;/p&gt;
&lt;pre&gt;&amp;lt;lang:groovy id=&quot;refreshableMessenger&quot; 
    &lt;span style=&quot;color: green; font-weight: bold;&quot;&gt;refresh-check-delay=&quot;5&quot;&lt;/span&gt;
    script-source=&quot;classpath:org/sfw/scripting/groovy/Messenger.groovy&quot;&amp;gt; 
    &amp;lt;lang:propertyname=&quot;message&quot; value=&quot;Hello World!&quot;/&amp;gt; 
&amp;lt;/lang:groovy&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Another feature with the &amp;lt;lang&amp;gt; namespace is using &quot;inline&quot; scripts. Rod says this can be useful for writing stubs, but he generally doesn&apos;t recommend using it.  You don&apos;t want to &lt;a href=&quot;http://static.springframework.org/spring/docs/2.0.1/reference/dynamic-language.html#dynamic-language-beans-inline&quot;&gt;program in XML&lt;/a&gt;, do you?
&lt;/p&gt;
&lt;p&gt;The last option, which is only possible with Groovy, is to use POBD to define Groovy components. This is only possible with Groovy, because it produces Java classes.
&lt;/p&gt;
&lt;p&gt;Why would you want to use Groovy?
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; May be more concise and simpler than Java to implement a component. Groovy has closures!
&lt;/li&gt;
&lt;li&gt; When the interface doesn?t change but the implementation might, for example with MVC Controllers. This can allow you to rapidly develop web applications. 
&lt;/li&gt;
&lt;li&gt; To use DSL and other capabilities that offer something Java does not.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The capabilities of developing a DSL in Java is pretty limited. Java 5 and annotations allow you to develop a DSL-ish system, but nothing like what a dynamic language can do.
&lt;/p&gt;
&lt;p&gt;It&apos;s not Rod&apos;s job to sell us Groovy, so he&apos;s now turning it over to &lt;a href=&quot;http://glaforge.free.fr/weblog/&quot;&gt;Guillaume&lt;/a&gt;. Guillaume is the Groovy Project Manager at Codehause and the JSR-241 Spec Lead. I think it&apos;s interesting that &lt;a href=&quot;radio.weblogs.com/0112098&quot;&gt;James Strachan&lt;/a&gt; invented Groovy and doesn&apos;t seem to be involved with Grails. Instead, he&apos;s helping to create &lt;a href=&quot;http://wiki.opensymphony.com/display/ABLE/Home&quot;&gt;Able&lt;/a&gt;. I digress...
&lt;/p&gt;
&lt;p&gt;To get started playing and working with Groovy is pretty simple.  &lt;a href=&quot;http://groovy.codehaus.org/Download&quot;&gt;Download&lt;/a&gt;, install, add GROOVY_HOME to your environment variables and GROOVY_HOME/bin to your path. I&apos;m downloading it now. The 1.0-RC1 release is around 13 MB.
&lt;/p&gt;
&lt;p&gt;Groovy is a dynamic and agile scripting language for the JVM. It&apos;s an OSS project hosted by &lt;a href=&quot;http://codehaus.org&quot;&gt;Codehaus&lt;/a&gt;. It was inspired by Ruby, Python and Smalltalk. It generates bytecode for the JVM so it natively integrates with Java libraries. Groovy differentiates itself with its GDK and MOP. The GDK (Groovy Development Kit) has additional libraries to simplify complex APIs and MOP (Meta Object Protocol) has advanced meta-programming features.
&lt;/p&gt;
&lt;p&gt;Groovy Syntax and Language Constructs:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Expressive Java-like syntax (flat learning curve) 
&lt;/li&gt;
&lt;li&gt; Same OO model as Java 
&lt;/li&gt;
&lt;li&gt; Properties support 
&lt;/li&gt;
&lt;li&gt; Supports ?duck typing?, and strong typing 
&lt;/li&gt;
&lt;li&gt; Native syntax constructs for Lists, Maps, regex 
&lt;/li&gt;
&lt;li&gt; Permits operator overloading 
&lt;/li&gt;
&lt;li&gt; GStrings: interpolated strings 
&lt;/li&gt;
&lt;li&gt; Closures: reusable and assignable code blocks
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sample class and script:
&lt;/p&gt;
&lt;div class=&quot;java&quot; style=&quot;margin-left: 30px&quot;&gt;
&lt;table bgcolor=&quot;#ffffff&quot; border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;0&quot;&gt;
   &lt;tbody&gt;&lt;tr&gt;
  &lt;!-- start source code --&gt;
   &lt;td align=&quot;left&quot; nowrap=&quot;nowrap&quot; valign=&quot;top&quot;&gt;

    &lt;code&gt;
&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;class&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Speaker&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;String&amp;nbsp;name&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;def&amp;nbsp;age&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;String&amp;nbsp;toString&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&amp;nbsp;{&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#2a00ff&quot;&gt;&quot;My&amp;nbsp;name&amp;nbsp;is&amp;nbsp;$name&amp;nbsp;and&amp;nbsp;I&apos;m&amp;nbsp;$age&quot;&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;}&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;def&amp;nbsp;speakers&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;[&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Speaker&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;name:&lt;/font&gt;&lt;font color=&quot;#2a00ff&quot;&gt;&quot;RodJohnson&quot;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;,&amp;nbsp;age:&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;36&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;,&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#7f0055&quot;&gt;&lt;b&gt;new&amp;nbsp;&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Speaker&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;name:&lt;/font&gt;&lt;font color=&quot;#2a00ff&quot;&gt;&quot;GuillaumeLaforge&quot;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;,&amp;nbsp;age:&lt;/font&gt;&lt;font color=&quot;#990000&quot;&gt;29&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#000000&quot;&gt;]&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;def&amp;nbsp;upper&amp;nbsp;=&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;it.toString&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;.toUpperCase&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;()&amp;nbsp;}&amp;nbsp;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#000000&quot;&gt;speakers.findAll&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;name&amp;nbsp;-&amp;gt;&amp;nbsp;name&amp;nbsp;=~&amp;nbsp;/.*od.*/&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;}&amp;nbsp;&lt;/font&gt;&lt;br/&gt;

&lt;font color=&quot;#ffffff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;.collect&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;(&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;upper&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;)&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;.each&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;{&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;println&amp;nbsp;it&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;}&lt;/font&gt;&lt;br/&gt;
&lt;font color=&quot;#ffffff&quot;&gt;&lt;/font&gt;&lt;font color=&quot;#ffffff&quot;&gt;
&lt;/font&gt;&lt;/code&gt;
    
   &lt;/td&gt;
  &lt;!-- end source code --&gt;
   &lt;/tr&gt;

&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;At this point, I pretty much tuned out. The slides I have in front of me match most of what Guillaume was saying.  In other words, I was able to read the slides and know what I was going to learn for the next 20 minutes. I generally blog these sessions because I&apos;ve found it&apos;s a good way of capturing the information w/o having to pack around the printed slides.  However, now that I have all the presentations in PDF form, I&apos;m a little less motivated. I wonder if there&apos;s any rules against me simply uploading the PDFs to this site?
&lt;/p&gt;
&lt;p&gt;Comment from Rod: &quot;This is the 2nd presentation I&apos;ve co-presented today and the 2nd enhancement I&apos;ve recognized we should add.&quot;  Apparently, he received a number of suggestions from Mike Keith in their JPA talk earlier today. I&apos;m not sure what Groovy-support enhancement was suggested.
&lt;/p&gt;
&lt;p&gt;One nifty thing I did see in Guillaume&apos;s demo was a &lt;a href=&quot;http://groovy.codehaus.org/IntelliJ+IDEA+Plugin&quot;&gt;Groovy Plugin for IDEA&lt;/a&gt;. Not only does it provide syntax highlighting, but it seems to allow compiling and running Groovy classes as well.
&lt;/p&gt;
&lt;p&gt;My take away from this presentation? Spring 2.0 allows you to easily use a dynamic language in your application. This can allow you to externalize business rules, programmatic configuration and possibly even write your UI layer with it.  With a backend that can CRUD any object (we have this in AppFuse 2.0), a front-end in a dynamic language could be one heck of a combination.  Of course, I could just use Grails. I like the ideas behind Grails, but I expect it&apos;d be hard to sell to clients - many of mine haven&apos;t even heard of Tapestry!</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_rapid_web_application_development</id>
        <title type="html">[TSE] Rapid Web Application Development with Rob Harrop</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_rapid_web_application_development"/>
        <published>2006-12-08T11:42:37-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">There&apos;s a couple of other sessions I should probably go to, namely Juergen&apos;s talk on Transactions and Mark Fisher&apos;s Message Driven POJOs Rock! However, transactions is generally a pretty boring topic and I don&apos;t see myself developing any MDPs in the next two weeks.  If you don&apos;t use your knowledge in two weeks, you generally lose it, so I&apos;ll wait to learn more about MDPs until someone pays me to.  I know a fair bit already, so I don&apos;t know that there&apos;s a whole lot more to learn.
&lt;br/&gt;&lt;br/&gt;
I&apos;m attending Rob Harrop&apos;s &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=240&quot;&gt;Rapid Web Application Development Essentials&lt;/a&gt; talk. With any luck, I&apos;ll learn some new tips that we can use in AppFuse.</summary>
        <content type="html">There&apos;s a couple of other sessions I should probably go to, namely Juergen&apos;s talk on Transactions and Mark Fisher&apos;s Message Driven POJOs Rock! However, transactions is generally a pretty boring topic and I don&apos;t see myself developing any MDPs in the next two weeks.  If you don&apos;t use your knowledge in two weeks, you generally lose it, so I&apos;ll wait to learn more about MDPs until someone pays me to.  I know a fair bit already, so I don&apos;t know that there&apos;s a whole lot more to learn.
&lt;br/&gt;&lt;br/&gt;
I&apos;m attending Rob Harrop&apos;s &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=240&quot;&gt;Rapid Web Application Development Essentials&lt;/a&gt; talk. With any luck, I&apos;ll learn some new tips that we can use in AppFuse.
&lt;br/&gt;&lt;br/&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Agenda:&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_rapid_web_application_development#recipe&quot;&gt;Recipe for rapid development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_rapid_web_application_development#tools&quot;&gt;Basic Tool Set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_rapid_web_application_development#springmvc&quot;&gt;Accelerating Spring MVC development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_rapid_web_application_development#swf&quot;&gt;Exploiting Web Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=tse_rapid_web_application_development#cool&quot;&gt;Cool tools to save you time&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a name=&quot;recipe&quot;&gt;&lt;/a&gt;
The recipe for rapid development is an easy compile/test cycle (eliminate deployment), an easy deployment for view testing (hot deploy, auto-detect changes) and reduce repetition (can often be fixed with convention over configuration, especially by defaulting model and view names). In addition:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Encapsulate common patterns: binding and validation, multi-page navigation, redirect after POST&lt;/li&gt;
&lt;li&gt;Reusable tools for common tasks: site-wide formatting, layout, testing and monitoring&lt;/li&gt;
&lt;li&gt;Plan and design for maintenance: profiling, tracing, monitoring&lt;/li&gt;
&lt;li&gt;Aspects and JMX are the perfect solution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;strong style=&quot;color: #666&quot;&gt;&lt;a name=&quot;tools&quot;&gt;&lt;/a&gt;Basic Tool Set&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
Why do we need tools? To reduce the compile/deploy/test life-cycle.  This is live testing, not unit testing. Many ideas also support view creation, code completion in view pages and previewing.
&lt;br/&gt;&lt;br/&gt;
What can you do without tools? Test, test and test some more. Unit and integration testing should be possible out-of-container.
&lt;br/&gt;&lt;br/&gt;
First thing you should is get a good IDE! Rob recommends IDEA and used it for all his demos. Make sure your IDE has the following features:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;View creation support: JSP, Velocity, JSF&lt;/li&gt;
&lt;li&gt;App server integration: Tomcat, Jetty, WebLogic, WebSphere; deploy/debug from the IDE&lt;/li&gt;
&lt;li&gt;Good candidates: IntelliJ IDEA, Eclipse with WTP/MyEclipse or NetBeans&lt;/li&gt;
&lt;li&gt;Webapp aware - so you can simply click &quot;run&quot; to view it in a browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
&lt;em&gt;
Jetty is your friend!&lt;/em&gt; It allows you to rapidly deploy, it&apos;s resilient to hot deploy, starts everything in about 2 seconds and integrates with everything.
&lt;/p&gt;

&lt;p&gt;
Maven is your other friend. It allows you to kick-start a web project very easily. It also has Jetty integration that allows you to hot deploy. The Jetty plugin also detects changes and redeploys automatically. It even creates project files for IDEA and Eclipse.
&lt;/p&gt;
&lt;blockquote&gt;
Caveats with Maven: Its online repositories are full of junk: many different versions of POMs. To solve this, use &lt;a href=&quot;http://mvnrepository.com&quot;&gt;mvnrepository.com&lt;/a&gt; to browse and find the right JARs. Also, lots of things are missing from the central repo: Trying finding a full Jamon distro.
&lt;br/&gt;&lt;br/&gt;
Solution: Get your own in-house repo (easy to manage, overcome missing dependency woes).&lt;/blockquote&gt;
&lt;p&gt;
Now Rob is doing a Maven QuickStart demo. He&apos;s using the maven-archetype-webapp to create a web application with Maven. He then added the Jetty Plugin and showed how it&apos;s easy to get started. For those of you that aren&apos;t aware, there&apos;s also a &lt;a href=&quot;http://mojo.codehaus.org/tomcat-maven-plugin/introduction.html&quot;&gt;Tomcat Maven Plugin&lt;/a&gt; that allows you to use Tomcat instead of Jetty. There&apos;s also a debate ensuing on whether Cargo should have this functionality or whether these plugins are better.  I&apos;m currently leaning towards the plugins since their easier to setup and configure (and they work too!).
&lt;br/&gt;&lt;br/&gt;
&lt;a name=&quot;springmvc&quot;&gt;&lt;/a&gt;&lt;strong style=&quot;color: #666&quot;&gt;Accelerating Spring MVC Development&lt;/strong&gt;
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot; style=&quot;margin-top: 10px&quot;&gt;
&lt;li&gt;Important existing features: testing outside the container and controller infrastructure&lt;/li&gt;
&lt;li&gt;Important new features in Spring 2.0: code by convention, JSP form tags, quick prototype with dynamic languages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Spring has many different Controller options: Controller/AbstractController, MultiActionController and SimpleFormController/AbstractWizardFormController.
All of these &lt;i&gt;can&lt;/i&gt; be tested outside the container. Unfortunately, SFC and AWFC are not so simple to test.
Rob recommends using with Controller and MultiActionController and using Web Flow for most other things.
&lt;br/&gt;&lt;br/&gt;
The fact that Rob doesn&apos;t recommend using SimpleFormController is quite interesting.  I&apos;ve never liked that I have to use Controllers for displaying data and SimpleFormController for forms, and apparently the Spring guys don&apos;t either. Rob says that if you&apos;re new to Spring MVC, it&apos;s better to skip learning/using SFC and use Web Flow instead.
&lt;br/&gt;&lt;br/&gt;
Testing outside of the container is one of the best things in Spring MVC (I agree). Spring Mock provides the necessary infrastructure with MockHttpServletRequest and MockHttpServletResponse. The most value can be gained from transaction integration in tests (using my favorite class - &lt;a href=&quot;http://www.springframework.org/docs/api/org/springframework/test/AbstractTransactionalDataSourceSpringContextTests.html&quot;&gt;AbstractTransactionalDataSourceSpringContextTests&lt;/a&gt;). Mock test are useful to test error conditions and hard-to-reproduce conditions, but integration tests are better in the web tier.
&lt;br/&gt;&lt;br/&gt;
Code by convention: Spring 2.0 introduces many Code by Convention features: view names, model parameter names, URL mappings. This reduces duplication and increases uniformity.
&lt;br/&gt;&lt;br/&gt;
JSP form tags: Creating forms in Spring 1.* was painful. The &amp;lt;spring:bind&amp;gt; tags were verbose and unclear. Spring 2.0 introduces new &amp;lt;form:*/&gt; tags.  These tags are much easier to read &lt;i&gt;and&lt;/i&gt; write. They clearly express the intent and handle all the common cases such as binding and error handling.
&lt;br/&gt;&lt;br/&gt;
Dynamic Languages: Spring 2.0 introduces support for beans written in other languages: JRuby, Groovy and BeanShell.
These are just plain beans: inject into them, advise them and expose them via JMX.
Change detection is built in (see live changes). Difficult integration is taken care of.  For example, how do you call methods in a dynamic object from Java.
&lt;br/&gt;&lt;br/&gt;
Now Rob is doing a demo of developing with Spring MVC and using CoC.
&lt;br/&gt;&lt;br/&gt;
One of the new things in MultiActionController is you don&apos;t have to return ModelAndView - you can return Map or have void methods as well.
&lt;br/&gt;&lt;br/&gt;
The ControllerClassNameHandlerMapping is a new class in Spring 2.0 that figures out the URLs for you based on Controller names.  If you&apos;re using a MultiActionController, the URL is the first part of the name and anything after it, for example: /catalog/*.  By configuring an additional property, you can make * map to method names. For regular Controllers, the mapping doesn&apos;t have the trailing slash (i.e. /catalog.html).
&lt;br/&gt;&lt;br/&gt;
Another new class in Spring 2.0 is ModelMap.  This class figures out your model names based on the simple class name.  Single objects are simply lowercased, whereas collections of objects are available as objectnameList (i.e. a Set of User objects will be userList).
&lt;br/&gt;&lt;br/&gt;
A method in AbstractTransactionalDataSourceSpringContexts that&apos;s quite useful is countRowsInTable(tableName).
&lt;br/&gt;&lt;br/&gt;
To debug from your IDE is generally pretty easy. If you setup your IDE to debug a &quot;Remote Application&quot;, it&apos;ll tell you the parameters you need to start that application with.  For example, to debug the Maven Jetty Plugin in IDEA, create a new Remote Application in IDEA (Run -&gt; Edit Configurations -&gt; Add -&gt; Remote) and then copy the command line arguments (listed below as well) into your MAVEN_OPTS environment variable.
&lt;/p&gt;
&lt;pre&gt;
-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
&lt;/pre&gt;
&lt;p&gt;After doing this, you should be able to restart Jetty and set breakpoints in your IDE.&lt;/p&gt;
&lt;p&gt;
Now Rob is showing us a JRuby example, where he&apos;s writing a Controller in JRuby and changing it/refreshing it in his browser. The code looks fairly simple and the configuration (in his *-servlet.xml file) looks like the following:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;lang:jruby id=&quot;stocklistController&quot; 
    script-source=&quot;WEB-INF/script/StocklistController.rb&quot;
    script-interfaces=&quot;org.springframework.web.servlet.mvc.Controller&quot;
    ... /&gt;
&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;Unfortunately, I didn&apos;t get a chance to write down the entire bean definition, but hopefully you get the idea.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Summary: Rapid Development with Spring MVC
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Use a project template: Build your own (simply create a ZIP file) or use Maven 2 archetypes.&lt;/li&gt;
&lt;li&gt;Make sure you can deploy quickly and frequently: Jetty is the way to go here.&lt;/li&gt;
&lt;li&gt;Build deployment into your build script: slapped wrists for using Tomcat Manager!&lt;/li&gt;
&lt;li&gt;Adhere to a code/test cycle: create mock tests to test error conditions. Use integration tests to verify end-to-end functionality.&lt;/li&gt;
&lt;li&gt;Code by Convention reduces repetition and increases uniformity.&lt;/li&gt;
&lt;li&gt;Dynamic languages: rapid prototyping, take advantage of additional language features&lt;/li&gt;
&lt;li&gt;JSP form tags: Largely replace &amp;lt;spring:bind/&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a name=&quot;swf&quot;&gt;&lt;/a&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Exploiting Web Flow&lt;/strong&gt;
&lt;br/&gt;&lt;br/&gt;
What is Web Flow? 
&lt;br/&gt;&lt;br/&gt;
A component for defining and managing interactions with the user. Typically long-running interactions. &lt;b&gt;Workflow for the web&lt;/b&gt;.
&lt;br/&gt;&lt;br/&gt;
Integration with traditional MVC frameworks: Spring MVC and Struts. SWF was originally designed to work with Struts.
&lt;br/&gt;&lt;br/&gt;
Why bother using Web Flow?
&lt;br/&gt;&lt;br/&gt;
&lt;em&gt;Productivity!&lt;/em&gt; It removes plumbing from your code: state management, flow management, allowed actions/security, isolation and concurrency.  By removing this plumbing, it allows you to focus on the business code.
&lt;br/&gt;&lt;br/&gt;
Key Components of SWF:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;i&gt;Flow Definition&lt;/i&gt;: A definition of a process in the application.  For example: checkout, register and CRUD.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;State&lt;/i&gt;: A single state in the execution of a flow.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;View State&lt;/i&gt;: A pause state that displays a view to the user and typically prompts for input.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Action state&lt;/i&gt;: A stat that executes on or more actions and then moves to another state (where the logic happens).&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Decision state&lt;/i&gt;: a routing state, evaluates or or more expressions (against data in the various scopes) and routes to a given state.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Action&lt;/i&gt;: The logic inside the Action state that gets executed.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Event&lt;/i&gt;: The user signaled event (submit, cancel, process, etc.).&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Transaction&lt;/i&gt;: a movement from one state to another in response to some event.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The three configuration elements of Spring Web Flow are: Flow Executor, Flow Repository and Flow Registry.
&lt;br/&gt;&lt;br/&gt;
One of Robs favorite things about Web Flow is the Testing support. SWF provides full testing support with &lt;a href=&quot;http://static.springframework.org/spring-webflow/docs/1.0.x/api/org/springframework/webflow/test/execution/AbstractXmlFlowExecutionTests.html&quot;&gt;AbstractXmlFlowExecutionTests&lt;/a&gt;. This class provides an API for you to start and stop the flow. It also allows you to override the &lt;code&gt;registerMockServices()&lt;/code&gt; method to register mock implementations of your services. You can also override &lt;code&gt;createFlowServiceLocator()&lt;/code&gt; to do integration testing. There are also a number of useful testing-related methods available on &lt;code&gt;AbstractXmlFlowExecutionTests&lt;/code&gt; to verify things are happening correctly within your flow execution. The &lt;code&gt;MockParameterMap&lt;/code&gt; makes it easy to set parameters to pass into the flow.
&lt;/p&gt;
&lt;p&gt;&lt;a name=&quot;cool&quot;&gt;&lt;/a&gt;
&lt;strong style=&quot;color: #666&quot;&gt;Cool and useful stuff&lt;/strong&gt; 
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://opensymphony.com/sitemesh&quot;&gt;SiteMesh&lt;/a&gt;: Apply site-wide formatting, use it in conjunction with a CSS Framework (Rob is using the same one that AppFuse does - Mike Stenhouse&apos;s CSS Framework).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.eclipse.org/aspectj/&quot;&gt;AspectJ&lt;/a&gt;: Great for adding in filtering, monitoring and profiling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jamonapi.sourceforge.net/&quot;&gt;Jamon&lt;/a&gt;: Great in conjunction with AspectJ.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/&quot;&gt;JMX&lt;/a&gt;: Adds in management functionality.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
If you liked the ideas that Rob presented in this talk, don&apos;t miss &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=288&quot;&gt;my talk&lt;/a&gt; on Saturday night. AppFuse 2.0 will have most of these components and ideas built-in by default.
&lt;br/&gt;&lt;br/&gt;
This was an excellent talk by Rob.  I certainly enjoyed myself, which is likely obvious since I wrote almost everything down. ;-)




</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/tse_domain_driven_design_with</id>
        <title type="html">[TSE] Domain Driven Design with Eric Evans</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/tse_domain_driven_design_with"/>
        <published>2006-12-08T08:37:28-07:00</published>
        <updated>2007-02-10T20:07:57-07:00</updated> 
        <category term="/Java" label="Java" />
        <summary type="html">I&apos;ve arrived at The Spring Experience, 45 minutes late for the first talk.  I tried to get up early, but decided I&apos;d rather get 6 hours of sleep instead of 4.  I&apos;m now sitting in Eric Evans&apos; &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=258&quot;&gt;Introduction to Domain-Driven Design&lt;/a&gt; talk and the room is packed.  I&apos;ve never seen Eric talk before, but he seems a bit unprepared.  His PowerPoint presentation is not in full-screen mode, so you can see where he hasn&apos;t finished slides and such.  He&apos;s also very soft-spoken and seems to have an interesting way of convincing the audience his ideas are good.  I feel like I&apos;m sitting in some sort of NPR Seminar.</summary>
        <content type="html">I&apos;ve arrived at The Spring Experience, 45 minutes late for the first talk.  I tried to get up early, but decided I&apos;d rather get 6 hours of sleep instead of 4.  I&apos;m now sitting in Eric Evans&apos; &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=258&quot;&gt;Introduction to Domain-Driven Design&lt;/a&gt; talk and the room is packed.  I&apos;ve never seen Eric talk before, but he seems a bit unprepared.  His PowerPoint presentation is not in full-screen mode, so you can see where he hasn&apos;t finished slides and such.  He&apos;s also very soft-spoken and seems to have an interesting way of convincing the audience his ideas are good.  I feel like I&apos;m sitting in some sort of NPR Seminar.
&lt;br/&gt;&lt;br/&gt;
This hotel is pretty damn nice, as well as huge.  It reminds me of some sort of Vegas hotel, with the grand entrance and all. The wireless network doesn&apos;t seem to work, but it&apos;s probably a problem with the network and my MacBook Pro. Luckily, connecting via Bluetooth through my phone seems to work.
&lt;br/&gt;&lt;br/&gt;
&quot;Not all of a large system will be well designed&quot;.  Any sort of design methodology that assumes that will be doomed.  Sometimes this leads to failure, but most often it leads to mediocrity. The best thing to do is use pragmatic, strategic design. You have to decide where the utility of your model is extremely high.  Then define boundaries around that model so you can build anti-corruption layers. When doing modeling, you shouldn&apos;t look for &lt;i&gt;the&lt;/i&gt; model, but simply &lt;i&gt;a&lt;/i&gt; model. 
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;&lt;i&gt;Meaning&lt;/i&gt; is specific to a context.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Usefulness&lt;/i&gt; is specific to some set of scenarios.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;Practicality&lt;/i&gt; is determined by enabling technology.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Technology should enable rich and precise model expressions. 
&lt;br/&gt;&lt;br/&gt;
Modeling does not suggest an upfront design phase. Models are distilled knowledge about the domain and tailored to the situation you&apos;re in.  At the beginning of a project, you don&apos;t have that knowledge. An Upfront Design Phase is an excellent way to design your system on the highest level of ignorance your team will have.
&lt;br/&gt;&lt;br/&gt;
Technology should enable evolutionary change of the model.
&lt;br/&gt;&lt;br/&gt;
Spring is getting more minimalist as it progresses. The amount of XML that J2EE makes you use to get something done is ridiculous - Spring fixes much of that and makes it much more manageable.
&lt;br/&gt;&lt;br/&gt;
We need tools that let us express models without getting bogged down in technical detail.  If you use a modeling approach, you&apos;ve chosen to use a sophisticated approach and tools won&apos;t dumb it down for folks that aren&apos;t as skilled to develop.  You&apos;ll still need skilled developers to develop this type of system and make it successful.
&lt;br/&gt;&lt;br/&gt;
We need tools to help raise the level of abstraction of programming.  However, we don&apos;t need Visual Programming or UML Extensions.  Language is our fundamental abstraction tool.  Language starts with talking ... &lt;i&gt;and coding&lt;/i&gt;.
&lt;br/&gt;&lt;br/&gt;
Eric&apos;s Favorite Modeling Tools (currently available)
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;Whiteboard (with a digital camera for persistence)&lt;/li&gt;
&lt;li&gt;IDE&lt;/li&gt;
&lt;li&gt;Unit tests&lt;/li&gt;
&lt;li&gt;Our Mouths and Ears&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The ultimate technology would be one that got out of your way so much that you wouldn&apos;t even be aware of it.
&lt;br/&gt;&lt;br/&gt;
Talks on Domain Driven Design today (and throughout the weekend) can be found on the &lt;a href=&quot;http://www.thespringexperience.com/show_agenda.jsp?showId=45&quot;&gt;session schedule&lt;/a&gt;. From the talks in this track, Ben Alex&apos;s &lt;a href=&quot;http://www.thespringexperience.com/speaker_topic_view.jsp?topicId=233&quot;&gt;talk&lt;/a&gt; on Sunday sounds pretty interesting. From this talk&apos;s description:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
In this presentation we&apos;ll study an internal web application developed by a major Australian corporation. The application uses a &quot;real object oriented&quot;, or ROO, architecture. That means we swapped out those anemic domain objects, fat services, and those repetitive DAOs for rich domain objects that utilize transparent persistence and encapsulate business rules. 
&lt;/p&gt;
&lt;p&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/back_in_denver1</id>
        <title type="html">Back in Denver</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/back_in_denver1"/>
        <published>2006-11-28T01:41:57-07:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/General" label="General" />
        <content type="html">&lt;a href=&quot;http://raibledesigns.com/page/rd?entry=raible_road_trip_11&quot;&gt;Raible Road Trip #11&lt;/a&gt; was an excellent vacation.  Our plan to drive through the night worked out splendidly. Not only did I make it to 7:30 a.m. (with the help of a bit of Red Bull), but I got to jam to my favorite tunes all night long.  We left at 11 p.m. and I handed over the reigns to Julie just outside of Billings.  She drove for the next 3 hours, and I took over again for the final 3.  Total time: 14 hours.  
&lt;br/&gt;&lt;br/&gt;
We arrived at the cabin at 1:00 p.m. on Wednesday.  Actually, I should say we got stuck at the cabin at 1:00 because we made it all the way up the &quot;bumpy road&quot;, but didn&apos;t make the last hill. 40 minutes later and at 40 miles an hour, I made it up the last hill. The next 3 days at the cabin were great.  We took Cookie the Dog and she loved it as much as the kids did. The drive home over the last 2 days wasn&apos;t nearly as pleasant as the drive there, but listening to &quot;Little Einstein&apos;s&quot; on the DVD player is never as much fun as listening to your favorite tunes. &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;
Click on the images below to view pictures from The Cabin.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://flickr.com/photos/mraible/sets/72157594395691237/&quot;&gt;&lt;img src=&quot;//static.flickr.com/105/308487308_297e660bca_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;The Cabin - November 2006&quot; style=&quot;border: 1px solid black&quot; /&gt; &lt;img src=&quot;//static.flickr.com/114/308486572_0165cb09b1_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Mimi and Baba&quot; style=&quot;margin-left: 10px; border: 1px solid black&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;The next couple weeks will likely be hectic. This week I&apos;ll be writing AppFuse 2.0 documentation. Next week I&apos;ll be delivering a Spring + Hibernate class in Boise, Idaho with &lt;a href=&quot;http://www.virtuas.com/management.html/#bnoll&quot;&gt;Country Bry&lt;/a&gt; and &lt;a href=&quot;http://www.virtuas.com/management.html/#snicholls&quot;&gt;Scott&lt;/a&gt; from Virtuas. Then I&apos;ll be flying to &lt;a href=&quot;http://thespringexperience.com/show_view.jsp?showId=45&quot;&gt;The Spring Experience&lt;/a&gt; on Thursday for a weekend in paradise.  Better yet, I&apos;ll be spending the following week in Florida on vacation. &lt;img src=&quot;https://raibledesigns.com/images/smileys/grin.gif&quot; class=&quot;smiley&quot; alt=&quot;:-D&quot; title=&quot;:-D&quot; /&gt;</content>
    </entry>
    <entry>
        <id>https://raibledesigns.com/rd/entry/livin_it_up_in_nyc</id>
        <title type="html">Livin&apos; it up in NYC</title>
        <author><name>Matt Raible</name></author>
        <link rel="alternate" type="text/html" href="https://raibledesigns.com/rd/entry/livin_it_up_in_nyc"/>
        <published>2006-05-05T14:34:36-06:00</published>
        <updated>2014-05-08T19:47:19-06:00</updated> 
        <category term="/General" label="General" />
        <content type="html">I&apos;ll admit, this week has been exhausting.  There&apos;s nothing like doing consulting 9-6 everyday for a client - especially when you&apos;re presenting or talking 90% of the time.  My final presentation I delivered to the client was 600 slides.  Yikes!  
&lt;br/&gt;&lt;br/&gt;
&lt;img src=&quot;//www.executive-limo.com/im/white_limo1.jpg&quot; alt=&quot;Limo&quot; width=&quot;208&quot; height=&quot;179&quot; class=&quot;picture&quot; style=&quot;border: 0&quot; /&gt;
Even while this week was tough, I did manage to have a good time.  I have a couple college buddies that live here, so they&apos;re always fun to hang out with.  Wednesday night, we all met up at one guy&apos;s house for dinner and reminisced about the good ol&apos; days.  Last night, I hung out with my relatives from Beacon.
&lt;br/&gt;&lt;br/&gt;
After finishing up with my client, I met my Aunt Mary in the lobby of the New Yorker Hotel. We walked outside, and when I started hailing a cab she said &quot;What are you doing? I got a limo!&quot; &quot;WTF?!&quot;, I said out loud. I turned around to see Mary had brought my cousins along and they&apos;d rented a limo for the night. Needless to say, we had a great time riding around, eating a fancy dinner and ended the night with champagne and cheesecake in Little Italy. It was truly awesome and definitely made my whole week.
&lt;br/&gt;&lt;br/&gt;
Now I&apos;m at the airport bar in Laguardia, sluggin&apos; down a few before I head back to Denver. The next couple weeks are guaranteed to be hectic - I leave on Wednesday for the &lt;a href=&quot;http://theajaxexperience.com&quot;&gt;Ajax Experience&lt;/a&gt;, followed by JavaOne the week after. While traveling to clients isn&apos;t the most glamorous job in the world, getting paid to learn about Ajax/Java for two weeks in San Fransisco isn&apos;t a bad gig. &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>
</feed>

