ArrayList só add valor atual [RESOLVIDO]

9 respostas
J

Boa a tarde…

Estou na seguinte situação, tenho uma arraylist de pessoas porém ela só armazena a última pessoa cadastrada, como se estivesse sobescrevendo o valor anterior. Jé debuguei e sempre que é chamado o método para add na lista ela está vazia.
Se alguém poder me ajudar, segue o código abaixo:

JSP:

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!-- RichFaces tag library declaration -->
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

<html>

<head>
<title>Testando richfaces com tabelas</title>
</head>

<body>
	<f:view>
		<h:form>
			
			<h:panelGrid columns="2">
				<h:column>
					<h:outputText value="Nome:"/>					
				</h:column>
				
				<h:column>					
					<h:inputText value="#{beanTabela.pessoa.nome}"/>
				</h:column>
				
				<h:column>
					<h:outputText value="Idade:"/>
				</h:column>
				
				<h:column>
					<h:inputText value="#{beanTabela.pessoa.idade}"/>
				</h:column>
				
				<h:column>
					<h:outputText value="Sexo"/>
				</h:column>
				
				<h:column>
					<h:inputText value="#{beanTabela.pessoa.sexo}"/>
				</h:column>
			</h:panelGrid>
			
			<a4j:commandButton value="Cadastrar">
				<a4j:support event="onclick" action="#{beanTabela.addPessoa}" reRender="tabelaPessoa"/>							
			</a4j:commandButton>		
			
			<br><br>
			
			<rich:dataTable value="#{beanTabela.listaPessoas}" var="lista" id="tabelaPessoa">
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Nome"/>
						</f:facet>
				
						<h:outputText value="#{lista.nome}"/>									
				</h:column>
				
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Idade"/>
						</f:facet>
				
						<h:outputText value="#{lista.idade}"/>									
				</h:column>
				
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Sexo"/>
						</f:facet>
				
						<h:outputText value="#{lista.sexo}"/>									
				</h:column>				
			</rich:dataTable>
			
		</h:form>
	</f:view>
</body>

</html>

Bean:

package br.com;

import java.util.ArrayList;

public class TestandoTabela {
		
	private ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
	private Pessoa pessoa = new Pessoa();
	
	public void addPessoa(){
		listaPessoas.add(this.pessoa);
	}
	
	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public ArrayList<Pessoa> getListaPessoas() {
		return listaPessoas;
	}

	public void setListaPessoas(ArrayList<Pessoa> listaPessoas) {
		this.listaPessoas = listaPessoas;
	}
	
}

Desde já, agradeço!

9 Respostas

jcmird
package br.com;

import java.util.ArrayList;

public class TestandoTabela {
		
	private ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
	private Pessoa pessoa;
	
	public void addPessoa()
		pessoa = new Pessoa();
		listaPessoas.add(this.pessoa);
	}
	
	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public ArrayList<Pessoa> getListaPessoas() {
		return listaPessoas;
	}

	public void setListaPessoas(ArrayList<Pessoa> listaPessoas) {
		this.listaPessoas = listaPessoas;
	}
	
}

Rode esse codigo e vê se funfa… Adicionei o new Pessoa(), no metodo adicionar pessoa. Antes vc tinha apenas um objeto pessoa e vc sempre o alterava.

Abraços

J

Olá…

primeiro obrigada por ter respondido. =)

Desde forma gerou uma excessão:
[color=red] Caused by: org.apache.jasper.el.JspPropertyNotFoundException: /testandoTabela.jsp(24,5) ‘#{beanTabela.pessoa.nome}’ Target Unreachable, ‘pessoa’ returned null[/color]

Afinal o objeto não instanciado =/

jcmird

Xiii entendi… O problema que no inpuxt text vc já tá chamando essa variavel…bem eu utilizaria uma variavel auxiliar… para captutar as informações da tela e adicionar no array…

eberson_oliveira

Olá jessicabnu,

Experimente deixar o seu ArrayList estático... No seu caso o problema deve estar no fato de instanciar o ArrayList toda hora...

Tente assim:

public class TestandoTabela {  

    static{
        listaPessoas = new ArrayList&lt;Pessoa&gt;();
    }
          
    private static ArrayList&lt;Pessoa&gt; listaPessoas;  
    private Pessoa pessoa = new Pessoa();  
      
    public void addPessoa(){  
        listaPessoas.add(this.pessoa);  
    }  
      
    public Pessoa getPessoa() {  
        return pessoa;  
    }  
  
    public void setPessoa(Pessoa pessoa) {  
        this.pessoa = pessoa;  
    }  
  
    public ArrayList&lt;Pessoa&gt; getListaPessoas() {  
        return listaPessoas;  
    }  
  
    public void setListaPessoas(ArrayList&lt;Pessoa&gt; listaPessoas) {  
        this.listaPessoas = listaPessoas;  
    }  
      
}

Se funcionar, você pode tentar implementar meios para que o fato de torná-lo estático não prejudique a sua aplicação.

Espero ter ajudo,

[]s

Éberson

jcmird

criei as variaveis que sexo, nome e idade, essas variaveis vc colocar no value do inpuxt text. Recomendo a fazer isso, pois dessa forma vc pode validar as informações
que o usuario digitou.

package br.com;

import java.util.ArrayList;

public class TestandoTabela {
		
private String nome;
	private String sexo;
	private String idade;
	
	
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getIdade() {
		return idade;
	}

	public void setIdade(String idade) {
		this.idade = idade;
	}

	private ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
	private Pessoa pessoa;
	
	public void addPessoa()
		pessoa = new Pessoa();
		pessoa.setNome(getNome());
		pessoa.setIdade(getIdade());
		pessoa.setSexo(getSexo());
		listaPessoas.add(this.pessoa);
	}
	
	public Pessoa getPessoa() {
		return pessoa;
	}

	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}

	public ArrayList<Pessoa> getListaPessoas() {
		return listaPessoas;
	}

	public void setListaPessoas(ArrayList<Pessoa> listaPessoas) {
		this.listaPessoas = listaPessoas;
	}
	


}
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<!-- RichFaces tag library declaration -->
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>

<html>

<head>
<title>Testando richfaces com tabelas</title>
</head>

<body>
	<f:view>
		<h:form>
			
			<h:panelGrid columns="2">
				<h:column>
					<h:outputText value="Nome:"/>					
				</h:column>
				
				<h:column>					
					<h:inputText value="#{beanTabela.nome}"/>
				</h:column>
				
				<h:column>
					<h:outputText value="Idade:"/>
				</h:column>
				
				<h:column>
					<h:inputText value="#{beanTabela.idade}"/>
				</h:column>
				
				<h:column>
					<h:outputText value="Sexo"/>
				</h:column>
				
				<h:column>
					<h:inputText value="#{beanTabela.sexo}"/>
				</h:column>
			</h:panelGrid>
			
			<a4j:commandButton value="Cadastrar">
				<a4j:support event="onclick" action="#{beanTabela.addPessoa}" reRender="tabelaPessoa"/>							
			</a4j:commandButton>		
			
			<br><br>
			
			<rich:dataTable value="#{beanTabela.listaPessoas}" var="lista" id="tabelaPessoa">
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Nome"/>
						</f:facet>
				
						<h:outputText value="#{lista.nome}"/>									
				</h:column>
				
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Idade"/>
						</f:facet>
				
						<h:outputText value="#{lista.idade}"/>									
				</h:column>
				
				<h:column>		
						<f:facet name="header">		
							<h:outputText value="Sexo"/>
						</f:facet>
				
						<h:outputText value="#{lista.sexo}"/>									
				</h:column>				
			</rich:dataTable>
			
		</h:form>
	</f:view>
</body>

</html>
gomesrod

:cry: Por favor não faça isso filho :cry:

Agora voltando à solução: nesse código existem 2 erros: a lista que é instanciada toda hora, e a pessoa que é sempre o mesmo objeto.

Tente o seguinte:

1) Volte o código para aquele original do primeiro post. Substitua isso:

public void addPessoa(){ listaPessoas.add(this.pessoa); } Por isso:public void addPessoa(){ listaPessoas.add(this.pessoa); Pessoa = new Pessoa(); // Quase igual o que o jcmird sugeriu, mas muda a ordem }
2) No faces-config.xml mude o escopo do bean de request para session.

eberson_oliveira

Pode explicar o porquê, por favor?

Obs - Ok, você tem razão… esquece isso…

[]s

Éberson

gomesrod

eberson_oliveira:
gomesrod:

:cry: Por favor não faça isso filho :cry:

Pode explicar o porquê, por favor?


Desculpe, eu devia mesmo ter explicado o motivo. Pela sua resposta vi que você já entendeu o que acontece, mas vou colocar mesmo assim, é um alerta importante para as pessoas sem muita experiência que venham a ler o tópico.

Ao colocar o atributo estático, ele passa a fazer parte da CLASSE, ou seja, é único para a aplicação inteira.
Agora imagine o seguinte: você desenvolveu o seu aplicativo Web usando esse recurso dos atributos estáticos, rodou no seu servidor de teste, testou as funcionalidades e tudo estava perfeito. Hora de colocar em produção, para todos os usuários - é aí que surgem os problemas.
Sempre que duas ou mais pessoas acessarem esta página, embora cada uma tenha sua sessão separada, vão surgir os comportamentos mais bizarros uma vez que elas estão acessando a mesma lista. O usuário está acessando a tela e de repente aparecem ou somem registros, outros se modificam… é uma loucura. Aí te chamam, você volta para sua máquina para tentar debugar o erro, e simplesmente ele não vai nunca acontecer porque no seu servidor de desenvolvimento só tem um usuário acessando.

E assim vai por muito tempo… claro que até descobrir o que está acontecendo você já perdeu muitas noites de sono e todos os cabelos da cabeça.

J

Pessoal, problema resolvido. =P

o bean esta como request >.<

Obrigada pela ajuda de todos.

Criado 27 de agosto de 2009
Ultima resposta 28 de ago. de 2009
Respostas 9
Participantes 4