PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Exibir ArrayList em página JSF index.xhtml #569885

11/10/2012

0

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

Responder

Posts

11/10/2012

Efraim Filho

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

Gostei + 0

11/10/2012

Raimundo Ramos

[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>
Responder

Gostei + 0

11/10/2012

Efraim Filho

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
Responder

Gostei + 0

11/10/2012

Raimundo Ramos

[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?
Responder

Gostei + 0

11/10/2012

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
Responder

Gostei + 0

11/10/2012

Raimundo Ramos

[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;
    }

}
Responder

Gostei + 0

12/10/2012

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
Responder

Gostei + 0

17/10/2012

Raimundo Ramos

[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.
Responder

Gostei + 0

17/10/2012

Davi Costa

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

Gostei + 0

17/10/2012

Raimundo Ramos

[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.
Responder

Gostei + 0

17/10/2012

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
Responder

Gostei + 0

17/10/2012

Raimundo Ramos

[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:
Responder

Gostei + 0

17/10/2012

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
Responder

Gostei + 0

17/10/2012

Raimundo Ramos

[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!!!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar