Cadastro Simples com Jboss Seam e A4j

Amigos boa noite,

Estou precisando desenvolver um formulario simples com Seam que tem vários campos para preenchimento, deve funcionar assim:

  1. Usuário chama a aplicação, a mesma redireciona para index.xhtml que já é o formulário.
  2. Usuário Preenche os valores dos campos e clica no botão para incluir, se houver algum erro um modal apresenta o erro via ajax, sem renderizar a página.
  3. Se os dados forem validados com sucesso, o sistema salva os dados na base e apresenta um modal com a mensagem de sucesso.
  4. O sistema limpa o formulário para um novo preenchimento de dados.

Vou incluir aqui os arquivos quem puder me ajudar eu agradeço.
Estou estudando o caso, para saber qual tipo de escopo Seam utilizar e como gerenciar os componentes ajax.

Web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

<!-- Plugging the "Blue Sky" skin into the project -->
<context-param>
   <param-name>org.richfaces.SKIN</param-name>
   <param-value>blueSky</param-value>
</context-param>

<!-- Making the RichFaces skin spread to standard HTML controls -->
<context-param>
      <param-name>org.richfaces.CONTROL_SKINNING</param-name>
      <param-value>enable</param-value>
</context-param>
<!-- Defining and mapping the RichFaces filter -->
<filter> 
   <display-name>RichFaces Filter</display-name> 
   <filter-name>richfaces</filter-name> 
   <filter-class>org.ajax4jsf.Filter</filter-class> 
</filter> 
<filter-mapping> 
   <filter-name>richfaces</filter-name> 
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

  <listener>
    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
  </listener>
  <filter>
    <filter-name>Seam Filter</filter-name>
    <filter-class>org.jboss.seam.web.SeamFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>Seam Filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <context-param>
    <param-name>facelets.DEVELOPMENT</param-name>
    <param-value>true</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
  </context-param>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.seam</url-pattern>
  </servlet-mapping>
</web-app>

Action/Bean para gerenciar o formulario:

package br.avaliacao.mirante.action;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import br.avaliacao.mirante.entidade.SolicitacaoTransporte;
import br.avaliacao.mirante.servico.SolicitacaoTransporteService;
import br.avaliacao.mirante.util.DataUtil;
import com.miranteinfo.seam.framework.action.BaseAction;

@Name("solicitacaoTransporteAction")
@Scope(ScopeType.CONVERSATION)
public class SolicitacaoTransporteAction extends BaseAction {

	private static final long serialVersionUID = -2104805853460643964L;
	
	
	
	@In(create = true, required=false)
	@Out(required=false)
	SolicitacaoTransporte solicitacaoTransporte;
	
	@In(create = true)
	SolicitacaoTransporteService solicitacaoTransporteService;
	
	/**
	 * Método responsável por chamar a camada SERVICE para inserir os dados
	 */
	public void incluirNovaSolicitacao(){
		if(validarCamposSolicitacaoTransporte()){
			solicitacaoTransporteService.incluirSolicitacao(solicitacaoTransporte);
			addMsg("Solicitação de Transporte de Passageiro incluída com sucesso");
			solicitacaoTransporte = new SolicitacaoTransporte();
		}
	}
	
	/**
	 * Método responsável por validar as informações vindas do formulário
	 */
	public boolean validarCamposSolicitacaoTransporte(){
		boolean validadorFormulario = Boolean.TRUE;
		
		try {
			int validaValorRamal = -1;  
			validaValorRamal = solicitacaoTransporte.getDsRamal();
		} catch (Exception e) {
			addMsgErro("Campo Ramal de Preenchimento Obrigatório!");
			validadorFormulario = Boolean.FALSE;
		}
		
		if(solicitacaoTransporte.getDataAgendamento() == null){
			addMsgErro("Campo Data do Agendamento de Preenchimento Obrigatório!");
			validadorFormulario = Boolean.FALSE;
		}else if(!DataUtil.isDataValida(solicitacaoTransporte.getDataAgendamento(),DataUtil.FORMATO_DATA_BRASIL)){
				addMsgErro("Campo Data do Agendamento preenchido com valor inválido!");
				validadorFormulario = Boolean.FALSE;
		}

		if(solicitacaoTransporte.getHorarioSolicitado() == null){
			addMsgErro("Campo Horário Solicitado de Preenchimento Obrigatório!");
			validadorFormulario = Boolean.FALSE;
		}
		
		return validadorFormulario;
	}

	public SolicitacaoTransporte getSolicitacaoTransporte() {
		return solicitacaoTransporte;
	}

	public void setSolicitacaoTransporte(SolicitacaoTransporte solicitacaoTransporte) {
		this.solicitacaoTransporte = solicitacaoTransporte;
	}
}

Formulario index.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <title></title>
  </head>
  <body>
   <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"
      xmlns:mir="http://www.miranteinfo.com/seam/taglib">
 	 <f:view>
 	 <mir:messages/>
  	 <mir:statusAjax/>
  	 
  	 
  		<a4j:form  id="solicitacaoForm" rendered="true">
  		
  		
			<rich:panel width="700" style="text-align:center;">
			<f:facet name="header">
                <h:outputText value="#{messages['index.topo.nome']}"/>
            </f:facet>
            <rich:columnGroup>
            	<rich:column>
 				 <h:panelGrid columns="2">


 				  <h:outputText value="Solicitante:" />
 				  <h:panelGroup>
 				    <h:inputText id="dsSolicitante" 
								 value="#{solicitacaoTransporteAction.solicitacaoTransporte.dsSolicitante}" 
								 maxlength="60" />
 				  </h:panelGroup>
 				    
 				    
 				    
 				    
 				    <h:outputText value="Localização da Área:" />
 				    <h:panelGroup>
 				     		<h:inputText id="dsLocalizacaoArea" 
								 value="#{solicitacaoTransporteAction.solicitacaoTransporte.dsLocalizacaoArea}" 
								 maxlength="100" />
 				    </h:panelGroup>
 				   
 				     
 				     
 				     
 				      		<h:outputText value="Ramal: *" />
							<h:panelGroup>
								<h:inputText id="dsRamal" 
									value="#{solicitacaoTransporteAction.solicitacaoTransporte.dsRamal}" 
									required="true"
									requiredMessage="Campo Ramal de Preenchimento Obrigatório!" 
							        validatorMessage="Campo Ramal preenchido com valor inválido - Inserir até quatro caracteres numéricos sem sinal!"
							        converterMessage="Campo Ramal preenchido com valor inválido!"
							        size="4"
							        maxlength="4">
									<f:validateLength minimum="1" maximum="4"/>
									<f:validateLongRange minimum="0" />
								</h:inputText>
							</h:panelGroup>

						
						
						
						
						<h:outputText value="Data do Agendamento: *" />
						<h:panelGroup>
	 				        <mir:inputDate id="dataAgendamento" 
	 				       			required="true"
	 				       			label="Campo Data do Agendamento"
	 				        		value="#{solicitacaoTransporteAction.solicitacaoTransporte.dataAgendamento}"
	 				        		pattern="dd/MM/yyyy"/>
 				        </h:panelGroup>
						
						
						
						
						
						
						
					<h:outputText value="Gerência:" />
					<h:panelGroup>
 				   		<h:inputText id="dsGerencia" 
								 	value="#{solicitacaoTransporteAction.solicitacaoTransporte.dsGerencia}" 
								 	maxlength="5" />
 				   	</h:panelGroup>
 				   
 				   
 				   
 				   
 				   
 				   
 				   
 				    <h:outputText value="Horário Solicitado: *" />
 				    <h:panelGroup>
 				     	<mir:inputDate id="horarioSolicitado" 
 				     			required="true"
 				     			label="Campo Horário Solicitado"
 				     			value="#{solicitacaoTransporteAction.solicitacaoTransporte.horarioSolicitado}" 
 				     			pattern="dd/MM/yyyy"/>
					</h:panelGroup>
					
					
					
					
 				 </h:panelGrid>
 				</rich:column>

 				
 				<rich:column>
 					<a4j:commandButton value="Enviar" 
 									action="#{solicitacaoTransporteAction.incluirNovaSolicitacao}" 
 									status="statusAjax" />
 				</rich:column>
 			</rich:columnGroup>
          	</rich:panel>
  		</a4j:form>                    
  	</f:view>                  
  </ui:composition>
  </body>
</html>

Muito Obrigado.