<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3569964</id><updated>2011-12-30T02:59:36.248-08:00</updated><title type='text'>A Sleepless Night in Tucson</title><subtitle type='html'>&lt;strong&gt;About the author&lt;/strong&gt;
&lt;p&gt;
&lt;a href="http://profiles.google.com/RichardHightower/about"&gt;Rick Hightower&lt;/a&gt; is CTO of &lt;a href="http://www.mammatustech.com/" title="Cloud Computing | EC2 | Amazon WS | IaaS | PaaS"&gt;Mammatus&lt;/a&gt; and is an expert on Java and &lt;a href="http://cloud.mammatustech.com/"&gt;Cloud Computing&lt;/a&gt;&lt;/p&gt; 

&lt;a href="http://www.caucho.com/" title="Java EE | Java Application Server | Java CDI"&gt;Resin | Java Application Server | Java EE | Java CDI &lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rickhightower.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default?start-index=101&amp;max-results=100'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>247</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3569964.post-107837415021757399</id><published>2004-03-03T20:22:00.000-08:00</published><updated>2004-03-03T20:24:39.793-08:00</updated><title type='text'>JavaServer[tm] Faces Technology - Download</title><content type='html'>&lt;a href="http://java.sun.com/j2ee/javaserverfaces/download.html"&gt;JavaServer[tm] Faces Technology - Download&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107837415021757399?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/j2ee/javaserverfaces/download.html' title='JavaServer[tm] Faces Technology - Download'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107837415021757399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107837415021757399'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_03_01_archive.html#107837415021757399' title='JavaServer[tm] Faces Technology - Download'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107533880811397683</id><published>2004-01-28T17:13:00.000-08:00</published><updated>2004-01-28T17:15:02.496-08:00</updated><title type='text'></title><content type='html'>Big Demo: Okay so I hit some milestones in the project. Today was the day to demo the product (in progress) to the customer. I give a few test runs before the big meeting. Everything works. During the meeting..... I run the demo (the most important part works), then another feature breaks with a problem I have never seen before.  I run it again later, and can not reproduce the problem. I showed the customer the feature (working). I hate demos. The chance of something going wrong during a demo is so much higher than when not doing a demo. Why? Oh well. It is a work in progress. &lt;br /&gt;&lt;br /&gt;JRoller seems to be down... I am back to using blogger.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107533880811397683?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107533880811397683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107533880811397683'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107533880811397683' title=''/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107474241221310545</id><published>2004-01-21T19:33:00.000-08:00</published><updated>2004-01-21T19:34:59.436-08:00</updated><title type='text'></title><content type='html'>test&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107474241221310545?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107474241221310545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107474241221310545'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107474241221310545' title=''/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107449890423819171</id><published>2004-01-18T23:55:00.000-08:00</published><updated>2004-01-18T23:56:28.403-08:00</updated><title type='text'>Moved to JRoller</title><content type='html'>&lt;a href="http://www.jroller.com/weblog.do"&gt;JRoller&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This blog has moved to JRoller. I am going to keep this blog site for a while. But for the latest and greatest blog stuff go to my JRoller account.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107449890423819171?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/RickHigh/Weblog' title='Moved to JRoller'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107449890423819171'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107449890423819171'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107449890423819171' title='Moved to JRoller'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107434164597678041</id><published>2004-01-17T04:14:00.000-08:00</published><updated>2004-01-17T04:15:28.936-08:00</updated><title type='text'>SourceBeat - Open Source Documentation for Eclipse, Tomcat, Struts, Apache, Perl and more...</title><content type='html'>&lt;a href="http://www.sourcebeat.com/"&gt;SourceBeat - Open Source Documentation for Eclipse, Tomcat, Struts, Apache, Perl and more...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hey... I got mentioned on this site! Free plug for me.&lt;br /&gt;&lt;br /&gt;"SourceBeat is the first publisher to create always updated open source technology books, written by expert authors such as James Goodwill, Rick Hightower, Bill Dudney, and many others. Utilizing our patent-pending "OpenBook™” process, you are always sure of getting the best information regarding the open source topic."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107434164597678041?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.sourcebeat.com/' title='SourceBeat - Open Source Documentation for Eclipse, Tomcat, Struts, Apache, Perl and more...'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107434164597678041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107434164597678041'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107434164597678041' title='SourceBeat - Open Source Documentation for Eclipse, Tomcat, Struts, Apache, Perl and more...'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107432548891543803</id><published>2004-01-16T23:44:00.000-08:00</published><updated>2004-01-16T23:46:11.233-08:00</updated><title type='text'></title><content type='html'>I tried JRoller out.&lt;br /&gt;&lt;br /&gt;Hmmmm.....&lt;br /&gt;&lt;br /&gt;I may switch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107432548891543803?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432548891543803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432548891543803'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107432548891543803' title=''/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107432255111014175</id><published>2004-01-16T22:55:00.000-08:00</published><updated>2004-01-16T22:57:13.250-08:00</updated><title type='text'></title><content type='html'>I just bought four books:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1930110995/qid=1074321901//ref=sr_8_xs_ap_i0_xgl14/104-9101130-4347122?v=glance&amp;s=books&amp;n=507846"&gt;JUnit in Action&lt;/a&gt; written by Ted Husted and Vincent Massol.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/1932394052/ref=pd_null_recs_b//104-9101130-4347122?v=glance&amp;s=books"&gt;XDoclet in Action&lt;/a&gt; by Rickard Oberg, Craig Wall, and Norman Richards.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0764543857/qid=1074322082/sr=2-3/ref=sr_2_3/104-9101130-4347122"&gt;Expert One-on-one J2EE design and Development&lt;/a&gt; by Rod Johnson. There are no books on Spring yet, but I heard much of the Stuff that is in Spring is covered in this book.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0321127420/qid=1074322187/sr=2-2/ref=sr_2_2/104-9101130-4347122"&gt;Patterns of Enterprise Application Architecture&lt;/a&gt; by Martin Fowler.&lt;br /&gt;&lt;br /&gt;I almost bought  &lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0321205758/qid=1074322318/sr=1-1/ref=sr_1_1/104-9101130-4347122?v=glance&amp;s=books"&gt;Contributing to Eclipse: Principles, Patterns, and Plugins by Erich Gamma, Kent Beck&lt;/a&gt;, but I went way passed my monthly book allowance already.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I think I have every book Kent Beck has written. I like his writing style, and his message. It is on my wish list.&lt;br /&gt;&lt;br /&gt;I am currently writing a book. I've written several hundred pages so far. In fact, I need to get back to my writing now. L8er&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107432255111014175?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432255111014175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432255111014175'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107432255111014175' title=''/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107432188484757947</id><published>2004-01-16T22:44:00.000-08:00</published><updated>2004-01-16T22:46:07.123-08:00</updated><title type='text'>TheServerSide.com - Kito Mann Interview</title><content type='html'>&lt;a href="http://www.theserverside.com/talks/videos/KitoMannText/interview.jsp"&gt;TheServerSide.com - Kito Mann Interview&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kito is the Man!&lt;br /&gt;&lt;br /&gt;Good interview. I will be buying his book. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107432188484757947?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.theserverside.com/talks/videos/KitoMannText/interview.jsp' title='TheServerSide.com - Kito Mann Interview'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432188484757947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107432188484757947'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107432188484757947' title='TheServerSide.com - Kito Mann Interview'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107431365647779050</id><published>2004-01-16T20:27:00.000-08:00</published><updated>2004-01-16T20:28:59.060-08:00</updated><title type='text'>between the lines: For whom do those e-bells toll? Ask promoOrder</title><content type='html'>&lt;a href="http://www.corporatelogo.com/articles/251between.html"&gt;between the lines: For whom do those e-bells toll? Ask promoOrder&lt;/a&gt;: "'The reason I think eBlox will succeed is we're self-funded,' says CEO Brent Buford. 'We don't have those outside investors telling us we have to perform a certain way. In the case of PromoFuel, we hit our stride right when the economy went down the tank.'"&lt;br /&gt;&lt;br /&gt;My old boss tells it like it is. Venture Capital stinks. You don't want somebody who made their money seeling coin operated laundry machines how to run your software company.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107431365647779050?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.corporatelogo.com/articles/251between.html' title='between the lines: For whom do those e-bells toll? Ask promoOrder'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107431365647779050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107431365647779050'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107431365647779050' title='between the lines: For whom do those e-bells toll? Ask promoOrder'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107429803406470802</id><published>2004-01-16T16:07:00.000-08:00</published><updated>2004-01-16T16:08:36.576-08:00</updated><title type='text'>Software Development Conference and Expo West 2004</title><content type='html'>&lt;a href="http://www.cmpevents.com/SDw/a.asp?option=G&amp;V=3&amp;id=192569"&gt;Software Development Conference and Expo West 2004&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll be speaking at SD West on extending Struts and J2EE development with Ant.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cmpevents.com/SDw/a.asp?option=3&amp;V=11&amp;SessID=2372&amp;Mgt=0&amp;RVid=0"&gt;Extending Struts&lt;/a&gt;&lt;br /&gt;Description: Okay you think you have mastered Struts, but you wish it could just do this one special thing? This session shows you how to go beyond the Struts basics to extend the framework to fit you needs. Struts was designed to be extensible. Learn how to extend it. Advance Struts topics about extending the framework using Struts plugins, and extending the Action Servlet, Custom Actions, the RequestProcessor, and more. This is an advanced topic that assumes previous knowledge of Struts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.cmpevents.com/SDw/a.asp?option=3&amp;V=11&amp;SessID=2377&amp;Mgt=0&amp;RVid=0"&gt; J2EE Development with XDoclet and Ant &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Time/Date: Friday (March 19, 2004)   10:30 am - 12:00 pm&lt;br /&gt;Track: Java Programming &lt;br /&gt;Format: Class&lt;br /&gt;Level: Intermediate/Advanced&lt;br /&gt;Description: This class covers developing J2EE components with XDoclet. XDoclet can drastically speed J2EE development by generating component support files by embedding meta data in what looks like JavaDoc tags of the component implementation. This class will also demonstrate developing Custom Tags, Entity Beans, Session Beans, and Struts Actions with the assistance of XDoclet combined with Ant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107429803406470802?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.cmpevents.com/SDw/a.asp?option=G&amp;V=3&amp;id=192569' title='Software Development Conference and Expo West 2004'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107429803406470802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107429803406470802'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107429803406470802' title='Software Development Conference and Expo West 2004'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107422715988620693</id><published>2004-01-15T20:25:00.000-08:00</published><updated>2004-01-15T20:27:21.343-08:00</updated><title type='text'>Erik Hatcher - Blog</title><content type='html'>Thanks Erik (&lt;a href="http://www.blogscene.org/erik/"&gt;Erik Hatcher - Blog&lt;/a&gt;). Erik is always so way ahead of the curve. I have to check what technology he is working with so I know what technology I will be working with in 6 months. It was fun working with Erik at eBlox.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107422715988620693?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.blogscene.org/erik/' title='Erik Hatcher - Blog'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107422715988620693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107422715988620693'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107422715988620693' title='Erik Hatcher - Blog'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107416359674968971</id><published>2004-01-15T02:46:00.000-08:00</published><updated>2004-01-15T02:51:14.560-08:00</updated><title type='text'>logic:present and logic:notPresent good for model 2 but use JSTL instead</title><content type='html'>The &lt;logic:present /&gt; and &lt;logic:notPresent /&gt; tags check to see if headers, request parameters, cookies, JavaBeans or JavaBean properties are present and not equal to null. You can specify the string which can be a cookie, header, request parameter or bean property by using the attributes cookie, header, parameter, or name &amp; property. Additionally you can check to see if the current users is in a certain role using the roles attribute (this integrates with the J2EE security model).&lt;br /&gt;&lt;br /&gt;TIP: both the &lt;logic:present /&gt; and &lt;logic:notPresent /&gt; fits really well in a Model 2/MVC architecture. You can allow the controller, i.e., your actions, to decide which objects to map into scope based on executing business rules of your application model.  The JSP page, which should have very little logic in it, will just check to see if an object is in scope and if it is in scope then it displays the object.  This way if the underlying business-rules of the model changes, it does not affect the JSP code. The JSP never knows why it's displaying object just if that object is present then it should display that object.  It's up to the controller to decide which objects to map into scope after executing business rules on the model.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You can do the same thing as the logic:present and logic:notPresent tags using JSTL. New projects should use the JSTL equivalent. &lt;br /&gt;&lt;br /&gt;EL would be                 foo!=null &lt;br /&gt;or                                 not empty foo&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.arc-mind.com/strutsCourse.htm"&gt;Best Struts Course&lt;/a&gt;, &lt;a href="http://www.arc-mind.com/strutsCourse.htm"&gt;Struts Training&lt;/a&gt;, &lt;a href="http://www.arc-mind.com/consulting.htm#StrutsMentoring"&gt;Struts Consulting&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107416359674968971?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107416359674968971'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107416359674968971'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107416359674968971' title='logic:present and logic:notPresent good for model 2 but use JSTL instead'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107409617316199341</id><published>2004-01-14T08:02:00.000-08:00</published><updated>2004-01-14T08:04:13.436-08:00</updated><title type='text'>A Sleepless Night in Tucson</title><content type='html'>&lt;a href="http://rickhightower.blogspot.com/"&gt;A Sleepless Night in Tucson&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I read my blog entry from last night, and I realize it had a little too much bile in it. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107409617316199341?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://rickhightower.blogspot.com/' title='A Sleepless Night in Tucson'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107409617316199341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107409617316199341'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107409617316199341' title='A Sleepless Night in Tucson'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107406261102021375</id><published>2004-01-13T22:43:00.000-08:00</published><updated>2004-01-13T22:44:50.530-08:00</updated><title type='text'>Amazon.com: Books: Professional Jakarta Struts</title><content type='html'>&lt;a href="http://www.amazon.com/exec/obidos/tg/detail/-/0764544373/qid=1074061813//ref=sr_8_xs_ap_i5_xgl14/104-8898701-2462334?v=glance&amp;s=books&amp;n=507846"&gt;Amazon.com: Books: Professional Jakarta Struts&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;Sooyoung Park write a review as follows.....&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"I have two gripes with this book. First, it's really a shame that the authors didn't take the time to include information about Unix/Linux installation and configuation since the vast majority of us will be deploying on those platforms, if not developing on them outright. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Any self-respecting Linux/Java developer can translate instructions from Windows/DOS into Linux, if not they should not be using Linux. We also don't have instructions for AIX, Solarix and HP-UX.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Secondly, the book is a little behind the curve regarding Struts 1.1. For example, the use of Struts tag libraries has been considerably simplified and the file upload example on page 391 uses the deprecated FormFile class instead of Jakarta FileUpload. It's only natural for APIs to change, but if you plan on buying this book, be prepared to spend some additional time on the Jakarta web site. "&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Is not! Check out the javadocs from the nightly build for &lt;a href="http://jakarta.apache.org/struts/api/org/apache/struts/upload/FormFile.html"&gt;FormFile&lt;/a&gt;. It is not deprecated. The book does not cover Jakarta FileUpload directly as it is used under the covers by Struts. Look a little further and you will find CommonsMultipartRequestHandler.CommonsFormFile. This class implements the Struts FormFile interface by wrapping the Commons FileUpload FileItem interface. &lt;br /&gt;&lt;br /&gt;So in short.... You don't know what you are talking about. Spend some time on the Jakarta web site before you criticize me for not spending time on the Jakarata web site.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107406261102021375?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.amazon.com/exec/obidos/tg/detail/-/0764544373/qid=1074061813//ref=sr_8_xs_ap_i5_xgl14/104-8898701-2462334?v=glance&amp;s=books&amp;n=507846' title='Amazon.com: Books: Professional Jakarta Struts'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107406261102021375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107406261102021375'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107406261102021375' title='Amazon.com: Books: Professional Jakarta Struts'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107403608198882309</id><published>2004-01-13T15:21:00.000-08:00</published><updated>2004-01-13T15:39:08.920-08:00</updated><title type='text'>Amazon.com reviews are a farce.</title><content type='html'>&lt;a href="http://weblogs.java.net/pub/wlg/665"&gt;Amazon.com reviews are a farce.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Who says there is no drama in our industry?&lt;br /&gt;&lt;br /&gt;I've been reading WSI profile spec. until my brain started bleeding, when I found the above link in an unrelated track of thinking. If you like controversy, and heated debated then you will love the above.&lt;br /&gt;&lt;br /&gt;I hardly every buy books based on their Amazon review. I may be old fashioned but I usually go to the book store and read chapters from the book first. I spend at least an hour reading through a book before I buy it. Unless, it is the only book on the topic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107403608198882309?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://weblogs.java.net/pub/wlg/665' title='Amazon.com reviews are a farce.'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107403608198882309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107403608198882309'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107403608198882309' title='Amazon.com reviews are a farce.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107402588247319283</id><published>2004-01-13T12:31:00.000-08:00</published><updated>2004-01-13T12:32:45.436-08:00</updated><title type='text'>I got my first endorsement on www.linkedin.com</title><content type='html'>I got my first endorsement on www.linkedin.com&lt;br /&gt;&lt;br /&gt;"I worked with Rick at eBlox - he literally saved the company from a sure death and he documented much of our experiences in the fantastic Java Tools for Extreme Programming book. Rick is a jack of all trades, and master of most - I wish he was on my team now!" -- Erik Hatcher&lt;br /&gt;&lt;br /&gt;If you are going to get an endorsement..... getting one from Erik Hatcher is a good thing. Erik Hatcher is the Ant, Struts, and WebDevelopment guru.&lt;br /&gt;&lt;br /&gt;I dig linkedin.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107402588247319283?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.linkedin.com' title='I got my first endorsement on www.linkedin.com'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107402588247319283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107402588247319283'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107402588247319283' title='I got my first endorsement on www.linkedin.com'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107401718081630571</id><published>2004-01-13T10:06:00.000-08:00</published><updated>2004-01-13T10:07:40.153-08:00</updated><title type='text'>Struts book doing well: Professional Struts</title><content type='html'>For a while the first edition of our Struts book was outselling the second edition. It sure did not help that the first edition was under a Wiley imprint and the second edition was under a Wrox imprint, and they changed the name of the book. My understanding is that Wiley bought the rights to Wrox name and their best selling books when Wrox went out of business. Now the book is third on Amazon (out of all Struts books), which is not too bad considering the Orielly's book and Ted Husted's book are number 1 and 2. For a while, the book was second on bookpool right after the Orielly book, which blows my mind. Now the book is no longer second on book pool, it is has dropped. This could be because bookpool is out of stock! Come on. You may wonder why I care. Mainly, if I am going to spend time writing a book, I want people to read it. Perhaps this is vain. The biggest complaint about the book seems to be that it does not cover Linux installation. Hey, if you can not translate the Windows instructions to Linux instruction in your head, then you probably should not be using Linux. We expect more from Java/Linux developers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107401718081630571?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107401718081630571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107401718081630571'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107401718081630571' title='Struts book doing well: Professional Struts'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107396629571338226</id><published>2004-01-12T19:58:00.000-08:00</published><updated>2004-01-12T19:59:34.560-08:00</updated><title type='text'>The Artful Blogger: Struts jobs in London... Struts jobs in the US.</title><content type='html'>&lt;a href="http://www.jroller.com/page/prpatel/20040112#35_struts_jobs_in_london"&gt;The Artful Blogger: Struts jobs in London&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hmmmm.... this made me think.... what about the US?&lt;br /&gt;&lt;br /&gt;I checked Dice....&lt;br /&gt;&lt;br /&gt;370 Struts jobs in Dice.&lt;br /&gt;&lt;br /&gt;1 WebWork job in Dice. (0 for WebWork2)&lt;br /&gt;&lt;br /&gt;The momentum still seems to be behind Struts. I think Struts and JSF is the ticket (Struts + JSF). Hmmmm....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107396629571338226?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/prpatel/20040112#35_struts_jobs_in_london' title='The Artful Blogger: Struts jobs in London... Struts jobs in the US.'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396629571338226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396629571338226'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107396629571338226' title='The Artful Blogger: Struts jobs in London... Struts jobs in the US.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107396553324930496</id><published>2004-01-12T19:45:00.000-08:00</published><updated>2004-01-12T19:46:51.640-08:00</updated><title type='text'>Struts vs. WebWork</title><content type='html'>&lt;a href="http://www.jroller.com/page/jcarreira?anchor=re_comments_to_struts_vs"&gt;Jason Carreira&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another WebWork vs. Struts comparison.&lt;br /&gt;&lt;br /&gt;Struts has great IDE support. WebWork has some very cool features, but none that cannot be added to Struts. There are parts of WebWork I really like, but everywhere I go, the client is using Struts. Hmmmmm.....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107396553324930496?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/jcarreira?anchor=re_comments_to_struts_vs' title='Struts vs. WebWork'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396553324930496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396553324930496'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107396553324930496' title='Struts vs. WebWork'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107396541830572030</id><published>2004-01-12T19:43:00.000-08:00</published><updated>2004-01-12T19:44:56.700-08:00</updated><title type='text'>Kris Thompson's Weblog</title><content type='html'>&lt;a href="http://www.jroller.com/page/quadzilla/20031211#battle_of_the_frameworks"&gt;Kris Thompson's Weblog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;WebWork vs. Struts comparison.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107396541830572030?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/quadzilla/20031211#battle_of_the_frameworks' title='Kris Thompson&apos;s Weblog'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396541830572030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396541830572030'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107396541830572030' title='Kris Thompson&apos;s Weblog'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107396491221434175</id><published>2004-01-12T19:35:00.000-08:00</published><updated>2004-01-12T19:36:30.686-08:00</updated><title type='text'>rebelutionary: Open Source FUD - The Verge Framework</title><content type='html'>&lt;a href="http://blogs.atlassian.com/rebelutionary/archives/000371.html"&gt;rebelutionary: Open Source FUD - The Verge Framework&lt;/a&gt;&lt;br /&gt;To rebelutionary (a.k.a. Mike Cannon-Brookes),&lt;br /&gt;&lt;br /&gt;I agree.&lt;br /&gt;&lt;br /&gt;I don’t know anything about the Verge framework. It might be the greatest thing since sliced bread, but Struts and WebWork are established and does the world need another front controllerish framework?&lt;br /&gt;&lt;br /&gt;How many IDE’s support Verge?&lt;br /&gt;How many books are written about Verge?&lt;br /&gt;&lt;br /&gt;You probably don’t remember me. But, we met at TheServerSide.com.&lt;br /&gt;&lt;br /&gt;I read your book: “Java Open Source Programming”.&lt;br /&gt;&lt;br /&gt;I must say I really dig it. I’ve used most of the tools you cover before, except WebWork and XWork (a bit of a Struts guy…pays the bills).&lt;br /&gt;&lt;br /&gt;I had a hard time with the XWork chapter, but I did a little research online, and I got it. The second go round made more sense after doing a little research.&lt;br /&gt;&lt;br /&gt;Great job. I like the ideas and design of WebWork. Give Joe Walnes.... my regards.&lt;br /&gt;&lt;br /&gt;--Rick Hightower&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107396491221434175?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.atlassian.com/rebelutionary/archives/000371.html' title='rebelutionary: Open Source FUD - The Verge Framework'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396491221434175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107396491221434175'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107396491221434175' title='rebelutionary: Open Source FUD - The Verge Framework'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107385751108677316</id><published>2004-01-11T13:45:00.000-08:00</published><updated>2004-01-11T13:49:57.250-08:00</updated><title type='text'>Dragon NaturallySpeaking.</title><content type='html'>I just got a new toy.  I got a new copy of Dragon NaturallySpeaking.  Dragon NaturallySpeaking allows me to write faster (hopefully). It's not perfect, but it is pretty darn cool.  So far I taught NaturallySpeaking to recognize words like:&lt;br /&gt;ActionForm;&lt;br /&gt;DynaActionForm;&lt;br /&gt;&lt;br /&gt;Work is pretty busy lately.  For that I am thankful, but it means that the writing assignments that I have are going to take longer. I just got back from the cold weather.  My first day back in Tucson was 75°F--quite a change from last week.&lt;br /&gt;&lt;br /&gt;I got a lot of consulting work lately. I should be busy for quite a while which is good. Most of the work involves Struts and Hibernate.  I have a new assignment that involves maven. I really enjoy working with maven.&lt;br /&gt;&lt;br /&gt;It is good to be busy.&lt;br /&gt;&lt;br /&gt;By the way, I wrote this blog entry with Dragon NaturallySpeaking.  I had to make a few corrections.  It did not understand a word blog. It has a training mode. But I have not trained it to understand the word blog yet. You really have to announciate your words, when you're using Dragon NaturallySpeaking. You are supposed to corrected whenever it makes a mistake and train it to listen to the way you speak.&lt;br /&gt;&lt;br /&gt;It is supposed to improve as you use it and continue to train it.  It'll take a while for it to work the way I want it. Already it is useful.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107385751108677316?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107385751108677316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107385751108677316'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107385751108677316' title='Dragon NaturallySpeaking.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107361666017506968</id><published>2004-01-08T18:51:00.000-08:00</published><updated>2004-01-08T18:57:48.653-08:00</updated><title type='text'>MVC for Struts Smarties</title><content type='html'>MVC for Struts Smarties&lt;br /&gt;Mastering MVC and Model 2 with Struts&lt;br /&gt;&lt;br /&gt;Struts promotes a Model 2 / MVC architecture. Essentially, Struts architecture is based on the J2EE blue print for Java, which heavily promotes using MVC. It has been said that Struts is the instantiation of the J2EE Blueprint’s view of the Web Tier.&lt;br /&gt;&lt;br /&gt;TIP: Read the J2EE Blueprint at http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/index.html.&lt;br /&gt;&lt;br /&gt;Many times application can have more than one type of client (e.g., web client, and rich GUI client).  For client independence and testability, it is good to develop your applications where the application data and business rules are separated from a particular client implementation. In order to adapt the application to multiple clients and to organize the code into separate areas of concern, you typically implement the systems using a variation of Model-View-Controller Architecture (MVC). &lt;br /&gt;&lt;br /&gt;MVC is an open architecture with multiple tiers. The Struts framework uses a variation of MVC that was adapted for web development called Model 2. The following sessions considers MVC/Model 2 and its ramification on Struts usage. &lt;br /&gt;&lt;br /&gt;WARNING: Java promotes object-oriented programming, but does not enforce it., i.e., you can create non OO code in Java. Similarly, Struts promotes MVC / Model 2 architecture, but does not enforce it. Making Struts foolproof with regards to MVC is difficult as foolish developers are ingenious. To get the best out of Struts, you need to know MVC / Model 2.&lt;br /&gt;Model Tier&lt;br /&gt;&lt;br /&gt;The model is the application data and the business rules of your application. The business rules are the rules for changing your application data. Many types of applications can share your application’s model. The model code should not be dependent on Struts, or the JSP/Servlet API. &lt;br /&gt;The Struts framework provides no model classes per se. All application should have different models.&lt;br /&gt;&lt;br /&gt;TIP: The Struts framework does not provide any model objects. Your model is specific to your application. Often developers develop their model with EJB, JDO or Hibernate. The model consists of the persistence layer, and the business rules for modifying the persistence layer.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;View Tier&lt;/strong&gt;&lt;br /&gt;The view tier is what the end-user sees. The view displays parts of the model to the end user. Different types of clients (web client, rich GUI client) have different view. The view should never modify model data directly, nor should it interact with business rules of the model. &lt;br /&gt;&lt;br /&gt;The Struts framework does not specify a particular view technology. The Struts framework does provide many JSP custom tags to aid in developing with JSP tags. You can also develop views with other technologies like Velocity (which has Struts tools), JSF and XSLT. Struts is fairly view agnostic.&lt;br /&gt;&lt;br /&gt;TIP: Many of the JSP custom tags that ship with Struts are essentially deprecated in favor of their JSTL equivalent (c:forEach vs. logic:iterate).  Other Struts custom tags are key to Struts development like html:form.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Controller Tier&lt;/strong&gt;&lt;br /&gt;A controller acts like the glue between the model and the view. The controller defines the flow of the application. It interprets events from the user (user gestures), and acts like the mediator between the view and the model. It parses the user gestures into actions it performs on the model. Different types of clients require different types of controllers. In Struts, the actions (Action), ActionServlet and config objects (created from struts-config.xml), act as the controller.&lt;br /&gt;&lt;br /&gt;The controller accepts user events from the view. In a Web interface, the user events are page loads (HTTP GET) and form submissions (HTTP POST) requests. &lt;br /&gt;To help separate the Model from the View, the controller should convert the request data, scoped beans, and request into business actions. The Struts framework does part of this for you. You do the rest of the conversion as your write action (Action) that act as intermediaries from the web request to the model.&lt;br /&gt;&lt;br /&gt;It is the controller job to select the next view to display; this is part of managing the flow of the application. The actions that you write return an ActionForward to the next view. Thus the ActionForward represents the next view in the system. And, it is the job of the actions, you write to return the next view. In the actions you write, you typically interact with the model’s business rules, look up model data, map the model data into scope (request, session, etc.) and then select the next view so the view can display the model data.&lt;br /&gt;&lt;br /&gt;Rules for writing proper MVC application with Struts&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rules for the View Tier&lt;/strong&gt;&lt;br /&gt;The view should never select the next view. This means that the JSP files should never use jsp:forward, logic:forward, logic:redirect, or core:redirect (JSTL) to change the view to a new JSP. Your actions should select the next view by returning the appropriate ActionForward.&lt;br /&gt;&lt;br /&gt;Try to only use stupid JSPs. A stupid JSP is a JSP that does not have a lot of logic. Try to limit the logic to looping through collection of data, and displaying objects if they are in scope (logic:present and core:if value=”not empty…). Often times I see JSP errantly sorting data, or checking with a model to see if a part of the page should display. Instead let the Action sort the data before it gives it to the JSP, and let the Action decide if a model object(s) needs to be display by interacting with the business rules of the model. JSP should not know why it is displaying an object if it is there display it. That way if the business rules for displaying the tag changes, the JSP does not change.&lt;br /&gt;&lt;br /&gt;A funny thing happened. They added custom tags to simplify JSP development, and remove Java code (Java Scriptlets and Expressions in the JSP) from the JSP. Then people started writing what they use to write in Java in logic custom tags. This helped, but the maintainability problems remained. The key is not only limit the Java code in a JSP, but to limit the logic in the JSP. Keep your JSPs simple and your web application will be a lot more maintainable. &lt;br /&gt;&lt;br /&gt;If your JSPs start to have too much logic (Struts logic:* tags, and JSTL core:* tags), move that logic into the action. If your are worried about too much code in your Action, use Action chaining. For example, you could have an Action that sorts the data that another Action put into scope then forward to the JSP.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rules for the Controller Tier&lt;/strong&gt;&lt;br /&gt;Actions should be small. Actions should never do JDBC directly. In fact, Action should never talk to EJBs directly, or Hibernate, or etc. Action should instead only talk to façade facets of the model. If you are using Session Facades (EJB), use delegate objects (wrapper object) so that the Action does not talk directly to the EJB. Limiting the Action to only talk to a façade of the model, helps keep the Action testable with unit tests. Conversely, tying the Action to some underlying technology couples the Action to that technology and makes the Action harder to test.&lt;br /&gt;&lt;br /&gt;Action should never implement business rules, or perform complex calculations. The Action should delegate those tasks to the model.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Rules for the Model&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The model should be completely divorced from the controller. The model should not be dependent on any class in the Struts hierarchy. The individual model objects should be hidden behind a façade.&lt;br /&gt;&lt;br /&gt;TIP: A great OO guru once said that the great thing about objects is that they can be replaced. As it turns out, the Controller is more testable if it is divorced from the model implementation. This allows you to substitute stubbed out objects that return hard-coded results needed to test the controller logic in you actions. There are several ways to do this. The controller code (actions), could look up Model facades in a registry, and instantiate them. You could also use an IOC (Inversion of Control) container like Spring, PicoContainer, HiveMind, or XWork. The Spring et al framework is beyond the scope of this discussion, but look for a chapter on using the Spring framework plugin with Struts. The best discussion of IOC, I’ve seen is at http://www.picocontainer.org, which is a type 3 ICO container.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.arc-mind.com/strutsCourse.htm"&gt;Best Struts Course &lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.arc-mind.com/jsfCourse.htm"&gt;New JSF Course &lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107361666017506968?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.arc-mind.com/strutsCourse.htm' title='MVC for Struts Smarties'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107361666017506968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107361666017506968'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107361666017506968' title='MVC for Struts Smarties'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107358822451730277</id><published>2004-01-08T10:57:00.000-08:00</published><updated>2004-01-08T10:58:19.043-08:00</updated><title type='text'>It is official.... there is a developer need uptick! It seems like a lot of projects are ramping up!</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107358822451730277?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107358822451730277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107358822451730277'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107358822451730277' title='It is official.... there is a developer need uptick! It seems like a lot of projects are ramping up!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107354553958628254</id><published>2004-01-07T23:05:00.000-08:00</published><updated>2004-01-07T23:06:53.513-08:00</updated><title type='text'>Kris Thompson's Weblog: Ken's Predictions for 2004</title><content type='html'>Ken has a list of prediction for 2004.&lt;br /&gt;&lt;a href="http://www.jroller.com/page/quadzilla/20040107#web_framework_predictions_for_2004"&gt;Kris Thompson's Weblog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;His list has inspired mine....&lt;br /&gt;My predictions....&lt;br /&gt;&lt;br /&gt;1) Struts will continue to make gains because of the IDE support for Struts.&lt;br /&gt;2) Struts will integrate well with JSF.&lt;br /&gt;3) JSF will be adopted as fast as Struts was.&lt;br /&gt;4) Struts will integrate well with Spring.&lt;br /&gt;5) Projects that use Struts + JSF + Tiles + Spring + Hibernate will be the most common web applications&lt;br /&gt;6) Hibernate will win over EJB CMP/CMR and JDO (continue to win)&lt;br /&gt;7) WebWork style feature will make it into Struts&lt;br /&gt;&lt;br /&gt;This will be the year of JSF, Hibernate, and Spring.&lt;br /&gt;&lt;br /&gt;JSF is to JSP as ASP.Net is to ASP. JSF will rule supreme.&lt;br /&gt;Hibernate will continue to be the OR mapping tool of choice.&lt;br /&gt;Spring has sprung.&lt;br /&gt;A cottage industry of JSF component development companies will spring up to create GUI Widgets!&lt;br /&gt;&lt;br /&gt;GUI Widgets for sale!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107354553958628254?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/quadzilla/20040107#web_framework_predictions_for_2004' title='Kris Thompson&apos;s Weblog: Ken&apos;s Predictions for 2004'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107354553958628254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107354553958628254'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107354553958628254' title='Kris Thompson&apos;s Weblog: Ken&apos;s Predictions for 2004'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107354439991439439</id><published>2004-01-07T22:46:00.000-08:00</published><updated>2004-01-07T22:47:53.280-08:00</updated><title type='text'>JAVA&amp;TRADE; ADVISOR®: Professional Jakarta Struts: Advanced Action Classes - - ADVISOR.com - -</title><content type='html'>I found my chapter on someone elses blog... thought I would add it to mine....&lt;br /&gt;&lt;a href="http://doc.advisor.com/Articles.nsf/nl/13372"&gt;JAVA&amp;TRADE; ADVISOR®: Professional Jakarta Struts: Advanced Action Classes - - ADVISOR.com - -&lt;/a&gt; &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107354439991439439?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://doc.advisor.com/Articles.nsf/nl/13372' title='JAVA&amp;TRADE; ADVISOR®: Professional Jakarta Struts: Advanced Action Classes - - ADVISOR.com - -'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107354439991439439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107354439991439439'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107354439991439439' title='JAVA&amp;TRADE; ADVISOR®: Professional Jakarta Struts: Advanced Action Classes - - ADVISOR.com - -'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107353254957751534</id><published>2004-01-07T19:29:00.000-08:00</published><updated>2004-01-07T19:30:23.030-08:00</updated><title type='text'>Cold is too weak an adjective to describe this weather..... Brrrrrrrrrrrrrrrrr.... Maven Guru</title><content type='html'>I have met the Maven guru! He has done things with Maven that you can only imagine. He has written 6 Maven plugins and created something similar to AntHill, but for Maven. WOW! Cool stuff. We are going to work on the next version of MavenHill together. Cool job.... Cold climate. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107353254957751534?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107353254957751534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107353254957751534'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107353254957751534' title='Cold is too weak an adjective to describe this weather..... Brrrrrrrrrrrrrrrrr.... Maven Guru'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107346292001332948</id><published>2004-01-07T00:08:00.000-08:00</published><updated>2004-01-07T00:09:52.950-08:00</updated><title type='text'>Musings, Shock Bloggers on the rise, Good Enough Development, TDD, Loving Software Development again (AOP, IOC, TDD, IF)</title><content type='html'>I am sitting on a plane flying to the brave, north mid-west.... waiting to get to the 9 degree weather that awaits me. I just saw that new Denzle Washington movie (Out of time... I think). Good movie.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Things have been going really well. I am happy with the progress of work. I've got more work than I can handle, which is a good thing. I am looking forward to speaking at the "No Fluff Just Stuff Software Symposiums" this year.&lt;br /&gt;&lt;br /&gt;Mussing...&lt;br /&gt;I've been thinking a lot about JBoss, JMX and JMS as of late (today). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have a IBM WebShpere project that I need to get started on next week too. IBM WSAD 5.1 is pretty kick butt. Java IDEs are really comming into their own. &lt;br /&gt;&lt;br /&gt;A year ago, I was getting kind of sick of Java and J2EE (bored really). Now with JSF, AOP frameworks, IOC containers, great OR mapping tool, advances in TDD (JWebUnit, MOckObjects, etc.), it is all exciting again. Thanks guys... my work is fun again. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I love TDD. I like developing that way. I like writing quality software. I have been test addicted for a while (1996), but have recently taken it to a new level with TDD (thanks Kent Beck for you TDD book; thanks Vincent Massol for explaining the real value of Mock Objects). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I hate pontificating, arrogant developer blogs. I don't like the tone of some developer blogging. I don't like bile(ing) someone. I don't like when other people do it either. I love blogs and even read biles, but don't like it, but am attracted to read them.&lt;br /&gt;&lt;br /&gt;I don't like when people take an absured point of view just to get heard. I think I am going to coin a new term for this.... Shock &lt;br /&gt;&lt;br /&gt;Bloggers. (kind of like Shock Jocks....)&lt;br /&gt;Hmmmmmmmmmmmmmmm..... How about Shog Bloggers?!&lt;br /&gt;&lt;br /&gt;I personally think that everything has a balance, even quality. "No Margin. No Mission." is my mantra! Don't get me wrong. I like writing quality software, and think we ought to be craftsman. But not all projects have to be a work of art... a lot of projects just have to work and provide business value. I am a strong believer of "good enough"; the value of the project has to exceed the development costs (Return on Investment). I feel developers often go overboard with whatever is the newest latest thing or trend. My main focus is to provide value. What can I do to provide business value as soon as possible and as cheap as possible. Don't get me wrong, I am not suggesting shoddy work, but I am suggesting doing easy jobs quickly.&lt;br /&gt;&lt;br /&gt;Don't get me wrong....I spend too many hours trying to improve my craft (just look at my bookshelves and ask my wife), but not at the expense of making my clients money. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Yes! It all comes down to money. Business value = money. I want to provide the best solution for the time available. There are other costs like oppurtunity costs. Sometimes it is more important to get it done. If you don't get it done in a timely matter, there will be no second chance. Sometimes you just got to get it done. There is time for improvement later. Keep it simple. The simplest solution that fits the customers needs (sometimes the simplest thing is still complex that is what makes our jobs interesting).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107346292001332948?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107346292001332948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107346292001332948'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107346292001332948' title='Musings, Shock Bloggers on the rise, Good Enough Development, TDD, Loving Software Development again (AOP, IOC, TDD, IF)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107343948023206732</id><published>2004-01-06T17:38:00.000-08:00</published><updated>2004-01-06T18:07:19.996-08:00</updated><title type='text'>Good couple of days.... I like JBoss.... MyEclispe ROCKS!</title><content type='html'>What a great couple of days..... I just spent the last two days in Phoenix. I was called into do an architectural analysis and provide mentoring for this future, strategic application.&lt;br /&gt;&lt;br /&gt;While I was on vacation in Colorado, I got called to go to Phoenix and do some &lt;a href="http://www.arc-mind.com/consulting.htm#StrutsMentoring"&gt;Struts Consulting &lt;/a&gt; and some &lt;a href="http://www.arc-mind.com/consulting.htm#StrutsMentoring"&gt;Struts Mentoring &lt;/a&gt;.... it turned into being a lot more than that. I only had two days to spare as I had previous commitment doing &lt;a href="http://www.arc-mind.com/consulting.htm#MavenMentoring"&gt; Maven Consulting&lt;/a&gt; and they needed someone ASAP. The engagement ended up being a lot more than &lt;a href="http://www.arc-mind.com/consulting.htm#StrutsMentoring"&gt;Struts Consulting &lt;/a&gt; and some &lt;a href="http://www.arc-mind.com/consulting.htm"&gt;Struts Mentoring &lt;/a&gt;. We did a lot of of work with JMS. I knew JMS well but it has been a while since I used it--turns out I was not very rusty. (I worked on a JMS implementation in the past for a EJB container company. And, I wrote a JMS course as well as courses that uses MDB. And, I have used JMS on several project... just not recently).&lt;br /&gt;&lt;br /&gt;They discussed their application for about 1/2 day. Then they discussed their marketing goals and vision. It was good background. I was very familiar with their domain (too familiar).&lt;br /&gt;&lt;br /&gt;They wanted advice about how to use J2EE/Struts/JMS/EJB/MDBs/MOM. With my previous experience in their particular vertical and my knowledge of the technologies, we were off to the races. I convinced them to use Hibernate for their application instead of  EJB CMP/CMR. (This is the nth customer who I have convinced to use Hibernate). (BTW I love Hibernate... Gavin King rocks! The funny part of this is that we were an early adopter of EJB CMP/CMR, and I even spoke about EJB CMP/CMR at JavaOne last year as well as wrote about it at IBM developerWorks, but now I prefer Hibernate. I still use EJB CMP/CMR every now and then when customers want me to, but prefer Hibernate.)&lt;br /&gt;&lt;br /&gt;The architecture analysis went so well the first day that we decided to write a prototype the second day. We quickly had a prototype up and running, which consisted of Struts based web app uploading files (using FormFile). The web app would send a notice that the file was uploaded using JBoss JMS. We had an MDB listening to the queue which would then submit the job  to be processed... (can't say anything more that).&lt;br /&gt;&lt;br /&gt;They are a JBoss shop. I have used JBoss before, but usually use WebLogic or WebShpere. It is not that I do not like JBoss,  it is just that most of my clients use BEA WebLogic or IBM WebSphere (I use whatever I get paid to use). I am personally partial to Cuacho Resin. However.....&lt;br /&gt;&lt;br /&gt;I found working with JBoss JMS a joy after I convinced them to buy the documentation. ;) We were setting up queues in no time. They recently bought copies of MyEclipse, which is a suite of plugins for Eclipse and J2EE (with XDoclet support). It was a little frustrating because they did not know how to use MyEclispe well (they just got it), and I did not know how to use it at all. But after some trial and error,  I found MyEclispe (we found) to be awesome. I am a MyEclipse believer; the XDOclet support is awesome and works well with Hibernate. We started implementing  the domain in Hibernate. &lt;br /&gt;&lt;br /&gt;It seems like a great project. I hope I get to work on it some more (during the implementation phase). They are still in the planning stages.  My contact told me that "You guys exceeded our expectations with your knowledge of the technology (JMS, Struts, J2EE, etc.) and our domain." It was a good feeling moment.  Now I am sitting in an air port on my way to another client site. Business is good and busy. At this next client, I am accessing creating a build system (with custom plugins) in Hibernate. Seems like a fun project.&lt;br /&gt;&lt;br /&gt;I am going to a place that has 0 degree weather. Brrrrrrrrrrrrrrr...... &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107343948023206732?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107343948023206732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107343948023206732'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107343948023206732' title='Good couple of days.... I like JBoss.... MyEclispe ROCKS!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107328298341061884</id><published>2004-01-04T22:09:00.000-08:00</published><updated>2004-01-04T23:58:43.780-08:00</updated><title type='text'>Java buzzwords :-)</title><content type='html'>List of Free Java Books!&lt;br /&gt;&lt;a href="http://www.jroller.com/page/Trainer/20031231#list_of_free_java_books"&gt;Java buzzwords :-)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107328298341061884?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.jroller.com/page/Trainer/20031231#list_of_free_java_books' title='Java buzzwords :-)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107328298341061884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107328298341061884'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107328298341061884' title='Java buzzwords :-)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107328093956821886</id><published>2004-01-04T21:35:00.000-08:00</published><updated>2004-01-04T21:36:50.030-08:00</updated><title type='text'>Feedreader | new.media.tool</title><content type='html'>I wanted a blog aggregator and Erik suggested &lt;a href="http://www.feedreader.com/"&gt;Feedreader | new.media.tool&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So far I added Erik's blog and The ServerSide.com....&lt;br /&gt;&lt;br /&gt;Pretty cool.... Reading blogs is now like reading email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107328093956821886?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.feedreader.com/' title='Feedreader | new.media.tool'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107328093956821886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107328093956821886'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107328093956821886' title='Feedreader | new.media.tool'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107327733830307572</id><published>2004-01-04T20:35:00.000-08:00</published><updated>2004-01-04T20:38:52.780-08:00</updated><title type='text'>J2EE BluePrints: The Web Tier</title><content type='html'>I find that many people usnig Struts fail to grasp concepts in the blue print:&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/web_tier/index.html"&gt;J2EE BluePrints: The Web Tier&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before one can grasp Struts, you have to grasp Model 2 and MVC. A good source for this is right from the source:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/client_tier/multiple_types/index.html"&gt;MVC - Model 2&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107327733830307572?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/blueprints/guidelines/designing_enterprise_applications/web_tier/index.html' title='J2EE BluePrints: The Web Tier'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327733830307572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327733830307572'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107327733830307572' title='J2EE BluePrints: The Web Tier'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107327193440755803</id><published>2004-01-04T19:05:00.000-08:00</published><updated>2004-01-04T19:06:45.170-08:00</updated><title type='text'>JSF and Struts</title><content type='html'>&lt;a href="http://nagoya.apache.org/wiki/apachewiki.cgi?StrutsMoreAboutJSF"&gt;Apache Wiki: StrutsMoreAboutJSF&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;A great quote from Craig:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"An additional lesson, though, is for the Struts developers ourselves. We were one of the pioneers in the webapp framework space, and have arguably been the most successful. But we were not alone. Indeed, my spreadsheet of various implementations of UI component and web app framework architectures (just the ones in Java) has roughtly fifty entries in it. That's way too many for tools to support; it's way too many for potential users to evaluate; it's way too confusing to the market; and it's way too weak for Java as a whole &lt;br /&gt;in the face of a determined competitor who feels threatened by the success of Java technologies at every turn. "&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107327193440755803?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://nagoya.apache.org/wiki/apachewiki.cgi?StrutsMoreAboutJSF' title='JSF and Struts'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327193440755803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327193440755803'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107327193440755803' title='JSF and Struts'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107327177217508663</id><published>2004-01-04T19:02:00.000-08:00</published><updated>2004-01-04T19:04:02.966-08:00</updated><title type='text'>About Struts and JavaServer Faces [forward-looking]</title><content type='html'>&lt;a href="http://jakarta.apache.org/struts/proposals/struts-faces.html"&gt;About Struts and JavaServer Faces [forward-looking]&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"&lt;br /&gt;While things can always change in the future, many JSR-127 expert group members consider high quality integration with Struts to be an important success factor for JavaServer Faces to be accepted. Therefore, I do not expect that JSF will evolve in ways that make this kind of integration difficult or impossible. &lt;br /&gt;&lt;br /&gt;"&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107327177217508663?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jakarta.apache.org/struts/proposals/struts-faces.html' title='About Struts and JavaServer Faces [forward-looking]'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327177217508663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107327177217508663'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107327177217508663' title='About Struts and JavaServer Faces [forward-looking]'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107325854565951206</id><published>2004-01-04T15:22:00.000-08:00</published><updated>2004-01-04T15:23:36.123-08:00</updated><title type='text'>Regular Expressions</title><content type='html'>Here is a good reference for using the regular expression library that ships with Java: &lt;a href="http://java.sun.com/docs/books/tutorial/extra/regex/"&gt;Regular Expressions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107325854565951206?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/docs/books/tutorial/extra/regex/' title='Regular Expressions'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107325854565951206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107325854565951206'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107325854565951206' title='Regular Expressions'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107325292397548138</id><published>2004-01-04T13:48:00.000-08:00</published><updated>2004-01-04T13:49:54.093-08:00</updated><title type='text'>Steve Ramsay's Guide to Regular Expressions</title><content type='html'>&lt;a href="http://etext.lib.virginia.edu/helpsheets/regex.html"&gt;Steve Ramsay's Guide to Regular Expressions&lt;/a&gt; is a good reference for regular expression when you need to review.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107325292397548138?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://etext.lib.virginia.edu/helpsheets/regex.html' title='Steve Ramsay&apos;s Guide to Regular Expressions'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107325292397548138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107325292397548138'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107325292397548138' title='Steve Ramsay&apos;s Guide to Regular Expressions'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107324090984279490</id><published>2004-01-04T10:28:00.000-08:00</published><updated>2004-01-04T10:31:12.373-08:00</updated><title type='text'>rick hightower dot com - 2003: Rick's Resume</title><content type='html'>I had to update my resume. A company just found me through my resume (&lt;a href="http://www.rickhightower.com/rick_m_hightower/Resumes/RicksResume5.htm"&gt;rick hightower dot com - 2003: Rick's Resume&lt;/a&gt;). They found that I worked at &lt;a href="http://www.arc-mind.com"&gt; ArcMind &lt;/a&gt; by looking at my resume and web site, which is funny since my resume did not mention ArcMind--now it does. ArcMind got a new contract out of the deal.&lt;br /&gt;&lt;br /&gt;I was just reading in InformationWeek that job oppenings for software developers has gone up 40% in the last few months (mostly in Silicon valley and Washington DC). It seems that the homeland security department has a lot of IT projects going on according to the article.  Business has been good for us.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107324090984279490?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.rickhightower.com/rick_m_hightower/Resumes/RicksResume5.htm' title='rick hightower dot com - 2003: Rick&apos;s Resume'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107324090984279490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107324090984279490'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2004_01_01_archive.html#107324090984279490' title='rick hightower dot com - 2003: Rick&apos;s Resume'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107281531139333885</id><published>2003-12-30T12:15:00.000-08:00</published><updated>2003-12-30T12:16:16.873-08:00</updated><title type='text'>warneronstine.com | home</title><content type='html'>&lt;a href="http://www.warneronstine.com/"&gt;warneronstine.com | home&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I get a lot of ideas and inspiration from talking to Warner. &lt;br /&gt;Warner lives in Tucson and is the guy who originally turned me onto PicoContainer and Maven.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107281531139333885?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.warneronstine.com/' title='warneronstine.com | home'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107281531139333885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107281531139333885'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107281531139333885' title='warneronstine.com | home'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107264762199842575</id><published>2003-12-28T13:40:00.000-08:00</published><updated>2003-12-28T13:41:41.500-08:00</updated><title type='text'>DynaActionForms</title><content type='html'>An anomyous friend emails me:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;one strong point i have against DAF - &lt;strutsvalidationxml&gt; in XDoclet  - try doing validation any easier than that!!!!  (can't do it with DAF,  that is for sure). &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I have used XDoclet's Struts Validator framework support. (BTW That part was written by Erik Hatcher a former co-worker who is still a good friend of mine.) I think XDoclet's Struts Validator framework puts the final nail in the coffin of DAF IMHO. &lt;br /&gt;&lt;br /&gt;Like I said before... I can work with them but I don't like them. (not on a tree; not with a bee; not on a bus; not with gus)&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107264762199842575?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107264762199842575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107264762199842575'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107264762199842575' title='DynaActionForms'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107257144742895567</id><published>2003-12-27T16:30:00.000-08:00</published><updated>2003-12-27T16:31:49.843-08:00</updated><title type='text'>Not a fan of DynaActionForms</title><content type='html'>DynaActionForms:&lt;br /&gt;&lt;br /&gt;DynaActionForms are universally loved and hated. In teaching, consulting Struts and developing with Struts, I have found that DynaActionForms are either embraced or rejected. The idea behind DynaActionForms is that instead of creating an ActionForm per form, you instead configure an ActionForm per form.&lt;br /&gt;&lt;br /&gt;Advantages:&lt;br /&gt;Some folks feel creating an ActionForm class for each HTML form in your Struts application is time-consuming, causes maintenance problems, and is frustrating. With DynaActionForm classes you don’t have to create an ActionForm subclass for each form and a bean property for each field. Instead you configure an DynaActionForm its properties, type, and defaults in the Struts configuration file. &lt;br /&gt;&lt;br /&gt;Deltas :&lt;br /&gt;You still have to create the DynaActionForm in the struts configuration file. When you use the DynaActionForm, you have to cast all the properties to their known type. Using a DynaActionForm is a lot like using a HashMap. In your Action if you are accessing a DynaActionForm, if you screw up a property name (misspell it) the compiler will not pick it up, instead you will get a runtime exception. If you cast an Integer to a Float by mistake the compiler will not pick it up, you will get a runtime exception. DynaActionForms are not type safe. If you use an IDE, code completion does not work with DynaActionForms. If you override the reset method, you defeat the purpose of having a DynaActionForm. Another point is that DynaActionForms are not very dynamic, as you still have to change the configuration file, and then restart the web application to get Struts to recognize an additional field. &lt;br /&gt;&lt;br /&gt;TIP: As you can probably tell, I think using DyanActionForms is less than ideal. I feel DynaActionForms are not really dynamic at all since you have to restart the web application when you change them. I find them no more dynamic than using Java classes. I prefer to create my ActionForms by subclassing ActionForm and using bean properties. I find that modern IDEs make short work of adding JavaBean properties. I see no real advantage to using DynaActionForms over ActionForms. If I want to make an ActionForm dynamic, I add a mapped backed property. I have worked on projects that forced DynaActionForms. I much prefer regular ActionForms.&lt;br /&gt;&lt;br /&gt;I can use DynaActionForms. But, I could also code with one hand tied behind my back. In both cases, I don't see why.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107257144742895567?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107257144742895567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107257144742895567'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107257144742895567' title='Not a fan of DynaActionForms'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107256796635958950</id><published>2003-12-27T15:32:00.000-08:00</published><updated>2003-12-27T15:33:48.700-08:00</updated><title type='text'>AppFuse</title><content type='html'>This sounds like something I might use on my next Struts project:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;What is AppFuse?&lt;br /&gt;An application for starting your web applications. Checkout from CVS and execute "ant -Dapp.name=yourApp -Ddb.name=database" to instantly be up and running with a Tomcat/MySQL app. Uses Ant, XDoclet, Hibernate, JUnit, Cactus, StrutsTestCase, Canoo's WebTest, Struts Menu, Display Tag Library, JSTL and Struts (including Validator and Tiles). Features include CMA, Remember Me, Self Registration, Password Hint. The fuse to start your apps.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107256796635958950?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuse' title='AppFuse'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256796635958950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256796635958950'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107256796635958950' title='AppFuse'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107256716774462962</id><published>2003-12-27T15:19:00.000-08:00</published><updated>2003-12-27T15:20:30.263-08:00</updated><title type='text'>Struts IOC</title><content type='html'>&lt;a href="http://struts.sourceforge.net/"&gt;struts.sf.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pretty cool Struts site. They have a plugin that integrates Struts with Spring.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;The goals of the Struts Applications Project are: &lt;br /&gt;&lt;br /&gt;to provide example Struts applications, &lt;br /&gt;to host Struts extensions and utilities, and &lt;br /&gt;to put the code out where the Community can use it, fix it, and maintain it &lt;br /&gt;The Struts Applications Project currently consists of the following sub- projects: &lt;br /&gt;&lt;br /&gt;AppFuse - A baseline Struts application to be used for future web applications &lt;br /&gt;Polls - A survey-management Struts application &lt;br /&gt;Struts Action Invocation Framework (SAIF) - Adds features like Action interceptors and Inversion of Control (IoC) to Struts. &lt;br /&gt;Struts BSF - A Struts Action implementation that uses BSF-compatible scripting languages. &lt;br /&gt;Struts Cocoon - Integrates Struts and Cocoon, using Cocoon for the presentation layer &lt;br /&gt;Struts Resume - An application written using AppFuse as a foundation. &lt;br /&gt;Struts Spring - Integrates Struts and the Spring Inversion of Control (IoC) framework. &lt;br /&gt;StrutsDoc - A JavaDoc-type documentation tool for Struts and Struts-related configuration files &lt;br /&gt;AppFuse &lt;br /&gt;An application for starting your Struts-based applications. Checkout from CVS and execute "ant -Dapp.name=yourApp -Ddb.name=database" to instantly be up and running with a Tomcat/MySQL app. Uses Ant, XDoclet, Hibernate, JUnit, Cactus, StrutsTestCase, Canoo's WebTest, Struts Menu, Display Tag Library, JSTL and Struts (including Validator and Tiles). Features include CMA, Remember Me, Self Registration, Password Hint. The fuse to start your apps. &lt;br /&gt;&lt;br /&gt;Polls &lt;br /&gt;A simple survey application. Deploy the .war file on your servlet container to see it running. Read the instructions provided to see all the options available. Uses Hibernate, Struts, and JSTL. &lt;br /&gt;&lt;br /&gt;Struts Action Invoocation Framework (SAIF) &lt;br /&gt;A set of Struts extensions to improve how Struts handles Actions adding features like Action interceptors and Inversion of Control (IoC). &lt;br /&gt;&lt;br /&gt;Struts BSF &lt;br /&gt;This project allows Struts Actions to be written in the scripting language of one's choice rather than as Java classes. It uses the Beans Scripting Framework to allow scripts to be written in any language BSF supports like Perl, Python, Ruby, JavaScript, and BeanShell. &lt;br /&gt;&lt;br /&gt;Struts Cocoon &lt;br /&gt;This is a Struts 1.1 plugin that integrates Cocoon into the Struts framework. Struts forwards are passed to Cocoon to be rendered in Cocoon XML pipelines. Struts is a familiar and proven application framework and Cocoon is a very powerful and flexibile XML presentation technology. The project includes both the plugin and a slightly modified Struts example web application to show how easily Cocoon can be added to an existing Struts application. &lt;br /&gt;&lt;br /&gt;Struts Resume &lt;br /&gt;An application written using AppFuse as a foundation. Future plans include the ability to create an online resume and render it's contents with XSL/XML or Velocity. &lt;br /&gt;&lt;br /&gt;Struts Spring &lt;br /&gt;This project integrates the Spring Framework's Inversion of Control (IoC) into Struts 1.1+. It allows a Struts application to take advantage of IoC with little or no references to Spring. Now, instead of relying on singletons and static factories, Struts actions can have their dependencies automatically resolved. &lt;br /&gt;&lt;br /&gt;StrutsDoc &lt;br /&gt;A JavaDoc-type documentation tool for Struts and Struts-related configuration files. Extensive use of Xalan to transform Struts-related configuration files into text-based documentation. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107256716774462962?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://struts.sourceforge.net/' title='Struts IOC'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256716774462962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256716774462962'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107256716774462962' title='Struts IOC'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107256516520649652</id><published>2003-12-27T14:46:00.000-08:00</published><updated>2003-12-27T14:48:37.966-08:00</updated><title type='text'>funny email I got from a good (anoymous friend)</title><content type='html'>My friend writes...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"""&lt;br /&gt;i saw you mentioned Tapestry on your blog - have you tried it?  careful if you do, you might be embarrassed to be doing so much with Struts when you give it a try :)  we are going full-on with Tapestry at BLANK and loving it! &lt;br /&gt;&lt;br /&gt;JSF sucks.  money schmoney - i'd rather work at McDonald's than use JSF. &lt;br /&gt;&lt;br /&gt;p.s. your blog still looks lousy in Safari - you should try it out on a Mac in Safari sometime and see what i mean. &lt;br /&gt;"""&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;BTW What is this thing you call Mac? I just bought a new laptop. I considered a Mac. But I bought a really nice 17inch HP laptop for half the price, and it is fast as a bat out of jail. And, the great thing is that all the software I use already works on my HP. I wanted to go with the Mac, but could not. There is this software package I must use that does not run on a Mac yet. (Emulation mode stinks)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107256516520649652?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256516520649652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107256516520649652'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107256516520649652' title='funny email I got from a good (anoymous friend)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107228349627718992</id><published>2003-12-24T08:31:00.000-08:00</published><updated>2003-12-24T08:32:35.530-08:00</updated><title type='text'>Hope Springs Eternal</title><content type='html'>&lt;a href="http://www.springframework.org/"&gt;Spring - j2ee Application Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here is the Spring framework. My pick of the week for interesting things you should look into.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107228349627718992?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.springframework.org/' title='Hope Springs Eternal'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107228349627718992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107228349627718992'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107228349627718992' title='Hope Springs Eternal'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107228329067166418</id><published>2003-12-24T08:28:00.000-08:00</published><updated>2003-12-24T08:29:09.950-08:00</updated><title type='text'>Lions, Tigers, and Bears got nothing on HiveMind, PicoContainer, XWork, Avalon and Spring</title><content type='html'>Thomas Dyer &lt;tom.dyer@comcast.net&gt; &lt;br /&gt;Sent :  Wednesday, December 24, 2003 3:09 AM &lt;br /&gt;To :  "'Richard Hightower'" &lt;rick_m_hightower@hotmail.com&gt; &lt;br /&gt;Subject :  RE: Interesting stuff we talked about. &lt;br /&gt;  &lt;br /&gt;  |  | Inbox  &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Tom Dyer write:&lt;br /&gt;&lt;quote&gt; &lt;br /&gt;Rick,&lt;br /&gt;&lt;br /&gt;Noticed you've looked at Pico Container. Check out the Spring Framework,&lt;br /&gt;cool stuff. Here's a TSS article.&lt;br /&gt;&lt;br /&gt;http://www.theserverside.com/resources/article.jsp?l=SpringFramework&lt;br /&gt;&lt;br /&gt;Tom,&lt;br /&gt;&lt;/quote&gt;&lt;br /&gt;&lt;br /&gt;Tom is right. Spring is cool. It is not longer of matter of whether I will use an IOC container on my next project. It is a matter of which one.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107228329067166418?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.theserverside.com/resources/article.jsp?l=SpringFramework' title='Lions, Tigers, and Bears got nothing on HiveMind, PicoContainer, XWork, Avalon and Spring'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107228329067166418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107228329067166418'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107228329067166418' title='Lions, Tigers, and Bears got nothing on HiveMind, PicoContainer, XWork, Avalon and Spring'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107222223563736572</id><published>2003-12-23T15:30:00.000-08:00</published><updated>2003-12-23T15:31:34.090-08:00</updated><title type='text'>What I have been up to</title><content type='html'>I am busy writing as of yet. I just wrote about applying TDD to Struts development with JUnit to test the model (MODEL), StrutsTestCase to test the struts Actions (CONTROLLER) and jWebUnit to test the JSPs (VIEW) and a Quick Start Tutorial to Struts.&lt;br /&gt;&lt;br /&gt;I am really getting into the PicoContainer, Hibernate, Maven, Tapestry and XWork/WebWork. I think JSF will be the next thing that makes money. I wish there were more hours in the day.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107222223563736572?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.rickhightower.com' title='What I have been up to'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107222223563736572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107222223563736572'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107222223563736572' title='What I have been up to'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107219289487904047</id><published>2003-12-23T07:21:00.000-08:00</published><updated>2003-12-23T07:22:33.123-08:00</updated><title type='text'>Testing JSPs with jWebUnit</title><content type='html'>jWebUnit  is another testing framework built on top of JUnit. It also uses HttpUnit, which is a framework for parsing HTML easily. &lt;br /&gt;&lt;br /&gt;jWebUnit makes testing JSP easy by providing a high-level API for navigating web applications. Like StrutsTestCase, jWebUnit provides methods to verify and assert valid conditions. JWebUnit assertion methods relate to navigation and the HTML DOM for example, form entry and submission, validation of table contents, and many common scenarios. &lt;br /&gt;&lt;br /&gt;TIP: The book Java Tools for Extreme Programming by Richard Hightower et al covered using JUnit and HttpUnit together to tests Servlets, JSP, Custom Tags and Filters. The chapter on HttpUnit is good background information for understanding jWebUnit. Using jWebUnit is much easier than using JUnit and HttpUnit together.&lt;br /&gt;&lt;br /&gt;You can find jWebUnit at http://jwebunit.sourceforge.net/. You can download jWebUnit from http://sourceforge.net/project/showfiles.php?group_id=61302. Download the file jWebUnit-1.1.1.zip. Extract the file and put the jwebunit.jar on the classpath of your IDE project. &lt;br /&gt;&lt;br /&gt;The jWebUnit framework depends on the HttpUnit framework so you will need to download HttpUnit. The HttpUnit web site can be found at http://httpunit.sourceforge.net/.&lt;br /&gt;To download HttpUnit go to http://prdownloads.sourceforge.net/httpunit/httpunit-1.5.4.zip?download. Extract the zip file and put the following jar files on your projects classpath js.jar, junit.jar, nekohtml.jar, Tidy.jar, xercesImpl.jar, xmlParserAPIs.jar (found under jars) and of course httpunit.jar (found under lib).&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107219289487904047?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jwebunit.sourceforge.net/' title='Testing JSPs with jWebUnit'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107219289487904047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107219289487904047'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107219289487904047' title='Testing JSPs with jWebUnit'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107219277780805655</id><published>2003-12-23T07:19:00.000-08:00</published><updated>2003-12-23T07:20:36.076-08:00</updated><title type='text'>Testing Struts Actions with StrutsTestCase</title><content type='html'>StrutsTestCase is a JUnit extension that allows you to test code that relies on the Struts framework. StrutsTestCase works in two modes: in container test, simulated container test. You can run StrutsTestCase test inside of a running J2EE container. This support is provided by StrutsTestCaseâ€™s integration with Cactus. Cactus is a framework for in container unit testing. Cactus extends JUnit as well. StrutsTestCase also allows you to use a simulated container test via its Mock Object approach. You can find more information about Struts test case at http://strutstestcase.sourceforge.net/. You can find more information about Cactus at http://jakarta.apache.org/cactus/.&lt;br /&gt;&lt;br /&gt;Using either mode, StrutsTestCase uses the Struts ActionServlet controller to test your Action objects, mappings, form beans and forward declaration. StrutsTestCase provides special assertion methods to assert for example that an action returned a certain forward.&lt;br /&gt;&lt;br /&gt;You typically combine StrutsTestCase with Cactus when you have code that depends on J2EE container resources. For example, you have an Action object that depends on local EJB Entity bean. Suffice to say, it is a good idea whenever possible not to rely too heavily on container resources as your code gets tightly coupled with the J2EE environment and harder to test. The problem, with Cactus based StrutsTestCase tests, is that Cactus is hard to setup (but you only have to do it once), and the tests take longer to run than the Mock Object equivalent test.&lt;br /&gt;&lt;br /&gt;On the flip side, container simulationâ€”Mock Object based tests require that your action code is not tightly coupled with the underlying J2EE container. This requires a cleaner design and cleaner delineation between your model and the container. Typically, you can get a fairly clean design by using an Abstract Factory from you actions. Thus your actions never directly deal with J2EE, they talk to the Abstract Factory to get model objects. The Abstract Factory may in turn talk to the J2EE services like JNDI to look up and interact with EJBs, etc. Then for testing you create an Abstract Factory that delivers Mock Objects for testing. This is the approach I use. The advantage of using container simulation is you donâ€™t have to deploy your code to the container to test it. In short, the reason to use container simulation is speed. Tests that take a long time to run donâ€™t get run as often. TDD favors fast running tests. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Test Driven Development (TDD) is all the rage. Unlike most development fads this one has staying power. TDD gets its birth from the Agile Development community (http://www.agilealliance.com) and Extreme Programming (XP). Although originally espoused by XP, the main stream uses TDD, which requires fast running, automated tests. The purpose of TDD is to draw out what functionality is really needed, rather than what the programmer thinks is needed. Developing software in a J2EE environment can be fairly tough with its somewhat complex deployment requirements and dependencies on the J2EE container. Layer on top of that the Struts framework and its complexities, and fast automated testing becomes essential. Why essential you ask? It is essential because of speed! By the time, you can deploy, and smoke test a feature or bug fix, using TDD you could do it 4 times. &lt;br /&gt;&lt;br /&gt;StrutsTestCase makes TDD possible with Struts.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107219277780805655?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://strutstestcase.sourceforge.net/' title='Testing Struts Actions with StrutsTestCase'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107219277780805655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107219277780805655'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107219277780805655' title='Testing Struts Actions with StrutsTestCase'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107208784473583225</id><published>2003-12-22T02:10:00.000-08:00</published><updated>2003-12-22T02:11:41.983-08:00</updated><title type='text'>Struts Training</title><content type='html'>Last week I was doing Struts training in Boston followed up by some architectural analysis of their current project. I ran into a real smart group. They need to incorporate agile development like TDD and pair programming. There were a lot of good ideas lurking in their framework. I added a few tricks to my bag of Tricks.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107208784473583225?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.arc-mind.com/courses.htm' title='Struts Training'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107208784473583225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107208784473583225'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107208784473583225' title='Struts Training'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107206932217504399</id><published>2003-12-21T21:02:00.000-08:00</published><updated>2003-12-21T21:02:59.293-08:00</updated><title type='text'>jWebUnit</title><content type='html'>&lt;a href="http://jwebunit.sourceforge.net/"&gt;jWebUnit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you know who I am, then you know I have used HttpUnit a lot in the past. I saw jWebUnit mentioned in "Java Open Source Programming", which covers XDoclet, WebWork and Hibernate (I highely reccommend getting this book).&lt;br /&gt;&lt;br /&gt;I looked into jWebUnit. Pretty cool stuff. Please check it out. Just look at the first page. Very cool stuff.&lt;br /&gt;&lt;br /&gt;I am going to start using jWebUnit where I used to use JUnit and HttpUnit together. jWebUnit builds on top of HttpUnit and JUnit.&lt;br /&gt;&lt;br /&gt;This is taken from their site:&lt;br /&gt;Compare this code sample....&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package net.sourceforge.jwebunit.sample;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;import com.meterware.httpunit.WebResponse;&lt;br /&gt;import com.meterware.httpunit.WebConversation;&lt;br /&gt;import com.meterware.httpunit.WebForm;&lt;br /&gt;import com.meterware.httpunit.WebRequest;&lt;br /&gt;&lt;br /&gt;public class SearchExample extends TestCase {&lt;br /&gt;&lt;br /&gt;   public void testSearch() throws Exception {&lt;br /&gt;      WebConversation wc = new WebConversation();&lt;br /&gt;      WebResponse resp = wc.getResponse( "http://www.google.com");&lt;br /&gt;      WebForm form = resp.getForms()[0];&lt;br /&gt;      form.setParameter("q", "HttpUnit");&lt;br /&gt;      WebRequest req = form.getRequest("btnG");&lt;br /&gt;      resp = wc.getResponse(req);&lt;br /&gt;      assertNotNull(resp.getLinkWith("HttpUnit"));&lt;br /&gt;      resp = resp.getLinkWith("HttpUnit").click();&lt;br /&gt;      assertEquals(resp.getTitle(), "HttpUnit");&lt;br /&gt;      assertNotNull(resp.getLinkWith("User's Manual"));&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To this...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;package net.sourceforge.jwebunit.sample;&lt;br /&gt;&lt;br /&gt;import net.sourceforge.jwebunit.WebTestCase;&lt;br /&gt;&lt;br /&gt;public class JWebUnitSearchExample extends WebTestCase {&lt;br /&gt;&lt;br /&gt;   public JWebUnitSearchExample(String name) {&lt;br /&gt;      super(name);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setUp() {&lt;br /&gt;      getTestContext().setBaseUrl("http://www.google.com");&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void testSearch() {&lt;br /&gt;      beginAt("/");&lt;br /&gt;      setFormElement("q", "httpunit");&lt;br /&gt;      submit("btnG");&lt;br /&gt;      clickLinkWithText("HttpUnit");&lt;br /&gt;      assertTitleEquals("HttpUnit");&lt;br /&gt;      assertLinkPresentWithText("User's Manual");&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107206932217504399?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jwebunit.sourceforge.net/' title='jWebUnit'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206932217504399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206932217504399'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107206932217504399' title='jWebUnit'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107206875942716547</id><published>2003-12-21T20:52:00.000-08:00</published><updated>2003-12-21T20:53:36.623-08:00</updated><title type='text'>PicoContainer -</title><content type='html'>&lt;a href="http://www.picocontainer.org/"&gt;PicoContainer -&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I read through the docs on this site. I really dig this type 3 Inversion of Control Container.&lt;br /&gt;&lt;br /&gt;If you get a few minutes, check the site out. It only takes a few minutes to get what they are trying to do, and it makes so much sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107206875942716547?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.picocontainer.org/' title='PicoContainer -'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206875942716547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206875942716547'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107206875942716547' title='PicoContainer -'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107206525542750578</id><published>2003-12-21T19:54:00.000-08:00</published><updated>2003-12-21T19:55:11.763-08:00</updated><title type='text'>Starbucks in Tucson</title><content type='html'>Most places I go, people think that Tucson is really backwards. The only Tucson they see is in the old westerns.  Here is proof that we are not as wardsback as people think. BTW I can't fire a gun or ride a horse at least not very well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107206525542750578?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.starbuckseverywhere.net/Tucson.htm' title='Starbucks in Tucson'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206525542750578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206525542750578'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107206525542750578' title='Starbucks in Tucson'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107206460817301931</id><published>2003-12-21T19:43:00.000-08:00</published><updated>2003-12-21T19:52:56.246-08:00</updated><title type='text'>Erik Hatcher at java.net</title><content type='html'>&lt;a href="http://today.java.net/pub/au/15"&gt;Erik Hatcher&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What a terrible friend I am.... I just read Erik's stuff on java.net... it has been there for six months. It was fun haning out with Erik at JavaOne.&lt;br /&gt;&lt;br /&gt;Cool stuff. Erik Rocks! I agree about the scripting languages. Why make JSR-223 Web centric? (I acutally care about scripting. I wrote a book on Jython and several articles on Jython, NetRexx, Bean Scripting Framework, etc. I hope scripting goes more main stream.)&lt;br /&gt;&lt;br /&gt;I am happy to see JSP support other languages. Although with JSTL, I think it is a lot less of an issue than it was before. I guess this is mostlly to win over the PHP crowd.&lt;br /&gt;&lt;br /&gt;Nutch sounds cool (see above link for more detail).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107206460817301931?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://today.java.net/pub/au/15' title='Erik Hatcher at java.net'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206460817301931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107206460817301931'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107206460817301931' title='Erik Hatcher at java.net'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107202302529124306</id><published>2003-12-21T08:10:00.000-08:00</published><updated>2003-12-21T08:11:21.763-08:00</updated><title type='text'>Rick's Resume</title><content type='html'>&lt;a href="http://www.rickhightower.com/rick_m_hightower/Resumes/RicksResume5.htm"&gt;Rick's Resume&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My resume use to show up second when you searched for "Rick Resume" in google.&lt;br /&gt;Now it has dropped down to third. (I don't know why it was second.)&lt;br /&gt;&lt;br /&gt;Anyway, my resume is a bit dated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107202302529124306?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.rickhightower.com/rick_m_hightower/Resumes/RicksResume5.htm' title='Rick&apos;s Resume'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107202302529124306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107202302529124306'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107202302529124306' title='Rick&apos;s Resume'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107195907511205370</id><published>2003-12-20T14:24:00.000-08:00</published><updated>2003-12-20T14:25:30.653-08:00</updated><title type='text'>Good article in this month's edition of Dr. Dobbs; porting Jakarta Lucene to J#</title><content type='html'>When I first saw J#, I just thought it was a dumb idea. My opinion, at the time, was why not just learn C# instead as it is close to Java. anyway. Then I read this article by Dr. Dobb about porting Jakarta Lucene to J#, and now I understand. In the article the author ports Lucene to J# and then calls into Lucene using C#. Pretty cool.  The author had to use the GNU classpath project to make the Vector more like the current version. Weridly enough J# seems to be stuck in time at about JDK 1.1.5. If I was doing a new project in .Net, I would still use C# instead of J#, but I suppose if I had to port code to work in both environments, I would probably use J# like the article did. I can't wait till JDK 1.5, but it makes this type of porting moot (or it will in time).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107195907511205370?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107195907511205370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107195907511205370'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107195907511205370' title='Good article in this month&apos;s edition of Dr. Dobbs; porting Jakarta Lucene to J#'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107163113924637658</id><published>2003-12-16T19:18:00.000-08:00</published><updated>2003-12-16T19:19:51.153-08:00</updated><title type='text'>Master the Tiles Framework with this tutorial....</title><content type='html'>The Tiles framework makes creating reusable pages and visual components easier. Developers can build Web applications by assembling reusable tiles. You can use tiles as templates or as visual components. &lt;br /&gt;&lt;br /&gt;In some respects, the tile layout is like a display function. First you pass tile layout parameters to use. The parameters can be simple strings, beans, or tiles. The parameters become attributes to the tile and get stored in the tile's tile scope. For its part, the tile scope resembles page scope, and is less general than request scope. The tile scope lets the tile's user pass arguments (called attributes) to the tile. &lt;br /&gt;&lt;br /&gt;Definitions let you define default parameters for tiles. Definitions can be defined in JSP or XML. Definitions can extend other definitions similarly to how a class can extend another class. Moreover, definitions can override parts of the definition it is extending. &lt;br /&gt;&lt;br /&gt;The Tiles framework includes its own RequestProcessor to handle tile layouts as ActionForwards. Thus you can forward to a tile definition instead of a JSP if you install the Tiles plug-in. &lt;br /&gt;&lt;br /&gt;If you are using Struts but not Tiles, then you are not fully benefiting from Struts and likely repeat yourself unnecessarily. The Tiles framework makes creating reusable site layouts and visual components feasible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In this tutorial you will cover the following: &lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;The Tiles framework and architecture &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to build and use a tile layout as a site template &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to use tile definitions both in XML and JSP &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to move objects in and out of tile scope &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to work with attributes lists &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to nest tiles &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to build and use tile layouts as small visual components &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to subclass a definition &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to create a controller for a tile &lt;/li&gt;&lt;br /&gt;&lt;li&gt;How to use a tile as an ActionForward &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107163113924637658?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.arc-mind.com/downloads.htm#TilesTutorial' title='Master the Tiles Framework with this tutorial....'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107163113924637658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107163113924637658'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107163113924637658' title='Master the Tiles Framework with this tutorial....'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107162986414769588</id><published>2003-12-16T18:57:00.000-08:00</published><updated>2003-12-18T17:00:16.436-08:00</updated><title type='text'>Good book... get it quick.... covers XDoclet, Hibernate, XWork, WebWork, Ognl, Jakarta Commons, SiteMesh and IOC, etc.</title><content type='html'>I just found this great book. Actually, I was told about this book at the Server Side Symposium in Boston. Funny that I am in Boston this week, when I finally bought a copy. (In case you can't tell by the title of tihs blog.... I live in AZ... BTW it is darn cold in Boston this week... nuff said.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've just read a few chapters and skimmed the rest of the book. This book is a classic. Hats off to the authors... Ara Abrahamian, Joe Walnes, Mike Cannon-Brookes, and Pat Lightbody. I can't wait to dig into this book into detail. &lt;br /&gt;&lt;br /&gt;So far, all I can say is WOW! Good Stuff. Sucky title.... great book.&lt;br /&gt;&lt;br /&gt;The book is called Java Open Source Programming by Wiley Press.&lt;br /&gt;&lt;br /&gt;I am more of a Struts, Hibernate, XDoclet, Tiles, and JSTL EL person myself but it is good to learn more about WebWork, OGNL, etc.&lt;br /&gt;&lt;br /&gt;Here is an update.... I have been digging in even deeper. I really love this book. I really the ideas behind XWork.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107162986414769588?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107162986414769588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107162986414769588'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107162986414769588' title='Good book... get it quick.... covers XDoclet, Hibernate, XWork, WebWork, Ognl, Jakarta Commons, SiteMesh and IOC, etc.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107067972650926384</id><published>2003-12-05T19:02:00.000-08:00</published><updated>2003-12-05T19:09:51.246-08:00</updated><title type='text'>ArcMind, Inc.</title><content type='html'>Online Tutorials covering EJB, Web Services, WebShpere, Apache Axis, and more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107067972650926384?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.arc-mind.com/downloads.htm' title='ArcMind, Inc.'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107067972650926384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107067972650926384'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107067972650926384' title='ArcMind, Inc.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107039400722211495</id><published>2003-12-02T11:40:00.000-08:00</published><updated>2003-12-02T11:40:44.780-08:00</updated><title type='text'>Accessing a Database from Struts using Struts Datasources</title><content type='html'>&lt;a href="http://jakarta.apache.org/struts/faqs/database.html"&gt;Accessing a Database from Struts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h1&gt;Datasource, DBCP documentation woes, suggested documentation fix &lt;/h1&gt;&lt;br /&gt;You need booth commons-pooling and commons-dbcp to get Struts Datasources to work, but this is not mentioned in the documentation and the required jar files do not ship with Blank.war. In fact in Struts 1.1., you also need Struts Legacy jar file as well. Of course, if you are using Tomcat then both commons-pooling and commons-dbcp ship in the shared folder but you do need to download them if you are using another application server. You do need to download them only f you are going to use Struts Datasources.&lt;br /&gt;&lt;br /&gt;I think either&lt;br /&gt;&lt;a href="http://jakarta.apache.org/struts/userGuide/configuration.html#data-source_config"&gt;http://jakarta.apache.org/struts/userGuide/configuration.html#data-source_config&lt;/a&gt;&lt;br /&gt;or &lt;br /&gt;&lt;br /&gt;&lt;a href="http://jakarta.apache.org/struts/faqs/database.html"&gt;http://jakarta.apache.org/struts/faqs/database.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;should make note of this.&lt;br /&gt;&lt;br /&gt;Here is a stab at it.&lt;br /&gt;&lt;br /&gt;Struts Datasources require commons-pooling and commons-dbcp. The blank.war does not have commons-pooling or commons-dbcp. If you want to use Struts datasource, you will need to download commons-pooling and commons-dbcp from the following locations:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://jakarta.apache.org/site/binindex.cgi#commons-dbcp"&gt;http://jakarta.apache.org/site/binindex.cgi#commons-dbcp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jakarta.apache.org/site/binindex.cgi#commons-pool"&gt;http://jakarta.apache.org/site/binindex.cgi#commons-pool&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Download the above archives and un-archive them. Then copy the jar files commons-pool-1.1.jar, and commons-dbcp-1.1.jar into the WEB-INF/lib directory of your web application. Note that Tomcat 5 ships with commons-dbcp and commons-pool so you do not need to download and install commons-dbcp and commons-pool if you are using Tomcat.&lt;br /&gt;&lt;br /&gt;In addition to the above two jar files, you will need to use the struts-legacy.jar jar file that ships with Struts 1.1. Copy the struts-legacy.jar file to the WEB-INF/lib directory of your web application.&lt;br /&gt;&lt;br /&gt;This might be a moot point depending on how soon Struts 1.2 comes out, and if commons-pooling and commons-dbcp ship with Struts.&lt;br /&gt;&lt;br /&gt;Rick Hightower&lt;br /&gt;Chief Technology Officer&lt;br /&gt;ArcMind&lt;br /&gt;“Know the Next!”&lt;br /&gt;&lt;a href="http://www.arc-mind.com"&gt;http://www.arc-mind.com&lt;/a&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107039400722211495?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://jakarta.apache.org/struts/faqs/database.html' title='Accessing a Database from Struts using Struts Datasources'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107039400722211495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107039400722211495'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_12_01_archive.html#107039400722211495' title='Accessing a Database from Struts using Struts Datasources'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107005040909769471</id><published>2003-11-28T12:13:00.001-08:00</published><updated>2003-11-28T12:14:02.950-08:00</updated><title type='text'>My first Fan</title><content type='html'>I got an interesting email (Subject Fan) today as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Dear Mr. Hightower,&lt;br /&gt; &lt;br /&gt;I am truly impressed by your technical achievements. I have been looking for (advice on) my career ... &lt;br /&gt;My ambition is to be close to what you have done in your career....&lt;br /&gt; &lt;br /&gt;I already have a head start with an Engineering degree in Electronics, and a Master's Degree in CS. Also, I have about 10 certifications including J2SE 1.4 and SCWCD (with 93%).&lt;br /&gt; &lt;br /&gt;I am eagrly waiting for your response.&lt;br /&gt;&lt;br /&gt;NAME_WITHHELD_TO_PROTECT_THE_INNOCENT&lt;br /&gt;Indiana, USA.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; I doubt I will get email like tihs very often so I suppose I should enjoy it or something.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I admire Martin Fowler, Kent Beck, Robert Orfalli, James Gosling, Drew Davidson, Erik Hatcher, Dan Harkey, Nick Lesiecki, Grady Booch, Peter Coad and many more. I have had the pleasure of meeting and talking to a lot of folks on my list in person, though I doubt any of them remember me. I worked with Erik, Nick and Drew at eBlox so they have to remember me. Everyone I met was extremely nice.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107005040909769471?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005040909769471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005040909769471'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#107005040909769471' title='My first Fan'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107005040749898022</id><published>2003-11-28T12:13:00.000-08:00</published><updated>2003-11-28T12:14:01.356-08:00</updated><title type='text'>My first Fan</title><content type='html'>I got an interesting email (Subject Fan) today as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Dear Mr. Hightower,&lt;br /&gt; &lt;br /&gt;I am truly impressed by your technical achievements. I have been looking for (advice on) my career ... &lt;br /&gt;My ambition is to be close to what you have done in your career....&lt;br /&gt; &lt;br /&gt;I already have a head start with an Engineering degree in Electronics, and a Master's Degree in CS. Also, I have about 10 certifications including J2SE 1.4 and SCWCD (with 93%).&lt;br /&gt; &lt;br /&gt;I am eagrly waiting for your response.&lt;br /&gt;&lt;br /&gt;NAME_WITHHELD_TO_PROTECT_THE_INNOCENT&lt;br /&gt;Indiana, USA.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; I doubt I will get email like tihs very often so I suppose I should enjoy it or something.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I admire Martin Fowler, Kent Beck, Robert Orfalli, James Gosling, Drew Davidson, Erik Hatcher, Dan Harkey, Nick Lesiecki, Grady Booch, Peter Coad and many more. I have had the pleasure of meeting and talking to a lot of folks on my list in person, though I doubt any of them remember me. I worked with Erik, Nick and Drew at eBlox so they have to remember me. Everyone I met was extremely nice.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107005040749898022?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005040749898022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005040749898022'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#107005040749898022' title='My first Fan'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-107005037007024619</id><published>2003-11-28T12:12:00.000-08:00</published><updated>2003-11-28T12:13:23.936-08:00</updated><title type='text'>My first Fan</title><content type='html'>I got an interesting email (Subject Fan) today as follows:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Dear Mr. Hightower,&lt;br /&gt; &lt;br /&gt;I am truly impressed by your technical achievements. I have been looking for (advice on) my career ... &lt;br /&gt;My ambition is to be close to what you have done in your career....&lt;br /&gt; &lt;br /&gt;I already have a head start with an Engineering degree in Electronics, and a Master's Degree in CS. Also, I have about 10 certifications including J2SE 1.4 and SCWCD (with 93%).&lt;br /&gt; &lt;br /&gt;I am eagrly waiting for your response.&lt;br /&gt;&lt;br /&gt;NAME_WITHHELD_TO_PROTECT_THE_INNOCENT&lt;br /&gt;Indiana, USA.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt; I doubt I will get email like tihs very often so I suppose I should enjoy it or something.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I admire Martin Fowler, Kent Beck, Robert Orfalli, James Gosling, Drew Davidson, Erik Hatcher, Dan Harkey, Nick Lesiecki, Grady Booch, Peter Coad and many more. I have had the pleasure of meeting and talking to a lot on folks on my list in person, though I doubt any of them remember me. I worked with Erik, Nick and Drew at eBlox. Everyone I met was extremely nice.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-107005037007024619?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005037007024619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/107005037007024619'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#107005037007024619' title='My first Fan'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106860321877836572</id><published>2003-11-11T18:13:00.000-08:00</published><updated>2003-11-11T18:13:36.286-08:00</updated><title type='text'>Mock Object Testing: A new respect for it</title><content type='html'>I have a new found respect for Mock object testing. I was just on this project that had a fairly laborius deploy process. I found mock object testing helped me write tests that I could run more often. I found myself more productive as I did not have to wait for the server to start up before I started writing tests and code.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106860321877836572?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106860321877836572'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106860321877836572'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106860321877836572' title='Mock Object Testing: A new respect for it'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106860317079843301</id><published>2003-11-11T18:12:00.000-08:00</published><updated>2003-11-11T18:12:48.316-08:00</updated><title type='text'>Cool project, a lot of fun, Tiles, lots of tiles (Struts chicken richness)</title><content type='html'>I worked on this project, recently, that was quite a treat. The application was a web application that was quite rich with functionality. I was charged with writing a menuing system that would only display certain menus depending how the user was logged in. The system integrated and extended the J2EE security model. I wrote a Struts extention (plugin) for the menuing system. The menus were stored in an XML file. I used the Jakarta commons digester to read the  XML file. I dig commons. I used the tiles framework to render the menus. I wrote a tile controller to manage the state of the menu. I wrote a Struts plugin that used the digester to read the menuing system.&lt;br /&gt;&lt;br /&gt;Later I worked on a pagination piece and a embeded Search piece. I used Tiles for both. I dig Tiles and Tile controllers.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106860317079843301?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106860317079843301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106860317079843301'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106860317079843301' title='Cool project, a lot of fun, Tiles, lots of tiles (Struts chicken richness)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106843443966788645</id><published>2003-11-09T19:20:00.000-08:00</published><updated>2003-11-09T19:22:13.570-08:00</updated><title type='text'>Note to self.... write down the user name and password</title><content type='html'>I installed this new server software. I am doing a course port to a new platform. I spent some time installing and configuring this server. I returned to it in a few days, and I cannot remember the blessed username and password. It is okay. I set it to something I would not forget, but I did forget. Grrrrrrrrrrrrr................ &lt;br /&gt;&lt;br /&gt;So now I uninstall and reinstall....  This time I will write it down.&lt;br /&gt;&lt;br /&gt;1/2 hour later. Now that I have uninstalled an reinstalled. I realize that the install never asked me for a username and password. Great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106843443966788645?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106843443966788645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106843443966788645'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106843443966788645' title='Note to self.... write down the user name and password'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106842958379703106</id><published>2003-11-09T17:59:00.000-08:00</published><updated>2003-11-09T17:59:40.960-08:00</updated><title type='text'>New Company...... Arc-Mind.... Know the Next!</title><content type='html'>It is official. I started a new company last week. People (mostly relatives) ask me if it is scarry. Mostly... it has been exciting. I feel a bit giddy. eBlox is designing the look and feel of the site. I decided early on that I wanted a professionals designing the look and feel and logo for the site. Part of growing up is knowing your weaknesses. I know that I have no artistic ability. I did not want the site to look like.... Well, you get the idea. eBlox creates the best looking sites. They have one more awards than most design companies I know. And, they are friends.&lt;br /&gt;&lt;br /&gt;I'd like to announce to anyone who cares that I am available for work. I am pretty well booked for the next few months, but I am sure I can fit some more work in. :o)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106842958379703106?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106842958379703106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106842958379703106'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106842958379703106' title='New Company...... Arc-Mind.... Know the Next!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106827949717532159</id><published>2003-11-08T00:18:00.000-08:00</published><updated>2003-11-11T17:50:50.616-08:00</updated><title type='text'>Fr33D0M</title><content type='html'>As usual Erik beat me to it. &lt;br /&gt;&lt;br /&gt;Erik wrote...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Yup, I resigned my full-time day job position. &lt;br /&gt;But rather than taking a new job, I'm going to continue contracting with them on a half-time basis. And just so you readers don't get the wrong impression, don't go write a book thinking you can quit your day job and rest easy on royalties. I'm taking a huge financial hit as well as a fairly sizeable risk. But risks make it all worthwhile. &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;My last day was last Monday. I gave a one month notice too, and Monday was the last day. I don't have a new job. I did start my own company. I do have a *lot* of contract work. I am working on another book too. And, I am working as a consultant to my last company on a part time basis. How is that for being in sync. with the Hatch!&lt;br /&gt;&lt;br /&gt;I worried for a long time. I have had a lot of success at all the companies I have worked for. And... this has been a slow progression going from smaller company to smaller company.... And then finally on my own! It feels good!  Really GOOD!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106827949717532159?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.blogscene.org/erik/' title='Fr33D0M'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106827949717532159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106827949717532159'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106827949717532159' title='Fr33D0M'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106827819133584808</id><published>2003-11-07T23:56:00.000-08:00</published><updated>2003-11-07T23:56:28.806-08:00</updated><title type='text'>Wired, then Tired: A good coding session ends the week on a positive note.</title><content type='html'>I worked late Thursday night, and I am tired. I started refactoring this one piece that I have been working on. I kept refactoring it until I could reuse the pieces I needed on a set of similar pieces. It was fun. The more I refactored, the more oppurtunties there were for refactoring. It was nice to have a set of automated tests to make sure I did not break anything as I was making fairly large changes to the system. I came out with a lot of good abstractions. I ended up using a template method base class that dicated the overall flow. Then a set of higher level abstractions for the template method base class to use. The subclasses had factory method to create specific instantiations of the higher level abstraction. I made a lot of progress and the more progress I made the less I felt like going home. By the end of the session, I had got a lot further than I had imagined. It was a blast. I live for coding sessions like that. When I started I had one working piece that implemented a user story, when I was done I had implemented five user stories that had similar work flows.&lt;br /&gt;&lt;br /&gt;I love speaking, writing and teaching, but I must admit I enjoy coding the best. Especially when I get in the zone! I wish all days could be like last Thursday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106827819133584808?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106827819133584808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106827819133584808'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106827819133584808' title='Wired, then Tired: A good coding session ends the week on a positive note.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106801024357327179</id><published>2003-11-04T21:30:00.000-08:00</published><updated>2003-11-07T23:44:11.486-08:00</updated><title type='text'>Read-Rite Corporation goes away... a sad day!</title><content type='html'>&lt;p&gt; Goodbye old friend! I'll miss you. I got my start at Read-Rite. I did not&lt;br /&gt;learn to program there, but I sure honed my software development skills there. I will always &lt;br /&gt;remember: Dave, Balaji S., Vince R., Rick K., and Peter B. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;On or about June 17, 2003, Read-Rite Corporation ceased operations and filed for Chapter 7 bankruptcy in the United States Bankruptcy Court for the Northern District of California, Oakland Division, Case No. 03-43576 RN-7. &lt;br /&gt;&lt;br /&gt;Please send inquiries concerning Read-Rite Corporation to: &lt;br /&gt;Tevis T. Thompson, Jr. &lt;br /&gt;Trustee for the Bankruptcy Estate of Read-Rite Corporation &lt;br /&gt;c/o Jeremy W. Katz, Esq. &lt;br /&gt;Pinnacle Law Group &lt;br /&gt;425 California Street, Suite 1800 &lt;br /&gt;San Francisco, CA 94104  &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106801024357327179?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.read-rite.com' title='Read-Rite Corporation goes away... a sad day!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106801024357327179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106801024357327179'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106801024357327179' title='Read-Rite Corporation goes away... a sad day!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106794770741148368</id><published>2003-11-04T04:08:00.000-08:00</published><updated>2003-11-04T04:08:26.020-08:00</updated><title type='text'>Struts and IBM developerWorks</title><content type='html'>&lt;p&gt;&lt;br /&gt;DeveloperWorks has been covering Struts for a long time and has quite an array of timely material on Struts.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/ibm/library/j-struts/"&gt;Struts, an open-source MVC implementation&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/java/library/j-strutstiles.html"&gt;Struts and Tiles aid component-based development&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/ibm/edu/i-dw-iextreme21-i.html"&gt;Struttin' your stuff with WebSphere Studio Application Developer, Part 2: Tiles&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/java/library/j-integrate/"&gt;Integrating Struts, Tiles, and JavaServer Faces&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/webservices/library/ws-arcstruts/"&gt;Architect Struts applications for Web services&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www-106.ibm.com/developerworks/ibm/edu/i-dw-iextreme19-i.html"&gt;Go-ForIt Chronicles, Part 19: Struttin' your stuff with WebSphere Studio&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I particularly liked the Go-ForIt Chronicle series and the Integrating Struts, Tiles, and JavaServer Faces. &lt;br /&gt;If you are jonesing for some Struts information, IBM developerWorks is the place to get your Struts fix.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Oh yeah... don't forget to get a copy of James and I's new Struts book: Professional Struts.&lt;br /&gt;It is the most up to date Struts book, and it covers the Validator Framework and the Tiles Framework in detail.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106794770741148368?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106794770741148368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106794770741148368'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_11_01_archive.html#106794770741148368' title='Struts and IBM developerWorks'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106752049358848613</id><published>2003-10-30T05:14:00.000-08:00</published><updated>2003-10-30T05:28:03.630-08:00</updated><title type='text'>This year is winding up.... it has been a good year</title><content type='html'>It's been a good year. &lt;br /&gt;&lt;br /&gt;This last month. I've been doing a lot of work with Struts for this client. There system is well designed and thought out and a real pleasure to work on.&lt;br /&gt;&lt;br /&gt;I just wrote a pagination tile/tile controller. Earlier I wrote a navigation system, essentially a Struts plugin that does secured menuing. (Only shows menu's user are allowed to visit.)&lt;br /&gt;&lt;br /&gt;I've also been helping to resolve build issues and J2EE environment issues (classloader, jars in the wrong location, etc.) In addition, I have been doing a lot of mentoring. Developers come to me with their Struts/J2EE questions and we figure things out together. It helps "to have been there and done" that many times before.&lt;br /&gt;&lt;br /&gt;The navigation system worked really well until we integrated it wtih the real security system. There was some integration pain and some late night coding sessions, but in the end it works really well. It was architected well.&lt;br /&gt;&lt;br /&gt;I wrote a replacement for LookupDispatch that allows multiple buttons on the same page to have the same label. &lt;br /&gt;&lt;br /&gt;I spent a fair bit of time wrestling with CSS to make buttons look like links and work in both Netscape 6.22 and IE 5.0 and higher (the requirement for the project).&lt;br /&gt;&lt;br /&gt;We were able to avoid requiring JavaScript and still meet the fairly rigid GUI guidelines.&lt;br /&gt;&lt;br /&gt;More to come.....&lt;br /&gt;&lt;br /&gt;Next time I will write about the joys of Mock Object testing...&lt;br /&gt;&lt;br /&gt;I've moved on over into the Mock Object testing love fest crowd, and I have started to not rely on Cactus so much.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106752049358848613?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106752049358848613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106752049358848613'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106752049358848613' title='This year is winding up.... it has been a good year'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106680415334064450</id><published>2003-10-21T23:29:00.000-07:00</published><updated>2003-10-21T23:29:13.190-07:00</updated><title type='text'>IBM Web Service Wizards</title><content type='html'>Rick Hightower, CTO at Trivera Technologies LLC (www.triveratech.com &lt;http://www.triveratech.com&gt;), a training and consulting firm helping companies with Web services implementations, said that he's impressed with the wizard technology in IBM's new WSDK 5.1. These wizards are not just for simplistic tasks, he said; they really get to the meat of Web services development. "They have a UDDI wizard. They also have wizards for creating Web services from a WSDL file," he noted. The wizards provide developers with a flexible but easy path to Web services development, according to Hightower. ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106680415334064450?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.adtmag.com/article.asp?id=8368' title='IBM Web Service Wizards'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106680415334064450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106680415334064450'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106680415334064450' title='IBM Web Service Wizards'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106589848582263622</id><published>2003-10-11T11:54:00.000-07:00</published><updated>2003-10-11T11:54:45.183-07:00</updated><title type='text'>Wireless Modem, StarBucks, WebLogic 7, Mastering BEA WebLogic</title><content type='html'>I just got a wireless modem from SprintPCS. It is nice. I can get 150K bandwidth for $60.00 a month from anywhere in the U.S. where SprintPCS works. (Which seems to be everywhere....)&lt;br /&gt;&lt;br /&gt;I got tired of not being able to connect. A lot of my clients have their networks locked down so its hard for me to send and recieve email. This way, I can stay connected no matter where I am. Some hotels have high speed, and some of the actually work, but why pay $10.00 a night.&lt;br /&gt;&lt;br /&gt;I figured out how to use an exploded EAR file with an exploded WAR file in BEA WebLogic 7. I found the information on google. The info was written by the author of Mastering BEA WebLogic. So I figured it was in his book as well. BTW I really dig Mastering BEA WebLogic.&lt;br /&gt;&lt;br /&gt;I got use to using WebLogic 8.1 which automatically expands EAR and WARs and lets you hot deploy JSPs and such.&lt;br /&gt;&lt;br /&gt;Well I am off to StarBucks to write an article about Custom Tags and drink some liquid motivation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106589848582263622?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106589848582263622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106589848582263622'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106589848582263622' title='Wireless Modem, StarBucks, WebLogic 7, Mastering BEA WebLogic'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106570376139114692</id><published>2003-10-09T05:49:00.000-07:00</published><updated>2003-10-09T05:49:48.983-07:00</updated><title type='text'>ArcMind--Know The Next!</title><content type='html'>http://www.arc-mind.com/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106570376139114692?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.arc-mind.com/' title='ArcMind--Know The Next!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106570376139114692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106570376139114692'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106570376139114692' title='ArcMind--Know The Next!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106554713743815761</id><published>2003-10-07T10:16:00.000-07:00</published><updated>2003-10-07T10:18:57.303-07:00</updated><title type='text'>Yet Another Discovery with LookUpDispatch and the resouce bundles</title><content type='html'>We are noticing the LookUpDispatchAction reads all of the bundles not just the default.&lt;br /&gt;However, when you invoke an LookUpDispatchAction the first time, it cannot find the bundle/key if it is not the default. The second time and forevermore, it works.... it just fails the first time.&lt;br /&gt;&lt;br /&gt;This may be a bug. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106554713743815761?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106554713743815761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106554713743815761'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106554713743815761' title='Yet Another Discovery with LookUpDispatch and the resouce bundles'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106553647619180345</id><published>2003-10-07T07:19:00.000-07:00</published><updated>2003-10-07T07:21:16.060-07:00</updated><title type='text'>Another resoruce bundle discovery</title><content type='html'>The default bundle is not the first bundle in the struts config file (I read this somewhere).&lt;br /&gt;It is the last bundle without a key. We found this out the hard way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106553647619180345?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106553647619180345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106553647619180345'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106553647619180345' title='Another resoruce bundle discovery'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106553636225889301</id><published>2003-10-07T07:17:00.000-07:00</published><updated>2003-10-07T07:19:22.140-07:00</updated><title type='text'>Struts 1.0 overides 1.1 resource bundle</title><content type='html'>I was helping a co-worker solve a problem.&lt;br /&gt;Appraently if you have the application init parameter set for ActionServlet (which specifies the resoruce bundle), it overrides the one that is set in struts-config with message-resoruces. &lt;br /&gt;&lt;br /&gt;The moral of this story, don't use the 1.0 init parameters with a 1.1 application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106553636225889301?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106553636225889301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106553636225889301'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_10_01_archive.html#106553636225889301' title='Struts 1.0 overides 1.1 resource bundle'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106329649574345739</id><published>2003-09-11T09:08:00.000-07:00</published><updated>2003-09-11T09:08:15.820-07:00</updated><title type='text'>fun at Venice Beach</title><content type='html'>I am in LA visiting a client. They had a company picnic yesterday so I had the day off. I went to Venice beach for a few hours. Venice beach is very nice. It was bitter-sweet.&lt;br /&gt;&lt;br /&gt;It gave me a chance to evaluate goals and priorities and sort of meditate while listening to the ocean. I love the ocean. I love the sound and the smell. &lt;br /&gt;&lt;br /&gt;As I traveled west of Venice Blvd. I .... &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106329649574345739?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106329649574345739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106329649574345739'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_09_01_archive.html#106329649574345739' title='fun at Venice Beach'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106274773910718665</id><published>2003-09-05T00:42:00.000-07:00</published><updated>2003-09-05T00:43:49.740-07:00</updated><title type='text'>How to ask a question?</title><content type='html'>I have written a couple of books and from time to time I get asked questions.&lt;br /&gt;Most times these questions are pretty vague.&lt;br /&gt;&lt;br /&gt;Jame Peterson knows how to ask a question.&lt;br /&gt;&lt;br /&gt;He wrote me a little document that walks me through his environment. Pretty cool.&lt;br /&gt;&lt;br /&gt;BTW I was still not able to really answer his question. It works on my box not on his.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.rickhightower.com/pyappletRespone.pdf"&gt; Response &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;But at least I was able to try. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106274773910718665?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.rickhightower.com/pyapplet.pdf' title='How to ask a question?'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106274773910718665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106274773910718665'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_09_01_archive.html#106274773910718665' title='How to ask a question?'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106261673595116059</id><published>2003-09-03T12:18:00.000-07:00</published><updated>2003-09-03T12:18:56.150-07:00</updated><title type='text'>crazybob.org - web log</title><content type='html'>&lt;a href="http://crazybob.org/roller/page/crazybob/20030901"&gt;crazybob.org - web log&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;BeanShell 2.0 looks really cool. Read what Crazy Bob wrote about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106261673595116059?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://crazybob.org/roller/page/crazybob/20030901' title='crazybob.org - web log'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106261673595116059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106261673595116059'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_09_01_archive.html#106261673595116059' title='crazybob.org - web log'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106248692688373898</id><published>2003-09-02T00:15:00.000-07:00</published><updated>2003-09-02T00:16:59.470-07:00</updated><title type='text'>Will program Swing for remodeling.... (one day of my labor day)</title><content type='html'>I had a relative help me with some remodeling... Putting up some cabinets, hanging curtains and such. In exchange I helped his wife with a little problem at work. &lt;br /&gt;&lt;br /&gt;I took some Excel spreadsheets that they used to track some billing data. I converted the highly unnormalized data from the Excel spreadsheet to a normalized set of database tables. I had to write a script in Python that would clean up the redundant data and arrange it into normalized tables (this was the longest part). I have to admit; I love this type of programming.&lt;br /&gt;&lt;br /&gt;I then wrote a simple GUI to track items to bill. You enter in the serial number of the item, it shows its picture plus a list of maintenance parts. You just pick the part and the qty and hit add. Simple, but fun to write. I wrote it all in Swing. &lt;br /&gt;&lt;br /&gt;It took me one day to write the data normalizer and the GUI.  &lt;br /&gt;&lt;br /&gt;You can add an optional date field (it defaults to today). I used the InputVerifier so you can't leave the date field until you enter in a proper date. I use labels associated with components that have displayMnemonics to make navigation easy.&lt;br /&gt;&lt;br /&gt;90% of the GUI is written in HTML (I know I said swing, but swing does HTML). I use an EditorPane with its content type set to text/html. This allows me to easily put up pretty pictures of the machines (the machine changes based on the serial number), the company logo, the vendor logo, etc. I wrote the whole thing in Jython (Python running in the JVM).&lt;br /&gt;&lt;br /&gt;I have a text field to enter in the serial number.... as you enter in the serial number, it highlights the closest serial number in a list, once you get close entering in the 10 digit serial number, you can pick it from the list. Then it pulls up that product data in a editable view (with a picture of the machine and a list of parts you can change). &lt;br /&gt;&lt;br /&gt;I have to admit programming in Swing was fun, and a nice break from programming in Struts.&lt;br /&gt;&lt;br /&gt;I am a big fan of Jython. I guess that is why I wrote a book on it. (Based on the book sales, there aren't as many jython fans as I would like.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106248692688373898?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106248692688373898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106248692688373898'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_09_01_archive.html#106248692688373898' title='Will program Swing for remodeling.... (one day of my labor day)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106211610368869942</id><published>2003-08-28T17:15:00.000-07:00</published><updated>2003-08-28T17:15:03.766-07:00</updated><title type='text'>Looking for something else and I ran into this....</title><content type='html'>Mastering Tomcat...&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Picked up that one yesterday. I bought it cause Rick Hightower (Java Tools for Extreme Programming) wrote the chapter on struts and ant/xdoclet. I haven't been able to go through the whole thing yet, but I need good reference info and insight into how the new Jasper2 engine handles caching of tag libs and some of the quirks that come up in JSP/Servlet development WRT insuring clean separation of data in the various scopes. I'm also very interested in seeing how struts and the JSTL should behave in the container.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I want a raise from Wiley.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106211610368869942?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://books.slashdot.org/books/02/11/14/1721243.shtml?tid=148' title='Looking for something else and I ran into this....'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211610368869942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211610368869942'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106211610368869942' title='Looking for something else and I ran into this....'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106211560806553214</id><published>2003-08-28T17:06:00.000-07:00</published><updated>2003-08-28T17:06:48.143-07:00</updated><title type='text'>Improve JSTL i18n support with Struts</title><content type='html'>I’d like to see Struts play nice with JSTL i18n support.&lt;br /&gt;&lt;br /&gt;I have a suggestion along these lines. (This is prelim. I am going to write some tests and do some prototyping but before I do… I’d like to hear if there are any thoughts on this).&lt;br /&gt;&lt;br /&gt;Currently when you call Action.setLocale you get this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;...class Action...&lt;br /&gt;    protected void setLocale(HttpServletRequest request, Locale locale) {&lt;br /&gt; &lt;br /&gt;        HttpSession session = request.getSession();&lt;br /&gt;        if (locale == null) {&lt;br /&gt;            locale = Locale.getDefault();&lt;br /&gt;        }&lt;br /&gt;        session.setAttribute(Globals.LOCALE_KEY, locale);&lt;br /&gt; &lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;I am suggesting this (for the release that embraces JSTL…. Struts 1.3 or 1.5).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javax.servlet.jsp.jstl.core.Config; //get this guy to use its Locale key as well ...class Action...&lt;br /&gt;    protected void setLocale(HttpServletRequest request, Locale locale) {&lt;br /&gt; &lt;br /&gt;        HttpSession session = request.getSession();&lt;br /&gt;        if (locale == null) {&lt;br /&gt;            locale = Locale.getDefault();//Don’t agree with this, but that is a different story…&lt;br /&gt;        }&lt;br /&gt;        session.setAttribute(Globals.LOCALE_KEY, locale);&lt;br /&gt;                session.setAttribute(Config.FMT_LOCALE, locale); //See this…. See this…. See this…&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The Config.FMT_LOCALE is similar to the Globals.LOCALE_KEY except that it is for the JSTL tags, e.g.,&lt;br /&gt;&lt;br /&gt;&lt;fmt:message key="title" /&gt;&lt;br /&gt;&lt;br /&gt;This is one possibility and the one that takes the least amount of effort. Another possibility is to change all struts i18n tags to use Config.FMT_LOCALE instead of Globals.LOCALE_KEY, which might be bad because it would break existing projects.&lt;br /&gt;&lt;br /&gt;I am going to write a prototype along these lines in the near future. I need to test to see if fmt:message will work with Strut’s resource bundles. (I am not sure it they will or not... I think they will with a little arm twisting. I am still a little ignorant on the details... I got the big picture... just not all the details.). Any suggestions from you i18n gurus would be nice or if someone already started this... clue me in so I don't waste time.&lt;br /&gt;&lt;br /&gt;This could be a first step in getting rid of our good friend bean:message and replacing him with fmt:message (or at least deprecating him a bit). :(&lt;br /&gt;&lt;br /&gt;Don’t worry. I will add this to the Bugzilla feature request as soon as I test it. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106211560806553214?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211560806553214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211560806553214'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106211560806553214' title='Improve JSTL i18n support with Struts'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106211537799706738</id><published>2003-08-28T17:02:00.000-07:00</published><updated>2003-08-28T17:04:14.920-07:00</updated><title type='text'>APIs of the World Unite.... Fail Loud and Proud (Struts Action.setLocale)</title><content type='html'>From Nightly build....&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    protected void setLocale(HttpServletRequest request, Locale locale) {&lt;br /&gt;&lt;br /&gt;        HttpSession session = request.getSession();&lt;br /&gt;&lt;br /&gt;        if (locale == null) {&lt;br /&gt;            locale = Locale.getDefault();&lt;br /&gt;        }&lt;br /&gt;        session.setAttribute(Globals.LOCALE_KEY, locale);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Comments on setLocale from Action..&lt;br /&gt;&lt;br /&gt;If the locale is null, wouldn't it be better for the default to come from the request as in request.getLocale(), which is the behavior of the tags when the Locale at Globals.LOCALE_KEY is not in session scope.&lt;br /&gt;&lt;br /&gt;Better Yet.... Also if they call setLocale, shouldn't the local object be non-null. My personal opinion on this stuff is that it should explode with an illegal argument exception. (I remember a bug report that talked about Struts quietly handing illegal situations... this has been a long time complaint about Struts)&lt;br /&gt;&lt;br /&gt;        if (locale == null) {&lt;br /&gt;            throw new java.lang.IllegalArgumentException("Locale was null");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As a developer when I misuse an API, I like to see it fail quickly. This way I don't have to spend a lot of time debugging where I went wrong. Die early and often in development not during QA or. gulp.. Production!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106211537799706738?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211537799706738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106211537799706738'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106211537799706738' title='APIs of the World Unite.... Fail Loud and Proud (Struts Action.setLocale)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106185252791912635</id><published>2003-08-25T16:02:00.000-07:00</published><updated>2003-08-25T16:05:22.706-07:00</updated><title type='text'>Struts JSTL EL Validator rule</title><content type='html'>I told Erik about my new Validator rule, and he told me to try to contribute it. Erik is my open source mentor.&lt;br /&gt;&lt;br /&gt;I tried to contribute it. I subscribed to the struts dev list, and posted the following:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I am new to this list so I apologize if I break any etiquette. I was thinking that I don't like validatewhen or requiredif so I wrote my own that uses JSTL EL. (I like the idea behind requiredif and validatewhen just not the implementation.) I believe this approach has several advantages over requiredif and validatewhen. I call this new rule validateel (I have not thought of a better name for it yet...).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Why write your own expression language? Why not use OGNL or JSTL EL? I think JSTL makes the most sense for the followig reasons:&lt;br /&gt;&lt;br /&gt;1) EASY TO LEARN&lt;br /&gt;The first advantage of this approach is it is easy to learn since developers know JSTL EL already. JSTL EL is easy to learn and you have to learn it for JSP 2.0 anyway. In fact, developers should be using JSTL tags in place of logic:* tags already.&lt;br /&gt;&lt;br /&gt;2) ACCESS TO PAGE CONTEXT &lt;br /&gt;The nice thing about this rule is that it has access to the complete pageContext (Headers, Request Parameters, Session, the whole thing) name space like any JSTL tag. (more on this trick later).&lt;br /&gt;&lt;br /&gt;Since I am using JSTL EL I can make my expression as complex as need be, e.g., I can check to see if one date is before another or if a string starts with a certain substring. It is completely powerful, and yet very easy to learn and use.&lt;br /&gt;&lt;br /&gt;3) VERY LITTLE CODE&lt;br /&gt;This rule was very easy to implement. It relies on the Jakarta JSTL EL implementation. I don't see the point in adding a new expression language just for Struts when Struts relies on JSP and Servlets and JSP will be using JSTL. (Less code to add means less code to maintain....)&lt;br /&gt;&lt;br /&gt;DETAILS:&lt;br /&gt;...&lt;br /&gt;(the rest you have seen in my blog)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This message was far more democratic and polite than my blog entry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106185252791912635?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106185252791912635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106185252791912635'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106185252791912635' title='Struts JSTL EL Validator rule'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106150583577077946</id><published>2003-08-21T15:43:00.000-07:00</published><updated>2003-08-21T15:50:37.570-07:00</updated><title type='text'>What is requiredif and validatewhen.....??? (Struts validator)</title><content type='html'>I wrote about the JSTL validator that I created that I though was better than requiredif and validatewhen, and someone wrote me an email asking what requiredif and validatewhen were. (see my blog entry about the JSTL validator too)&lt;br /&gt;&lt;br /&gt;They (requiredif and validatewhen) both account for...making fields required based on the value of other fields, or checking a relationship between fields.&lt;br /&gt;&lt;br /&gt;So here goes....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's assume you want to make the state fields (as in a US state like a province in other countries) conditionally required only if the US checkbox field is set or the country drop down field is equal to the country code “us”. You would use the requiredif rule. The entry in your validation.xml file would look like this: &lt;br /&gt;&lt;br /&gt;&lt;code&gt; &lt;pre&gt;&lt;br /&gt;&amp;lt;form name="inputForm"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;field&lt;br /&gt;    property="state" depends="requiredif"&amp;gt;&lt;br /&gt;  &amp;lt;arg0 key="inputForm.state "/&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;field[0]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;us&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;fieldTest[0]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;EQUAL&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;fieldValue[0]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;true&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;field[1]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;country&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;fieldTest[1]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;EQUAL&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;fieldValue[1]&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;us&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;  &amp;lt;var&amp;gt;&lt;br /&gt;    &amp;lt;var-name&amp;gt;fieldJoin&amp;lt;/var-name&amp;gt;&lt;br /&gt;    &amp;lt;var-value&amp;gt;OR&amp;lt;/var-value&amp;gt;&lt;br /&gt;  &amp;lt;/var&amp;gt;&lt;br /&gt;&amp;lt;/field&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The field[n], fieldTest[n] and fieldValue[n] variables setup the expression. Thus the above states that in order for state to be required the us field has to equal “true” or country has to equal “us”. The fieldJoin variables joins the two expression. The fieldJoin value can be OR or AND, if AND then both of the expression have to be true. In addition to using EQUAL as a fieldTest, you can also use NULL and NOTNULL to see if the related properties are NULL or not. &lt;br /&gt;The above is nice because it negates the need to override the ValidateForm’s validate method. However, it would not work for our password example earlier. For that more would be needed. &lt;br /&gt;Requiredif might be deprecated in future releases&lt;br /&gt;Future version of Struts passed version 1.1 may deprecate requiredif. The requiredif is considered very complex, especially when dealing with indexed fields (arrays of beans). The recommended way to perform this type of validation will be with the validwhen rule.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Beyond 1.1 conditional validation&lt;/b&gt;&lt;br /&gt;As we showed earlier it is often the case that fields are validated based on the value of other fields. The example we did earlier in the chapter regarding password fields that are only valid if they are equal to each other. Thus we need to do more complex expressions than the requiredif rule provides. The validwhen validation rule is designed to handle these types of validation but it is not available until the release beyond 1.1. If you want in now, you will have to download the nightly source.&lt;br /&gt;The validwhen rule takes a single test variable. The value of test must be a boolean expression.  You can also refer to the current field under test with the keyword *this*. An example of using this with our password example is as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;   &amp;lt;field property="password" depends="validwhen"&amp;gt;&lt;br /&gt;      &amp;lt;arg0 key="inputForm.password"/&amp;gt;&lt;br /&gt;        &amp;lt;var&amp;gt;&lt;br /&gt;          &amp;lt;var-name&gt;test&amp;lt;/var-name&amp;gt;&lt;br /&gt;          &amp;lt;var-value&amp;gt;&lt;br /&gt;        ((passwordCheck != null) and (*this* == passwordCheck))&lt;br /&gt;         &amp;lt;/var-value&amp;gt;&lt;br /&gt;        &amp;lt;/var&amp;gt;&lt;br /&gt;      &amp;lt;/field&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The above would perform the same type of validation as the example we had earlier which required us to use override the validate method of the ValidateForm.&lt;br /&gt;Here's a an example that redoes the requiredif example with validwhen as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;field property="state" depends="validwhen"&amp;gt;&lt;br /&gt;      &amp;lt;arg0 key="inputForm.state"/&amp;gt;&lt;br /&gt;        &amp;lt;var&amp;gt;&lt;br /&gt;          &amp;lt;var-name&amp;gt;test&amp;lt;/var-name&amp;gt;&lt;br /&gt;          &amp;lt;var-value&amp;gt;&lt;br /&gt;        ((us == "true") or (country == "us"))&lt;br /&gt;         &amp;lt;/var-value&amp;gt;&lt;br /&gt;        &amp;lt;/var&amp;gt;&lt;br /&gt;      &amp;lt;/field&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can also use validwhen with indexedProperties. Let’s say that the user registration form had two address, home address and shipping address. You would only want to validate the zip if address line one was set, you would use the following entry in the validation.xml file.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;field property="zip" indexedListProperty="addresses" depends="validwhen"&amp;gt;&lt;br /&gt;      &amp;lt;arg0 key="inputForm.zip"/&amp;gt;&lt;br /&gt;        &amp;lt;var&amp;gt;&lt;br /&gt;          &amp;lt;var-name&amp;gt;test&amp;lt;/var-name&amp;gt;&lt;br /&gt;          &amp;lt;var-value&amp;gt;((addresses [].addressLine1 == null) or (*this* != null))&amp;lt;/var-value&amp;gt;&lt;br /&gt;        &amp;lt;/var&amp;gt;&lt;br /&gt;      &amp;lt;/field&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;The address[] corresponds to the array of JavaBeans (e.g., ch15.Address). You are stating that the addresses[].zip is only required if the addresses[].addressLine1 is set.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106150583577077946?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106150583577077946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106150583577077946'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106150583577077946' title='What is requiredif and validatewhen.....??? (Struts validator)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106149999659471911</id><published>2003-08-21T14:06:00.000-07:00</published><updated>2003-08-21T15:14:39.566-07:00</updated><title type='text'>Validator Rule that uses JSTL EL to validate multiple fields (and I hate coneys)</title><content type='html'>I was sitting at lunch eating a coney at Skyline in Cincinnati (not my favorite YUCK).... I from Tucson AZ, and I can't understand how Skylines draws such a crowd. &lt;br /&gt;&lt;br /&gt;I was thinking how much I hate requiredif validator. I was also thinking that I don't like validatewhen much better.&lt;br /&gt;&lt;br /&gt;Why write your own expression language? Why not use Ognl or JSTL?&lt;br /&gt;&lt;br /&gt;I wrote my own version of validatewhen, and it uses JSTL lib from the Jakarta tag project. It took me about 20 minutes to write this. Short, sweet, and I'll never use validatewhen or requiredif again!&lt;br /&gt;&lt;br /&gt;In my opinion, this new validate rule is much better than requiredif or validatewhen (at least the versions that I messed with). I can't believe someone did not think of tihs sooner.&lt;br /&gt;&lt;br /&gt;It is also really easy to learn since you should know JSTL already.... Nothing special past that!  (JSTL is easy and you have to learn it for JSP 2.0. You should be using JSTL tags in place of logic:* tags already.).&lt;br /&gt;&lt;br /&gt;I call this new rule validateel (i have not thought of a better name for it yet... but I will, let me know if you think of one). &lt;br /&gt;&lt;br /&gt;The nice thing about this rule is that it has access to the complete pageContext name space like any JSTL tag.&lt;br /&gt;(more on this trick later).&lt;br /&gt;&lt;br /&gt;Here is an example of using this rule to check to see if a passwordCheck field is equal to a password field as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;			&amp;lt;field property="passwordCheck"&lt;br /&gt;			          depends="validateel"&amp;gt;&lt;br /&gt;			     &amp;lt;arg0 key="inputForm.passwordCheck"/&amp;gt;&lt;br /&gt;			    &amp;lt;var&amp;gt;&lt;br /&gt;			       &amp;lt;var-name&amp;gt;test&amp;lt;/var-name&amp;gt;&lt;br /&gt;			       &amp;lt;var-value&gt;&lt;br /&gt;			        &lt;b&gt;${value==form.password}&lt;/b&gt;&lt;br /&gt;			       &amp;lt;/var-value&amp;gt;&lt;br /&gt;			    &amp;lt;/var&amp;gt;			               &lt;br /&gt;            &lt;/field&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I created a FakePageContext class that takes a HttpServletRequest, and mocks up page context. I then add form to the fake page context as well as value inside of my new rule as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;		PageContext pageContext =	new FakePageContext(request);&lt;br /&gt;		String test = field.getVarValue("test"); //Get the test var (this is the JSTL expression)&lt;br /&gt;		pageContext.setAttribute("form",bean); //Map in the form&lt;br /&gt;		pageContext.setAttribute("field",field); //Map the field object (Just in case)&lt;br /&gt;		String value = ValidatorUtil.getValueAsString(bean, field.getProperty()); //Get the value of the property&lt;br /&gt;		pageContext.setAttribute("value",value); //Map the value into the page context.&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The workhorse that actually does the JSTL expresion evaluation is from the JSTL lib. I just invoke it as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;		 result = (Boolean) ExpressionEvaluatorManager.evaluate("validateEL", test, Boolean.class, pageContext);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This was so easy... and IMHO it is better than requiredif and validatewhen. First... it uses JSTL which is an expression language people either know or should know (as it is required knowledge in JSP 2.0).&lt;br /&gt;&lt;br /&gt;Here is the complete ValidateEL method and imports that implements this new validator rule.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.jsp.JspException;&lt;br /&gt;import javax.servlet.jsp.PageContext;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.validator.Field;&lt;br /&gt;import org.apache.commons.validator.ValidatorAction;&lt;br /&gt;import org.apache.commons.validator.ValidatorUtil;&lt;br /&gt;import org.apache.struts.action.ActionErrors;&lt;br /&gt;import org.apache.struts.validator.Resources;&lt;br /&gt;import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author rhightower&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class CustomValidatorRules {&lt;br /&gt;&lt;br /&gt;	public static boolean validateEL(&lt;br /&gt;		Object bean,&lt;br /&gt;		ValidatorAction va,&lt;br /&gt;		Field field,&lt;br /&gt;		ActionErrors errors,&lt;br /&gt;		HttpServletRequest request) {&lt;br /&gt;		&lt;br /&gt;		PageContext pageContext =	new FakePageContext(request);&lt;br /&gt;		String test = field.getVarValue("test");&lt;br /&gt;		pageContext.setAttribute("form",bean);&lt;br /&gt;		pageContext.setAttribute("field",field);&lt;br /&gt;		String value = ValidatorUtil.getValueAsString(bean, field.getProperty());&lt;br /&gt;		pageContext.setAttribute("value",value);&lt;br /&gt;		Boolean result = Boolean.FALSE;&lt;br /&gt;		try{&lt;br /&gt;		&lt;br /&gt;		 result = (Boolean) ExpressionEvaluatorManager&lt;br /&gt;						 .evaluate("validateEL", &lt;br /&gt;                                   test, &lt;br /&gt;                                   Boolean.class, &lt;br /&gt;                           		   pageContext);&lt;br /&gt;&lt;br /&gt;		}catch (JspException je){&lt;br /&gt;			// TODO fix&lt;br /&gt;			je.printStackTrace();&lt;br /&gt;		}&lt;br /&gt;        boolean r = result.booleanValue();&lt;br /&gt;        if (r == false){&lt;br /&gt;			errors.add(&lt;br /&gt;				field.getKey(),&lt;br /&gt;				Resources.getActionError(request, va, field));&lt;br /&gt;        	&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        return r;&lt;br /&gt;        &lt;br /&gt;	}&lt;br /&gt;        .... &lt;other rules I wrote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here is the listing for the FakePageContext (it fakes the needed parts of the context and leaves the rest noops):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.Hashtable;&lt;br /&gt;&lt;br /&gt;import javax.servlet.Servlet;&lt;br /&gt;import javax.servlet.ServletConfig;&lt;br /&gt;import javax.servlet.ServletContext;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.ServletRequest;&lt;br /&gt;import javax.servlet.ServletResponse;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;import javax.servlet.jsp.JspWriter;&lt;br /&gt;import javax.servlet.jsp.PageContext;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * @author rhightower&lt;br /&gt; *&lt;br /&gt; * To change the template for this generated type comment go to&lt;br /&gt; * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments&lt;br /&gt; */&lt;br /&gt;public class FakePageContext extends PageContext {&lt;br /&gt;	HttpServletRequest request;&lt;br /&gt;	Hashtable map = new Hashtable();&lt;br /&gt;	&lt;br /&gt;	public FakePageContext(HttpServletRequest request){&lt;br /&gt;	   this.request = request;	&lt;br /&gt;	   &lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getAttribute(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public Object getAttribute(String key) {&lt;br /&gt;		return map.get(key);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#setAttribute(java.lang.String, java.lang.Object)&lt;br /&gt;	 */&lt;br /&gt;	public void setAttribute(String key, Object value) {&lt;br /&gt;		map.put(key, value);&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#removeAttribute(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public void removeAttribute(String key) {&lt;br /&gt;		map.remove(key);&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getOut()&lt;br /&gt;	 */&lt;br /&gt;	public JspWriter getOut() {&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getSession()&lt;br /&gt;	 */&lt;br /&gt;	public HttpSession getSession() {&lt;br /&gt;		&lt;br /&gt;		return request.getSession(true);&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getPage()&lt;br /&gt;	 */&lt;br /&gt;	public Object getPage() {&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getRequest()&lt;br /&gt;	 */&lt;br /&gt;	public ServletRequest getRequest() {&lt;br /&gt;		&lt;br /&gt;		return this.request;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getResponse()&lt;br /&gt;	 */&lt;br /&gt;	public ServletResponse getResponse() {&lt;br /&gt;		// no op&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getException()&lt;br /&gt;	 */&lt;br /&gt;	public Exception getException() {&lt;br /&gt;		// no op&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getServletConfig()&lt;br /&gt;	 */&lt;br /&gt;	public ServletConfig getServletConfig() {&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getServletContext()&lt;br /&gt;	 */&lt;br /&gt;	public ServletContext getServletContext() {&lt;br /&gt;		&lt;br /&gt;		return null;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#forward(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public void forward(String arg0) throws ServletException, IOException {&lt;br /&gt;		//no op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#include(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public void include(String arg0) throws ServletException, IOException {&lt;br /&gt;		//no op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#initialize(javax.servlet.Servlet, javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.String, boolean, int, boolean)&lt;br /&gt;	 */&lt;br /&gt;	public void initialize(&lt;br /&gt;		Servlet arg0,&lt;br /&gt;		ServletRequest arg1,&lt;br /&gt;		ServletResponse arg2,&lt;br /&gt;		String arg3,&lt;br /&gt;		boolean arg4,&lt;br /&gt;		int arg5,&lt;br /&gt;		boolean arg6)&lt;br /&gt;		throws IOException, IllegalStateException, IllegalArgumentException {&lt;br /&gt;		//no op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;		 * @see javax.servlet.jsp.PageContext#setAttribute(java.lang.String, java.lang.Object, int)&lt;br /&gt;		 */&lt;br /&gt;		public void setAttribute(String key, Object value, int scope) {&lt;br /&gt;			if (scope ==PageContext.PAGE_SCOPE){&lt;br /&gt;				map.put(key, value);&lt;br /&gt;			}else if (scope == PageContext.REQUEST_SCOPE){&lt;br /&gt;				request.setAttribute(key,value);&lt;br /&gt;			}else if (scope==PageContext.SESSION_SCOPE){&lt;br /&gt;				request.getSession().setAttribute(key,value);&lt;br /&gt;			}else if (scope==PageContext.APPLICATION_SCOPE){&lt;br /&gt;				//TODO fix&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getAttribute(java.lang.String, int)&lt;br /&gt;	 */&lt;br /&gt;	public Object getAttribute(String key, int scope) {&lt;br /&gt;		if (scope ==PageContext.PAGE_SCOPE){&lt;br /&gt;			return map.get(key);&lt;br /&gt;		}else if (scope == PageContext.REQUEST_SCOPE){&lt;br /&gt;			return request.getAttribute(key);&lt;br /&gt;		}else if (scope==PageContext.SESSION_SCOPE){&lt;br /&gt;			return request.getSession().getAttribute(key);&lt;br /&gt;		}else if (scope==PageContext.APPLICATION_SCOPE){&lt;br /&gt;				return null; //TODO fix&lt;br /&gt;		}else {&lt;br /&gt;			return null;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#removeAttribute(java.lang.String, int)&lt;br /&gt;	 */&lt;br /&gt;	public void removeAttribute(String key, int scope) {&lt;br /&gt;		if (scope ==PageContext.PAGE_SCOPE){&lt;br /&gt;			 map.remove(key);&lt;br /&gt;		}else if (scope == PageContext.REQUEST_SCOPE){&lt;br /&gt;			 request.removeAttribute(key);&lt;br /&gt;		}else if (scope==PageContext.SESSION_SCOPE){&lt;br /&gt;			 request.getSession().removeAttribute(key);&lt;br /&gt;		}else if (scope==PageContext.APPLICATION_SCOPE){&lt;br /&gt;		     //TODO fix&lt;br /&gt;		}else {&lt;br /&gt;			 // no op&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getAttributeNamesInScope(int)&lt;br /&gt;	 */&lt;br /&gt;	public Enumeration getAttributeNamesInScope(int scope) {&lt;br /&gt;		if (scope ==PageContext.PAGE_SCOPE){&lt;br /&gt;			return map.keys();&lt;br /&gt;		}else if (scope == PageContext.REQUEST_SCOPE){&lt;br /&gt;			return request.getAttributeNames();&lt;br /&gt;		}else if (scope==PageContext.SESSION_SCOPE){&lt;br /&gt;			return request.getSession().getAttributeNames();&lt;br /&gt;		}else if (scope==PageContext.APPLICATION_SCOPE){&lt;br /&gt;				return null; //TODO fix&lt;br /&gt;		}else {&lt;br /&gt;			return null;&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#getAttributesScope(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public int getAttributesScope(String arg0) {&lt;br /&gt;		//  No op&lt;br /&gt;		return 0;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#findAttribute(java.lang.String)&lt;br /&gt;	 */&lt;br /&gt;	public Object findAttribute(String key) {&lt;br /&gt;		Object value = map.get(key);&lt;br /&gt;		if (value == null){&lt;br /&gt;		   value = request.getAttribute(key);	&lt;br /&gt;		}&lt;br /&gt;		if (value == null){&lt;br /&gt;			value = request.getSession().getAttribute(key);&lt;br /&gt;		}&lt;br /&gt;		if (value == null){&lt;br /&gt;			//TODO look it up in app scope&lt;br /&gt;		}&lt;br /&gt;		return value;&lt;br /&gt;		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#handlePageException(java.lang.Exception)&lt;br /&gt;	 */&lt;br /&gt;	public void handlePageException(Exception arg0)&lt;br /&gt;		throws ServletException, IOException {&lt;br /&gt;		// No op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#handlePageException(java.lang.Throwable)&lt;br /&gt;	 */&lt;br /&gt;	public void handlePageException(Throwable arg0)&lt;br /&gt;		throws ServletException, IOException {&lt;br /&gt;		// No op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/* (non-Javadoc)&lt;br /&gt;	 * @see javax.servlet.jsp.PageContext#release()&lt;br /&gt;	 */&lt;br /&gt;	public void release() {&lt;br /&gt;		// No op&lt;br /&gt;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For completeness...&lt;br /&gt;&lt;br /&gt;I had to add this entry in validation-rules.xml&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;      &amp;lt;validator name="validateel"&lt;br /&gt;                 classname="ch15.CustomValidatorRules"&lt;br /&gt;                 method="validateEL"&lt;br /&gt;                 methodParams="java.lang.Object,&lt;br /&gt;                               org.apache.commons.validator.ValidatorAction,&lt;br /&gt;                               org.apache.commons.validator.Field,&lt;br /&gt;                               org.apache.struts.action.ActionErrors,&lt;br /&gt;                               javax.servlet.http.HttpServletRequest"&lt;br /&gt;                 msg="errors.validateEL"&amp;gt;&lt;br /&gt;      &amp;lt;/validator&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It took me longer to write this blog entry then it did to write the above code. IMO if you are using requiredif or validatewhen, then you are wasting your time. Also, if you use the validator framework and you ever need to do a simple comparison of two fields... this is the way to go. With JSTL you have access to headers, attributes in session,  request attributes, request parameters, and so much more.... Use this... it works and it is cool.&lt;br /&gt;&lt;br /&gt;Here is how I would do the above in my own validate method of an ActionForm (for reference).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public class InputFormAll extends ValidatorForm {&lt;br /&gt;        ...&lt;br /&gt;	public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {&lt;br /&gt;		ActionErrors errors = super.validate(mapping, request);&lt;br /&gt;		&lt;br /&gt;		&lt;br /&gt;		if (!(password.equals(passwordCheck))){	&lt;br /&gt;			errors.add(&lt;br /&gt;				"password",&lt;br /&gt;				new ActionError("errors.password.nomatch"));&lt;br /&gt;		}&lt;br /&gt;		return errors;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Using validateel is so much more terse! &lt;code&gt;${value==form.password}&lt;/code&gt; and I am done!&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106149999659471911?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106149999659471911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106149999659471911'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106149999659471911' title='Validator Rule that uses JSTL EL to validate multiple fields (and I hate coneys)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106133946611601575</id><published>2003-08-19T17:31:00.000-07:00</published><updated>2003-08-19T17:31:06.183-07:00</updated><title type='text'>Proud Mary's.... I love it.... WIFI and Burgers!</title><content type='html'>&lt;a href="http://www.cincypost.com/2002/jan/10/dining011002.html"&gt;dining011002&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am in Cincinnati and my hotel does not have high speed access. I was working in my hotel room with a dial-up modem.... Yuck!&lt;br /&gt;&lt;br /&gt;I saw this place last night, and thought I would give it try.&lt;br /&gt;&lt;br /&gt;Proud Mary's Burgers..... (near the down town library).&lt;br /&gt;&lt;br /&gt;Turns out Proud Mary's has Hi Speed Access (WIFI baby), and yes I did bring my laptop (eventhough I did not know about the WIFI).&lt;br /&gt;&lt;br /&gt;I have not tried the food yet (still waiting), but WIFI access is great!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106133946611601575?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.cincypost.com/2002/jan/10/dining011002.html' title='Proud Mary&apos;s.... I love it.... WIFI and Burgers!'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106133946611601575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106133946611601575'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106133946611601575' title='Proud Mary&apos;s.... I love it.... WIFI and Burgers!'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106133316389286687</id><published>2003-08-19T15:46:00.000-07:00</published><updated>2003-08-19T15:46:03.853-07:00</updated><title type='text'>Should frameworks fail when you do something stupid? I think so... fail fast and early (preconditions rule!)</title><content type='html'>What I don't like about GridBagConstraints....&lt;br /&gt;&lt;br /&gt;Let's say I have a the following code that adds a checkbox, label and text field to a container.&lt;br /&gt;The code is setup to allow the text field to stretch horizontally as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;     	JFrame frame = new JFrame(); //Create the frame.&lt;br /&gt;     	JPanel content = new JPanel();  //Create the panel to hold the label and text field&lt;br /&gt;     	frame.getContentPane().add(content); //Add the panel to the frame&lt;br /&gt;     	content.setLayout(new GridBagLayout()); //Set the panel layout to GridBagLayout&lt;br /&gt;     	&lt;br /&gt;     	JLabel label = new JLabel("Enter Name:"); //Create a label&lt;br /&gt;     	JTextField field = new JTextField(10); //Create a text field&lt;br /&gt;     	JCheckBox checkbox = new JCheckBox(); //Create checkbox&lt;br /&gt;     	&lt;br /&gt;     	GridBagConstraints constraints = new GridBagConstraints(); //Create a constraint&lt;br /&gt;     	//Add the label with the defaults&lt;br /&gt;        content.add(checkbox); //Add the label using defaults, OPPS!&lt;br /&gt;        constraints.gridx=1;&lt;br /&gt;	content.add(label); //Add the label using defaults, OPPS!&lt;br /&gt;        &lt;br /&gt;        //Add the field to show to the right of the label, &lt;br /&gt;        //and take up the rest of the leftover space.&lt;br /&gt;        constraints.gridx=2;&lt;br /&gt;        constraints.fill=GridBagConstraints.HORIZONTAL; //Stretch horizontally&lt;br /&gt;        constraints.weightx=1.0; //Take up the rest 1 of 1&lt;br /&gt;        content.add(field); //OPPS!&lt;br /&gt;        frame.pack();&lt;br /&gt;        frame.setVisible(true);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Do you see what is wrong....&lt;br /&gt;&lt;br /&gt;I forgot to use the constraint when I call add.&lt;br /&gt;What happens? A nasty exception telling me that I dumb and forgot the constraint? Nope. I wish.&lt;br /&gt;It happily add the fields with the defaults, which kind of behaves like FlowLayout.&lt;br /&gt;I'd prefer if the framework would fail quickly, and let me know I screwed up.&lt;br /&gt;The add method should throw some kind of precondition assertion. "Hey dummy you forgot to use a constraint" Exception. Instead of making me stare at the code. What if I forget? Let me know. This makes the framework easier to use.&lt;br /&gt;&lt;br /&gt;The following code is correct....&lt;br /&gt;&lt;code&gt;&lt;br /&gt;     	JFrame frame = new JFrame(); //Create the frame.&lt;br /&gt;     	JPanel content = new JPanel();  //Create the panel to hold the label and text field&lt;br /&gt;     	frame.getContentPane().add(content); //Add the panel to the frame&lt;br /&gt;     	content.setLayout(new GridBagLayout()); //Set the panel layout to GridBagLayout&lt;br /&gt;     	&lt;br /&gt;     	JLabel label = new JLabel("Enter Name:"); //Create a label&lt;br /&gt;     	JTextField field = new JTextField(10); //Create a text field&lt;br /&gt;     	JCheckBox checkbox = new JCheckBox(); //Create checkbox&lt;br /&gt;     	&lt;br /&gt;     	GridBagConstraints constraints = new GridBagConstraints(); //Create a constraint&lt;br /&gt;     	//Add the label with the defaults&lt;br /&gt;        content.add(checkbox, constraints); //Add the label using defaults&lt;br /&gt;        constraints.gridx=1;&lt;br /&gt;	content.add(label, constraints); //Add the label using defaults&lt;br /&gt;        &lt;br /&gt;        //Add the field to show to the right of the label, &lt;br /&gt;        //and take up the rest of the leftover space.&lt;br /&gt;        constraints.gridx=2;&lt;br /&gt;        constraints.fill=GridBagConstraints.HORIZONTAL; //Stretch horizontally&lt;br /&gt;        constraints.weightx=1.0; //Take up the rest 1 of 1&lt;br /&gt;        content.add(field, constraints);&lt;br /&gt;        frame.pack();&lt;br /&gt;        frame.setVisible(true);&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106133316389286687?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106133316389286687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106133316389286687'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106133316389286687' title='Should frameworks fail when you do something stupid? I think so... fail fast and early (preconditions rule!)'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106110149743295502</id><published>2003-08-16T23:24:00.000-07:00</published><updated>2003-08-16T23:24:57.443-07:00</updated><title type='text'>Interesting problem.... JSP 1.2... who is right?</title><content type='html'>I ran into a werid problem. I wrote a JSP/Struts application and deployed it to Resin 2.1. But....&lt;br /&gt;When I deployed it to WebLogic 8.1 it stopped working.&lt;br /&gt;&lt;br /&gt;It seems that Resin allows you to use the import directive (&lt;%@page import="foo.Boo") to import classes that get used by useBean (jsp:useBean class="Boo"), but Weblogic does not allow this, you have to always use the fully qualified classname with useBean even if you imported it (jsp:useBean class="foo.Boo"). I wonder who is right. Resin feels right. &lt;br /&gt;&lt;br /&gt;I guess I should not be lazy and go look it up in the spec. and then report the bug to whoever is doing it wrong. Anyone know off the top of their head????????&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106110149743295502?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106110149743295502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106110149743295502'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106110149743295502' title='Interesting problem.... JSP 1.2... who is right?'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106105700394401951</id><published>2003-08-16T11:03:00.000-07:00</published><updated>2003-08-16T11:03:23.953-07:00</updated><title type='text'>Extreme programming: Process vs. culture</title><content type='html'>Erik Hatcher and I use to work with Ryan Ripley at eBlox/PromoFuel. I need to read his article....&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.javaworld.com/javaworld/jw-08-2003/jw-0815-xp.html"&gt;Extreme programming: Process vs. culture&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106105700394401951?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.javaworld.com/javaworld/jw-08-2003/jw-0815-xp.html' title='Extreme programming: Process vs. culture'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106105700394401951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106105700394401951'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106105700394401951' title='Extreme programming: Process vs. culture'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106105582592171886</id><published>2003-08-16T10:43:00.000-07:00</published><updated>2003-08-16T10:43:45.913-07:00</updated><title type='text'>Journal of Computing and Information Technology</title><content type='html'>I just recieved a copy of the Journal of Computing and Information Technology from the University Computing Centre in Zagreb, Croatia. They reviewed the book that me and Nick wrote (Java Tools for Extreme Programming). It was a nice review. And, they were kind enough to send us several copies along with the Journal that has the review in it.&lt;br /&gt;&lt;br /&gt;The review was written by Hrvoje Bogunovic. I found his homepage, but alas there is not much there yet.&lt;br /&gt;&lt;br /&gt;When I was up late working on the book at the coffee shop, I never dreamed someone in Croatia would write a review for it. We live in a small world. :)&lt;br /&gt;&lt;br /&gt;--Rick Hightower&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106105582592171886?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://fly.srk.fer.hr/~hrvbo/' title='Journal of Computing and Information Technology'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106105582592171886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106105582592171886'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106105582592171886' title='Journal of Computing and Information Technology'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106095413272591663</id><published>2003-08-15T06:28:00.000-07:00</published><updated>2003-08-16T10:33:58.260-07:00</updated><title type='text'>Fire Drill, Struts Best Practices</title><content type='html'>Started this week in total fire drill mode. Somehow it has managed to be a good week. I've spent a lot of time tihs week with WebLogic 8.1. &lt;br /&gt;&lt;br /&gt;I finished my contribution to the second edtion of Mastering Struts by James Goodwill and Rick Hightower, which is now going to be printed under Wrox Professional Struts.&lt;br /&gt;&lt;br /&gt;The last chapter I wrote was on Struts Best Practices, it covered the full gamut of things you need to do to use Struts on projects including StrutsTestCase, XDoclet for generation of validation.xml, transaction tokens to make sure a form only gets submitted once, when to use JSTL, how to write JSTL enabled tags, when to use Tiles, etc.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106095413272591663?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106095413272591663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106095413272591663'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106095413272591663' title='Fire Drill, Struts Best Practices'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106080718280337565</id><published>2003-08-13T13:39:00.000-07:00</published><updated>2003-08-13T13:44:26.876-07:00</updated><title type='text'>Books on Jakarta.... Crowbar Tech: Axis Book Dodgy</title><content type='html'>I saw this and I could not help linking to it. Thanks by the way... you made my day.&lt;br /&gt;&lt;a href="http://crowbar.dnsalias.com:443/crowbar/000080.html"&gt;Crowbar Tech: Axis Book Dodgy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;"&lt;br /&gt;There are many good books on Apache's java software. At Crowbar, some of out favorites are:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Programming Jakarta Struts by by Chuck Cavaness&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Java Development With Ant by Erik Hatcher, Steve Loughran&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Apache Jakarta-Tomcat by by James Goodwill&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And the best one, in our opinion is Java Tools for Extreme Programming: Mastering Open Source Tools Including Ant, JUnit, and Cactus by Richard Hightower, Nicholas Lesiecki.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Apache and Jakarta software is some of the best software available, commecial or not, according to our expert Crowbar analysts. The books on the subject should be of equally high quality. As for Wrox, here is a tip on how to create indexes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106080718280337565?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://crowbar.dnsalias.com:443/crowbar/000080.html' title='Books on Jakarta.... Crowbar Tech: Axis Book Dodgy'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106080718280337565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106080718280337565'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106080718280337565' title='Books on Jakarta.... Crowbar Tech: Axis Book Dodgy'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-106049514290571942</id><published>2003-08-09T22:59:00.000-07:00</published><updated>2003-08-09T23:07:28.466-07:00</updated><title type='text'>Contemplation</title><content type='html'>I just realized I worked 20 of the last 24 hours. This week I put in something like 75 hours. More like a 100 if you count travel time (planes).&lt;br /&gt;&lt;br /&gt;Some of this time was spent on the book, most of it was spent at work, and a little was spent working on an article.&lt;br /&gt;&lt;br /&gt;I've got some good feedback from the Tiles chapter I wrote as follows:&lt;br /&gt;&lt;br /&gt;Craig Pfeifer writes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Rick --&lt;br /&gt;&lt;br /&gt;I read your chapter on tilles and  I enjoyed it. We're using tiles right&lt;br /&gt;now on my project, and when we did our initial investigation/prototyping we&lt;br /&gt;went through the exact same steps that your chapter takes the reader through,&lt;br /&gt;so I think the flow and approach are dead on. (Wow... that is cool! Thanks)&lt;br /&gt;&lt;br /&gt;Here are my comments (nits at best):&lt;br /&gt;&lt;br /&gt;- in your code samples, you use the struts tag libraries where JSTL tag&lt;br /&gt;libraries exist (logic, bean). Is there any reason to use the Struts&lt;br /&gt;tags over JSTL in these samples? Also, you use scriplets in a couple of&lt;br /&gt;places,&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;(Are you sure? I am quite sure that I never use scriplets. I do use expressions a few times. &lt;br /&gt;&lt;br /&gt;Since you can write a Tile layout as a type of Visual component, it is probably okay to use scriplets in some instances. Even the Tiles examples do this. &lt;br /&gt;&lt;br /&gt;You can use Tiles as a replacement for some custom tags. The examples that ship with Tiles use scriplets quite a bit. Think about Tile Layouts as another way to write a Custom Tags like thing. &lt;br /&gt;&lt;br /&gt;Tile Layouts have a lot in common with the JSP 2.0 tag file. The same rules do not apply to Tile Layouts IMHO that apply to JSP files. You should be judicious not dogmatic.&lt;br /&gt;&lt;br /&gt;It comes down to intent. If you intend on creating a site layout then you should not use scriptlets ever. If you are creating a reusable visual component than sciplets are okay. &lt;br /&gt;&lt;br /&gt;Again, I don't use scriplets in the examples. At least I don't remember doing so.....&lt;br /&gt;)&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;I'm a firm believer that scriplets are evil (mostly), is there a reason&lt;br /&gt;that JSTL wouldn't work?&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;&lt;br /&gt;(In the examples you cite there is not reason JSTL would not work. I just did not want to make the asumption that they were using/knew JSTL. I think they should use JSTL whenever possible over using the equiv. Struts tags. We cover JSTL in another section of the book and we suggest using JSTL as you state. If I were writing this book in a year or two, when everybody uses JSTL than that would be a different story... I would not use bean:write, logic:iterate at all.... I think.)&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;- Since Tiles is just a tag library, I'm guessing that using JSPC in&lt;br /&gt;your ant build to precompile your pages works the same as without Tiles.&lt;br /&gt;Again, my current project makes heavy use of tiles and we find that the first&lt;br /&gt;hit to each page is fairly hefty. Once the page is compiled it's not a big&lt;br /&gt;deal, but that first step is a doozy. IMHO using JSPC is even more important&lt;br /&gt;w/Tiles than without.&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;&lt;br /&gt;(I agree, but don't want to cover this in this chapter.)&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;- I think the sample JSPs would be more effective w/o the layout markup&lt;br /&gt;(table formatting, fonts, styles). When I'm reading this chapter I don't&lt;br /&gt;care about the HTML parts of the page. Keep all this stuff in the sample&lt;br /&gt;code that you package and make available for download, but it just&lt;br /&gt;clutters the page in the text.&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;&lt;br /&gt;(Hmmmm.... I see your point. I like the context though.)&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;- In the "Understanding and using Tile Scope" section there's a sentance&lt;br /&gt;"The tiles scope is a similar scope to the page scope." This section&lt;br /&gt;needs to be reworked for clarity and so you don't use the word 'scope' (even&lt;br /&gt;though it is the proper term) 3 times in the same sentance. I think a&lt;br /&gt;picture would go a long way in showing this.&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;&lt;br /&gt;(I have a really good editor. He will fix that. I'll send him your comment as well just to make sure.)&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;All in all I think it's a very solid chapter! There were some&lt;br /&gt;grammatical issues here and there, and the look and feel of the headings doesn't do&lt;br /&gt;much for me, but I was reading more for content and organization.&lt;br /&gt;&lt;br /&gt;&lt;font color="red"&gt;&lt;br /&gt;&lt;br /&gt;(My grammar sucks! I can write grammaticaly correct if I need to, but I cannot engage the right and left sides of my brain at the same time when I am writing a technical book, i.e., the creative part engages when I write. I can correct other people's grammar but have a hard time correcting my own, because I know what I meant. Thank God for Editors like Tim Ryan. Sometimes I will let a chapter sit for a month and then copy edit it. It makes more sense to me then. For now, I am relying on Tim Ryan.&lt;br /&gt;&lt;br /&gt;The look and feel of the book will change quite a bit. It goes through a bunch of stuff. You are seeing it in its raw form.)&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Craig&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-106049514290571942?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106049514290571942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/106049514290571942'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#106049514290571942' title='Contemplation'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-105975193144645873</id><published>2003-08-01T08:32:00.000-07:00</published><updated>2003-08-01T08:32:11.493-07:00</updated><title type='text'>Tutorial offers fast track to component integration- ADTmag.com</title><content type='html'>I am quoted in ADT Programmer's Report Weekly wrt to XDoclet (&lt;a href="http://www.adtmag.com/article.asp?id=8009"&gt;Tutorial offers fast track to component integration- ADTmag.com&lt;/a&gt;). Here is a small snip:&lt;br /&gt;&lt;br /&gt;"XDoclet allows you to tack on meta data to language features like classes, methods and fields using what looks like JavaDoc tags. It then uses that extra meta data to generate related files like deployment descriptors and source code," said Rick Hightower, director of development at eBlox and author of the developerWorks Web site's "Enhance J2EE component reuse with XDoclets" tutorial.&lt;br /&gt;&lt;br /&gt;This, said Hightower, can cut out quite a bit of redundant coding. &lt;br /&gt;&lt;br /&gt;Read more at: &lt;a href="http://www.adtmag.com/article.asp?id=8009"&gt;Tutorial offers fast track to component integration- ADTmag.com&lt;/a&gt;. Bummer that they got my company name wrong.&lt;br /&gt;I work at Trivera Technologies. I am the CTO of Trivera Technologies not the Director of Development at eBlox (I used to be).&lt;br /&gt;&lt;br /&gt;I was in Ohio for the last two days. The weather was really nice, and I had a good time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-105975193144645873?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.adtmag.com/article.asp?id=8009' title='Tutorial offers fast track to component integration- ADTmag.com'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105975193144645873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105975193144645873'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#105975193144645873' title='Tutorial offers fast track to component integration- ADTmag.com'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-105975190653025738</id><published>2003-08-01T08:31:00.000-07:00</published><updated>2003-08-01T08:31:46.613-07:00</updated><title type='text'>Tutorial offers fast track to component integration- ADTmag.com</title><content type='html'>I am quoted in ADT Programmer's Report Weekly wrt to XDoclet (&lt;a href="http://www.adtmag.com/article.asp?id=8009"&gt;Tutorial offers fast track to component integration- ADTmag.com&lt;/a&gt;). Here is a small snip:&lt;br /&gt;&lt;br /&gt;"XDoclet allows you to tack on meta data to language features like classes, methods and fields using what looks like JavaDoc tags. It then uses that extra meta data to generate related files like deployment descriptors and source code," said Rick Hightower, director of development at eBlox and author of the developerWorks Web site's "Enhance J2EE component reuse with XDoclets" tutorial.&lt;br /&gt;&lt;br /&gt;This, said Hightower, can cut out quite a bit of redundant coding. &lt;br /&gt;&lt;br /&gt;Read more at: &lt;a href="http://www.adtmag.com/article.asp?id=8009"&gt;Tutorial offers fast track to component integration- ADTmag.com&lt;/a&gt;. Bummer that they got my company name wrong.&lt;br /&gt;I work at Trivera Technologies. I am the CTO of Trivera Technologies not the Director of Development at eBlox (I used to be).&lt;br /&gt;&lt;br /&gt;I was in Ohio for the last two days. The weather was really nice, and I had a good time.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-105975190653025738?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.adtmag.com/article.asp?id=8009' title='Tutorial offers fast track to component integration- ADTmag.com'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105975190653025738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105975190653025738'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_08_01_archive.html#105975190653025738' title='Tutorial offers fast track to component integration- ADTmag.com'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-105942139305909418</id><published>2003-07-28T12:43:00.000-07:00</published><updated>2003-07-28T12:43:12.970-07:00</updated><title type='text'>Late night... procrastination woes</title><content type='html'>finally someone agrees with me...&lt;a href="http://blogging.autenroad.com/user_blogs/cpfeifer/archives/000258.html"&gt;late night&lt;/a&gt;. It was bound to happen sooner or later.&lt;br /&gt;&lt;br /&gt;Perhaps the root of the problem is a bad case of &lt;a href="http://blogging.autenroad.com/user_blogs/cpfeifer/archives/000262.html"&gt; procrastination&lt;br /&gt;&lt;/a&gt;. Anyway thanks for the good, timely advice. I've been at the coffee shop 5 times in the last week for my late night work sessions.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-105942139305909418?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogging.autenroad.com/user_blogs/cpfeifer/archives/000258.html' title='Late night... procrastination woes'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105942139305909418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105942139305909418'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_07_01_archive.html#105942139305909418' title='Late night... procrastination woes'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-105916890257891622</id><published>2003-07-25T14:35:00.000-07:00</published><updated>2003-07-27T20:27:20.353-07:00</updated><title type='text'>Erik Hatcher and Andy Barton are awesome.</title><content type='html'>Erik Hatcher is awesome. He just reviewed a chapter I wrote on the Tiles Framework. I swear Erik is the busiest guy in software development, yet always seems to take time to help others.&lt;br /&gt;&lt;br /&gt;It was a long chapter, about 40 pages, and he had comments all the way to the end of the chapter. He really took the time to review it.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Andy Barton just reviewed my Tiles chapter too. You Rock Andy! Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-105916890257891622?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105916890257891622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105916890257891622'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_07_01_archive.html#105916890257891622' title='Erik Hatcher and Andy Barton are awesome.'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-3569964.post-105892462736229545</id><published>2003-07-22T18:43:00.000-07:00</published><updated>2003-08-09T00:51:24.186-07:00</updated><title type='text'>Driven by Demons</title><content type='html'>I just read this quote from Erik's blog.&lt;br /&gt;&lt;br /&gt;From http://www.washingtonpost.com/wp-dyn/articles/A28471-2003Jun24.html: &lt;br /&gt;&lt;br /&gt;"All writers are vain, selfish and lazy, and at the very bottom of their motives there lies a mystery," he wrote in 1947. "Writing a book is a horrible, exhausting struggle, like a long bout of some painful illness. One would never undertake such a thing if one were not driven on by some demon whom one can neither resist nor understand." &lt;br /&gt;&lt;br /&gt;Wow... I could not agree more. (Except the lazy part....) &lt;br /&gt;Most great authors were drunkards or druggies. I either have to quit writing or don an addiction. I guess I never be great.&lt;br /&gt;&lt;br /&gt;Writing is a mental mind screw for sure. It is addictive and painful. Every time I write, I always wonder, will this be read, will this be liked, will it be helpful.... my usual self confidense gives way to doubt and fear of critisism.&lt;br /&gt;&lt;br /&gt;July 23rd&lt;br /&gt;11:35 PM&lt;br /&gt;&lt;br /&gt;It's my third night at the coffee shop. I've reached a new level of sleep deprived creativity. Did I mention that I am tired? I am considering going home to sleep. I got the monkey off my back by finishing the thing I needed to finish last night. Now I need to work on the next thing. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2:00 AM&lt;br /&gt;&lt;br /&gt;I am out of here. Can't focus. Can't continue. Caffiene not working....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3569964-105892462736229545?l=rickhightower.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.blogscene.org/erik' title='Driven by Demons'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105892462736229545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3569964/posts/default/105892462736229545'/><link rel='alternate' type='text/html' href='http://rickhightower.blogspot.com/2003_07_01_archive.html#105892462736229545' title='Driven by Demons'/><author><name>Rick Hightower</name><uri>http://www.blogger.com/profile/15451049723511388409</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry></feed>
