<?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-13341121</id><updated>2011-12-28T07:25:40.806-06:00</updated><category term='Swing'/><category term='web applications'/><category term='book reviews'/><category term='Filthy Rich Clients'/><category term='framework'/><category term='java stripes'/><category term='desktop'/><category term='java'/><category term='stripes'/><category term='interceptors'/><title type='text'>Big J. Little J. What Begins With J.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13341121.post-4799156031518137441</id><published>2008-02-06T09:02:00.000-06:00</published><updated>2008-02-06T09:05:42.388-06:00</updated><title type='text'>Powered By Stripes</title><content type='html'>Mark Page has created some wonderful Stripes logos.  Check them out &lt;a href="http://stripesframework.org/display/stripes/Website+Furniture"&gt;here&lt;/a&gt; and here are a couple of examples:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://weballistics.com/images/stripes/stripesbutton-builtusing.gif" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://weballistics.com/images/stripes/stripeslogo4.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-4799156031518137441?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/4799156031518137441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=4799156031518137441' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4799156031518137441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4799156031518137441'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2008/02/powered-by-stripes.html' title='Powered By Stripes'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-4240014488937831140</id><published>2008-02-06T08:52:00.000-06:00</published><updated>2008-02-06T08:56:43.358-06:00</updated><title type='text'>Stripes 1.5 Beta Available For Download</title><content type='html'>I just copied this straight from the mailing list announcement.&lt;br /&gt;&lt;br /&gt;Stripes 1.5 beta 1 is available for download:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=145476"&gt;http://sourceforge.net/project/showfiles.php?group_id=145476&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some of the major enhancements and bug fixes include:&lt;br /&gt;&lt;br /&gt;    * Even less configuration! Using the new Extension.Packages configuration parameter, Stripes can automatically locate and use your extensions (TypeConverter, Formatter, ExceptionHandler, ActionBeanContext, etc.). Most applications can now be configured with just two parameters: Extension.Packages and ActionResolver.Packages. Use the @DontAutoLoad annotation to tell Stripes to ignore an extension class.&lt;br /&gt;    * Clean URLs. Just declare URI parameters using, for example, @UrlBinding("/SomeBean/{foo}/{bar}.action") on your ActionBean. The parameters will appear as normal request parameters and will be validated, converted, and bound just like normal request parameters, too. Clean URLs are fully supported by s:link, s:url, and s:form.&lt;br /&gt;    * Binding access control. Annotate your ActionBean class with @StrictBinding to restrict binding only to those properties you wish to allow. @StrictBinding works with @Validate to determine which properties may be bound to. For special cases, the annotation also supports the "policy," "allow," and "deny" elements. More information can be found in the Javadocs.&lt;br /&gt;    * Easier Formatters and TypeConverters. In addition to improvements to the TypeConverterFactory and FormatterFactory APIs, Formatters and TypeConverters can now be loaded using autodiscovery (see above), eliminating the need to extend DefaultTypeConverterFactory and DefaultFormatterFactory. DefaultFormatterFactory has been improved so that it now provides support for inheritance and interfaces. For example, if a Formatter for List is registered, that formatter will be used for any type that implements List.&lt;br /&gt;    * DateTypeConverter improvements. A lot of work was put into making DateTypeConverter more robust.&lt;br /&gt;    * Transparent encryption of ActionBean property values. You can now use @Validate(encrypted=true) to cause ActionBean property values to be encrypted before being written to a page in a link or form input. This is meant for cases where you want to send a value back to the server with assurance that it is the same value that was written by the server.&lt;br /&gt;    * Validation error report. If an ActionBean is called and there are validation errors and no _sourcePage is given, Stripes will generate a nicely formatted report detailing the validation errors that occurred. This is a vast improvement over the StripesRuntimeException that used to be thrown, with no information as to what went wrong.&lt;br /&gt;    * New s:format tag can be used to format an object using a Formatter.&lt;br /&gt;    * Tags and Resolutions use Formatters. Where String.valueOf(object) used to be called, Stripes will now attempt to format the object using a Formatter and use String.valueOf() only as a last resort.&lt;br /&gt;    * @DontBind annotation to completely bypass both binding and validation for an event.&lt;br /&gt;    * @DontValidate no longer fails due to type conversion errors.&lt;br /&gt;    * Automatic detection of file upload provider. You can select your file upload implementation just by dropping it in. Commons-FileUpload takes precedence over COS if both libraries are present.&lt;br /&gt;    * Partial forms. The s:form tag supports a new attribute partial="true|false" that allows for partial forms nested inside another form tag. This facilitates AJAX code that returns HTML snippets to the client that might contain form inputs.&lt;br /&gt;    * Optional _sourcePage for links. By default, the _sourcePage parameter is no longer appended to URLs generated by s:url and s:link. This can be overridden with addSourcePage="true". The _sourcePage parameter is still included in forms.&lt;br /&gt;    * Encrypted _sourcePage. The _sourcePage parameter is encrypted to prevent revealing sensitive information about the structure of the app.&lt;br /&gt;    * Context-relative URLs. The s:link and s:url tags have a new attribute, prependContext="true|false", that can be used to generate URLs relative to the app context (when set to false). Relative URLs can be used with JSTL tags much more easily.&lt;br /&gt;    * Client cache control. The new @HttpCache annotation can be applied to an ActionBean class and/or event handler method to control how the client caches the response. Annotations on methods override those on classes and the annotation is inherited from superclasses. This is especially useful for AJAX calls from IE.&lt;br /&gt;    * Property labels with annotations. @Validate(label="Some property label") can be used during development to easily label ActionBean properties without having to add them to the resource bundle. Values from the resource bundle override those from the annotation.&lt;br /&gt;    * Automatic maxlength on text inputs. The maxlength attribute of a text input is automatically set if a value is specified by @Validate(maxlength=X).&lt;br /&gt;    * s:form supports s:param. Parameters can be added to a form URL by included s:param tags within the s:form tag. This is mostly intended for use with clean URLs, but it works with normal parameters as well.&lt;br /&gt;&lt;br /&gt;There are many more. The full list can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.stripesframework.org/jira/browse/STS?report=com.atlassian.jira.plugin.system.project:roadmap-panel"&gt;http://www.stripesframework.org/jira/browse/STS?report=com.atlassian.jira.plugin.system.project:roadmap-panel&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This release is not completely backward compatible with Stripes 1.4. Some changes to your code and configuration may be necessary. Tim has written up a document that will help with the process. It can be found here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stripes.svn.sourceforge.net/viewvc/*checkout*/stripes/trunk/upgrading.txt?revision=831"&gt;http://stripes.svn.sourceforge.net/viewvc/*checkout*/stripes/trunk/upgrading.txt?revision=831&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We encourage everyone to download and test this software out. Your feedback is very important. During the beta period we will be working on updating all the documentation. Any corrections or contributions are greatly appreciated.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-4240014488937831140?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/4240014488937831140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=4240014488937831140' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4240014488937831140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4240014488937831140'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2008/02/stripes-15-bete-available-for-download.html' title='Stripes 1.5 Beta Available For Download'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6063199915375769381</id><published>2008-01-31T12:50:00.000-06:00</published><updated>2008-01-31T13:51:56.304-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><title type='text'>Stripes 1.5 Feature: General Improvements</title><content type='html'>My last two Stripes articles covered &lt;a href="http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-clean-urls.html"&gt;Clean URLs&lt;/a&gt; and &lt;a href="http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-control-binding-with.html"&gt;@StrictBinding&lt;/a&gt;.  Today I am going a bit more general and discussing several of the smaller improvements.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Disclaimer - We know that other web frameworks have had some of these features in some form or fashion so please don't comment with "ZZZ Framework has been doing that for years.". We know. We get it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@DontValidate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This annotation has been in Stripes for a while.  We would typically use this for cancel events or just any event where you don't want validation to occur.  The problem however was that type converting still happens and if it fails errors are generated and your event won't complete.  This has been changed in 1.5 so now @DontValidate will also ignore type conversion.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;@DontBind&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yesterday I talked about @StrictBinding and how you can control data binding using the annotation and validation.  Since @StrictBinding is a class level annotation it makes it nearly impossible to do this on a per event basis.  @DontValidate helps but binding still occurs.  @DontBind implies @DontValidate and does not attempt any binding of data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@HttpCache&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Back in November of last year I &lt;a href="http://greggbolinger.blogspot.com/2007/11/stripes-interceptor-tutorial.html"&gt;blogged&lt;/a&gt; about how easy it is to create an interceptor for Stripes and we created the @NoCache interceptor.  This interceptor has been added to Stripes core in 1.5 but with a twist.  It is now called @HttpCache and you can control the no-cache and expires parameters via annotation attributes.  Lets look at an example.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@HttpCache(expires=600)&lt;br /&gt;public Resolution ajaxUpdate() {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The above example will allow caching but expires the document in 10 minutes.  &lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@HttpCache(allow=false)&lt;br /&gt;public Resolution ajaxUpdate() {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The above example disables caching and immediately expires the document.  This comes in really handy when returning Resolutions to AJAX requests (especially in IE).  @HttpCache can be applied at the class or method level.  Method level annotations will always override class level annotations.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;@Before/@After&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;These annotations have been available in Stripes for a while but now can be set to run on certain events.  Lets look at an example.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@After(on = {&amp;quot;save&amp;quot;,&amp;quot;edit&amp;quot;}, stages = LifecycleStage.BindingAndValidation)&lt;br /&gt;public Resolution runAfterBinding() {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The above method will only execute on the &lt;span style="font-style:italic;"&gt;save &lt;/span&gt;and &lt;span style="font-style:italic;"&gt;edit &lt;/span&gt;events.  Multiple LifecycleStages can also be specified.  @Before works the same way.&lt;br /&gt;&lt;br /&gt;There are also quite a few more subtle but significant changes.  Here they are in no particular order of importance.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When you create a link that doesn't pass validation and there is no _sourcePage to go to, you get a nice validation error report that tells you what you did wrong instead of getting a StripesRuntimeException and having to jump through hoops to figure it out&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Incoming requests are no longer wrapped multiple times when you map StripesFilter on FORWARD. Solves problems that existed with wrapping multipart requests more than once (big explosion) and other silly issues that would occasionally arise from wrapping multiple times.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Enhanced checking of stuff (multiple @Validate, multiple @DefaultHandler) etc.  Stripes now does a much better job at notifying you about trivial issues that can be a pain to track down.  For example if you annotated two methods with @DefaultHandler Stripes would just pick one and determining why you weren't getting the expected results was time consuming.  Now Stripes will throw an exception and tell you exactly what the problem is.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Reduced Session use.  Stripes used to store encryption keys in the HttpSession.  Now that it doesn't stripes doesn't force session creation of any kind.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Lots of changes with classpath scanning so that Stripes plays nicer with container/custom class loaders.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Most things in Stripes can be easily overridden to support a wide array of scenarios we can come up with as web developers.  ActionResolver, ActionBeanContext, TypeConverters, just to name a few. While Stripes prides itself on zero ActionBean configuration you still need to specify init params for the Stripes Filter in the web.xml and that includes any core classes you want replaced with your own custom versions.  Stripes now offers an init param, Extension.Packages, that accepts a comma separated list of packages where Stripes will auto discover and load any custom classes that would override Stripes default classes.  This can significantly reduce the amount of configuration required in the web.xml&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There are a few more enhancements that need to be discusses however they require their own articles respectively.  I hope everyone is enjoying these articles.  More to come in the days ahead, I assure you.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6063199915375769381?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6063199915375769381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6063199915375769381' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6063199915375769381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6063199915375769381'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-general-improvements.html' title='Stripes 1.5 Feature: General Improvements'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-933148766246626714</id><published>2008-01-30T14:44:00.000-06:00</published><updated>2008-01-31T08:55:28.711-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><title type='text'>Stripes 1.5 Feature: Control Binding with @StrictBinding</title><content type='html'>If you missed yesterday's article on Clean URLs you can find it &lt;a href="http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-clean-urls.html"&gt;here&lt;/a&gt;.  Today I want to talk about how we can control what values get bound in an Action Bean when we submit a form.  And once again;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Disclaimer - We know that other web frameworks have had some of these features in some form or fashion so please don't comment with "ZZZ Framework has been doing that for years.". We know. We get it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.stripesframework.org"&gt;Stripes &lt;/a&gt;team has added a very useful annotation as well as some supporting changes to an existing annotation to provide a first line of defense against hackers.  This annotation is @StrictBinding.  This is a class level annotation and uses the @Validate annotation as support.  First we can look at a basic example:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@StrictBinding&lt;br /&gt;public class RegisterActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt;   private User user;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this example any values submitted by a form to this action bean won't be bound at all.  Hmm, not very useful. So lets tweak it a bit.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@StrictBinding(allow=&amp;quot;*&amp;quot;)&lt;br /&gt;public class RegisterActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt;   private User user;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will allow binding to any top level properties in user.  However, nested properties are ignored.  Not quite what we need yet.  One more modification.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@StrictBinding(allow=&amp;quot;**&amp;quot;)&lt;br /&gt;public class RegisterActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt;   private User user;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Alright, the double * in the allow attribute says bind everything, no matter how nested.  Another way to achieve the same thing is to use defaultPolicy=Policy.ALLOW instead of "allow".  If we need finer grained control we can also use the "deny" attribute.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@StrictBinding(allow=&amp;quot;**&amp;quot;, deny=&amp;quot;user.role.id&amp;quot;)&lt;br /&gt;public class RegisterActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt;   private User user;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This allows everything to bind except for user.role.id because we don't want a new user to be able to specify their own security level by adding parameters sent to the server.  That would be bad.  And with that I think you can see the benefit of @StrictBinding.  It is a good first line defense mechanism.  But we're not done yet.&lt;br /&gt;&lt;br /&gt;@StrictBinding all by itself can handle anything you need however the preferred way to control binding is with @StrictBinding + @Validate.  Lets look at another example.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;@StrictBinding&lt;br /&gt;public class RegisterActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt;   @ValidateNestedProperties({&lt;br /&gt;      @Validate(field=&amp;quot;username&amp;quot;, required=true),&lt;br /&gt;      @Validate(field=&amp;quot;password&amp;quot;, required=true),&lt;br /&gt;      @Validate(field=&amp;quot;firstName&amp;quot;, required=true),&lt;br /&gt;      @Validate(field=&amp;quot;lastName&amp;quot;, required=true)&lt;br /&gt;   })&lt;br /&gt;   private User user;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;First we turn off all binding using the simplest form of @StrictBinding.  Then, we control the binding with validation.  Any property being validated is bound.  Everything else is ignored.  &lt;br /&gt;&lt;br /&gt;As always data should be sanitized but with the addition of @StrictBinding, Stripes provides a very elegant first line of defense against intruders.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-933148766246626714?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/933148766246626714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=933148766246626714' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/933148766246626714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/933148766246626714'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-control-binding-with.html' title='Stripes 1.5 Feature: Control Binding with @StrictBinding'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-586770480063535362</id><published>2008-01-29T10:09:00.000-06:00</published><updated>2008-01-31T08:55:54.684-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><title type='text'>Stripes 1.5 Feature: Clean URLs</title><content type='html'>So I promised a list of some new features coming in &lt;a href="http://www.stripesframework.org"&gt;Stripes&lt;/a&gt; 1.5. Since several of them require some explanation to really get the point across I decided to do a daily article about each of the major feature improvements and then one final article on the smaller things.  I finally found a bit of time so here is the first one.  Stripes 1.5 is coming along really well.  The developers have been committing code like crazy the past month.  We should be seeing a beta release really soon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Disclaimer - We know that other web frameworks have had some of these features in some form or fashion so please don't comment with "ZZZ Framework has been doing that for years.".  We know.  We get it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Clean URLs have been possible in Stripes for a while through an add on.  However, with Stripes 1.5 they will be an optional feature in the core API.  As you may or may not know currently you can define a URL Binding for a Stripes action one of 2 ways.  You can let Stripes handle it by inspecting the package and class name and binding it for you or you can explicitly set it using the @UrlBinding annotation.  With clean URLs @UrlBinding is required.  The format is something like:&lt;br /&gt;&lt;br /&gt;@UrlBinding("/action/blog/{$event}/{blog.id}")&lt;br /&gt;public class BlogActionBean...&lt;br /&gt;&lt;br /&gt;The resulting URL to edit a blog entry would be:&lt;br /&gt;&lt;br /&gt;http://.../app/action/blog/edit/1234&lt;br /&gt;&lt;br /&gt;If the event is null it is ignored as well as any given parameter.  So a URL like:&lt;br /&gt;&lt;br /&gt;http://.../app/action/blog&lt;br /&gt;&lt;br /&gt;would result in calling the Default Handler for the BlogActionBean.  Support for default parameter values are also available.&lt;br /&gt;&lt;br /&gt;@UrlBinding("/action/blog/{$event}/{blog.id=1234")&lt;br /&gt;&lt;br /&gt;So accessing the url&lt;br /&gt;&lt;br /&gt;http://.../app/action/blog&lt;br /&gt;&lt;br /&gt;blog.id will have a value of 1234 however if you pass in a blog.id value it will override the default.  Default values for {$event} can also be given.  This overrides the @DefaultHandler method if one exists.  Otherwise, the @DefaultHandler method is executed.&lt;br /&gt;&lt;br /&gt;If you still prefer extensions on your URLs, support for that is also available.  The change to the URL binding is trivial:&lt;br /&gt;&lt;br /&gt;@UrlBinding("/blog/{$event}/{blog.id}.action")&lt;br /&gt;&lt;br /&gt;Stripes JSP tags &amp;lt;s:url /&amp;gt;, &amp;lt;s:link /&amp;gt;, and &amp;lt;s:form /&amp;gt; all support Clean URLs.  For example:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;s:link beanclass=&amp;quot;com.app.foo.BlogActionBean&amp;quot; event=&amp;quot;edit&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;s:param name=&amp;quot;blog.id&amp;quot;&amp;gt;1234&amp;lt;/s:param&amp;gt;&lt;br /&gt;    Edit&lt;br /&gt;&amp;lt;/s:link&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Will result in:&lt;br /&gt;&lt;br /&gt;&amp;lt;a href="/app/action/blog/edit/1234"&amp;gt;Edit&amp;lt/a&amp;gt;&lt;br /&gt;&lt;br /&gt;And that is pretty much it for Clean URLs in Stripes 1.5.  Very simple, elegant, and as good as the next guys.  Possibly better?  Let me know.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-586770480063535362?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/586770480063535362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=586770480063535362' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/586770480063535362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/586770480063535362'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-clean-urls.html' title='Stripes 1.5 Feature: Clean URLs'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-2779280558178060159</id><published>2007-12-19T11:55:00.000-06:00</published><updated>2007-12-19T12:00:05.583-06:00</updated><title type='text'>Stripes (1.5) Updates Are Coming...</title><content type='html'>There's been a lot going on with &lt;a href="http://stripes.mc4j.org/confluence/display/stripes/Home"&gt;Stripes &lt;/a&gt;lately.  A lot of users have been asking when 1.5 is due out.  I don't believe there is a set date yet but I do know that something is coming quickly.  There's a lot of new features and improvements in the trunk right now that are making it into 1.5.  I'm going to try and get together a list and post them here with explinations.&lt;br /&gt;&lt;br /&gt;Also, there will be a new website (http://www.stripesframework.org).  The current website (wiki) will still be there with all the wonderful documentation that Stripes is known for but now there will be a more elegant entry point.&lt;br /&gt;&lt;br /&gt;So check back and I'll see if I can gather up that feature/improvement list for my next post.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-2779280558178060159?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/2779280558178060159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=2779280558178060159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/2779280558178060159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/2779280558178060159'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/12/stripes-15-updates-are-coming.html' title='Stripes (1.5) Updates Are Coming...'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-4737088822693860183</id><published>2007-11-16T14:32:00.000-06:00</published><updated>2008-01-31T08:56:18.498-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><title type='text'>Stripes TypeConverters: Populating Domain Objects</title><content type='html'>Most web frameworks today have type converters. Type converters are chunks of code that takes query parameters as Strings and convert them into their appropriate data type.  So numbers become Integers, dates become Dates, etc.  Most frameworks also allow you to create custom type converters.  For example, you might want to convert a currency form field into a Money object.  That's all well and good.  But we can take it a bit further with Stripes.&lt;br /&gt;&lt;br /&gt;A common scenario in the web world is requesting data from the server and displaying it on the page.  I mean, really, all web applications do is send data and get data and display the data they got.  Nothing too complex.  How we populate domain objects based on query parameters is where everyone's code can differ.  Most common is for an action to process the query parameters and we get the one(s) we need and use them to lookup information in a database, shove those into some domain objects or properties of some sort, throw them in the request and forward to our view.  Again, nothing too complex.&lt;br /&gt;&lt;br /&gt;There are many times when we need to populate the same domain object(s) based on the same parameter on many different pages.  I'll set up a scenario that we can use throughout the rest of this article.  You created a User management screen.  Displaying a list of users you want to edit one.  The query parameter you pass in is the user.id.  So we might have some code in our Stripes action bean that looks something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private User user;&lt;br /&gt;private UserDao userDao;&lt;br /&gt;&lt;br /&gt;public User getUser()&lt;br /&gt;{&lt;br /&gt;   return this.user;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setUser(User user)&lt;br /&gt;{&lt;br /&gt;   this.user = user;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@SpringBean("userDao")&lt;br /&gt;public void setUserDao(UserDao userDao)&lt;br /&gt;{&lt;br /&gt;   this.userDao = userDao;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Resolution edit()&lt;br /&gt;{&lt;br /&gt; user = UserDao.getUser(user.getId());&lt;br /&gt; return new ForwardResolution(EDIT_USER_PAGE);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;We could of course also discuss the pros and cons of doing the same thing in a method annotated with @After/@Before but for the sake of simplicity we'll say that's possible as well and move on.&lt;br /&gt;&lt;br /&gt;So the client comes back and decides that they need an additional page where the administrator can click on a product and see all the users that purchased this product.  And further more he can click on a user and view some details about that user.  We begin to build the new action and view and notice that we've got to duplicate some code we just wrote.  We need the UserDao again and we need to do a lookup so we copy and paste, test it, it works.  Yea!  And then we need another page, and another page, and we copy and paste and copy and paste.  At this point we've got the same code written 10 times.  That's bad.  So we decide hey, we are using Stripes, let's use a TypeConverter to do this.&lt;br /&gt;&lt;br /&gt;Stripes has a TypeConverter interface that requires two methods:&lt;br /&gt;&lt;br /&gt;convert(String input, Class&lt;? extends T&gt; targetType, Collection&lt;ValidationError&gt; errors) &lt;br /&gt;setLocale(Locale locale) &lt;br /&gt;&lt;br /&gt;We are only going to worry about convert right now.  So we begin our custom type converter:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class UserTypeConverter implements TypeConverter&lt;User&gt;&lt;br /&gt;{&lt;br /&gt;   private UserDao userDAo;&lt;br /&gt;   &lt;br /&gt;   @SpringBean("userDao")&lt;br /&gt;   public void setUserDao(UserDao userDao)&lt;br /&gt;   {&lt;br /&gt;       this.userDao = userDao;&lt;br /&gt;   }   &lt;br /&gt;&lt;br /&gt;   public User convert(String id, Class&lt;? extends USer&gt; user, Collection&lt;ValidationError&gt; error)&lt;br /&gt;   {&lt;br /&gt;      if (id != null)&lt;br /&gt;      {&lt;br /&gt;          User user = userDao.getUser(id);&lt;br /&gt;          return user;&lt;br /&gt;      }&lt;br /&gt;      return null;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is pretty straightforward.  We are just looking the user up from our UserDao using an id.  But how does that id get there?  Pretty simple as well.  Let's look at our action again, only this time using the converter.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;User user;&lt;br /&gt;&lt;br /&gt;public void setUser(User user)&lt;br /&gt;{&lt;br /&gt;   this.user = user;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public User getUser()&lt;br /&gt;{&lt;br /&gt;   return this.user;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public Resolution edit()&lt;br /&gt;{&lt;br /&gt;    return new ForwardResolution(EDIT_USER_PAGE);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And the URL might looking something like this:&lt;br /&gt;&lt;br /&gt;http://localhost:8080/app/User.action?edit=&amp;user=1234&lt;br /&gt;&lt;br /&gt;Anytime the id is not null, user gets populated.  If it is null, for example when adding a new user, user will only be populated from the normal form to object binding that Stripes normally does.  But how does our action know that User is supposed to use the UserTypeConverter?  Well, if we weren't needing the Spring Bean injection magic would could have simply done this in our action.&lt;br /&gt;&lt;br /&gt;@Validate(converter=UserTypeConverter.class)&lt;br /&gt;User user;&lt;br /&gt;&lt;br /&gt;But since we need the Spring Bean magic we need to create our own TypeConverterFactory.  Again, another interface.  Stripes uses a default to init all the built in type converters.  Here is what one might look like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class CustomTypeConverterFactory extends DefaultTypeConverterFactory &lt;br /&gt;{&lt;br /&gt;    public TypeConverter getInstance(Class&lt;? extends TypeConverter&gt; clazz, Locale locale) throws Exception &lt;br /&gt;    {&lt;br /&gt;        TypeConverter tc = super.getInstance(clazz, locale);&lt;br /&gt;        ServletContext sc = getConfiguration().getServletContext();&lt;br /&gt;        &lt;br /&gt;        SpringHelper.injectBeans(tc, sc);&lt;br /&gt;        &lt;br /&gt;        return tc;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void init(Configuration configuration) {&lt;br /&gt;        super.init(configuration);&lt;br /&gt;        add(User.class, UserTypeConverter.class);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And then we need to tell Stripes to use our CustomTypeConverterFactory.  In the web.xml in the StripesFilter init-params add the following param-name:&lt;br /&gt;&lt;br /&gt;TypeConverterFactory.Class&lt;br /&gt;&lt;br /&gt;and param-value:&lt;br /&gt;&lt;br /&gt;com.app.package.foo.CustomTypeConverterFactory&lt;br /&gt;&lt;br /&gt;And we're done.  Comments welcome.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-4737088822693860183?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/4737088822693860183/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=4737088822693860183' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4737088822693860183'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4737088822693860183'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/11/stripes-typeconverters-populating.html' title='Stripes TypeConverters: Populating Domain Objects'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6832756019950746544</id><published>2007-11-15T09:52:00.000-06:00</published><updated>2007-11-15T09:54:15.083-06:00</updated><title type='text'>Spring's DAO Support..Other choices?</title><content type='html'>I've gotten really spoiled to Spring's DAO support classes, Transaction management, etc.  But as any good developer should I begin to wonder what alternatives are out there?  Do java developers have another choice aside from rolling our own?&lt;br /&gt;&lt;br /&gt;Just looking for comments.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6832756019950746544?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6832756019950746544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6832756019950746544' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6832756019950746544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6832756019950746544'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/11/springs-dao-supportother-choices.html' title='Spring&apos;s DAO Support..Other choices?'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6568385046806260936</id><published>2007-11-12T22:23:00.000-06:00</published><updated>2008-01-31T08:56:47.081-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='stripes'/><category scheme='http://www.blogger.com/atom/ns#' term='interceptors'/><title type='text'>Stripes Interceptor Tutorial</title><content type='html'>&lt;div&gt;&lt;span style="font-weight: bold;"&gt;Note: I still can't get code to display very well on blogger.  Sorry for the formatting issues.  If you need to the source code is linked at the bottom of this article if it makes it easier to follow along.&lt;/span&gt;      &lt;p&gt;     I've been using &lt;a href="http://mc4j.org/confluence/display/stripes/Home"&gt;Stripes&lt;/a&gt; for both large and small applications for about a     year.  While I am of the camp that there is no golden hammer I've not     run across a project I am involved with where Stripes doesn't make sense.      I've been wanting to write more articles on Stripes.  While the     documentation on the site is great for folks to get started it is lacking in     the area of best practices and general tutorials on different aspects of the     framework.  One of my favaorite things about Stripes (and there are     many) is how easy it is to extend the framework to suit my needs and     most of the time I don't even need to dig into the source.  A lot of     tiimes that power comes in the form of an Interceptor.    &lt;/p&gt;      &lt;p&gt;     Interceptors are not a new concept.  I believe my first experince with     them in web applications was when working with WebWork several years ago.      Stripes has a couple of Interceptors already:&lt;br /&gt;&lt;/p&gt;   &lt;ul&gt;&lt;li&gt;       &lt;span lang="en-US"&gt; SpringInterceptor - Allows you to inject Spring Beans       into controllers using the @SpringBean method level annotation.&lt;/span&gt;     &lt;/li&gt;&lt;li&gt;       &lt;span lang="en-US"&gt; BeforeAfterMethodInterceptor - Allows you to execute       methods before and/or after specific Lifecycle Stages using @Before and       @After method level annotations (AOP like behavior)&lt;/span&gt;     &lt;/li&gt;&lt;/ul&gt;      &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;&lt;span lang="en-US"&gt;&lt;b&gt;Note: Both the Interceptors mentioned above work in     combination with annotations but not all have to.&lt;/b&gt;&lt;/span&gt;&lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;            &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;In this article I want to show how to create an     interceptor and we'll also create an annotation that will be used with the     interceptor.&lt;/span&gt;&lt;span lang="en-US"&gt;  I'll identify a problem that Stripes by     itself doesn't solve and show how to implement the solution with a simple     Interceptor.  At times you may see mention of concepts that you won't     be familiar with if not familiar with Stripes.  While I'll try and     explain these a bit as I go I may link to the Stripes documentation on the     subject so as not to repeat information.  I also want to keep this     article as concise and to the point as possible.&lt;br /&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p style="margin-left: 0pt; text-indent: 0pt; font-weight: bold;"&gt;     &lt;span lang="en-US"&gt;The Problem&lt;/span&gt;   &lt;/p&gt;   &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Ajax is everywhere and one common problem I've run into in     the past is dealing with the browser caching the response from an ajax     request.  This seems to happen more often than not in Internet     Explorer.  What we want is to prevent this as much as possible when     needed.&lt;br /&gt;&lt;/span&gt;   &lt;/p&gt;      &lt;p style="margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p style="margin-left: 0pt; text-indent: 0pt; font-weight: bold;"&gt;     &lt;span lang="en-US"&gt;Typical Solutions&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Probably the most common talked about solution is appending     a random number on the end of the request.  This tricks the browser     into thinking it is a different response.  Wikipedia's entry on     XmlHttpRequest offers a different and slightly more complex solution which     you can read about here:     http://en.wikipedia.org/wiki/Xmlhttprequest#Caching.  The problem with     that is most of us are using a JavaScript library like jQuery or Prototype     and that would cause us to go hacking inside their code. Not ideal.      And another approache is to add header information to the response.      In java it goes something like this:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;HttpServletResponse response =     context.getResponse();&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;response.setDateHeader("Expires", 0);&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;response.setHeader("Cache-control", "no-cache");&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;response.setHeader("Pragma", "no-cache");&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Finding a centralized place for that code is the key.      One solution on the Stripes mailing list was having a disableCaching()     method in an ActionBean base class.  When you wanted this to execute     you would do something like this:&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;@Before(stages = LifecycleStage.ResolutionExecution)&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;    @Override&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;    protected void disableCaching() {&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;            super.disableCaching();&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;    }&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;And while that works it is a bit more verbose than need     be.&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt; font-weight: bold;"&gt;     &lt;span lang="en-US"&gt;The Interceptor Solution&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;What we want to do is take the above code and centralize it     in an Interceptor that executes on the     &lt;/span&gt;&lt;span lang="en-US"&gt;LifecycleStage.ResolutionExecution stage however we     want to be able to control when the code gets executed.  To do this we     need two things:&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;ol&gt;&lt;li dir="ltr" style="text-align: left;"&gt;       &lt;span lang="en-US"&gt; @NoCache annotation - We'll use this on methods to       denote we want no caching.  We'll also allow a boolean argument to       indicate whether it should be on or off.  This is important if we       want to override a class level annotation on one or more methods.&lt;br /&gt; &lt;/span&gt;     &lt;/li&gt;&lt;li dir="ltr" style="text-align: left;"&gt;       &lt;span lang="en-US"&gt; NoCacheInterceptor - We'll use this to check for the       @NoCache annotation and shove the no cache header directives into the       response.&lt;/span&gt;     &lt;/li&gt;&lt;/ol&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;The @NoCache annotation is pretty straightfoward:&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;@Retention(RetentionPolicy.RUNTIME)&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;@Target( {ElementType.METHOD, ElementType.TYPE})&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;@Documented&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;public @interface NoCache&lt;br /&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;{&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;         boolean value() default true;&lt;span lang="en-US"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;}&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Save that in a file called NoCache.java in whatever package     you desire.&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Next is the interceptor which requires a bit more     discussion.  A Stripes interceptor implements an interface called     Interceptor.  Interceptor requires one method be implemented; public     Resolution intercept(ExecutionContext ctx) throws Exception.  Stripes     will call this method on any configured interceptor during the specified     LifecycleStage.  Whoa, how do we specify the LifecycleStage?      Whoa!!! What's with all this LifecycleStage talk?&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;Segway..Stripes has five Lifecycle Stages.  Instead of     repeating what is already well documented I'll let you read about them at     your lesiure &lt;a href="http://mc4j.org/confluence/display/stripes/Lifecycles+Etc"&gt;here.&lt;/a&gt;&lt;/span&gt;   &lt;/p&gt;      &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;And we're back...So we need to create this Interceptor and     tell it when to execute the intercept method.  We do that by specifying     an annotation at the class level:&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;@Intercepts(LifecycleStage.ResolutionExecution)&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;public class NoCacheInterceptor implements Interceptor     {&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt; ...&lt;/span&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;     &lt;span lang="en-US"&gt;}&lt;/span&gt;&lt;/p&gt;      Now we should define our intercept method:&lt;br /&gt;&lt;br /&gt;public Resolution intercept(ExecutionContext ctx) throws Exception {&lt;br /&gt; ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Inside this method we need to define several objects we are going to use:&lt;br /&gt;&lt;br /&gt;(1) final Configuration config = StripesFilter.getConfiguration();&lt;br /&gt;(2) final ActionResolver resolver = config.getActionResolver();&lt;br /&gt;(3) final ActionBeanContext context = ctx.getActionBeanContext();&lt;br /&gt;(4) final ActionBean actionBean = resolver.getActionBean(context);&lt;br /&gt;(5) final Class beanClass = actionBean.getClass();&lt;br /&gt;(6) final String eventName = resolver.getEventName(beanClass, context);&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;       The Stripes Configuration class holds all the configuration information       passed into Stripes from the web.xml.  This includes all configured       Interceptors.     &lt;/li&gt;&lt;li&gt;       The ActionResolver will allows us to get which Method was requested from       the ActionBean during the request.     &lt;/li&gt;&lt;li&gt;       The ActionBeanContext is used to help us get an instance of the requested       ActionBean     &lt;/li&gt;&lt;li&gt;       The requested ActionBean.     &lt;/li&gt;&lt;li&gt;       We need the actual Class.     &lt;/li&gt;&lt;li&gt;       The eventName or requested method to call.     &lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The next thing we need to do is get the Method or handler if the eventName   doesn't exist.  The reason for this is because if you request a URL and   there is no eventName specified Stripes will look for a default handler which   is a method denoted by the @DefaultHandler annotation.  And then if this   doesn't exist we need to throw an error and inform the user.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Good Practice: All ActionBeans should have a default handler in case an   eventName was not given.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;final Method handler;&lt;br /&gt;     if (eventName != null) {&lt;br /&gt;         handler =   resolver.getHandler(beanClass, eventName);&lt;br /&gt;     } else {&lt;br /&gt;         handler =   resolver.getDefaultHandler(beanClass);&lt;br /&gt;         if (handler != null)   {&lt;br /&gt;               context.setEventName(resolver.getHandledEvent(handler));&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     // Insist that we have a handler&lt;br /&gt;     if (handler == null) {&lt;br /&gt;         throw new   StripesServletException(&lt;br /&gt;                   "No handler method found for request with  ActionBean   ["&lt;br /&gt;                           + beanClass.getName()   + "] and eventName [ "&lt;br /&gt;                           + eventName + "]");&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;Don't worry too much about understanding every bit of that.  Just know   that we need the handler and we need to throw an error if one doesn't   exist.  The next thing we need to do is actually look for the @NoCache   annotation.  If we find it we set the no cache header junk and tell the   ExecutionContext to proceed with the request.&lt;br /&gt;&lt;br /&gt;if (isCachingDisabled(handler, beanClass)) {&lt;br /&gt;     HttpServletResponse response =   context.getResponse();&lt;br /&gt;     response.setDateHeader("Expires", 0);&lt;br /&gt;     response.setHeader("Cache-control",   "no-cache");&lt;br /&gt;     response.setHeader("Pragma",   "no-cache");&lt;br /&gt;}&lt;br /&gt;return ctx.proceed();&lt;br /&gt;&lt;br /&gt;Now we'll look at the isCachingDisabled method.  We pass this method the   handler and also the beanClass.&lt;br /&gt;&lt;br /&gt;protected boolean isCachingDisabled(Method method, Class beanClass) {&lt;br /&gt;....&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;To make sure that we are as performant as possible Stripes caches interceptor   instances.  Because of this we can also cache data within the   interceptor.  In this case once a @NoCache annotation has been found we   want to cache this fact so the next time this interceptor is run with this   beanClass we can just check the cache and not have to go through the   annotation reflection checks.  We first want to check the handler   (Method) being called because it override class level annotations.  If no   annotation is found then we check for a class annotation.&lt;br /&gt;&lt;br /&gt;So first, lets check the cache:&lt;br /&gt;&lt;br /&gt;CacheKey cacheKey = new CacheKey(method, beanClass);&lt;br /&gt;Boolean disabled = cache.get(cacheKey);&lt;br /&gt;if (disabled != null) {&lt;br /&gt; return disabled;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Don't worry about CacheKey yet.  It's a simple class and we'll discuss it   last.  So if we found cache we return the value we found.    Otherwise, we need to check for the annotation:&lt;br /&gt;&lt;br /&gt;NoCache annotation = method.getAnnotation(NoCache.class);&lt;br /&gt;if (annotation != null) {&lt;br /&gt; disabled = annotation.value();&lt;br /&gt;} else {&lt;br /&gt; // search the method's class and its superclasses&lt;br /&gt; Class clazz = beanClass;&lt;br /&gt; do {&lt;br /&gt;     annotation =   clazz.getAnnotation(NoCache.class);&lt;br /&gt;     clazz = clazz.getSuperclass();&lt;br /&gt; } while (clazz != null &amp;amp;&amp;amp; annotation == null);&lt;br /&gt;&lt;br /&gt; if (annotation != null) {&lt;br /&gt;     disabled = annotation.value();&lt;br /&gt; } else {&lt;br /&gt;      disabled = false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;So basically we look for an annotation on the method.  If we find it we   return its value.  Otherwise, we check the class.  We also want to   check all super classes incase the user is extending a Base ActionBean of   sorts.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Good Practice: Creating a BaseActionBean and having all your ActionBeans   extend that base class will save a lot of boilerplace code and make developing   with Stripes a lot simpler.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So once we either find an annotation or not we want to cache it and then   return what we found:&lt;br /&gt;&lt;br /&gt;cache.put(cacheKey, disabled);&lt;br /&gt;return disabled;&lt;br /&gt;&lt;br /&gt;The last thing for code is the CacheKey class.  We want to make sure that   we store unique keys when checking for cache.  That way we always know we   have the correct cache for the correct beanClass that was requested.    Here's the class.  I just make it an inner class of the interceptor.&lt;br /&gt;&lt;br /&gt;private static final class CacheKey {&lt;br /&gt;     private Method method;&lt;br /&gt;     private Class beanClass;&lt;br /&gt;     private int hashCode;&lt;br /&gt;&lt;br /&gt;     public CacheKey(Method method,   Class beanClass) {&lt;br /&gt;         super();&lt;br /&gt;         this.method = method;&lt;br /&gt;         this.beanClass =   beanClass;&lt;br /&gt;         this.hashCode =   method.hashCode() * 37 + beanClass.hashCode();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     @Override&lt;br /&gt;     public boolean equals(Object obj) {&lt;br /&gt;         CacheKey that =   (CacheKey) obj;&lt;br /&gt;         return   this.method.equals(that.method)&lt;br /&gt;                   &amp;amp;&amp;amp; this.beanClass.equals(that.beanClass);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     @Override&lt;br /&gt;     public int hashCode() {&lt;br /&gt;         return hashCode;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     @Override&lt;br /&gt;     public String toString() {&lt;br /&gt;         return   beanClass.getName() + "." + method.getName();&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note: In Stripes 1.5, yet to be released, there will be a core set of   interceptors on by default.  This NoCache interceptor will be one of them   along with BeforeAfterMethodInterceptor.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;And that's it.  Now to use it you might do something like this:&lt;br /&gt;&lt;br /&gt;public class SomeActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt; @NoCache&lt;br /&gt; public Resolution ajaxEvent() {&lt;br /&gt;    // return some ajaxy stuff here&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;If you needed all but one method to turn caching off you might do something   like this:&lt;br /&gt;&lt;br /&gt;@NoCache&lt;br /&gt;public class SomeActionBean extends BaseActionBean {&lt;br /&gt;&lt;br /&gt; @NoCache(false)&lt;br /&gt; public Resolution ajaxEvent() {&lt;br /&gt;    // return some ajaxy stuff here&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;I've included the full source for the interceptor and annotation at the   following URL.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.paradigmcoders.net/projects/article/stripes/NoCache.tar.gz"&gt;NoCache.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;   &lt;p dir="ltr" style="text-align: left; margin-left: 0pt; text-indent: 0pt;"&gt;   &lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6568385046806260936?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6568385046806260936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6568385046806260936' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6568385046806260936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6568385046806260936'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/11/stripes-interceptor-tutorial.html' title='Stripes Interceptor Tutorial'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-2851079814987041243</id><published>2007-10-15T22:54:00.000-05:00</published><updated>2007-10-15T23:15:40.153-05:00</updated><title type='text'>JavaRebel: Interesting but still iffy</title><content type='html'>I tried &lt;a href="http://www.zeroturnaround.com/javarebel/"&gt;JavaRebel &lt;/a&gt;today and for the most part it does what it says.  It was really cool to see a single class updated in Tomcat without Tomcat reloading the application.  However, there were a couple of gotchas that I am not sure how to overcome if possible at all.&lt;br /&gt;&lt;br /&gt;1.  For some reason a fellow developer where I work needed to get the package name of a class at runtime.  So we have getClass().getPackage().getName();  Once JavaRebel is in place getPackage() returns null.  Remove JavaRebel and it works fine.  I assume this has something to do with a class wrapper.  &lt;br /&gt;&lt;br /&gt;2.  I primarily use &lt;a href="http://mc4j.org/confluence/display/stripes/Home"&gt;Stripes &lt;/a&gt;and one of the things Stripes tries to do is cache configuration information at startup.  For example, to inject a Spring Bean into a Stripes ActionBean I simply provide an @SpringBean for a bean setter.  If I decide to inject a new/different Spring Bean into the ActionBean, even though it already exists in the spring context, the class reloads but Stripes doesn't know about it.  Is this a JavaRebel flaw?  No, not really.  As I said, it works as stated.  But this does limit the effectiveness for me.&lt;br /&gt;&lt;br /&gt;I still think it is slick and I am anxious to see how java development improves for us web developers as JavaRebel improves.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-2851079814987041243?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/2851079814987041243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=2851079814987041243' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/2851079814987041243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/2851079814987041243'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/10/javarebel-interesting-but-still-iffy.html' title='JavaRebel: Interesting but still iffy'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-4321159434324232213</id><published>2007-10-11T10:45:00.000-05:00</published><updated>2007-10-11T10:49:50.430-05:00</updated><title type='text'>Stripes Presentation KC JUG Post Mortem</title><content type='html'>Last night's presentation on &lt;a href="http://mc4j.org/confluence/display/stripes/Home"&gt;Stripes&lt;/a&gt; at the Kansas City Java Users Group went well.  It was my first time doing that kind of a presentation.  There was quite a bit of code to discuss and I wish I'd had more time.  Overall I felt that I explained things well and I did get quite a bit of positive feedback from the attendees.  I hope that I'll have the opportunity to do more of these types of presentations.  I'm considering a &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; presentation for early next year.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-4321159434324232213?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/4321159434324232213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=4321159434324232213' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4321159434324232213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4321159434324232213'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/10/stripes-presentation-kc-jug-post-mortem.html' title='Stripes Presentation KC JUG Post Mortem'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-631107374949203834</id><published>2007-10-08T16:42:00.000-05:00</published><updated>2007-10-08T16:43:55.943-05:00</updated><title type='text'>Halo 3 Looks Amazing</title><content type='html'>I played the original Halo on PC when it came out years ago. Never played Halo 2.  Looking at Halo 3 it really looks amazing.  Halo was a blast.  So would I be nuts to want an XBox just so I can play Halo 3?  I'm not a big gamer which is to say that when I do want to waste time I really have to like the game.  So I doubt I'd buy a whole library of games if I did purchase an XBox.&lt;br /&gt;&lt;br /&gt;Is it worth it?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-631107374949203834?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/631107374949203834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=631107374949203834' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/631107374949203834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/631107374949203834'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/10/halo-3-looks-amazing.html' title='Halo 3 Looks Amazing'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6928227004860855049</id><published>2007-10-08T14:20:00.000-05:00</published><updated>2007-10-08T14:46:59.699-05:00</updated><title type='text'>Spring MVC Seems Overly Complicated</title><content type='html'>Chris Sawer wrote an article on &lt;a href="http://www.salixalba.uklinux.net/willow/computing/spring.html"&gt;Using Spring's MVC framework for web form validation&lt;/a&gt;.  I haven't used Spring MVC a lot so I am not here to say he did it right or wrong.  However, if he did it the right way I'm glad I am not using Spring MVC.&lt;br /&gt;&lt;br /&gt;I thought it might be a good idea to show an alternative using the same example Chris used but I'll show mine in &lt;a href="http://mc4j.org/confluence/display/stripes/Home"&gt;Stripes&lt;/a&gt;.  I'm not going to repeat Chris' code here so you can follow along using another tab or open another browser window.&lt;br /&gt;&lt;br /&gt;So the first thing Chris mentions beyond the web.xml file is the configuration for the controller bean in servlet configuration xml file.  Stripes doesn't require controllers (Stripes calls them Action Beans) to be configured anywhere so we've already saved a bit of configuration.&lt;br /&gt;&lt;br /&gt;Next Chris shows the SpringTestController.java and the SpringTestValidator; both of which are required to validate a form.  Here is the Stripes version (Since I have no idea what properties a DataBean refers to I'll use my own object):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The code formatting didn't turn out exactly as I had planned so bare with me until I find a better solution.  The gist of the post just be understandable, however.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;import net.sourceforge.stripes.action.ActionBean;&lt;br /&gt;import net.sourceforge.stripes.action.ActionBeanContext;&lt;br /&gt;import net.sourceforge.stripes.action.RedirectResolution;&lt;br /&gt;import net.sourceforge.stripes.action.Resolution;&lt;br /&gt;import net.sourceforge.stripes.validation.Validate;&lt;br /&gt;import net.sourceforge.stripes.validation.ValidateNestedProperties;&lt;br /&gt;import org.apache.log4j.Logger;&lt;br /&gt;import com.miadidas.model.User;&lt;br /&gt;&lt;br /&gt;public class StripesTestActionBean implements ActionBean {&lt;br /&gt;&lt;br /&gt; protected final Logger logger = Logger.getLogger(StripesTestActionBean.class);&lt;br /&gt; private ActionBeanContext context;&lt;br /&gt; &lt;br /&gt; @ValidateNestedProperties({&lt;br /&gt;  @Validate(field = "username", required = true),&lt;br /&gt;  @Validate(field = "password", required = true)&lt;br /&gt; })&lt;br /&gt; private User user;&lt;br /&gt; &lt;br /&gt; public User getUser() {&lt;br /&gt;  return user;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setUser(User user) {&lt;br /&gt;  this.user = user;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public ActionBeanContext getContext() {  &lt;br /&gt;  return this.context;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setContext(ActionBeanContext context) {&lt;br /&gt;  this.context = context;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public Resolution doSubmitAction() {&lt;br /&gt;  /* The givenData object now contains the successfully validated &lt;br /&gt;   * data from the form, so can be written to a database, or whatever.&lt;br /&gt;          */&lt;br /&gt;  return new RedirectResolution("We would redirect to a new view at this point");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And now the JSP, however mine may be a bit different because of the DataBean I was unclear on:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="stripes" uri="http://stripes.sourceforge.net/stripes.tld"%&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;title&amp;gt;Stripes Test&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;stripes:errors /&amp;gt;&lt;br /&gt;&amp;lt;stripes:form beanclass="com.test.web.action.StripesTestActionBean" method="post"&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Username: &amp;lt;stripes:text name="username" /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;Password: &amp;lt;stripes:password name="password" /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;stripes:submit name="doSubmitAction" value="Login" /&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&amp;lt;/stripes:form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And that's it.  To me, its simpler.  I'd like to hear what you think.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6928227004860855049?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6928227004860855049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6928227004860855049' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6928227004860855049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6928227004860855049'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/10/spring-mvc-seems-overly-complicated.html' title='Spring MVC Seems Overly Complicated'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-1265083869794804377</id><published>2007-09-17T11:18:00.000-05:00</published><updated>2007-09-17T11:20:45.699-05:00</updated><title type='text'>Stripes Presentation Kansas City JUG Oct 10th</title><content type='html'>I'll be doing a presentation on &lt;a href="http://mc4j.org/confluence/display/stripes/Home"&gt;Stripes&lt;/a&gt; October 10th at the Kansas City Java Users Group.  See details &lt;a href="http://kcjava.org/kcjava.htm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-1265083869794804377?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/1265083869794804377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=1265083869794804377' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/1265083869794804377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/1265083869794804377'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/stripes-presentation-kansas-city-jug.html' title='Stripes Presentation Kansas City JUG Oct 10th'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-7532307781690464022</id><published>2007-09-12T09:07:00.000-05:00</published><updated>2007-09-12T11:01:38.408-05:00</updated><title type='text'>Requirements Exceeding Web Capabilities</title><content type='html'>Let me start off with the fact that I like HTML.  I like JavaScript.  I like CSS.  I'm rather proud of my abilities in combining these technologies to make some really interactive sites.  The problem is that I keep seeing requirements come down that make using these age old and proven technologies extremely difficult.  So there's prototype, scriptaculous, JQuery, Dojo, GWT; I could go on and on.  And to a fault these libraries do ease the pain.  Well, some of them.  Some of them actually cause me more pain.&lt;br /&gt;&lt;br /&gt;I'm leading a project now and I spoke with one of my developers and asked him if he thought this would make a really great Desktop application.  He agreed.  Unfortunately, it's not what the client wants.  In fact, Its not what any client wants these days.  Its all about the DubDubDub.  Enter Flex and Silverlight.&lt;br /&gt;&lt;br /&gt;I don't dislike Flex and I know it has been around for a year or so and it is going open source, yada yada and I've not even glanced at Silverlight so I won't bother commenting on it aside from saying it locks you into the .NET world.   And looking at Air, linux is once again an afterthought for the flash guys.&lt;br /&gt;&lt;br /&gt;It seems to me that web developers are sitting in a very difficult era in web development where clients want the bells and whistles of a true rich client application that runs in a web browser but aren't willing to commit to new technologies (Flex, etc) that actually make these applications possible.  What's a developer to do?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-7532307781690464022?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/7532307781690464022/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=7532307781690464022' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/7532307781690464022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/7532307781690464022'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/requirements-exceeding-web-capabilities.html' title='Requirements Exceeding Web Capabilities'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6187163632988456585</id><published>2007-09-10T08:34:00.000-05:00</published><updated>2007-09-10T08:37:55.800-05:00</updated><title type='text'>Java Forums</title><content type='html'>I'm in search of a new stomping ground.  I've been a member at &lt;a href="http://www.javaranch.com"&gt;JavaRanch &lt;/a&gt;for 6 years and a staff member for about 4 but I'm needing to part ways and I'm looking for a new community to be a part of and help if I can.  I know about Sun's forums and Javalobby's forums but I'm not too impressed with either community.  JavaRanch is full of really nice folks and I'm looking for something similar.  Any suggestions?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6187163632988456585?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6187163632988456585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6187163632988456585' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6187163632988456585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6187163632988456585'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/java-forums.html' title='Java Forums'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-4530450109671882375</id><published>2007-09-07T09:25:00.000-05:00</published><updated>2007-09-07T09:30:36.275-05:00</updated><title type='text'>DZone Aggregated on Javablogs?</title><content type='html'>Does anyone else think that &lt;a href="http://www.dzone.com/"&gt;DZone&lt;/a&gt; should not be aggregated on &lt;a href="http://www.javablogs.com/Welcome.action"&gt;Javablogs&lt;/a&gt;?  I find it pretty annoying that on Thursday I jump to a blog entry from Javablogs to the author's site and then on Friday I see the same blog entry on Javablogs  but this time I'm jumped to DZone.&lt;br /&gt;&lt;br /&gt;Look, I like DZone.  I prefer it to Digg for my technology related information.  And I have them subscribed in my Google Reader.  It would be one thing if DZone published their own content and every now and again thought a blog was worth linking.  I've done that.  It happens.  But that's not how they operate.  They are another version of Javablogs and shouldn't be listed on Javablogs.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-4530450109671882375?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/4530450109671882375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=4530450109671882375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4530450109671882375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/4530450109671882375'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/dzone-aggregated-on-javablogs.html' title='DZone Aggregated on Javablogs?'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-8343304761755002949</id><published>2007-09-05T13:04:00.000-05:00</published><updated>2007-09-05T13:16:33.321-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java stripes'/><category scheme='http://www.blogger.com/atom/ns#' term='web applications'/><title type='text'>Invalid Property Binding Feedback</title><content type='html'>Matt Raible &lt;a href="http://raibledesigns.com/rd/entry/does_struts_2_suck"&gt;blogged &lt;/a&gt;today about why Struts 2 sucks.  At the same time he concluded that Stripes sucks as well.  Why?  Because neither framework handle invalid property binding feedback properly.  Well, let's discuss what might be proper and let's talk about Stripes because I love Stripes.  I want Stripes to be the best it can be and we can find ways to improve it, let's do that.&lt;br /&gt;&lt;br /&gt;Stripes doesn't use OGNL.  When Tim designed Stripes he used OGNL in the beginning and later found out that he could write something a bit smaller and faster that was specific for Stripes and remove another dependency from the project.  I think that is great.  One less JAR I need to fetch.&lt;br /&gt;&lt;br /&gt;One of the many nice things about Stripes (specifically over Struts) is the ability to create pages without wiring up the actions on the back end.  with Struts (this could be different in Struts 2, someone please correct me) you had to have your form beans, validation, XML all correct and complete before you could even view your JSP.  With Stripes, if a binding resource is missing it's ignored.  Is this a flaw?  I don't believe so. &lt;br /&gt;&lt;br /&gt;When you submit the form or when the page requires binding, which typically isn't on view, Stripes will tell you what you've missed.  It's in the debug log, not on screen.  So if you had a form that required a first name and a last name.  In your action bean you have two strings, firstName and lastName.  On the JSP you fat finger lastName to lkastName, the form will display just fine.  This is what I would want.  I want to see my form.  When I submit the form, this is what I get in the debug:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DEBUG Could not bind property with name [lkastName] to bean of type: FormTestActionBean : Bean class com.app.web.action.FormTestActionBean does not contain a property called 'lkastName'. As a result the following expression could not be evaluated: lkastName&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And now I know what I need to fix.  I'm not 100% sure that Matt views this as a flaw or if maybe he doesn't understand that Stripes does this.  From his post I am led to believe that Matt wants immediate feedback if there are binding issues, even prior to submitting the form.  I don't agree that this should be an issue.  What do you think?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-8343304761755002949?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/8343304761755002949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=8343304761755002949' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/8343304761755002949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/8343304761755002949'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/invalid-property-binding-feedback.html' title='Invalid Property Binding Feedback'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-9213945835297137888</id><published>2007-09-05T10:36:00.001-05:00</published><updated>2007-09-05T10:37:44.001-05:00</updated><title type='text'>Java Desktop Jobs</title><content type='html'>After reviewing Filthy Rich Clients I got all excited about Desktop Java again.  It did get me wondering though if there are jobs out there for Swing folks.  I'm not looking for one but I am curious what the market is like in this time of Ajax and Flex.  Does anyone have any stats or information regarding this?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-9213945835297137888?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/9213945835297137888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=9213945835297137888' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/9213945835297137888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/9213945835297137888'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/java-desktop-jobs.html' title='Java Desktop Jobs'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-6406772292036644693</id><published>2007-09-04T18:57:00.000-05:00</published><updated>2007-09-05T10:42:05.852-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='desktop'/><category scheme='http://www.blogger.com/atom/ns#' term='Filthy Rich Clients'/><category scheme='http://www.blogger.com/atom/ns#' term='book reviews'/><title type='text'>Book Review: Filthy Rich Clients</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_8xhP3-wQ-qU/Rt35FNwnWRI/AAAAAAAAAAY/BF8k5ycN09U/s1600-h/51UVh0D6rvL._AA240_.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://bp2.blogger.com/_8xhP3-wQ-qU/Rt35FNwnWRI/AAAAAAAAAAY/BF8k5ycN09U/s200/51UVh0D6rvL._AA240_.jpg" alt="" id="BLOGGER_PHOTO_ID_5106511420496238866" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This review will be in two parts.  I was contacted about reviewing &lt;a href="http://www.filthyrichclients.org/"&gt;Filthy Rich Clients&lt;/a&gt; by Chet Haase and Romain Guy and at the same time asked to review Safari's "Rough Cuts" subscription.  So first, let's get the not so good out of the way.&lt;br /&gt;&lt;br /&gt;Safari's "&lt;a href="http://my.safaribooksonline.com/roughcuts"&gt;Rough Cuts&lt;/a&gt;" is similar to Manning's MEAP (Manning Early Access Program).  If you aren't familiar with either one it's basically a way to read a book as chapters are made available online.  The difference, as far as I can tell, between MEAP and Rough Cuts is that chapters released through MEAP are complete whereas chapters released through Rough Cuts often times are incomplete.  That isn't to say that reading the final draft of a book versus the Rough Cut version is significantly different but there were things missing like diagrams that are referred to in the text.  I may be in the minority here but I actually find them useful in most cases and when a book is talking about a diagram its nice to be able to see it.  Add that to my dislike of Safari's interface for reading books online and I give it a thumbs down.  I'd rather just read the book when it is complete than have incomplete chapters made available.&lt;br /&gt;&lt;br /&gt;And now on to some good news.  FRC is a great book.  The community has needed a book like this for a long time and I can't think of any better folks to write this kind of book than Chet and Romain.  I've been following their blogs for a long time and am a big fan of all the cool things Romain has done with Swing.&lt;br /&gt;&lt;br /&gt;FRC is a book about "Developing Animated and Graphical Effects for Desktop Java Applications".  Yes, that is on the cover but I couldn't think of a better way to describe this book.  FRC gives some much needed insight into the inner workings of Swing, AWT, and Java2D and how they all interact.  Sure, you  can scour the web and locate a lot of articles and blogs that talk about this but its nice to finally have this in one place.  But don't worry, its not that deep.  Its just enough to help you understand when things start getting cool later on.&lt;br /&gt;&lt;br /&gt;The book does assume a basic understanding of desktop development with Java.  If you are new to Swing you might want to get a few basics down before delving into FRC.  The book reads very well, even going between the two authors, which you can easily tell who wrote what.  If its technical it was probably Chet.  If it was pretty it was probably Romain.  Not to say that Romain isn't technical in his own right.&lt;br /&gt;&lt;br /&gt;There are plenty of code fragments in the book to help convey the author's points.  In fact, there is a lot.  More than I expected.  On a sad note, even though all the examples are available on the book's web site they are Netbeans projects.  I download a few and tried to compile them with Ant from the command line but they always complained about Netbeans dependencies.  Granted, I didn't research this much so the problem may have easily been resolved.&lt;br /&gt;&lt;br /&gt;The book is fun and results are immediate.  I've already started trying to come up with a side project for myself just to try out a lot of the techniques described in FRC.  I'd recommend this book to anyone looking to spruce up their existing desktop applications or design something entirely new and original.  Great work Chet and Romain!!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-6406772292036644693?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/6406772292036644693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=6406772292036644693' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6406772292036644693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/6406772292036644693'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2007/09/book-review-filthy-rich-clients.html' title='Book Review: Filthy Rich Clients'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_8xhP3-wQ-qU/Rt35FNwnWRI/AAAAAAAAAAY/BF8k5ycN09U/s72-c/51UVh0D6rvL._AA240_.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-116642292610821518</id><published>2006-12-18T00:21:00.000-06:00</published><updated>2006-12-18T00:22:52.036-06:00</updated><title type='text'>Proxy Apache Httpd and Tomcat</title><content type='html'>I wrote a small FAQ on how to proxy Apache Httpd and Tomcat.  You can find it &lt;a href="http://faq.javaranch.com/view?ProxyApacheHttpdAndTomcat"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Feel free to correct any mistakes you find or just let me know and I will fix them.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-116642292610821518?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/116642292610821518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=116642292610821518' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/116642292610821518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/116642292610821518'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/12/proxy-apache-httpd-and-tomcat.html' title='Proxy Apache Httpd and Tomcat'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-115457377028859807</id><published>2006-08-02T21:52:00.000-05:00</published><updated>2006-08-02T21:56:10.300-05:00</updated><title type='text'>Freespire: Coming to you live...</title><content type='html'>I installed &lt;a href="http://freespire.org/community"&gt;Freespire&lt;/a&gt; tonight on my Dell Gen1 XPS Laptop.  ATI Radeon 9800 and Linksys wireless, which have been my headache with every other distro, worked out of the box.  Video is at max rez with Opengl.  How refreshing.&lt;br /&gt;&lt;br /&gt;My only complaint at the moment is the startup time for the OS.  Very slow.  Probably takes 5 times longer to boot than XP which I am dual booting.  Other than that, I'm perfectly happy with it, so far.  Ubuntu has some stiff comp now.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-115457377028859807?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/115457377028859807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=115457377028859807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115457377028859807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115457377028859807'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/08/freespire-coming-to-you-live.html' title='Freespire: Coming to you live...'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-115446604029345359</id><published>2006-08-01T15:56:00.000-05:00</published><updated>2006-08-01T16:01:34.070-05:00</updated><title type='text'>Book Review: AJAX and PHP: Building Responsive Web Applications</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/gp/product/1904811825/sr=1-1/qid=1154465727/ref=pd_bbs_1/104-7406784-9535158?ie=UTF8&amp;s=books"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6086/1034/320/1904811825.png" border="0" alt="" /&gt;&lt;/a&gt;I’m a big fan of PHP (though a Java developer by trade) and although I don’t buy into all the hype surrounding AJAX I do appreciate what it can do for a web application when used appropriately.  So I was really excited to review “AJAX and PHP: Building Responsive Web Applications”.&lt;br /&gt;&lt;br /&gt;What I liked most about this book was that there was no fluff.  AJAX is what it is and I felt the authors realize this and wasted no time getting right into it.  There is the typical regurgitated information that all tech books can’t seem to ignore in chapter one but luckily not much.  In fact, chapter one has you writing your very first AJAX enabled app.&lt;br /&gt;&lt;br /&gt;The remaining chapters handle one application after another showing you several different ways you can utilize AJAX in your PHP web applications.  Chapter seven, which shows how to implement a real time charting application using SVG, is debatably the most useless chapter in my opinion; however, it is something different that you don’t see similar books covering.  And it’s a decent way to avoid using something like an Applet or Flash for similar functionality.&lt;br /&gt;&lt;br /&gt;Probably my biggest complaint about the book in general is the authors’ use of XSL for a couple of the examples.  This is easily excusable given the rest of the book though.  The book does assume a basic understanding of PHP and Javascript but that shouldn’t scare off any newcomers to any of these technologies since you can simply copy and paste and run the code to see the outcome.  The appendix has all the instructions for setting up the various technologies used in this book to get the reader going.&lt;br /&gt;&lt;br /&gt;All in all I think this is a great introduction to AJAX and since AJAX is server agnostic all the techniques in the book can be applied to the server technology of choice whether its PHP, Java, or even .NET.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-115446604029345359?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/115446604029345359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=115446604029345359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115446604029345359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115446604029345359'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/08/book-review-ajax-and-php-building.html' title='Book Review: AJAX and PHP: Building Responsive Web Applications'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-115277424454516148</id><published>2006-07-13T01:49:00.000-05:00</published><updated>2006-07-13T02:09:24.283-05:00</updated><title type='text'>Elegant Image Loading</title><content type='html'>On my current project I had to display some images associated with a story.  We have a servlet that uses &lt;a href="http://www.imagemagick.org/script/index.php"&gt;ImageMagick&lt;/a&gt; and &lt;a href="http://www.yeo.id.au/jmagick/"&gt;JMagick &lt;/a&gt; to dynamically load an image from a database and do various things on the fly like resizing, cropping, etc depending on the params passed in.  This servlet is mapped to a variation of the JPG image extension.&lt;br /&gt;&lt;br /&gt;When I designed the page and tested it, I noticed that because there might be 12 images going through this process on the page, it appeared that the page loaded very slowly.  It also would display those nice little "there's an image getting ready to display here" place holders until the image was finally loaded.  This was just annoying and it made for a bad user experience, imho.&lt;br /&gt;&lt;br /&gt;To resolve this and make it appear that the images were loading in the background, I put in the following code (click on the image for a larger preview):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6086/1034/1600/code001.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6086/1034/320/code001.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What I did here was for each image in the imageList I created a DIV that is not visible when the page loads.  Next, I placed the following code in the window.onload event (click on the image for a larger preview):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6086/1034/1600/code002.0.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6086/1034/320/code002.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What this does is creates a new IMG object on the page for each image in the imageList.  When an image has completed loading the file given in the SRC attribute, it's onload event is fired.  When this happens I use the &lt;a href="http://script.aculo.us/"&gt;Scriptaculous&lt;/a&gt; Appear function to allow the image to fade in.  &lt;br /&gt;&lt;br /&gt;When the page loads, you can't see the empy place holder boxes and it appears the page has completed loading.  After which you start to see the images fade in, which is a very elegant effect.  If the images are cached, they just begin to fade in that much faster.&lt;br /&gt;&lt;br /&gt;One other thing I did which I didn't supply the code for was I placed a transparent div over the entire table with a message in the middle saying Images Loading.  As soon as the first img.onload event is fired, I Fade that div out.  The effect is very nice.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-115277424454516148?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/115277424454516148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=115277424454516148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115277424454516148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115277424454516148'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/07/elegant-image-loading.html' title='Elegant Image Loading'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-115276475941342067</id><published>2006-07-12T23:22:00.000-05:00</published><updated>2006-07-12T23:25:59.426-05:00</updated><title type='text'>Giving JSF Another Shot - Part Deux</title><content type='html'>A while back I blogged about &lt;a href='http://greggbolinger.blogspot.com/2006/05/giving-jsf-another-shot.html' target='_blank'&gt;Giving JSF Another Shot&lt;/a&gt;.  Well, I did.  I even had the opportunity to use it at my new job.  And it failed, miserably.&lt;br /&gt;&lt;br /&gt;I spent more time hacking components, hunting for working components, and coding around all the issues surrounding it than I did actually getting any work done.  This is by no means a slam on any one implementation mind you, but the specification in general.  Sure, maybe 1.2 is fixing those issues.  Sure, maybe facelets fixes those issues.  Sure, maybe I'll win the lotery.  I just don't personally have any more time to devote to it.&lt;br /&gt;&lt;br /&gt;I know I haven't blogged in a while, and to start back with something negative isn't always the best approach.  But what can I say?  I'm opinionated.  I have happier thoughts to blog about in the near future.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-115276475941342067?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/115276475941342067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=115276475941342067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115276475941342067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/115276475941342067'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/07/giving-jsf-another-shot-part-deux.html' title='Giving JSF Another Shot - Part Deux'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-114771414171551996</id><published>2006-05-15T10:50:00.000-05:00</published><updated>2006-05-15T12:29:01.833-05:00</updated><title type='text'>IntelliJ IDEA and Multiple Projects Views</title><content type='html'>I love IntelliJ IDEA.  But nothing is perfect.  And although IDEA comes as close to perfect as anything else, IMHO, there is something I wish I could do, but can't.  Sometimes while working on a project I'll also need to work on an API or supporting project at the same time.  Currently, I have to have two copies of IDEA open to do this.&lt;br /&gt;&lt;br /&gt;I'd like IDEA to support multi project views of some sort.  What do you think?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-114771414171551996?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/114771414171551996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=114771414171551996' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/114771414171551996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/114771414171551996'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/05/intellij-idea-and-multiple-projects.html' title='IntelliJ IDEA and Multiple Projects Views'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-114713897380735211</id><published>2006-05-08T20:26:00.000-05:00</published><updated>2006-05-08T20:42:53.830-05:00</updated><title type='text'>Giving JSF Another Shot</title><content type='html'>Leaving my opinions on other web frameworks aside, I am going to give JSF another shot.  JSF, to me, is one of those technologies that reared its head as the next best thing.  And at first glance it was nice.  There was the big promise of tool support.  I still have yet to see one I really like.  But I don't typically like tools that write all my code for me anyway. If I did, I'd use .NET.&lt;br /&gt;&lt;br /&gt;After a while though, I started to see the short-comings of JSF.  There are issues with JSF and JSP and how the component tree is slapped together.  There is the whole back button issue. No true Post back checking ability. But I think my biggest problem with JSF isn't the specification's bugs and/or failures.  It's the way it was thrown at me.  Sun said, "Here is the next standard" and a lot of the community said "Okay".  Interestingly, I think the Struts maintainers adopting JSF for Shale is more likely to push it as a standard than Sun bullying it on me, but only because of Strut's reputation. I've looked at Shale.  It still has a ways to go.  Config file are really out of control.  But that is another story. &lt;br /&gt;&lt;br /&gt;With JSF 1.2 lingering around the corner and with projects like Facelets, I think JSF deserves another hard look.  MyFaces has really come a long way and the inclusion of ADF Faces components are really going to give that project a super sweet component set.  &lt;br /&gt;&lt;br /&gt;JSF's role as the new standard for Java based web applications remains still to be seen, even after all this time.  And a standard should be determined by the technologies adoption in the community, not by the entity that created said technology.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-114713897380735211?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/114713897380735211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=114713897380735211' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/114713897380735211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/114713897380735211'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/05/giving-jsf-another-shot.html' title='Giving JSF Another Shot'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113867947738662608</id><published>2006-01-30T21:48:00.000-06:00</published><updated>2006-01-30T21:51:17.400-06:00</updated><title type='text'>Checking Multiple GMail Accounts</title><content type='html'>I decided recently that I wanted a better way to manage all the mailing lists that I belong to.  I thought that a good way to do this would be to create a seperate GMail account for each list.  I like doing it this way so far but there is still the issue of having to login to each account everytime I want to check for new messages.&lt;br /&gt;&lt;br /&gt;I know about the Firefox plugin for checking multiple GMail accounts however, I don't like the dependency on having FF open.  I also considered running Thunderbird and adding each GMail account as a POP account, but that ties me down to my computer.  I am really looking for something more like the GMail notifier but that will check more than one GMail account.  Anyone know of anything?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113867947738662608?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113867947738662608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113867947738662608' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113867947738662608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113867947738662608'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/checking-multiple-gmail-accounts.html' title='Checking Multiple GMail Accounts'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113837611930998053</id><published>2006-01-27T09:30:00.000-06:00</published><updated>2006-01-27T09:35:19.416-06:00</updated><title type='text'>Book Review: Beginning Python</title><content type='html'>I could write about how &lt;a href="http://www.apress.com"&gt;Apress &lt;/a&gt;has a knack for publishing great books by great authors.  I could write about how “Beginning Python…” is one of my favorite books so far, and not just on Python.  I could write about how Magnus Lie Hetland does a wonderful job of introducing the reader to the Python language.  I could write about how “Beginning Python…” is one of the few books that actually delves into as many possible uses for the Python language from simple lists and string manipulation to GUI’s to web development.  Believe it or not, with all the great content in this book, the best is yet to come. &lt;br /&gt;&lt;br /&gt;Starting with Chapter 20 “Beginning Python…” takes the reader through ten (10) complete projects start to finish including two versions of a file sharing application (version two adds a GUI)  and a small game.  The best way to showcase the power of a language is to show it in action.  Magnus does just that with these project chapters.  And it makes the book fun.  It makes Python fun.  It makes learning fun.&lt;br /&gt;&lt;br /&gt;For anyone wanting to learn Python or for a Python developer that wants to expand their knowledge and increase their productivity and find new uses for a great language, “Beginning Python…” is a must have.  It’s definitely one of my top five (5) favorite programming books.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://rcm.amazon.com/e/cm?t=bigjlittjwhat-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=159059519X&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000ff&amp;bc1=000000&amp;bg1=ffffff&amp;f=ifr" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113837611930998053?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113837611930998053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113837611930998053' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113837611930998053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113837611930998053'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/book-review-beginning-python.html' title='Book Review: Beginning Python'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113813668474221397</id><published>2006-01-24T15:03:00.000-06:00</published><updated>2006-01-24T15:04:44.743-06:00</updated><title type='text'>Chuck Norris Fact of the Day</title><content type='html'>#7. &lt;span style="font-weight:bold;"&gt;Chuck Norris does not hunt because the word hunting implies the probability of failure. Chuck Norris goes killing. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.chucknorrisfacts.com" target="_blank" style="font-size: small;"&gt;Chuck Norris Facts&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113813668474221397?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113813668474221397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113813668474221397' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113813668474221397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113813668474221397'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/chuck-norris-fact-of-day.html' title='Chuck Norris Fact of the Day'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113762217720098177</id><published>2006-01-18T16:08:00.000-06:00</published><updated>2006-01-18T16:09:37.226-06:00</updated><title type='text'>Javaranch Journal: January Edition</title><content type='html'>The January edition of the Javaranch Journal has been &lt;a href="http://www.javaranch.com/journal/200601/Journal200601.jsp"&gt;published &lt;/a&gt;with some excellent articles.  Be sure to check it out.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113762217720098177?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113762217720098177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113762217720098177' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113762217720098177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113762217720098177'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/javaranch-journal-january-edition.html' title='Javaranch Journal: January Edition'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113756102408196402</id><published>2006-01-17T22:52:00.000-06:00</published><updated>2006-01-18T09:36:35.096-06:00</updated><title type='text'>I say Tapestry.  You Say Wicket.</title><content type='html'>Tomato Tomato, Potato Potato...Well, probably not.  But they aren't apples and oranges either.  It seems like everytime I bring up &lt;a href="http://jakarta.apache.org/tapestry/"&gt;Tapestry&lt;/a&gt;, someone brings up &lt;a href="http://wicket.sourceforge.net/"&gt;Wicket&lt;/a&gt;.  I looked at Wicket back in its infancy; version 1.0.  It looked neat and I did some very light testing with it.  And then I dropped it and hadn't really looked at it since.&lt;br /&gt;&lt;br /&gt;Since it keeps popping up in conversation I decided that tonight I would start looking at it again.  I didn't see any significant changes since I used it last.   The documentation has improved but it still seems the downloadable examples are still the only way to see how an entire app is really put together.  I've decided that I might put my Tapestry/JSF tutorial on hold until I can possibly explain Wicket well enough to include it in the same tutorial.  Kill 3 birds with 1 stone I suppose.&lt;br /&gt;&lt;br /&gt;The hardest aspect of Wicket that I can't seem to wrap my head around yet is the use of the IModel interface and it's pluthra of implementations.  The documentation does a descent job of explaining what the IModel is, but not so good and explaining when to use which and why.  The examples in the documentation are about 2-3 lines long and don't mean much to me.  And the framework's use of inner classes seems a bit, well, overused.  Most of the time I think this is for simplicity and the ability to create less seperate files when writing how-to articles.  Specifically, classes that extend Form always seem to be inner classes as well as anonymous methods for listeners.  This is my favorite though.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6086/1034/1600/code.gif"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6086/1034/400/code.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is code from a series of tutorials by &lt;a href="http://www.javalobby.org/java/forums/t60786.html"&gt;R.J. Lorimer&lt;/a&gt;.  This doesn't scream simple to me, especially as the site grows and becomes more and more complex.  That's not to say this is at the fault of Wicket.  I am betting R.J. did this for the simplicity of the tutorial, but at first glance, it's a bit confusing.&lt;br /&gt;&lt;br /&gt;Anyway, I plan to keep chugging away for the next couple of days, possibly into the weekend when I have a chance.  And then I will decide what direction my article/tutorial on these similar frameworks might be.  As always, any input along the way is greatly appreciated.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113756102408196402?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113756102408196402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113756102408196402' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113756102408196402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113756102408196402'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/i-say-tapestry-you-say-wicket.html' title='I say Tapestry.  You Say Wicket.'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113746085978956470</id><published>2006-01-16T19:17:00.000-06:00</published><updated>2006-01-16T19:23:42.063-06:00</updated><title type='text'>Should I Write A Tapestry to JSF Comparison Tutorial?</title><content type='html'>I frriend of mine has requested that I take my &lt;a href="http://www.javaranch.com/newsletter/200404/Journal200404.jsp#a3"&gt;JSF Tutorial&lt;/a&gt; I wrote a while back and create the same exact tutorial in Tapestry but showing both the JSF and Tapestry code side by side as I go along.  I'd prefer not to make a "which is better" assumption on my own but rather let the reader decide for themselves which technology they prefer.  I think we all know what I like.  And I'd like to keep that opinion as much out of the tutorial as possible to give both a fighting chance.&lt;br /&gt;&lt;br /&gt;Is this something that anyone else would be interested in or would I be wasting my time?  I know there are a lot of good Tapestry tutorials out there, just not any that I know of that show both the JSF and Tapestry code side by side.  Let me know.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113746085978956470?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113746085978956470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113746085978956470' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113746085978956470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113746085978956470'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/should-i-write-tapestry-to-jsf.html' title='Should I Write A Tapestry to JSF Comparison Tutorial?'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113729342913803260</id><published>2006-01-14T20:33:00.000-06:00</published><updated>2006-01-14T20:50:29.153-06:00</updated><title type='text'>The Benefit of Annotations in Tapestry 4</title><content type='html'>Annotations are a new addition to Java5.  Everyone has an opinion on whether or not they are a good thing.  Some people love them, some hate them.  Others ride the fence and say they are good for some things but not for others.  That is kind of where I tread on the subject.  Specifically when it comes to configuration files for my web projects.&lt;br /&gt;&lt;br /&gt;Back in the day all you had to worry about was the web.xml, then struts came along and added struts-config.  A bit later, tiles.xml and then applicationContext from the spring "beans" (I just decided to call the Spring developers beans).  And then the bad boy drops in.  Tapestry.  Talk about config files.  You have a template (html), an associated .page file (xml), an application config (xml), possibly a hivemind module config (xml).  Add any other technology into the same mix and you've got xml config files running everywhere.  Tracking down the latest bug means traversing through file after file, tracing what xml element was used where.  Ugh!&lt;br /&gt;&lt;br /&gt;There is no perfect solution for this.  Today's applications need configuration files.  Believe it or not they do ease long term development.  It's the small single developer projects that suffer the most (that would be mostly me).  So if I have the chance to lessen the xml config file load I'll take it.  Tapestry 4 provides annotation support to replace (optional) page-specifications and/or component-specifications that normally exist in an XML file.&lt;br /&gt;&lt;br /&gt;What I like best about this is losing the .page file all together.  Before annotations or if you refuse to use them you will have the HTML template and an associated .page file and the associated java class.  Using annotations you can move everything in the .page file into the java class.  When there are problems or errors instead of flipping back and forth between your .page file and your java class to see what component you forgot to define or what event you forgot to include or spelled wrong in one file or the other, it's all right there in the single java class file.  Someone might say you lose some flexibility with this.  That you are now required to build your project everytime you make a slight configuration change.  To this I would argue that if you are making changes to your .page file, chances are you are going to associate that change in the java class, and vice versa.  So you are going to have to build again anyway.&lt;br /&gt;&lt;br /&gt;Like I said at the beginning, I tend to feel the same way about annotations as I do about many technologies in general.  They have their place.  They're not an end all solution.  But they do solve problems.  Use them when you need them.  If you are using Tapestry 4 and not using annotations I'd seriously reconsider.  But that's me.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113729342913803260?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113729342913803260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113729342913803260' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113729342913803260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113729342913803260'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/benefit-of-annotations-in-tapestry-4.html' title='The Benefit of Annotations in Tapestry 4'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113704345880251325</id><published>2006-01-11T23:13:00.000-06:00</published><updated>2006-01-11T23:27:24.336-06:00</updated><title type='text'>Tapestry: "The" Web Framework</title><content type='html'>I've used &lt;a href="http://jakarta.apache.org/tapestry/" target="_blank"&gt;Tapestry&lt;/a&gt; off and on since version 3.0.  Not for anything major, but just enough to keep up with the changes through 4.0.  This evening I threw caution to the wind and started converting a PHP app to Tapestry.  I say conversion, but really it's a complete rework because I am changing the look and feel as well as a ton of functionallity.&lt;br /&gt;&lt;br /&gt;Using Tapestry 4.0 final I accomplished more tonight than I've ever been able to with any other framework (JSF, Struts, WebWork, SpringMVC, Wicket, yes, I've tried them all).  &lt;a href="http://www.agileskills2.org/EWDT/" target="_blank"&gt;Enjoying Web Development With Tapestry&lt;/a&gt; is what I've been utalizing as I go along.  It's an excellent book and covers everything through the 4.0 final release.  Kudos to Kent for such an excellent book which is available as PDF or print.&lt;br /&gt;&lt;br /&gt;Currently, I see no reason to use any other j2ee web framework.  Even for small projects, Tapestry is so quick and easy to setup and accomplish tasks you'll wonder why you've been mucking around with anything else.  And I am not one that typically likes to use frameworks.  But I do like getting things done and Tapestry allows me to do just that.&lt;br /&gt;&lt;br /&gt;Howard, you da man!  And to everyone else that helped Howard along the way, thanks for a great framework.  &lt;a href="http://howardlewisship.com/blog/" target="_blank"&gt;"2006 looks like a true banner year for Tapestry!"&lt;/a&gt;.  Amen brother.  I agree 100%.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113704345880251325?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113704345880251325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113704345880251325' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113704345880251325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113704345880251325'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2006/01/tapestry-web-framework.html' title='Tapestry: &quot;The&quot; Web Framework'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113572364855016364</id><published>2005-12-27T16:42:00.000-06:00</published><updated>2005-12-27T16:47:28.566-06:00</updated><title type='text'>Using Ajax Techniques @ Work</title><content type='html'>I wouldn't say I condem Ajax.  I'd say that I am just skeptical of new "buzz" like technologies and while I have seen the effective use of it via Gmail and various other sites popping up here and there, I never really thought I'd find a good use for it.&lt;br /&gt;&lt;br /&gt;On a project I am working on we needed to sort a table of data by clicking on the column headers. A very common task that has been done many many times.  The problem though was that since we are pulling all the rows from the database and paging through the results using Javascript there are just too many rows for javascript to handle without choking.  Also, because of the way things are done here, it's not an easy process to persist page data to be redisplayed if we were to submit the entire page just to sort a column using SQL.  &lt;br /&gt;&lt;br /&gt;I suggested using Ajax techniques and it seems to be working out very well for us so far.  Clicking on the column headers makes an ajax request to the server for the data already sorted.  I then take that data (xml) and rebuild my array in javascript.  Turned out to be really simple.&lt;br /&gt;&lt;br /&gt;I wouldn't say I condone the use of Ajax...&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113572364855016364?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113572364855016364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113572364855016364' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113572364855016364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113572364855016364'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/12/using-ajax-techniques-work.html' title='Using Ajax Techniques @ Work'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113146140587801630</id><published>2005-11-08T08:49:00.000-06:00</published><updated>2005-11-08T09:10:50.913-06:00</updated><title type='text'>Review: Foundations of Ajax</title><content type='html'>The first round of Ajax books have hit the shelves and Apress is trying to make their mark with &lt;a href="http://www.apress.com/book/bookDisplay.html?bID=10042"&gt;Foundations of Ajax&lt;/a&gt;.  A thin book with only 273 pages including the index, Foundations of Ajax hits the mark with its recipe style format and examples.&lt;br /&gt;&lt;br /&gt;Foundations of Ajax starts out the way most tech books do with a bit of history and primer for what’s to come.  Most people familiar with web applications and design can probably just skip chapter 1 and possibly 2.  But don’t skip anymore.  Chapter 3 jumps right in with your first fully functional Ajax enabled web page and it doesn’t let up.  Some of the examples are dynamic tool tips, textfield autocomplete, dynamic drop down lists, and my favorite, the progress bar.  The elements of each example are well explained and easy to understand but aren’t diluted with pages of theory and why’s.  This book is all how.&lt;br /&gt;&lt;br /&gt;The last few chapters all deal with tools for the developer to help make Ajax development easier.  It talks about Firefox extensions, JSUnit, and lightly touches on some Ajax frameworks though no working examples of any of the frameworks are shown.&lt;br /&gt;&lt;br /&gt;The book was not without its faults, however.  There are syntax errors lightly scattered throughout some of the examples.  This was frustrating because I had to debug javascript for someone else’s errors.  The book also assumes a fair amount of Servlet knowledge and J2EE web app deployment know how.  While I’m all for examples in Java, this does limit the books potential customer base.  Ajax is pretty much server side technology agnostic.  It can be used with ASP, PHP, J2EE, Ruby, and many others.   And while the book does touch on this fact, newbies to Servlets will find running the examples difficult. &lt;br /&gt;&lt;br /&gt;I whole heartedly enjoyed this book and it really wet my appetite for Ajax and how I can use it to improve my own applications UI and provide a better experience for the end user.  I’d highly recommend this to anyone wanting to learn the “Foundations of Ajax”.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113146140587801630?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113146140587801630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113146140587801630' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113146140587801630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113146140587801630'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/11/review-foundations-of-ajax.html' title='Review: Foundations of Ajax'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113112165611762381</id><published>2005-11-04T10:24:00.000-06:00</published><updated>2005-11-04T10:27:36.140-06:00</updated><title type='text'>KornShell Scripting Reference</title><content type='html'>I've been doing quite a bit of KornShell scripting at my new job the past couple of days.  I am familiar with bash primarily so I was needing some reference to KornShell and it took me forever to find something good.  This link was buried about 9 pages deep in google.  It answered a lot of questions that other tutorials and links just didn't touch on.  So I thought I would share it in case anyone else needs something similar.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.maththinking.com/boat/kornShell.html"&gt;Unix KornShell Quick Reference&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Happy scripting!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113112165611762381?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113112165611762381/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113112165611762381' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113112165611762381'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113112165611762381'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/11/kornshell-scripting-reference.html' title='KornShell Scripting Reference'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-113086460315317068</id><published>2005-11-01T10:11:00.000-06:00</published><updated>2007-09-05T18:21:50.461-05:00</updated><title type='text'>Just An Update On My New Job</title><content type='html'>&lt;span style="font-size:180%;"&gt;&lt;span style="font-weight: bold;"&gt;[I noticed that this post has made it to the top of javablogs Hot list.  I added this blog to javablogs yesterday and it aggregated everything.  This post is really old and I am not even at this job anymore.  Sorry about that.]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I got yelled at the other day for not having any updates on my weblog for a long time.  Not that me taking long breaks from blogging is anything new, but I figured I'd go ahead and throw out one today.&lt;br /&gt;&lt;br /&gt;Last week I started a new job at DST Output in Kansas City, MO.  So far things are going pretty well.  I'm enjoying being at a job where I am getting paid to write code full time instead of my part time consulting work.  The company has a great history and great financials.  My colleagues have been very helpful in getting me up to speed on everything we do here.&lt;br /&gt;&lt;br /&gt;I would say more about the work I am doing and the company however, only being here a week, I am not quite sure what all I am at liberty to speak about in public.  More to come in later days I am sure.  Now back to work...&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-113086460315317068?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/113086460315317068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=113086460315317068' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113086460315317068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/113086460315317068'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/11/just-update-on-my-new-job.html' title='Just An Update On My New Job'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112810539390304342</id><published>2005-09-30T13:23:00.000-05:00</published><updated>2005-09-30T13:37:13.346-05:00</updated><title type='text'>Evaluating MyEclipse IDE for JSF Development</title><content type='html'>Today I decided to start really evaluating MyEclipse IDE.  Their 4.0 version offers many new and exciting enhancements including some for JSF development.  These are just a few observations I've made thus far and as I continue to use it I'm sure I'll be adding more.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;When in design mode, after adding a component, the mouse cursor will turn to a circle with a line and not allow you to click in the design editor anymore.  Switching to source mode then back to design mode fixes this until the next time you add a component.&lt;br /&gt;&lt;li&gt;There is no palette component for h:outputText (forums - known issue. have to wait until next version at least)&lt;br /&gt;&lt;li&gt;Design mode does not represent a panelGrid correctly.  For example, I created a panelGrid with 2 columns.  I then added 4 components expecting 2 columns.  In design mode all four components are displayed in a horizontal flow layout.  Not a grid layout as expected.  Same goes for the preview tab.&lt;br /&gt;&lt;li&gt;There is no tool button on the faces-config design palette for adding a managed-bean.&lt;br /&gt;&lt;li&gt;When adding a managed-bean with properties via the wizard, the managed-bean declaration in faces-config contains managed-properties for each declared property.  At the very least this should be an option as managed-properties are, at most times, not required.&lt;br /&gt;&lt;li&gt;There are no options to specify expression language values for managed-properties.&lt;br /&gt;&lt;li&gt;There is currently no palette support for MyFaces extensions, although MyEclipse IDE has MyFaces support which is to say it adds JAR's for you and web.xml entires. (forums - known issue. Have to wait for next version and even then it's a maybe??)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Ok, these seem to all be complaints.  Hopefully as I use it more I'll have something good to say about it.  I've searched for some of these issues on the support forums and noted findings in the list above.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112810539390304342?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112810539390304342/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112810539390304342' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112810539390304342'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112810539390304342'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/09/evaluating-myeclipse-ide-for-jsf.html' title='Evaluating MyEclipse IDE for JSF Development'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112653807770110134</id><published>2005-09-12T10:10:00.000-05:00</published><updated>2005-09-12T10:14:37.716-05:00</updated><title type='text'>Are You Really Blogging About Splash Screens?</title><content type='html'>Reading my javablogs email today I noticed 2 very similar posts.  &lt;a href="http://blogs.sun.com/roller/page/roumen?entry=new_netbeans_5_0_graphics"&gt;New Netbeans 5.0 Graphics&lt;/a&gt; and &lt;a href="http://blogs.sun.com/roller/page/geertjan?entry=cool_new_netbeans_welcome_screen"&gt;Cool New Netbeans Welcome Screen&lt;/a&gt;.  Are you serious?  Are you really blogging about splash screens?  I'm not a Netbeans user but I can think of a hundred other Netbeans topics that are a lot more important than it's splash screen.  But I guess this is where blogging has been going for some time.  Can't think of anything important to blog about so I'll pick the most mundane meaningless topic possible.  And  here I am blogging about people blogging about Splash Screens.  Oh well...&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112653807770110134?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112653807770110134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112653807770110134' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112653807770110134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112653807770110134'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/09/are-you-really-blogging-about-splash.html' title='Are You Really Blogging About Splash Screens?'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112490008181097448</id><published>2005-08-24T11:14:00.000-05:00</published><updated>2005-08-24T11:14:41.816-05:00</updated><title type='text'>Download Google Talk</title><content type='html'>&lt;a href="http://www.google.com/talk"&gt;Google Talk&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112490008181097448?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112490008181097448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112490008181097448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112490008181097448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112490008181097448'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/08/download-google-talk.html' title='Download Google Talk'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112428905970467894</id><published>2005-08-17T09:14:00.000-05:00</published><updated>2005-08-17T09:30:59.713-05:00</updated><title type='text'>Closed Source vs Open Source</title><content type='html'>This morning I was reading through a thread at Javaranch in our Moderators Only forum about an odd statement in LayoutComparator.  This discussion eventually led to various RFE's that have been ignored for years by Sun.  One of the staff's favorites was &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4057701" target="_blank"&gt;this one&lt;/a&gt;.  All this talk of ignored bugs got me thinking about libraries and API's that I use that are open source and others that are considered closed source.&lt;br /&gt;&lt;br /&gt;Take, for example, JSF.  For all it's (debatably) usefullness there are some major issues.  Some of these issues are being resolved in the 1.2 version of the specification.  However, 1.2 is not due out until the release of J2EE 1.5 which is not due until late next year (2006).  In comparison, look at &lt;a href="http://jakarta.apache.org/tapestry/"&gt;Tapestry&lt;/a&gt;.  Sure, it has it's own issues.  But time and time again I see bug reports on the mailing list and replys that these issues have been fixed within days.  Obviously this is happening more frequently with Tapestry 4 final on the horizen and I know Howard wants it to be as bug free as possible before the release.  At the very least, nightly builds are available so if you need the most recent version with the bug fixed you are having a problem with, you can probably get it.  Sun might have all the bugs fixed in JSF.  But we don't get it until late next year.  We have to settle for good open source projects like &lt;a href="http://myfaces.apache.org/"&gt;MyFaces&lt;/a&gt; to make work arounds for these bugs.&lt;br /&gt;&lt;br /&gt;I haven't looked into Apache's open source VM (Harmony) at all.  I haven't even been to the website.  But the more issues I run into with closed source tools, the more willing I am to check it out.  And if they can address some of these 8 year old lingering issues before Sun, why not?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112428905970467894?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112428905970467894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112428905970467894' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112428905970467894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112428905970467894'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/08/closed-source-vs-open-source.html' title='Closed Source vs Open Source'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112267275286771288</id><published>2005-07-29T16:26:00.000-05:00</published><updated>2005-07-29T16:32:32.873-05:00</updated><title type='text'>Hibernate Forum Now Based on Credit System</title><content type='html'>So the Hibernate team has finally pulled out the final stop in trying to, well, the only thing I can come up with is to get people to stop asking questions.  They state that this is to force people to help each other, but it seems to me that helping is something that comes natural in most community forums.&lt;br /&gt;&lt;br /&gt;You can read about this rediculous effort &lt;a href="http://forum.hibernate.org/viewtopic.php?t=945105" target="_blank"&gt;here&lt;/a&gt;.  And just so you know, &lt;a href="http://saloon.javaranch.com"&gt;Javaranch&lt;/a&gt; has a forum dedicated to ORM tools including Hibernate and we are actually really friendly and helpful just out of the goodness of our hearts.  So if your sick of the crap you have to put up with on the Hibernate forums, we'd love to see you at the Ranch.&lt;br /&gt;&lt;br /&gt;Hibernate is an awesome tool, but they really make it hard to want to use it, don't they?&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112267275286771288?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112267275286771288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112267275286771288' title='39 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112267275286771288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112267275286771288'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/hibernate-forum-now-based-on-credit.html' title='Hibernate Forum Now Based on Credit System'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>39</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112266253799146741</id><published>2005-07-29T13:38:00.000-05:00</published><updated>2005-07-29T13:42:58.083-05:00</updated><title type='text'>.NET Near Darwin Award Goes To...</title><content type='html'>God help us if this developer switches to Java.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=63512"&gt;http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=63512&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112266253799146741?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112266253799146741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112266253799146741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112266253799146741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112266253799146741'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/net-near-darwin-award-goes-to.html' title='.NET Near Darwin Award Goes To...'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112250044187507619</id><published>2005-07-27T16:35:00.000-05:00</published><updated>2005-07-27T16:41:31.126-05:00</updated><title type='text'>JSF Component Blushing</title><content type='html'>I've been looking for a way to blush some of my text components based on whether or not they passed JSF's built in validation of some input components rather than displaying error messages because they tend to mess up my layout and I don't like the global messages.&lt;br /&gt;&lt;br /&gt;Found out from a guy on Javaranch you can do something similar to this:&lt;br /&gt;&lt;br /&gt;styleClass="#{newIssueForm.summaryText.valid ? 'normal' : 'error'}"&lt;br /&gt;&lt;br /&gt;Where normal and error are styles defined in your stylesheet.  Works great.  Thanks a lot to Mauro Castaldo for pointing this out to me.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112250044187507619?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112250044187507619/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112250044187507619' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112250044187507619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112250044187507619'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/jsf-component-blushing.html' title='JSF Component Blushing'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112205014792395272</id><published>2005-07-22T11:06:00.000-05:00</published><updated>2005-07-22T13:53:24.006-05:00</updated><title type='text'>Desktop Java Live - A Must Have For Desktop Developers</title><content type='html'>Recently I was fortunate enough to win a copy of &lt;a href="http://www.sourcebeat.com/TitleAction.do?id=10"&gt;Desktop Java Live&lt;/a&gt; by Scott Delap (who also runs &lt;a href="http://www.clientjava.com"&gt;clientjava.com&lt;/a&gt;) during a book promotion over at &lt;a href="http://www.javaranch.com"&gt;Javaranch&lt;/a&gt;.  Desktop Java Live isn’t your typical “how-to” java book full of API references and examples of how to create JFrame’s, JComboBoxes, and custom widgets.  DJL is a pioneering book distributed by a pioneering publisher (&lt;a href="http://www.sourcebeat.com/"&gt;SourceBeat&lt;/a&gt;) that teaches you how to write desktop applications using best practices as well as how to use a plethora of open source libraries to enhance and ease the development of your applications.&lt;br /&gt;&lt;br /&gt;Currently there are 7 chapters available with chapter 8 due out the beginning of August.  If you don’t know how SourceBeat titles work I’d suggest visiting their website and seeing what they offer.  Books are bought on a yearly subscription and for that year you have access to any updated material as well as new chapters as they are made available.  A lot better than waiting years for second and third editions.  You get the hottest topics while they are still hot.&lt;br /&gt;&lt;br /&gt;Scott starts your journey in chapter one and introduces you to desktop applications all over again.  He talks about the swing (no pun intended) from rich desktop apps to browser based web applications over the past several years and how to determine if your application is right for the desktop.  From there you move on to Layout Managers, GUI Builders (not to be confused with GUI designers), Look And Feel and then to a chapter that is pure gold.  Swing Threads.&lt;br /&gt;&lt;br /&gt;Chapter 5 on Swing Threads is also the sample chapter available as a free download.  This chapter introduces you to the Event Dispatching Thread and discusses common threading pitfalls in Swing applications.  Scott then shows you several different freely available API’s that have been made available to help Swing developers deal with threads more effectively.  You can search the web for weeks and not find the culmination of useful information available in this single chapter of Scott’s book.&lt;br /&gt;&lt;br /&gt;The book continues on with data binding and validation and to my knowledge is the only book that actually teaches you how to use JGoodies data binding and validation frameworks.  The book is full of sample code.  You never get bogged down in API references or theory.  But theory is still important.  And I had the honor of being able to read Chapter 8 prior to its release this August which is about Swing Patterns.  This chapter also contains a sample application that uses what you have learned all the way to this point.  Chapter 8 discusses MVC (Model-View-Controller) and MVP (Model-View-Presenter) and how they are used in and with Swing.  Again, no other book that I know of teaches you what Scott does in this chapter alone.  And although chapter 8 as well as many other chapters are biased to Swing the concepts are true for almost any toolkit.  If you only buy this book for one chapter, it should be chapter 8.&lt;br /&gt;&lt;br /&gt;On the horizon are chapters on Java WebStart, Installers, Obfuscators, and the all important Testing.  Scott writes in a way that that is easy to follow and understand but does not water down the topics.  Scott knows what he is talking about and that shows throughout the book.  If you’ve never written a Swing application this book won’t explain how to do that.  But if you are even remotely familiar with how to develop Swing applications this book will help your next application be the best it can be.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112205014792395272?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112205014792395272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112205014792395272' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112205014792395272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112205014792395272'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/desktop-java-live-must-have-for.html' title='Desktop Java Live - A Must Have For Desktop Developers'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112074704927085232</id><published>2005-07-07T09:30:00.000-05:00</published><updated>2005-07-07T09:38:10.193-05:00</updated><title type='text'>DB4Free - Help Make MySQL 5 As Perfect As Possible</title><content type='html'>I ran across &lt;a href="http://www.db4free.net/"&gt;this&lt;/a&gt; little site yesterday from a post at Javaranch.  Basically, you sign up and you get a free MySQL 5 database on a remote server that you have access to.  You can give access from any host or limit it to be from a single host.  You can register 2 databases under a single email address.  &lt;br /&gt;&lt;br /&gt;The main goal of this project is to help get MySQL 5 ready for primetime.  From the website: &lt;span style="font-style:italic;"&gt;With this project we also like to help the MySQL AB company to make the new MySQL 5 database server as perfect as possible. If you find any bugs, we would like you to report them on the MySQL website.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Obviously you wouldn't want to use this for anything in production or anything secure but it's a nice way to test out the new features of MySQL 5 without having to install and configure it yourself.  Also, my site host only gives me 1 MySQL database so if I needed another one this would be a good temporary solution.  Plus, I am all for helping MySQL out.  They've been good to me by providing really good free database servers.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112074704927085232?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112074704927085232/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112074704927085232' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112074704927085232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112074704927085232'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/db4free-help-make-mysql-5-as-perfect.html' title='DB4Free - Help Make MySQL 5 As Perfect As Possible'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112022831787494195</id><published>2005-07-01T08:59:00.000-05:00</published><updated>2005-07-01T09:31:57.880-05:00</updated><title type='text'>The Desktop War and Java</title><content type='html'>Yesterday I had a conversation with a friend of mine about linux, mac, windows, etc.  He is a big fan of the mac and suggested I get one so I could have the best of both worlds, meaning windows and linux.  I made some comment about not needing to buy new hardware just so I can run OSX.  Linux has everything I need with the exception of good solid gaming support, which mac currently is one up on linux because they can run World of Warcraft natively.&lt;br /&gt;&lt;br /&gt;But in all honesty the desktop I run is meaningless to me.  Software is more important right there with getting done what I need to get done.  I don't even care what the desktop looks like.  I run blackbox on linux if that tells you anything.  Sure there are features of a desktop that are nice, like OSX's drag and drop to/from anything, but visually speaking I am too busy programming or playing games in fullscreen mode to care if the menu's fade in/out, have drop shadows, or what is animated.  This is all fluff.  And desktops like Gnome, WindowsXP, KDE, etc just eat up system memory that could be put into better things like the applications I run.&lt;br /&gt;&lt;br /&gt;Given that I don't care about the desktop but software is important it makes sense to acknowledge that I should run the desktop with the best support for the software I like to use.  But software should not determine what Desktop OS I run.  Java developers need to grab hold of this concept.  There are a lot of native packages that have been ported to all different platforms.  Java developers wake up, this is a sign.  More and more people are demanding good software run on anything.  And no matter what anyone says, Java is the best solution.  Write your code on any platform, compile to bytecode on said platform, deploy anywhere.  There is no other language that can do this.  There is no other language that makes it easier to develop for any OS.  If you are developing applications for multiple platforms and you aren't using Java, you are wasting valuable time in cross platform development.  It's natural only to Java.&lt;br /&gt;&lt;br /&gt;Writing code native to a platform only makes sense if there are features of that platform that java can't get to and you are only planning those features on said platform.  If you are writing an application that interacts with MS Outlook, then just write in C# or VB.NET or even C++ and MFC.  I am 100% for using the best language to get the job done.  But I'll always consider Java as the first language of choice and if I don't feel it can accomplish the tasks at hand, I'll find something that can.  But honestly, there isn't much that java can't do these days.  &lt;br /&gt;&lt;br /&gt;The desktop war can only last so long until people get really sick of paying high prices for fluff.  Windows, Mac, Linux, I don't care.  I just want to run software and get my work done.  Give me all my tools in Java and the desktop war is over!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112022831787494195?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112022831787494195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112022831787494195' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112022831787494195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112022831787494195'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/07/desktop-war-and-java.html' title='The Desktop War and Java'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112014567147592484</id><published>2005-06-30T10:32:00.000-05:00</published><updated>2005-06-30T10:34:31.480-05:00</updated><title type='text'>Native Linux World of Warcraft Petition</title><content type='html'>In looking for ways to make World of Warcraft run on my new smoking Ubuntu linux machine I ran across a petition that will be given to Blizzard in an effort to get them to port WoW to linux.  If you are a WoW fan like me and have 5 seconds, please sign this petition.&lt;BR&gt;&lt;BR&gt;&lt;br /&gt;&lt;a href="http://www.blizzpub.net/petition/"&gt;Petition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112014567147592484?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112014567147592484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112014567147592484' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112014567147592484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112014567147592484'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/native-linux-world-of-warcraft.html' title='Native Linux World of Warcraft Petition'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112014397328173754</id><published>2005-06-30T10:02:00.000-05:00</published><updated>2005-06-30T10:06:13.286-05:00</updated><title type='text'>Trolltech's QT 4 Released</title><content type='html'>June 28, 2005 - Trolltech launches QT4 along with a duel licensing scheme for Windows.  QT was originally only offered as GPL Open Source under X11 and Mac.  Now QT is available under GPL Open Source for Windows users.&lt;br /&gt;&lt;br /&gt;Official announcment and downloads can be found &lt;a href="http://www.trolltech.com/newsroom/announcements/00000209.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112014397328173754?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/112014397328173754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=112014397328173754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112014397328173754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112014397328173754'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/trolltechs-qt-4-released.html' title='Trolltech&apos;s QT 4 Released'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111997267037107906</id><published>2005-06-28T10:31:00.000-05:00</published><updated>2005-06-28T10:31:10.376-05:00</updated><title type='text'>Java Gaming on the Desktop Could Be A Good Thing</title><content type='html'>I'm not a big gamer and the games I do play have to be pretty darn good. I have been playing World of Warcraft since it was in open beta and can't get enough of that. It runs on Windows and Mac. I was impressed that they released a Mac version. It's about time OSX starts getting some popular ports so those guys and gals can spend some money as well. :)&lt;br /&gt;&lt;br /&gt;I have never owned a Mac and with the change to x86 I am leary to go out and buy a new one right now. But I do run Linux. Not because I hate Windows or anything but because for a developer Linux has everything I need and more. And it is free after all. Don't get me wrong, I have no problems paying for good software. Espeically good games like WoW. But the linux world is really hurting I think. There are a lot of reasons why games just won't work on Linux. The most obvious is most games written today are written for Windows and therefor use DirectX which Linux doesn't really have. And for some reason not a lot of people are developing commercial games in pure opengl. But I am not real sure why.&lt;br /&gt;&lt;br /&gt;Ok, where does Java fit into all this rambling? I see Java as a good future gaming platform. Right now there are some pretty good API's like LWJGL and JOGL along with some Scenegraphs like Xith and jME which use JOGL and/or LWJGL. They are still pretty young in the grand scheme of things but I think in a few years we could see a shift in what language major games are being developed in. I know all you die hard C++ fanatics out there will disagree. In fact one of my best friends will argue till the day we die about how C++ is better than Java. But that's not really what this blog is about.&lt;br /&gt;&lt;br /&gt;I think portability is going to be a major attraction to the gaming industry in the coming years. WIth OSX on the rise (maybe) in popularity and with Linux distros like Ubuntu getting better and better, more people are going to want to run their favorite apps on the OS of thier choice instead of running the OS because the app requires it. This is where Java fits perfectly. Yes, there are some good C/C++ multiplatform tools out there. QT, SDL, Ogre to name just a few. I've used all 3 and they are good. But you still have to be really careful when developing in these as to what OS you are really working on. Java on different platforms, so long as there is a VM, just works. Plain and simple. C++ works, most of the time. Compilers really differ. And that is the big difference. The compiler. You still have to compile source code for the various platforms. And that isn't always fun.&lt;br /&gt;&lt;br /&gt;WIth the opengl wrappers for Java like JOGL and LWJGL there is still compiling for various supported platforms for the native libraries. But these are compiled and tested and done. You just use them and all you care about is Java.&lt;br /&gt;&lt;br /&gt;I don't think Java is quite there in terms of what API's are provided for gaming. But it's getting better. Puzzle Pirates is a recent success story. A MMORPG written in Java and was picked up by a commerical distributor. And there are a few Java games on the shelves at Best Buy if you look really carefully.&lt;br /&gt;&lt;br /&gt;True platform independency, ease of distribution via Java WebStart, a great community; all these things could make Java the new gaming language in the near future. I wouldn't mind that so much.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111997267037107906?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111997267037107906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111997267037107906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111997267037107906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111997267037107906'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/java-gaming-on-desktop-could-be-good.html' title='Java Gaming on the Desktop Could Be A Good Thing'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111996862452190279</id><published>2005-06-28T08:56:00.000-05:00</published><updated>2005-06-29T00:28:43.486-05:00</updated><title type='text'>Ubuntu - A True Pleasure</title><content type='html'>I have a Dell Inspiron XPS laptop.  It's a P4 3.4GHz machine with 1 GIG of RAM and it has an ATI Radeon Mobility 9800 with 256MB.  Not a bad machine.  I have really enjoyed it.  Well, I've enjoyed running Windows on it.  I've been trying for 6 months to get a Linux distro to run on it.  The major hurdle?  Video.  About the time I bought it was when ATI was just releasing their drivers for linux for the 9800.  Problem is they were never really designed for the mobility card and they suggest getting drivers from the computer manufacturer.  Uh, Dell don't do dat.  &lt;br /&gt;&lt;br /&gt;I tried Mandrake, Fedora, Debian, and Gentoo.  All of which installed rather easily (well, not gentoo but I still like that distro) but I could not get video to work with any of them.  And I'm not talking 3D acceleration.  Plain old show my desktop video would not work.  It was so frustrating.  So I gave up for a while.&lt;br /&gt;&lt;br /&gt;Yesterday I got to work and went to &lt;a href="http://distrowatch.com/"&gt;Distro Watch&lt;/a&gt; to see what was up and coming, what had been updated, etc.  I noticed &lt;a href="http://www.ubuntulinux.org/"&gt;Ubuntu&lt;/a&gt; recently released another version.  I went to their site and did some reading.  It seemed that from the forums people were having success getting video to work with the same hardware I have.&lt;br /&gt;&lt;br /&gt;Ubuntu is built off of a Debain core so all you need to download is a single CD ISO.  The CD installs the base system, kernel, and a few other goodies to get you going.  Everything else you need is done using apt-get or their nice GUI interface for apt-get, synaptic.  I downloaded the CD, created the CD image, and started the install process.  The install is all text based but it is still really simple.  The only part where you might have questions if you are new to linux is drive partitioning.  Although you can automate that but I was dual booting so I had to customize the partitions a bit.  Hardware detection was all automatic.  The install was done in a hurry and it ejected my CD and asked to reboot.  No questions about video or anything.  I thought "Great, going to have to jack with this manually".  It booted right into a nice GDM where I logged in and saw the nice, clean Gnome desktop.  And at the correct resolution, 1900x1200.&lt;br /&gt;&lt;br /&gt;I was in utter amazement.  Video worked just like that.  There was still a problem though.  My 3D acceleration wasn't working very well because it was still wanting to use some basic ATI driver and not the fglrx drivers that really sing.  After a bit of searching on the &lt;a href="http://ubuntuforums.org/index.php?"&gt;Ubuntu Forums&lt;/a&gt; I was able to fix this problem really easily. 3D acceleration and opengl support work flawlessly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A few other notes:&lt;/span&gt;&lt;br /&gt;------------------&lt;br /&gt;Desktop - Ubuntu uses a customized Gnome by default.  You can install any other desktop you want.  There is even a KDE Ubuntu project called &lt;a href="http://www.kubuntu.org/"&gt;Kubuntu&lt;/a&gt; that I installed and it works great if you are a KDE fan.&lt;br /&gt;&lt;br /&gt;Multimedia - I had to install some additional drivers and codecs to get DVD and MP3 support.  Not a big deal as Ubuntu makes installing additional software a breeze with apt-get.&lt;br /&gt;&lt;br /&gt;&lt;strike&gt;I still don't have my linksys wireless PCMCIA card working.  Word in the forums is that my card worked after some driver installs using ndiswrapper with the RC of the latest release.  After the release was made final it doesn't work anymore.  So I am still working on this.  But I can run wired just fine.&lt;/strike&gt;&lt;br /&gt;I went to Best Buy tonight and bought a Netgear WG111 Wireless USB Adapter for my Tivo.  I noticed this card mentioned on the Ubuntu forums so I gave it a shot and now I am editing this post from my Ubuntu Wireless system.  Wahoo!!  (I also installed Unreal Tournament 2004 and it runs even better than it ran on Windows, but that is another blog)&lt;br /&gt;&lt;br /&gt;Ubuntu has a 6 month release cycle so every 6 months they offer a new distribution.  Current users can simply upgrade their current release with apt-get, kernel and all.&lt;br /&gt;&lt;br /&gt;Software packages using apt-get are based on links in the repository of where to find the software.  You need to add additional links to the list so that apt-get can get more and newer software.  This is as easy as editing a file and adding the links though.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ubuntuguide.org/"&gt;The Ubuntu Guide&lt;/a&gt; is the best place to go right after installation.  Just go down the list and do what it says to get what you need.  Including how to add those additional resources for software.&lt;br /&gt;&lt;br /&gt;Sometimes software versions won't match release.  What I mean is accoring to Help-&gt;About on Mozilla Firefox I am running versino 1.02.  1.04 is the latest.  Questioning this in the forums I was told that although the versions don't match all the patches in 1.04 have been applied to my 1.02.  Good enough for me.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111996862452190279?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111996862452190279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111996862452190279' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111996862452190279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111996862452190279'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/ubuntu-true-pleasure.html' title='Ubuntu - A True Pleasure'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111781830995134133</id><published>2005-06-03T12:02:00.000-05:00</published><updated>2005-06-03T12:06:48.183-05:00</updated><title type='text'>Generics and EFL Save Me Code</title><content type='html'>I know that Generics and the Enhanced For Loop have been blogged to death but since I just now really started using them here and there I just wanted to publically state my thanks to those Sun guys that improved the language for me.&lt;br /&gt;&lt;br /&gt;The old way:&lt;br /&gt;-------------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(int i=0; i&amp;#60workstationlist.size(); i++){&lt;br /&gt;  list.add(new SelectItem(&lt;br /&gt;    ((Workstation)workstationList.get(i)).getId(),&lt;br /&gt;    ((Workstation)workstationList.get(i)).getWorkstation()));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The new way:&lt;br /&gt;--------------&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;for(Workstation w : workstationList) {&lt;br /&gt;   list.add(new SelectItem(w.getId(), w.getWorkstation());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Gotta love it!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111781830995134133?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111781830995134133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111781830995134133' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111781830995134133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111781830995134133'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/generics-and-efl-save-me-c_111781830995134133.html' title='Generics and EFL Save Me Code'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111773335720052808</id><published>2005-06-02T12:24:00.000-05:00</published><updated>2005-06-02T12:29:17.203-05:00</updated><title type='text'>SwingX Needs JDNC</title><content type='html'>I was playing around with some of the projects in the &lt;a href="https://swinglabs.dev.java.net/"&gt;SwingLabs&lt;/a&gt; today.  I started trying to get the JXDatePicker to work and I kept receiving a NullPointerException on an ImageIcon.  I thought that was strange.  I had the &lt;a href="https://swingx.dev.java.net/"&gt;SwingX&lt;/a&gt; JAR in my classpath.  &lt;br /&gt;&lt;br /&gt;I started looking on the &lt;a href="http://www.javadesktop.org/forums/index.jspa"&gt;JavaDesktop Forums&lt;/a&gt; for answers and I noticed that all the JXDatePicker questions were in the JDNC forum.  So I took a chance and downloaded those JAR files and added those to my classpath and now my JXDatePicker works.&lt;br /&gt;&lt;br /&gt;Thought this might help someone else out.  Took me a while to figure it out.  Maybe I am just slow. :)&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111773335720052808?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111773335720052808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111773335720052808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111773335720052808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111773335720052808'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/swingx-needs-jdnc.html' title='SwingX Needs JDNC'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111765458325253883</id><published>2005-06-01T14:34:00.000-05:00</published><updated>2005-06-01T14:36:23.253-05:00</updated><title type='text'>Java Studio Creator: Not The Same Code</title><content type='html'>I posted this over on &lt;a href="http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&amp;f=82&amp;amp;t=000223"&gt;Javaranch&lt;/a&gt; earlier but wanted to get some feedback from those that might not visit us over there.  Here is what I had to say:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Verdana, Arial;font-size:85%;"&gt; So I downloaded JSC today to give it another whirl. The last time I tried it was when it was still an RC. Ran decent on my 3 GHz with 1 Gig RAM but still not up to par with IDEA or Eclipse. I excepted this though since it's based on Netbeans and Netbeans is still creepy crawly even on good machines.&lt;br /&gt;&lt;br /&gt;Performance aside, it worked fairly well. I was able to create some basic forms and throw some navigation in there and move from page to page. The issues I had came when I started to look at the generated code. Hardly any of it follows the guidelines/practices that are taught in books. I'd asume this is because in the books we aren't using an IDE. But it is still interesting.&lt;br /&gt;&lt;br /&gt;For example, I've always considered it best practice to load a dropdown list via a getter method in the backing bean that loads the list and binds it to the dropdown component. When I look at the same code using JSC this is all down in the constructor of the backing bean.&lt;br /&gt;&lt;br /&gt;Another interesting note is how you are taught in books to create getter and setter methods for the values of the components. So for a login form you'd have&lt;br /&gt;&lt;br /&gt;private String username;&lt;br /&gt;private String password;&lt;br /&gt;&lt;br /&gt;and then getters and setters and in the componet you would specifiy the value accordingly. In JSC it uses all component binding. So you call getValue() of the component instead of getUsername() or whatever. Not that this is a bad way, just different than what is generally taught in books.&lt;br /&gt;&lt;br /&gt;I realize you can't expect IDE generated code to be as neat as what you write yourself but it would be nice if the things you learned from reading the books on JSF carried over to the IDE that just so happens to be made by Sun who just so happened to create the JSF specification.&lt;br /&gt;&lt;br /&gt;So who's breaking the rules?  Hand coders or the IDE?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111765458325253883?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111765458325253883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111765458325253883' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111765458325253883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111765458325253883'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/java-studio-creator-not-same-code.html' title='Java Studio Creator: Not The Same Code'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-111765367104475606</id><published>2005-06-01T14:19:00.000-05:00</published><updated>2005-06-01T14:21:11.046-05:00</updated><title type='text'>Moving My Blog</title><content type='html'>For a while now I have been mainting a weblog at http://radio.javaranch.com/gthought.  Recently I have been getting so bogged down with comment spam I thought I'd move my weblog over here and see if that subsides.&lt;br /&gt;&lt;br /&gt;I'll be attempting to move my blog entries from radio over to here so bare with me if you visit and things seem a bit out of order.&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-111765367104475606?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://greggbolinger.blogspot.com/feeds/111765367104475606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13341121&amp;postID=111765367104475606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111765367104475606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/111765367104475606'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/06/moving-my-blog.html' title='Moving My Blog'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13341121.post-112318744751882657</id><published>2005-04-28T15:29:00.000-05:00</published><updated>2005-08-04T15:30:47.526-05:00</updated><title type='text'>KGBInternet: Bad Experienced Turned Good by Good Customer Service</title><content type='html'>The other day I signed up for a shared Tomcat hosting plan at &lt;a href="http://www.kgbinternet.com/"&gt;KGBInternet&lt;/a&gt;. I was thrilled to find such a good price for the features that you get. They said they were running Tomcat 5.0.x so the first thing I wanted to do was try it out. I created a very simple webapp that accepted a users name and then displayed "Welcome name" on another page using JSP 2.0's EL. Worked great on my test machine so I uploaded it to my site. They provide a script via telnet to reload your context, which is nice because most others make you request a reload from support. So I ran that script, loaded my index page, input my name, clicked submit...and...ServletException!&lt;br /&gt;&lt;br /&gt;Thus begins my trials with KGBInternet. The first thing I did was search google and it turned up nothing. I then searched Javaranch and there were no threads with my ServletException. So I emailed Keith at KGBInternet. He was quick to respond and both he and I started looking into the issue. After about 20 emails I was getting so frustrated because there was no reason I should be getting the exception. The exception was being thrown because of something to do with the Expression Language parser. At this point I was very disappointed in KGBInternet. I emailed Keith and asked what I needed to do to cancel my account. He said an email was fine and he would take care of it. Something about the issue wouldn't let me let it go at that point. I continued discussions with Keith and he suggested something I never would have expected. He asked me to upload my tomcat folder and he would setup a private VM account for me at no additional charge while we figured out the problem. Talk about shocked, and impressed. I did as he suggested and I tried my webapp and it worked great. I emailed Keith thanking him for the help and told him to go ahead and set me up for the private tomcat account. It's $10 more a month but still a very good price comparativley. Come to find out it was a version issue with Tomcat 5.0.x not working with Java 1.5. I could have kept my shared account after this. I'll gladly pay KGBInternet $20 for a private tomcat instance.&lt;br /&gt;&lt;br /&gt;I worked retail for 10 years. I managed a Blockbuster Video and I was a manager at Lowe's Home Improvement. I know customer service. And it is seriously lacking these days. Cashiers don't even make eye contact anymore. Sales reps point to what aisle to find whatever product on instead of taking you there. It's all about the lowest price but somehow that also equates to the lowest service. I upped my account at KGBInternet 100% based on the customer service I received from Keith. And as long as it stays that way, I don't see any reason to leave them anytime soon.&lt;br /&gt;&lt;br /&gt;Thanks Keith. Great job!!&lt;div class="blogger-post-footer"&gt;&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-0023334659506868";
google_ad_width = 180;
google_ad_height = 150;
google_ad_format = "180x150_as";
google_ad_type = "text_image";
google_ad_channel ="";
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13341121-112318744751882657?l=greggbolinger.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112318744751882657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13341121/posts/default/112318744751882657'/><link rel='alternate' type='text/html' href='http://greggbolinger.blogspot.com/2005/04/kgbinternet-bad-experienced-turned.html' title='KGBInternet: Bad Experienced Turned Good by Good Customer Service'/><author><name>Gregg Bolinger</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp1.blogger.com/_8xhP3-wQ-qU/R5-98MtkHHI/AAAAAAAAAAk/eKbA2Mgg6YI/S220/l_1f561805d257e2cd8fa744b6aff7c4f4.jpg'/></author></entry></feed>
