This week's book giveaway is in the OO, Patterns, UML and Refactoring forum. We're giving away four copies of Refactoring for Software Design Smells: Managing Technical Debt and have Girish Suryanarayana, Ganesh Samarthyam & Tushar Sharma on-line! See this thread for details.
The validate() method of a form returns a value of type ActionErrors. The contract of the validate() method is that if you find an error, you will instantiate either an ActionError or ActionMessage object, and add it to the ActionErrors object using the add() method. ActionError objects are displayed using the <html:errors/> tag, not the <html:messages/> tag.
The <html:messages /> tag will display an ActionMessages object that you have put in the request using the saveMessages() method in the Action superclass.
Even in your <html:messages/> tag, you are working way too hard. All you have to do is place the tag where you want the messages, and they will display if they are present, and won't display if they aren't.