AJAX em JSF 2.0

3 respostas
R

Senhores,
estou com um problema numa tela de um sistema feito utilizando Java Server Faces 2.0, onde esta possui um grupo de Combo Boxes aninhadas, a implementação da mesma está da seguinte forma:

No meu projeto eu possuo o cadastro de:
Contrato
Sistema
Projeto
Tela

Um Contrato possui uma lista de Sistemas;

Um Sistemas uma lista de Projeto;

Um Projeto uma lista de Telas;

Dessa forma, na tela de cadastro de Sistemas haverá um Combo Box com uma lista de Contratos, para o usuário escolher um deles.

Na tela de cadastro de Projetos preciso colocar um Combo Box com uma lista de Contratos e outra com uma lista de Sistemas, que inicialmente virá vazia, e, quando o usuário selecionar um Contrato o sistema atualizará a lista de Sistemas com todos os registros relacionados a este contrato.

Na tela de cadastro de Telas tenho uma situação parecida, só que com um Combo Box a mais, o de Projetos, onde os Combo Boxes de Contrato e Sistema funcionarão da mesma forma, e o Combo Box de Projeto será atualizado com a lista de Projetos do Sistema escolhido.

Para construir a tela estou usando as tags ‘h:selectOneMenu’ para os Combo Boxes, o ‘f:selectItems’ para listar o conteúdo dos Combo Boxes, e a ‘f:ajax’, para atualizar os Combo Boxes filhos, que é onde estou tendo problemas. Para fazer isso funcionar eu preciso submeter o componente Pai, para que o meu Controller (Bean) possa usar-lo como filtro para atualizar a lista do filho. A renderização do filho está funcionando, mas eu não estou conseguindo fazer com que o Pai seja submetido.

Segue um trecho do código como exemplo:

<h:outputLabel value="#{bundle.CreateProjetoLabel_contrato}" for=“contrato” />

<h:selectOneMenu id=“contrato” value="#{sistemaController.sistema.contrato}" title="#{bundle.CreateProjetoTitle_contrato}" required=“true” requiredMessage="#{bundle.CreateProjetoRequiredMessage_contrato}">

<f:ajax execute=“formulario:contrato” render=“formulario:sistema”/>

<f:selectItems value="#{contratoController.itensSelecaoUnica}" var=“itemContrato” itemValue="#{itemContrato.codigo}" itemLabel="#{itemContrato.nome}"/>

</h:selectOneMenu>

<h:outputLabel value="#{bundle.CreateProjetoLabel_sistema}" for=“sistema” />

<h:selectOneMenu id=“sistema” value="#{projetoController.projeto.sistema}" title="#{bundle.CreateProjetoTitle_sistema}" required=“true” requiredMessage="#{bundle.CreateProjetoRequiredMessage_sistema}">

<f:selectItems value="#{sistemaController.sistemasContrato}" var=“itemSistema” itemValue="#{itemSistema.codigo}" itemLabel="#{itemSistema.nome}"/>

</h:selectOneMenu>

O nome do formulário é ‘formulario’. Já não sei mais o que alterar ou testar, preciso de alguma ajuda com urgência…

Obrigado.

3 Respostas

dev.rafael
<h:selectOneMenu value="..." ...>
  <h:selectItems value="..." ... />
  <f:ajax event="change" ... />
</h:selectOneMenu>

Tente assim, especificando o event. Se ñ der certo poste tb o código do ManagedBean.

R

Não funcionou, ele renderiza o componente filho, mas não se submete…

R

Segue o código dos ManagedBeans envolvidos, estou postando apenas o trecho envolvido:

ManagedBeans:

projetoController:
public class ProjetoController {

private Projeto projeto = null;

/**
 * @return the projeto
 */
public Projeto getProjeto() {
    return projeto;
}

/**
 * @param projeto the projeto to set
 */
public void setProjeto(final Projeto projeto) {
    this.projeto = projeto;
}

public List<Projeto> getProjetosSistema() {
    List<Projeto> resultado = new ArrayList<Projeto>();
    try {
        if ((getProjeto() != null) &&
            (getProjeto().getSistema() != null) &&
            (getProjeto().getSistema().getCodigo() != null)) {
            resultado = getProjetoBOS().listarProjetosFiltrandoPeloSistema(getProjeto().getSistema().getCodigo());
        }
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
    }
    return resultado;
}

}

sistemaController:
public class SistemaController {

private Sistema sistema = null;

/**
 * @return the sistema
 */
public Sistema getSistema() {
    return sistema;
}

/**
 * @param sistema the sistema to set
 */
public void setSistema(final Sistema sistema) {
    this.sistema = sistema;
}

public List<Sistema> getSistemasContrato() {
    List<Sistema> resultado = new ArrayList<Sistema>();
    try {
        if ((getSistema() != null) &&
            (getSistema().getContrato() != null) &&
            (getSistema().getContrato().getCodigo() != null)) {
            resultado = getSistemaBOS().listarSistemasFiltrandoPeloContrato(getSistema().getContrato().getCodigo());
        }
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
    }
    return resultado;
}

}

contratoController:
public class ContratoController {

private Contrato contrato = null;

/**
 * @return the contrato
 */
public Contrato getContrato() {
    return contrato;
}

/**
 * @param contrato the contrato to set
 */
public void setContrato(final Contrato contrato) {
    this.contrato = contrato;
}

public List<Entidade> getItensSelecaoUnica() throws Exception {
    return listarItensSelecao(true);
}

private List<Entidade> listarItensSelecao(boolean tipoSelecao) throws Exception {
    List<Entidade> resultado = listar();
    if (tipoSelecao) {
        resultado.add(0, (Entidade) getEntidadeVazia());
    }
    return resultado;
}

}

projetoController:
public class ProjetoController {

private Projeto projeto = null;

/**
 * @return the projeto
 */
public Projeto getProjeto() {
    return projeto;
}

/**
 * @param projeto the projeto to set
 */
public void setProjeto(final Projeto projeto) {
    this.projeto = projeto;
}

public List<Projeto> getProjetosSistema() {
    List<Projeto> resultado = new ArrayList<Projeto>();
    try {
        if ((getProjeto() != null) &&
            (getProjeto().getSistema() != null) &&
            (getProjeto().getSistema().getCodigo() != null)) {
            resultado = getProjetoBOS().listarProjetosFiltrandoPeloSistema(getProjeto().getSistema().getCodigo());
        }
    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured"));
    }
    return resultado;
}

}

Entidades:

projeto:

public class Projeto {

/**

* @return the sistema

*/

public Sistema getSistema() {

return sistema;

}
/**
 * @param sistema the sistema to set
 */
public void setSistema(final Sistema sistema) {
    this.sistema = sistema;
}

}

sistema:
public class Sistema {

private Contrato contrato;

/**
 * @return the contrato
 */
public Contrato getContrato() {
    return contrato;
}

/**
 * @param contrato the contrato to set
 */
public void setContrato(final Contrato contrato) {
    this.contrato = contrato;
}

}

contrato:
public class Contrato {

public Contrato() {
}

}

Criado 25 de agosto de 2010
Ultima resposta 26 de ago. de 2010
Respostas 3
Participantes 2