Montar um formulário dinamico usando JSF 2.0

Olá pessoal,

Estou fazendo um trabalho da faculdade, e tem de ser em JSF 2.0 e sou mó noob nesta tecnologia, então preciso de um help, meu problema é o seguinte, tenho um formulário que vai ter x campos e um dropdown, caso o usuário selecione uma opção deste dropdown, irá aparecer mais campos, fazer isso eu já consegui fazer (vou postar o que eu já fiz abaixo) o problema é que os campos que devem aparecer, também precisam ser validados como required e tal, mas quando do o submit, só os campos que já estavam visiveis são validados e de quebra os que foram exibidos depois do usuario selecionar a opção são escondidos novamente…

No caso a selectOneMenu irá ter dois valores {Assinante:A,Promotor:P} quando usuário selecionar valor Promotor:P então os campos que estão dentro de idPanelDadosPromotor devem ser exibidos e validados, até agora só está exibindo não está validando, é como se os campos não fizessem parte do form, como eu adiciono eles?

Obrigado

o JSF

<?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"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form id="formAssinante">
            <h:outputLabel value="Nome" for="nomeAssinante" />
            <h:inputText id="nomeAssinante" value="#{assinanteManagedBean.assinante.nomeAssinante}" title="Nome" required="true" requiredMessage="Required"/>
            <br/><h:outputLabel value="Apelido" for="apelidoAssinante" />
            <h:inputText id="apelidoAssinante" value="#{assinanteManagedBean.assinante.apelidoAssinante}" title="Apelido" required="true" requiredMessage="Required"/>
            <br/><h:outputLabel value="Email" for="emailAssinante" />
            <h:inputText id="emailAssinante" value="#{assinanteManagedBean.assinante.emailAssinante}" title="Email" required="true" requiredMessage="Required"/>
            <br/><h:outputLabel value="Senha" for="senhaAssinante" />
            <h:inputText id="senhaAssinante" value="#{assinanteManagedBean.assinante.senhaAssinante}" title="Senha" required="true" requiredMessage="Required"/>
            <br/><h:outputLabel value="FotoAssinante" for="fotoAssinante" />
            <h:inputText id="fotoAssinante" value="#{assinanteManagedBean.assinante.fotoAssinante}" title="Foto" />
            <br/><h:outputLabel value="Sexo" for="sexoAssinante" />
            <h:inputText id="sexoAssinante" value="#{assinanteManagedBean.assinante.sexoAssinante}" title="Senha" required="true" requiredMessage="Required"/>
            <br/><h:outputLabel value="Data de Nascimento" for="dataNascimentoAssinante" />
            <h:inputText id="dataNascimentoAssinante" value="#{assinanteManagedBean.assinante.dataNascimentoAssinante}" title="Data Nascimento" required="true" requiredMessage="Required">
                <f:convertDateTime pattern="dd/MM/yyyy" />
            </h:inputText>
            <br/><h:outputLabel value="Funçao" for="funcaoAssinante" />
            <h:selectOneMenu id="funcaoAssinante" value="#{assinanteManagedBean.assinante.funcaoAssinante}">
                <f:selectItems value="#{assinanteManagedBean.funcaoAssinanteList}"/>
                <f:ajax event="change" listener="#{assinanteManagedBean.processarPainelDadosPromotor}" execute="@this" render="wrapDadosPromotor" />
            </h:selectOneMenu>
            <br/><br/><br/>
            <h:panelGroup id="wrapDadosPromotor">
                <h:panelGroup id="idPanelDadosPromotor" rendered="#{assinanteManagedBean.exibePainelPromotor}">
                    <h:outputLabel value="tipoPessoaPromotor" for="tipoPessoaPromotor" />
                    <h:inputText id="tipoPessoaPromotor" value="#{assinanteManagedBean.promotor.tipoPessoaPromotor}" title="tipoPessoaPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="cpfCnpjPromotor" for="cpfCnpjPromotor" />
                    <h:inputText id="cpfCnpjPromotor" value="#{assinanteManagedBean.promotor.cpfCnpjPromotor}" title="cpfCnpjPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="telefonePromotor" for="telefonePromotor" />
                    <h:inputText id="telefonePromotor" value="#{assinanteManagedBean.promotor.telefonePromotor}" title="telefonePromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="celularPromotor" for="celularPromotor" />
                    <h:inputText id="celularPromotor" value="#{assinanteManagedBean.promotor.celularPromotor}" title="celularPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="cepEnderecoPromotor" for="cepEnderecoPromotor" />
                    <h:inputText id="cepEnderecoPromotor" value="#{assinanteManagedBean.promotor.cepEnderecoPromotor}" title="Foto" />
                    <br/><h:outputLabel value="logradouroEnderecoPromotor" for="logradouroEnderecoPromotor" />
                    <h:inputText id="logradouroEnderecoPromotor" value="#{assinanteManagedBean.promotor.logradouroEnderecoPromotor}" title="logradouroEnderecoPromotor" required="true" requiredMessage="Required"/>

                    <br/><h:outputLabel value="numeroEnderecoPromotor" for="numeroEnderecoPromotor" />
                    <h:inputText id="numeroEnderecoPromotor" value="#{assinanteManagedBean.promotor.numeroEnderecoPromotor}" title="numeroEnderecoPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="bairroEnderecoPromotor" for="bairroEnderecoPromotor" />
                    <h:inputText id="bairroEnderecoPromotor" value="#{assinanteManagedBean.promotor.bairroEnderecoPromotor}" title="bairroEnderecoPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="cidadeEnderecoPromotor" for="cidadeEnderecoPromotor" />
                    <h:inputText id="cidadeEnderecoPromotor" value="#{assinanteManagedBean.promotor.cidadeEnderecoPromotor}" title="estadoEnderecoPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="estadoEnderecoPromotor" for="estadoEnderecoPromotor" />
                    <h:inputText id="estadoEnderecoPromotor" value="#{assinanteManagedBean.promotor.estadoEnderecoPromotor}" title="estadoEnderecoPromotor" required="true" requiredMessage="Required"/>
                    <br/><h:outputLabel value="paisEnderecoPromotor" for="paisEnderecoPromotor" />
                    <h:inputText id="paisEnderecoPromotor" value="#{assinanteManagedBean.promotor.paisEnderecoPromotor}" title="paisEnderecoPromotor" required="true" requiredMessage="Required"/>
                </h:panelGroup>
            </h:panelGroup>
            <br/><br/><br/>
            <h:commandButton id="inserir" action="#{assinanteManagedBean.inserirCompleto}" value="Inserir" />

        </h:form>
    </h:body>
</html>

o ManagedBean

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.evto.apresentacao;

import br.com.evto.fachada.AssinanteFachada;
import br.com.evto.fachada.PromotorFachada;
import br.com.evto.modelo.Assinante;
import br.com.evto.modelo.Promotor;
import br.com.evto.util.DateUtil;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author root
 */
@ManagedBean(name = "assinanteManagedBean")
@RequestScoped
public class AssinanteManagedBean {

    private Assinante assinante;
    private Promotor promotor;
    private boolean exibePainelPromotor;
    private String funcaoAssinante;

    public List<SelectItem> getFuncaoAssinanteList() {
        List<SelectItem> list = new ArrayList<SelectItem>();
        list.add(new SelectItem("A", "Assinante"));
        list.add(new SelectItem("P", "Promotor"));
        return list;
    }

    public String getFuncaoAssinante() {
        return funcaoAssinante;
    }

    public void setFuncaoAssinante(String funcaoAssinante) {
        this.funcaoAssinante = funcaoAssinante;
    }

    /** Creates a new instance of AssinanteManagedBean */
    public AssinanteManagedBean() {
    }

    public Assinante getAssinante() {
        if (assinante == null) {
            assinante = new Assinante();
        }
        return assinante;
    }

    public void setAssinante(Assinante assinante) {
        this.assinante = assinante;
    }

    public Promotor getPromotor() {
        if (promotor == null) {
            promotor = new Promotor();
        }
        return promotor;
    }

    public void setPromotor(Promotor promotor) {
        this.promotor = promotor;
    }

    public boolean isExibePainelPromotor() {
        return exibePainelPromotor;
    }

    public void setExibePainelPromotor(boolean exibePainelPromotor) {
        this.exibePainelPromotor = exibePainelPromotor;
    }

    public String montarPaginaParaInsercao() throws Exception {
        this.assinante = new Assinante();
        return "/assinante/InserirAssinante";
    }

    public String inserir() throws Exception {
        Assinante ass = this.getAssinante();
        //ass.setIdAssinante(Long.valueOf("1"));
        ass.setDataCadastroAssinante(DateUtil.now());
        ass.setFuncaoAssinante("A");
        this.setAssinante(ass);
        AssinanteFachada.inserir(this.getAssinante());
        return "/index";
    }

    public String inserirCompleto() throws Exception {
        Assinante ass = this.getAssinante();
        ass.setDataCadastroAssinante(DateUtil.now());
        this.setAssinante(ass);
        AssinanteFachada.inserir(this.getAssinante());

        if (ass.getFuncaoAssinante().equals("P")) {
            this.getPromotor().setIdAssinante(this.getAssinante());
            PromotorFachada.inserir(this.getPromotor());
        }

        return "/index";
    }

    public String montarPaginaCompletaParaInsercao() throws Exception {
        this.assinante = new Assinante();
        this.assinante.setPromotor(new Promotor());

        return "/assinante/inserirAssinantePromotor";
    }

    public void processarPainelDadosPromotor(AjaxBehaviorEvent event) throws Exception {
        if (this.getAssinante().getFuncaoAssinante().equals("P")) {
            this.setExibePainelPromotor(true);
        } else {
            this.setExibePainelPromotor(false);
        }
    }
}

Bom dia.

Bom… o que eu vejo que você pode fazer… é criar um validador para esses campos que aparecerão depois.
Aí você valida para ver se eles podem ser validados ou não.

Valeu!