Exibir ArrayList em página JSF index.xhtml

Java

11/10/2012

Possuo a classe seguinte:
public class ComentarioBean {
    private int idCom;
    private int idTemaCom;
    private int idCodPartCom;
    private String textoCom;
    private int statusCom;
    private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();
    
    public List<ComentarioBean> listar() {
        return this.lista;
    }
    
    public String insereComentario() {
        lista.add(this);
        return "sucesso";
    }
E não estou conseguindo exibir o que foi adicionado ao ArrayList, na página principal em um dataTable. Esse é o treco do dataTable:
 <h:dataTable value="#{comentarioBean.lista}" var="com" rules="rows">
                <f:facet name="caption">Comentários relativos aos temas desenvolvidos
                </f:facet>
                <f:facet name="header">Listagem dos comentários</f:facet>
                <f:facet name="footer">Fim da listagem</f:facet>
                <h:column>
                    <f:facet name="header">Cód. do Tema</f:facet>#{com.idTemaCom}
                </h:column>
                <h:column>
                    <f:facet name="header">Cód. do Participante</f:facet>#{com.idCodPartCom}
                </h:column>
                <h:column>
                    <f:facet name="header">Comentários</f:facet>#{com.textoCom}
                </h:column>
            </h:dataTable>
alguém me ajuda?
Raimundo Ramos

Raimundo Ramos

Curtidas 0

Respostas

Efraim Filho

Efraim Filho

11/10/2012

o seu managedBean está mapeado no faces-context ?? ou esta com a anotação ? seu managedBean possuim uma lida do proprio managed bean ?????
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="efraimgentil"]o seu managedBean está mapeado no faces-context ?? ou esta com a anotação ? seu managedBean possuim uma lida do proprio managed bean ?????
Está mapeado no faces-config.xml eis o código:
 <managed-bean>
        <managed-bean-name>comBean</managed-bean-name>
        <managed-bean-class>pkgListaFour.ComentarioBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
Esse é o mapeamento para o cadastramento realizado:
<navigation-rule>
        <from-view-id>comentario.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>comentarioCadastrado.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
GOSTEI 0
Efraim Filho

Efraim Filho

11/10/2012

Ok, mas ao inves de você criar uma lista de managedBean , que tal criar uma classe externa ? tipo
   public class Comentario{
      private Integer id;
      private String comentario;
      //gets  e seters 
   }
e seu managed bean contem uma lista dessa classe
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="efraimgentil"]Ok, mas ao inves de você criar uma lista de managedBean , que tal criar uma classe externa ? tipo
   public class Comentario{
      private Integer id;
      private String comentario;
      //gets  e seters 
   }
e seu managed bean contem uma lista dessa classe
É uma idéia legal, porém gostaria de saber utilizar o gerenciamento Bean, pois vou precisar bastante mais adiante. E como não está apresentando erro... queria ver o que falta para esse código funcionar... pode me ajudar mais nesse sentido?
GOSTEI 0
Davi Costa

Davi Costa

11/10/2012

Na sua tabela vc definiu esse valor:
 <h:dataTable value="#{comentarioBean.lista}" var="com" rules="rows">
No seu bean possui o getter e setter dessa lista? tipo : getLista() e setLista(...)? O jsf precisa disso p exibir na página abcs
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="davi.costa"]Na sua tabela vc definiu esse valor:
 <h:dataTable value="#{comentarioBean.lista}" var="com" rules="rows">
No seu bean possui o getter e setter dessa lista? tipo : getLista() e setLista(...)? O jsf precisa disso p exibir na página abcs
Sim aí está ela completa...
public class ComentarioBean {
    private int idCom;
    private int idTemaCom;
    private int idCodPartCom;
    private String textoCom;
    private int statusCom;
    
    private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();
    
    public List<ComentarioBean> getLista() {
        if (this.lista == null) {
            ComentarioBean comentarioBean = new ComentarioBean();
            this.lista = comentarioBean.listar();
        }
        return this.lista;
    }
    
    public List<ComentarioBean> listar() {
        return this.lista;
    }
    
    public String insereComentario() {
        lista.add(this);
        return "sucesso";
    }
    
    public String erroPagina() {
        return "erro";
    }
    
    public int getIdCom() {
        return idCom;
    }

    public void setIdCom(int idCom) {
        this.idCom = idCom;
    }

    public int getIdTemaCom() {
        return idTemaCom;
    }

   public void setIdTemaCom(int idTemaCom) {
        this.idTemaCom = idTemaCom;
    }

    public int getIdCodPartCom() {
        return idCodPartCom;
    }

    public void setIdCodPartCom(int idCodPartCom) {
        this.idCodPartCom = idCodPartCom;
    }

    public String getTextoCom() {
        return textoCom;
    }

    public void setTextoCom(String textoCom) {
        this.textoCom = textoCom;
    }

    public int getStatusCom() {
        return statusCom;
    }

    public void setStatusCom(int statusCom) {
        this.statusCom = statusCom;
    }

}
GOSTEI 0
Davi Costa

Davi Costa

11/10/2012

Reparou que vc inicializa a variável mas não atribui os objetos a ela:

private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();//inicializa aqui  
      
    public List<ComentarioBean> getLista() {  
        if (this.lista == null) {  //como inicializou não preencheu com itens
            ComentarioBean comentarioBean = new ComentarioBean();  
            this.lista = comentarioBean.listar();  
        }  
        return this.lista;  
    }  
Vc pode mudar sua verificação para:
 if (this.lista == null || this.lista.size() ==0)
abcs
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="davi.costa"]Reparou que vc inicializa a variável mas não atribui os objetos a ela:

private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();//inicializa aqui  
      
    public List<ComentarioBean> getLista() {  
        if (this.lista == null) {  //como inicializou não preencheu com itens
            ComentarioBean comentarioBean = new ComentarioBean();  
            this.lista = comentarioBean.listar();  
        }  
        return this.lista;  
    }  
Vc pode mudar sua verificação para:
 if (this.lista == null || this.lista.size() ==0)
abcs
Olá Davi. Mudei a classe que ficou assim:
@ManagedBean
@RequestScoped
public class ComentarioBean {
    private int idCom;
    private int idTemaCom;
    private int idCodPartCom;
    private String textoCom;
    private int statusCom;
    private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();
    
    public List<ComentarioBean> getLista() {
        if (this.lista == null || this.lista.isEmpty()) {
            ComentarioBean comentarioBean = new ComentarioBean();
            this.lista = comentarioBean.listar();
        }
        return this.lista;
    }
    
    public List<ComentarioBean> listar() {
        return this.lista;
    }
    
    public String insereComentario() {
        lista.add(this);
        return "sucesso";
    }
Na verificação um novo comentárioBean é criado apenas se ele for nulo ou estiver vazio? O método insereComentario está correto? Ainda não compreendi porque o dataTable vem vazio. Estou executando a classe e a pagina de sucesso mostra o que foi informado, porém no dataTable... Nada. Sei que o erro não é da Java...rsrsrs.
GOSTEI 0
Davi Costa

Davi Costa

11/10/2012

Não precisa disso tb não.
private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();
Basta ficar assim:
private List<ComentarioBean> lista;
abcs
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="davi.costa"]Não precisa disso tb não.
private List<ComentarioBean> lista = new ArrayList<ComentarioBean>();
Basta ficar assim:
private List<ComentarioBean> lista;
abcs
Ao fazer isso surgiu o erro:
java.lang.NullPointerException
Deixando da forma anterior ele exibe a página de sucesso. V no debuger que a lista é adicionada, mas ao retornar ao página index, o conteúdo do array não é exibido. Estou pensando em gravar a informação em tabela ao invés do array, mas aí eu fico sem sacar manipulação de arraylist para essa construção... ah! antes que eu esqueça obrigado pela paciência... mas me ajuda? Eu quero entender e assimilar esses conceitos.
GOSTEI 0
Davi Costa

Davi Costa

11/10/2012

O jsf inicia seus atributos no construtor padrão (public e sem argumentos), então o ideal é inicializar lá.

public SeuBean(){
  suaLista = new ArrayList<SeuTipo>();
}
abcs
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="davi.costa"]O jsf inicia seus atributos no construtor padrão (public e sem argumentos), então o ideal é inicializar lá.

public SeuBean(){
  suaLista = new ArrayList<SeuTipo>();
}
abcs
Deixei a classe dessa forma:
@ManagedBean
@RequestScoped
public class ComentarioBean {
    private int idCom;
    private int idTemaCom;
    private int idCodPartCom;
    private String textoCom;
    private int statusCom;
    private List<ComentarioBean> lista;
    
    public ComentarioBean() {
        lista = new ArrayList<ComentarioBean>();
    }
    
    public List<ComentarioBean> getLista() {
        if (this.lista == null || this.lista.isEmpty()) {
            ComentarioBean comentarioBean = new ComentarioBean();
            this.lista = comentarioBean.listar();
        }
        return this.lista;
    }
    
    public List<ComentarioBean> listar() {
        return this.lista;
    }
    
    public String insereComentario() {
        lista.add(this);
        return "sucesso";
    }
O dataTable contido dentro do form ficou assim:
            <h:dataTable value="#{comentarioBean.lista}" var="com" rules="rows">
                <f:facet name="caption">Comentários relativos aos temas desenvolvidos
                </f:facet>
                <f:facet name="header">Listagem dos comentários</f:facet>
                <f:facet name="footer">Fim da listagem</f:facet>
                <h:column>
                    <f:facet name="header">Cód. do Tema</f:facet>#{com.idTemaCom}
                </h:column>
                <h:column>
                    <f:facet name="header">Cód. do Participante</f:facet>#{com.idCodPartCom}
                </h:column>
                <h:column>
                    <f:facet name="header">Comentários</f:facet>#{com.textoCom}
                </h:column>
            </h:dataTable>
            
        
Porém nada é mostrado. O que eu faço? :zoio:
GOSTEI 0
Davi Costa

Davi Costa

11/10/2012

O seu método inserir n salva no banco. Então comoé só em memória, acho q vai ter que deixar o escopo do seu Bean de Sessão, testa, tira o escopo de rquisição e coloca de sessão. abcs
GOSTEI 0
Raimundo Ramos

Raimundo Ramos

11/10/2012

[quote="davi.costa"]O seu método inserir n salva no banco. Então comoé só em memória, acho q vai ter que deixar o escopo do seu Bean de Sessão, testa, tira o escopo de rquisição e coloca de sessão. abcs
:!: Realmente, Davi. Mudei o scopo do bean comentário para session conforme vc instruiu, e deu certinho. Falta só eu fazer o loop para mostrar as ocorrências do array. Obrigado mesmo!!!
GOSTEI 0
POSTAR