Validação JSF

Olá pessoal! Seguinte, eu estou fazendo validação no JSF mas as mensagens de erros aparecem em frente ao campo, deslocando todos os campos para a esquerda. Tentei colocar as mensagens embaixo de todos os campos, mas ocorre que ao abrir a tela do cadastro, esses campos de mensagens já estão ocupando espaço em tela, sendo assim, ficam vários espaços em branco na tela para nada as vezes. Como posso fazer para eliminar isso?

Eis o código da página:

[code]
<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1”
pageEncoding=“ISO-8859-1”%>

<%@taglib uri=“http://java.sun.com/jsf/core” prefix=“j” %>
<%@taglib uri=“http://java.sun.com/jsf/html” prefix=“h” %>
<j:loadBundle basename=“br.org.capixabavip.config.message_pt” var=“msg”/>

<!DOCTYPE html PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN” “http://www.w3.org/TR/html4/loose.dtd”>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=ISO-8859-1”>
<title>Cadastro Usuário</title>

<link href="…/css/estilo.css" rel=“stylesheet” type=“text/css” />

</head>
<body class=“BODY”>
<center><h3>Cadastro de Usuário</h3>
<j:view>
* = Campos Obrigatórios!
<h:form id=“cadastroUsuario”>
<h:panelGrid columns=“2” rules=“all” title=“Cadastro de Usuário” styleClass=“tabelaCadastro”>
<j:facet name=“header”>
<h:outputText value=“Cadastro de Usuário” />
</j:facet>

		&lt;h:outputLabel for="nome"&gt;			
			&lt;h:outputText value="Nome: " /&gt;				
		&lt;/h:outputLabel&gt;
	  		 
		&lt;h:inputText id="nome" value="#{Usuario.nome}" required="true"&gt;
			&lt;j:validator validatorId="valida" /&gt;
		&lt;/h:inputText&gt;					

		&lt;h:outputLabel for="usuario"&gt;
			&lt;h:outputText value="Usuário: " /&gt;
		&lt;/h:outputLabel&gt;
		&lt;h:inputText id="usuario" value="#{Usuario.usuario}" required="true" /&gt;
					
		&lt;h:outputLabel for="senha"&gt;
			&lt;h:outputText value="Senha: " /&gt;
		&lt;/h:outputLabel&gt;
		&lt;h:inputSecret id="senha" value="#{Usuario.senha}" required="true" /&gt;			
		
		&lt;/h:panelGrid&gt;
		
		&lt;h:panelGrid columns="1" rules="all" title="Cadastro de Usuário" styleClass="tabelaCadastro"&gt;
			<br>&lt;!-- Mensagens de erro --&gt;
				&lt;h:message for="nome" errorClass="errors" /&gt; <br>
				&lt;h:message for="usuario" errorClass="errors" /&gt; <br>
				&lt;h:message for="senha" errorClass="errors" /&gt; <br>
		
			&lt;j:facet name="footer"&gt;
				&lt;h:panelGroup&gt;
					&lt;h:commandButton action="#{Usuario.save}" value="#{msg.botao_confirmar}"
						styleClass="button"/&gt;
					&lt;h:commandButton action="#{Usuario.cancelar}" value="Cancelar"
						styleClass="button"/&gt;
				&lt;/h:panelGroup&gt;	
			&lt;/j:facet&gt;
		&lt;/h:panelGrid&gt;
	  
	&lt;/h:form&gt;	

</j:view>
</center>
</body>
</html>[/code]

Ta usando JSP ?

olha como fica usando XHTML…

&lt;?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich"&gt;
    &lt;style type="text/css"&gt;
        .ecol1 { vertical-align: top; padding-right : 25px }
        .ecol2 { vertical-align: top; border-left: #ACBECE 1px solid; padding-left : 10px }
        .rich-calendar-tool-btn{
            font-family: Arial, Verdana;
        }
    &lt;/style&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;
        &lt;link rel="StyleSheet" type="text/css" href="../style/estilos.css" media="screen" /&gt;
    &lt;/head&gt;
    &lt;a4j:keepAlive beanName="pessoaMB" /&gt;
    &lt;ui:composition template="/template/template.xhtml"&gt;
        &lt;ui:define name="corpo"&gt;
            &lt;rich:tabPanel switchType="ajax"&gt;
                &lt;rich:tab label="Cadastro de Mensalidade"&gt;
                    &lt;a4j:form&gt;
                        &lt;rich:messages /&gt;
                        &lt;legend&gt;Cadastro de Pessoa&lt;/legend&gt;
                        &lt;a4j:region id="regiaoAjax"&gt;
                            &lt;a4j:status id="sts"&gt;
                                &lt;f:facet name="start"&gt;
                                    &lt;h:graphicImage value="/images/ajax-loader_1.gif" /&gt;
                                &lt;/f:facet&gt;
                            &lt;/a4j:status&gt;
                        &lt;/a4j:region&gt;
                        &lt;!-- INICIA FORMULARIO--&gt;
                        &lt;fieldset&gt;
                            &lt;h:panelGrid columns="2" id="inputs"&gt;
                                &lt;h:outputLabel for="matricula" value="Digite a Matrícula: " /&gt;
                                &lt;h:inputText id="matriuclaInput" value="#{pessoaMB.pessoa.matricula}"  styleClass="inputPesquisa" &gt;
                                    &lt;a4j:commandButton  value="Pesquisar" action="#{pessoaMB.pesquisaByMatricula}" styleClass="inputPesquisaBtn2" reRender="inputs,fisicas,pessoas,listaumensalidade"&gt;
                                    &lt;/a4j:commandButton&gt;
                                &lt;/h:inputText&gt;

                                Nome:
                              
                                 
                                &lt;h:selectOneMenu&gt;
                                  &lt;f:selectItems id="comboSelectItens" value="#{mensalidadeMB.PessoaParaComboBox}" /&gt;
                               &lt;/h:selectOneMenu&gt;
                                

                                &lt;h:inputText id="idMensalidade" value="#{mensalidadeMB.mensalidade.idMensalidade}" styleClass="inputPesquisa3" size="4" &gt;
                                &lt;/h:inputText&gt;
                                &lt;h:outputLabel for="Data Pagamento.:" value="Data Pagamento.: "  /&gt;
                                &lt;rich:calendar id="data_pag" value="#{mensalidadeMB.mensalidade.data_pag}"&gt;
                                    &lt;a4j:support event="ondateselected" /&gt;
                                &lt;/rich:calendar&gt;
                                &lt;h:outputLabel for="valor" value="Valor.: ($)"/&gt;
                                &lt;h:inputText id="valor" value="#{mensalidadeMB.mensalidade.valor}" styleClass="edit" size="30"&gt;
                                &lt;/h:inputText&gt;
                            &lt;/h:panelGrid&gt;
                               |&lt;a4j:commandButton value="Inserir" action="#{mensalidadeMB.salva}" status="sts" reRender="inputs,fisicas,pessoas,mensalidade,mensalidades" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Deletar" action="#{mensalidadeMB.delete}" status="sts" reRender="inputs,fisicas,pessoas,mensalidade" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Modificar" action="#{mensalidadeMB.merge}" status="sts" reRender="inputs,fisicas,pessoas,mensalidade" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Listar" action="#{mensalidadeMB.list}" status="sts" reRender="inputs,fisicas,pessoas,mensalidade" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Relatório" action="toCadastraMensalidade" status="sts" reRender="inputs,fisicas,pessoas,mensalidade" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Menslidades" action="toCadastraMensalidade" immediate="true" styleClass="botoes"/&gt;
                            |&lt;a4j:commandButton value="Voltar" immediate="true" action="toIndex" styleClass="botoes"/&gt;|
                        &lt;/fieldset&gt;

                        &lt;rich:messages /&gt;
                        &lt;fieldset&gt;&lt;legend&gt;Atualização de Dados&lt;/legend&gt;
                            &lt;f:subview id="listauser"&gt;
                                &lt;rich:dataTable value="#{pessoaMB.pessoas}" var="pessoa" rows="1" id="pessoas" width="100%" cellspacing="0" cellpadding="0" border="5"&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="MATRÍCULA" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{pessoa.matricula}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="NOME" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{pessoa.nome}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="STATUS" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{pessoa.status}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="Excluir"/&gt;
                                        &lt;/f:facet&gt;
                                        &lt;a4j:commandLink action="#{pessoaMB.delete}" status="sts" reRender="inputs,fisicas,pessoas" &gt;
                                            &lt;h:outputText value="Excluir"/&gt;
                                            &lt;f:setPropertyActionListener value="#{pessoa.id}" target="#{pessoaMB.id}" /&gt; &lt;!-- pega  o id --&gt;
                                        &lt;/a4j:commandLink&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="Editar"/&gt;
                                        &lt;/f:facet&gt;
                                        &lt;a4j:commandLink reRender="inputs,fisicas,pessoas" &gt;
                                            &lt;h:outputText value="Editar"/&gt;
                                            &lt;f:setPropertyActionListener value="#{pessoa}" target="#{pessoaMB.pessoa}" /&gt;
                                        &lt;/a4j:commandLink&gt;
                                    &lt;/h:column&gt;
                                    &lt;f:facet name="footer"&gt;
                                        &lt;rich:datascroller /&gt;
                                    &lt;/f:facet&gt;
                                &lt;/rich:dataTable&gt;
                            &lt;/f:subview&gt;
                            &lt;f:subview id="listaumensalidade"&gt;
                                &lt;rich:dataTable value="#{mensalidadeMB.mensalidades}" var="mensalidade" rows="5" id="mensalidades" width="100%" cellspacing="0" cellpadding="0" border="5"&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="CÓDIGO" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{mensalidade.idMensalidade}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="DATA/PAGAMENTO" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{mensalidade.data_pag}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="VALOR" /&gt;
                                        &lt;/f:facet&gt;
                                        &lt;h:outputText value="#{mensalidade.valor}" /&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="Excluir"/&gt;
                                        &lt;/f:facet&gt;
                                        &lt;a4j:commandLink action="#{mensalidadeMB.delete}" status="sts" reRender="inputs,mensalidade,mensalidades" &gt;
                                            &lt;h:outputText value="Excluir"/&gt;
                                            &lt;f:setPropertyActionListener value="#{mensalidade.idMensalidade}" target="#{mensalidadeMB.idMensalidade}" /&gt; &lt;!-- pega  o id --&gt;
                                        &lt;/a4j:commandLink&gt;
                                    &lt;/h:column&gt;
                                    &lt;h:column&gt;
                                        &lt;f:facet name="header"&gt;
                                            &lt;h:outputText value="Editar"/&gt;
                                        &lt;/f:facet&gt;
                                        &lt;a4j:commandLink reRender="inputs,mensalidade,mensalidades" &gt;
                                            &lt;h:outputText value="Editar"/&gt;
                                            &lt;f:setPropertyActionListener value="#{mensalidade}" target="#{mesalidadeMB.mensalidade}" /&gt;
                                        &lt;/a4j:commandLink&gt;
                                    &lt;/h:column&gt;
                                    &lt;f:facet name="footer"&gt;
                                        &lt;rich:datascroller /&gt;
                                    &lt;/f:facet&gt;
                                &lt;/rich:dataTable&gt;
                            &lt;/f:subview&gt;
                        &lt;/fieldset&gt;
                    &lt;/a4j:form&gt;
                &lt;/rich:tab&gt;
&lt;!-- ****************************************************************** TAB LISTA DE PESSOAS**************************************************--&gt;
                &lt;rich:tab label="Lista de Pessoas"&gt;
                    &lt;f:subview id="listauser"&gt;
                        &lt;a4j:form&gt;
                            &lt;rich:messages /&gt;
                            &lt;fieldset&gt;
                                &lt;a4j:region id="regiaoAjax"&gt;
                                    &lt;a4j:status id="sts"&gt;
                                        &lt;f:facet name="start"&gt;
                                            &lt;h:graphicImage value="/images/ajax-loader_1.gif" /&gt;
                                        &lt;/f:facet&gt;
                                    &lt;/a4j:status&gt;
                                &lt;/a4j:region&gt;
                                &lt;h:panelGrid columns="2" id="inputs"&gt;
                                    &lt;h:outputLabel for="nomeLabel" value="Digite o Nome: " /&gt;
                                    &lt;h:inputText id="nomeInput" value="#{pessoaMB.pessoa.nome}" style=" width : 250px;"  styleClass="inputPesquisa"&gt;
                                        &lt;a4j:commandButton value="Pesquisar" action="#{pessoaMB.pesquisaByNome}" reRender="pessoas"&gt;
                                        &lt;/a4j:commandButton&gt;
                                    &lt;/h:inputText&gt;
                                &lt;/h:panelGrid&gt;
                            &lt;/fieldset&gt;
                            &lt;rich:dataTable value="#{pessoaMB.pessoas}" var="pessoa" rows="10" id="pessoas" width="100%" cellspacing="0" cellpadding="0" border="1"&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="MATRÍCULA" /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.matricula}" /&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="NOME" /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.nome}" /&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="E-MAIL" /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.email}" /&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="CPF" /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.cpf}" /&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="DATA NASC." /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.data_nasc}"&gt;
                                        &lt;f:convertDateTime pattern="dd/MM/yyyy" /&gt;
                                    &lt;/h:outputText&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="CELULAR" /&gt;
                                    &lt;/f:facet&gt;
                                    &lt;h:outputText value="#{pessoaMB.pessoa.celular}" /&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="Excluir"/&gt;
                                    &lt;/f:facet&gt;
                                    &lt;a4j:commandLink action="#{pessoaMB.delete}" status="sts" reRender="inputs,fisicas,pessoas" &gt;
                                        &lt;h:outputText value="Excluir"/&gt;
                                        &lt;f:setPropertyActionListener value="#{pessoa.id}" target="#{pessoaMB.id}" /&gt;
                                    &lt;/a4j:commandLink&gt;
                                &lt;/h:column&gt;
                                &lt;h:column&gt;
                                    &lt;f:facet name="header"&gt;
                                        &lt;h:outputText value="Editar"/&gt;
                                    &lt;/f:facet&gt;
                                    &lt;a4j:commandLink reRender="inputs,fisicas,pessoas" &gt;
                                        &lt;h:outputText value="Editar"/&gt;
                                        &lt;f:setPropertyActionListener value="#{pessoa}" target="#{pessoaMB.pessoa}" /&gt;
                                    &lt;/a4j:commandLink&gt;
                                &lt;/h:column&gt;

                                &lt;f:facet name="footer"&gt;
                                    &lt;rich:datascroller /&gt;
                                &lt;/f:facet&gt;
                            &lt;/rich:dataTable&gt;
                        &lt;/a4j:form&gt;
                    &lt;/f:subview&gt;
                &lt;/rich:tab&gt;
                &lt;!-- ******************************FIM************************************ TAB LISTA DE PESSOAS********************************************--&gt;
                &lt;rich:tab label="Filtros"&gt;
                &lt;/rich:tab&gt;
                &lt;rich:tab label="Relatórios"&gt;
                &lt;/rich:tab&gt;
            &lt;/rich:tabPanel&gt;
        &lt;/ui:define&gt;
    &lt;/ui:composition&gt;
&lt;/html&gt;



tu pode controlar tudo mostra onde quiser até em um panel :

# &lt;rich:messages /&gt;  
#                             &lt;fieldset&gt;  
#                                 &lt;a4j:region id="regiaoAjax"&gt;  
#                                     &lt;a4j:status id="sts"&gt;  
#                                         &lt;f:facet name="start"&gt;  
#                                             &lt;h:graphicImage value="/images/ajax-loader_1.gif" /&gt;  
#                                         &lt;/f:facet&gt;  
#                                     &lt;/a4j:status&gt;  
#                                 &lt;/a4j:region&gt;  

Valew Junior! Já sei mais ou menos como me virar agora aqui.

olha aqui:
required=“true”

&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"&gt;

    &lt;h:form id="ajaxValidatorForm"&gt;
        &lt;rich:panel&gt;
            &lt;f:facet name="header"&gt;
                &lt;h:outputText value="User Info:" /&gt;
            &lt;/f:facet&gt;
            &lt;h:panelGrid columns="3"&gt;
                
                &lt;h:outputText value="Name:" /&gt;
                &lt;h:inputText value="#{userBean.name}" id="name" required="true"&gt;
                    &lt;f:validateLength minimum="3" maximum="12"/&gt;
                    &lt;rich:ajaxValidator event="onblur"/&gt;
                &lt;/h:inputText&gt;
                &lt;rich:message for="name" /&gt;
                
                &lt;h:outputText value="Age:" /&gt;
                &lt;h:inputText value="#{userBean.age}" id="age" required="true"&gt;
                    &lt;f:convertNumber integerOnly="true"/&gt;
                    &lt;f:validateLongRange minimum="18" maximum="99"/&gt;
                    &lt;rich:ajaxValidator event="onblur"/&gt;
                &lt;/h:inputText&gt;
                &lt;rich:message for="age"/&gt;
                
            &lt;/h:panelGrid&gt;
        &lt;/rich:panel&gt;
    &lt;/h:form&gt;
&lt;/ui:composition&gt;

olha este exemplo:

/**
 * 
 */
package org.richfaces.demo.validation;

import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.Max;
import org.hibernate.validator.Min;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;

/**
 * @author Ilya Shaikovsky
 *
 */
public class ValidationBean {

    private String progressString="Fill the form please";
    
    @NotEmpty
    @Pattern(regex=".*[^\\s].*", message="This string contain only spaces")
    @Length(min=3,max=12)
    private String name;
    @Email
    @NotEmpty
    private String email;
    
    @NotNull
    @Min(18)
    @Max(100)
    private Integer age;
    
    public ValidationBean() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
    public void success() {
        setProgressString(getProgressString() + "(Strored successfully)");
    }

    public String getProgressString() {
        return progressString;
    }

    public void setProgressString(String progressString) {
        this.progressString = progressString;
    }
}
&lt;ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"&gt;

    &lt;h:form id="ajaxValidatorForm2"&gt;
        &lt;rich:panel&gt;
            &lt;f:facet name="header"&gt;
                &lt;h:outputText value="User Info:" /&gt;
            &lt;/f:facet&gt;
            &lt;h:panelGrid  columns="3"&gt;
                &lt;h:outputText value="Name:" /&gt;
                &lt;h:inputText value="#{validationBean.name}" id="name" required="true"&gt;
                    &lt;rich:ajaxValidator event="onblur" /&gt;
                &lt;/h:inputText&gt;
                &lt;rich:message for="name" /&gt;
                &lt;h:outputText value="Email:" /&gt;
                &lt;h:inputText value="#{validationBean.email}" id="email"&gt;
                    &lt;rich:ajaxValidator event="onblur" /&gt;
                &lt;/h:inputText&gt;
                &lt;rich:message for="email" /&gt;
                &lt;h:outputText value="Age:" /&gt;
                &lt;h:inputText value="#{validationBean.age}" id="age"&gt;
                    &lt;rich:ajaxValidator event="onblur" /&gt;
                &lt;/h:inputText&gt;
                &lt;rich:message for="age" /&gt;
            &lt;/h:panelGrid&gt;
        &lt;/rich:panel&gt;
    &lt;/h:form&gt;
&lt;/ui:composition&gt;

mais informações ?

http://livedemo.exadel.com/richfaces-demo/richfaces/graphValidator.jsf?c=graphValidator&tab=usage
http://imasters.uol.com.br/artigo/12384/jquery/validacao_de_formularios_com_jquery/