<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Matt Stine&#039;s Blog &#187; jsf</title>
	<atom:link href="http://mattstine.com/category/jsf/feed/" rel="self" type="application/rss+xml" />
	<link>http://mattstine.com</link>
	<description>Thoughts on Java, Groovy, Grails, Agile Development, etc. etc. etc.</description>
	<lastBuildDate>Tue, 17 May 2011 17:02:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='mattstine.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Matt Stine&#039;s Blog &#187; jsf</title>
		<link>http://mattstine.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://mattstine.com/osd.xml" title="Matt Stine&#039;s Blog" />
	<atom:link rel='hub' href='http://mattstine.com/?pushpress=hub'/>
		<item>
		<title>How to implement form-level validation in JSF</title>
		<link>http://mattstine.com/2007/06/27/how-to-implement-form-level-validation-in-jsf/</link>
		<comments>http://mattstine.com/2007/06/27/how-to-implement-form-level-validation-in-jsf/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 17:54:00 +0000</pubDate>
		<dc:creator>mattstine</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[validation]]></category>

		<guid isPermaLink="false">http://www.mattstine.com/?p=36</guid>
		<description><![CDATA[Recently I was faced with the challenge of implementing form-level (or page-level) validation in a JSF-based application. What I mean by form-level validation is the need to evaluate a subset of a form&#8217;s fields as a unit, rather than simply validating each field in isolation. An example of this type of validation can be found [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=36&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently I was faced with the challenge of implementing form-level (or page-level) validation in a JSF-based application. What I mean by form-level validation is the need to evaluate a subset of a form&#8217;s fields as a unit, rather than simply validating each field in isolation. An example of this type of validation can be found on a user registration form where one has to select a password in one text field, and then retype the same password in another text field for confirmation. Validating that these two text fields contain the same password is an example of form level validation.</p>
<p>In my case, I had two date selector components on my form, one for a start date/time and one for an end date/time for an event that was being scheduled. The rule I needed to validate was that the end date/time was later than the start date/time.</p>
<p>There are a few ways to implement validation like this, including but not limited to:</p>
<ol>
<li>Build a custom component that renders selectors for both the start and end date/time, then validate as a unit. This actually is field-level validation and doesn&#8217;t truly address the form-level problem.</li>
<p>
<li>Implement a validator method on a managed bean that will evaluate the data submitted for multiple components.</li>
<p></ol>
<p>I&#8217;ll address the second method in this HOWTO.</p>
<p>First, you&#8217;ll need to bind at least <i>n-1</i> of the components that you want to validate to properties on your managed bean. The simplest way is to declare properties of type <b>UIInput</b>:<br />
<blockquote>
<pre>private UIInput startDateComponent;

public UIInput getStartDateComponent() {    return startDateComponent;}

public void setStartDateComponent(UIInput startDateComponent) {      this.startDateComponent = startDateComponent;}</pre>
<p></p></blockquote>
<p>and do the actual binding in the JSP:</p>
<blockquote><pre>&lt;t:inputDate id="eventStart" value="#{orderForm.sampleInfo.requestedStartTime}"    type="both"    popupCalendar="true"    ampm="true" binding="#{dateValidationForm.startDateComponent}"/&gt;</pre>
<p></p></blockquote>
<p>Next, you&#8217;ll implement the validation method, which can have any name you like, but must share the same signature as this example:<br />
<blockquote>
<pre>public void validateEndDate(FacesContext context, UIComponent toValidate, Object value) {    Date endDate = (Date) value;    Date startDate = (Date) getStartDateComponent().getLocalValue();

    if (startDate == null) {        context.addMessage(getStartDateComponent().getClientId(context),new FacesMessage("Please specify a valid date and time."));        throw new ValidatorException(new FacesMessage());    }

    long endTime = endDate.getTime();    long startTime = startDate.getTime();

    if (startTime &gt;= endTime) {        addError("errors.batchOrder.invalidEndDate");        throw new ValidatorException(new FacesMessage("Event end must be later than event start."));    }}</pre>
</blockquote>
<p>And finally, you&#8217;ll bind the validation method to the last component in your subset of components that need to be validated together:<br />
<blockquote>
<pre>&lt;t:inputDate id="eventEnd" value="#{orderForm.sampleInfo.requestedEndTime}" type="both" popupCalendar="true" ampm="true" validator="#{dateValidationForm.validateEndDate}"/&gt;</blockquote>
</pre>
<p>To understand why I say <i>n-1</i> components, think of the way the validation phase occurs in JSF. Data is bound to the components in the order that they occur in the JSF component tree, which just so happens to be the order in which they appear in the JSP source. Looking at the <b>validateEndDate</b> method, you&#8217;ll see that I only reference the <b>startDateComponent</b> from the binding, but I reference the <b>endDate</b> as the <b>Object value</b> reference that was passed into the method. This is why you only need to bind <i>n-1</i> components, because you get the <i>nth</i> component from the method signature.</p>
<p>If you want to be more uniform and bind all of the components, you could create an extra dummy hidden value component and bind the validator method to it. You could then bind all of the components to your managed bean and access them all from the bindings rather than accessing one from the method signature.</p>
<p>The <b>validateEndDate</b> method itself is rather simple. First you access the data by getting the local value of each component (again, the <b>endDate</b> value is not accessed in this way &#8211; in fact, it hasn&#8217;t been bound yet because it must be validated first, and that&#8217;s what&#8217;s happening in this method!). You then apply the business rule. You&#8217;ll see that first I look to see if the <b>startDate</b> is null. I&#8217;m not sure why this is possible, but if the <b>startDate</b> was not submitting a good value on the FIRST submit, the local value was null. So, I catch that here. I add an error message to the <b>startDateComponent</b> and throw a <b>ValidatorException</b>. If the business rule is violated, throw a <b>ValidatorException</b>. (I&#8217;m also using the <b>addError</b> method provided by AppFuse to work w/ its message framework as well, but that is not necessary w/ all JSF apps).</p>
<p>Now, for the final problem I encountered. In Weblogic server, which we&#8217;re still using for the time being, if your session cannot be serialized then it deletes your entire session. Obviously this can cause major problems in any web app. To deal with this, ANY SESSION SCOPED MANAGED BEAN must be fully serializable, meaning it and any objects referenced in its state. Herein lies the problem for JSF. Instances of <b>UIComponent</b> (an ancestor of <b>UIInput</b>) are not serializable, so if we bind our components to <b>UIInput</b> fields on a session-scoped managed bean (the bean backing this form is an Order Form/Shopping Cart style bean), it will not be serializable and Weblogic will kick out your session.</p>
<p>To deal with this problem, realize that there is no reason that you can only have one managed bean backing a form. In fact, you can reference as many managed beans as you need. Since validation is done for each request, there is no need to manage any state there across multiple requests like we need to do with a shopping cart. So, why not declare an additional managed bean that is REQUEST SCOPED, and then put the bindings and validation method there. That is exactly what I did. Here is the entire bean:<br />
<blockquote>
<pre>public class DateValidationForm extends BasePage {

    private UIInput startDateComponent;

    public UIInput getStartDateComponent() {        return startDateComponent;    }

    public void setStartDateComponent(UIInput startDateComponent) {        this.startDateComponent = startDateComponent;    }

    public void validateEndDate(FacesContext context, UIComponent toValidate, Object value) {        Date endDate = (Date) value;        Date startDate = (Date) getStartDateComponent().getLocalValue();

        if (startDate == null) {            context.addMessage(getStartDateComponent().getClientId(context),new FacesMessage("Please specify a valid date and time."));            throw new ValidatorException(new FacesMessage());        }

        long endTime = endDate.getTime();        long startTime = startDate.getTime();

        if (startTime &gt;= endTime) {            addError("errors.batchOrder.invalidEndDate");            throw new ValidatorException(new FacesMessage("Event end must be later than event start."));        }    }}</pre>
</blockquote>
<p>and the declaration in faces-config.xml:<br />
<blockquote>
<pre>&lt;managed-bean&gt;    &lt;managed-bean-name&gt;dateValidationForm&lt;/managed-bean-name&gt;    &lt;managed-bean-class&gt;org.stjude.hc.srmcti.webapp.action.ordering.
DateValidationForm&lt;/managed-bean-class&gt;    &lt;managed-bean-scope&gt;request&lt;/managed-bean-scope&gt;&lt;/managed-bean&gt;</pre>
</blockquote>
<p>The added bonus is that you can reuse this bean across all forms where you need this behavior. My application happens to have 2 additional forms where I would have repeated this logic, so I just reference this bean there.</p>
<p>Enjoy!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/mattstine.wordpress.com/36/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/mattstine.wordpress.com/36/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mattstine.wordpress.com/36/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mattstine.wordpress.com/36/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mattstine.wordpress.com/36/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=36&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mattstine.com/2007/06/27/how-to-implement-form-level-validation-in-jsf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1eaa45fee6a2b0c4b479b2982a4274f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mattstine</media:title>
		</media:content>
	</item>
		<item>
		<title>Thursday was slow&#8230;</title>
		<link>http://mattstine.com/2007/05/11/thursday-was-slow/</link>
		<comments>http://mattstine.com/2007/05/11/thursday-was-slow/#comments</comments>
		<pubDate>Sat, 12 May 2007 03:17:00 +0000</pubDate>
		<dc:creator>mattstine</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[restaurants]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.mattstine.com/?p=32</guid>
		<description><![CDATA[for me, not for JavaOne. Of course I was a good little programmer and used the schedule builder to sign up for all of my sessions. I edited them a bit after the first two keynotes. Even then, I had one lone session scheduled for Thursday morning (that wasn&#8217;t really directly applicable to my work, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=32&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>for me, not for JavaOne. Of course I was a good little programmer and used the schedule builder to sign up for all of my sessions. I edited them a bit after the first two keynotes. Even then, I had one lone session scheduled for Thursday morning (that wasn&#8217;t really directly applicable to my work, it just looked interesting), and then two sessions in the afternoon, the first starting at 4:10. I decided to skip out on the morning session and do a little shopping at Pier 39. The highlight was a &#8220;Bucket of Boat Trash&#8221; and clam chowder at the Bubba Gump Shrimp Company. And yes, we Ole Miss Rebels are represented as far out as the end of Pier 39:</p>
<p><a href="http://picasaweb.google.com/matt.stine/SanFranciscoJavaOne2007/photo#5063511710562298018"><img src="http://lh4.google.com/image/matt.stine/RkU1ErgYqKI/AAAAAAAAAMA/6BJ0mkhqgn8/s288/DSCN1117.JPG" /></a></p>
<p>The two sessions that I attended were:</p>
<p>- RubyTooling: State of the Art<br />- Using Ajax with POJC (Plain Old JavaServer Faces Components)</p>
<p>I attended the first session simply to get a little more detail on all of the hype surrounding Ruby tooling support in NetBeans 6. What I got was even more than I bargained for. The project leaders actually walked us through not only the features that were available, but how they were implemented. I had never really thought about the problems with providing code completion and refactoring with a dynamically-typed language. It was really cool to see the thought process that went into their solutions. I&#8217;d love to hear a similar discussion from the JetBrains guys, as the Ruby support in IntelliJ IDEA is quite good as well.</p>
<p>For me the second session was the best of the conference for me up until that point, and arguably it still is after attending Friday&#8217;s sessions. Craig McClanahan, of Struts fame, was the main speaker and was joined by his colleagues Matthew Bohm and Jayashri Visvanathan. What made this session so good for me was that they presented a problem &#8211; &#8220;How can I add Ajax behaviors to my JavaServer™ Faces technology based application, without throwing away my investment in existing component libraries?&#8221; &#8211; and then provided three different solutions to that problem &#8211; low, medium, and high level.</p>
<p>The low level consisted of simply using the HTML event pass-through attributes that are implemented by most standard JSF components (onClick, onBlur, etc.). One could use an existing JavaScript framework such as Dojo to send an XMLHttpRequest and then map that request to a Servlet or JSF handler using a technology such as Shale Remoting. The response could be sent back as JSON data which could then be transformed into the desired UI update.</p>
<p>The medium level consisted of actually extending existing JSF components and adding the desired Ajax behavior. Due to time constraints they didn&#8217;t cover this solution in detail, but they did provide a link to a detailed discussion in the Java BluePrints catalog: https://blueprints.dev.java.net/bpcatalog/ee5/ajax/extendingRenderFunctionality.html</p>
<p>The high level solutions addressed the following needs (copied directly from the slides):</p>
<p>● Partial page submit—gather up a particular set of<br />input element values, and send them to a bit of server<br />side business logic<br />● Partial page refresh—the business logic needs to<br />refresh the content of one or more subtrees of the<br />client side DOM<br />● Synchronization—the benefits of synchronizing the<br />server side state<br />● Don’t repeat yourself (DRY)—reuse existing<br />components and renderers for partial page updates</p>
<p>To address these issues, the speakers highlighted two add-on frameworks:</p>
<p>● Ajax4JSF (http://labs.jboss.com/portal/jbossajax4jsf)<br />● Dynamic Faces (https://jsf-extensions.dev.java.net/)</p>
<p>I was quite impressed with both of these frameworks. One of my colleagues is currently implementing Ajax behavior in a Facelets-based application using Ajax4JSF and he is quite happy with it. Dynamic Faces looked really awesome, especially its tooling support in NetBeans (actually I&#8217;m quite impressed with the overall JSF support in NetBeans &#8211; I&#8217;ll definitely be adding it to my tool belt). The highlight of the presentation was Matt&#8217;s video of him building an entire currency trading application in 28 minutes &#8211; except it was &#8220;fast-played&#8221; to finish in 3 1/2 minutes and set to techno music. Matt wowed us with his dancing abilities while we watched true RAD. The crowd went wild!</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/mattstine.wordpress.com/32/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/mattstine.wordpress.com/32/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mattstine.wordpress.com/32/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mattstine.wordpress.com/32/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mattstine.wordpress.com/32/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=32&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mattstine.com/2007/05/11/thursday-was-slow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1eaa45fee6a2b0c4b479b2982a4274f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mattstine</media:title>
		</media:content>

		<media:content url="http://lh4.google.com/image/matt.stine/RkU1ErgYqKI/AAAAAAAAAMA/6BJ0mkhqgn8/s288/DSCN1117.JPG" medium="image" />
	</item>
		<item>
		<title>Wednesday was AJAX Day</title>
		<link>http://mattstine.com/2007/05/10/wednesday-was-ajax-day/</link>
		<comments>http://mattstine.com/2007/05/10/wednesday-was-ajax-day/#comments</comments>
		<pubDate>Thu, 10 May 2007 23:49:00 +0000</pubDate>
		<dc:creator>mattstine</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[jMaki]]></category>
		<category><![CDATA[jsf]]></category>

		<guid isPermaLink="false">http://www.mattstine.com/?p=31</guid>
		<description><![CDATA[Not officially, but nearly every session I attended had something to do with AJAX: - Creating Amazing Web Interfaces with Ajax- jMaki: Web 2.0 App Building Made Easy- Fast, Beautiful, Easy: Pick Three &#8211; Building Web User Interfaces in the Java Programming Language with Google Web Toolkit- Killer JavaScript Technology Frameworks for Java Platform Developers: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=31&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Not officially, but nearly every session I attended had something to do with AJAX:</p>
<p>- Creating Amazing Web Interfaces with Ajax<br />- jMaki: Web 2.0 App Building Made Easy<br />- Fast, Beautiful, Easy: Pick Three &#8211; Building Web User Interfaces in the Java Programming Language with Google Web Toolkit<br />- Killer JavaScript Technology Frameworks for Java Platform Developers: An Exploration of Prototype, Script.aculo.us, and Rico</p>
<p>I have to say that I was rather impressed by what I saw.</p>
<p>The first talk was by Ben and Dion, the Ajaxian guys. It was an appropriate way to start, as they gave a quick history overview of Ajax. One nice point they made was that Ajax really isn&#8217;t about the acronym &#8211; it never was &#8211; it&#8217;s about building killer websites. Who cares what the actual technology behind it is. They discussed a couple of what they seemed to consider the better frameworks available &#8211; Dojo and ExtJS. They then explored some amazing up and coming features, including offline support and 2D client side graphics manipulation.</p>
<p>I was rather impressed with jMaki &#8211; in short it is a wrapper around many of the popular JavaScript frameworks available (Dojo, Yahoo UI, Script.aculo.us, Spry, Google), and makes them accessible to Java, PHP, and Ruby. It has excellent tool support in NetBeans and Eclipse. It provides protection from changes in the API&#8217;s of all of these projects &#8211; you can mix and match frameworks and only be concerned about one API &#8211; jMaki&#8217;s. It does the work of linking all of the widgets together and communicating amongst them and with the server side.</p>
<p>The GWT talk was easily my favorite of the day. I&#8217;m extremely impressed with what these guys have done. I hadn&#8217;t had much opportunity to look at GWT until now, and I really wish I had. I was initially skeptical about writing an entire application in Java and letting it generate HTML and JavaScript. I guess these guys knew that, because they&#8217;re development philosophy addresses my concerns quite nicely:</p>
<p><span style="font-style:italic;"><br />To radically improve the web experience for<br />users by enabling developers to use existing<br />Java tools to build no-compromise AJAX for<br />any modern browser</span></p>
<p>From what I can see, they deliver on their mission. They&#8217;ve optimized their code for speed and for browser specificity (e.g. from what I understand, if your client is using Firefox, you get Firefox optimized JavaScript, same for IE, etc.). You can use all of your favorite IDE features to build the code, including the debugger. I really want to try to make use of this toolkit in the near future.</p>
<p>The final talk was less informative for me, but only because I had experience with most of the technologies already. The killer part of this was how the speaker extended existing JSF components and added Script.aculo.us effects. It really made his version of Yahoo maps shine.</p>
<p>Ajax isn&#8217;t going anywhere but up. I just left yet another Ajax/JSF session, which for me was the best session of the conference so far. In a later entry I&#8217;ll tell you why.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/mattstine.wordpress.com/31/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/mattstine.wordpress.com/31/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/mattstine.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/mattstine.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/mattstine.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=mattstine.com&amp;blog=58954&amp;post=31&amp;subd=mattstine&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://mattstine.com/2007/05/10/wednesday-was-ajax-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1eaa45fee6a2b0c4b479b2982a4274f4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">mattstine</media:title>
		</media:content>
	</item>
	</channel>
</rss>
