Saudações Comunidade…
Estou com uma dúvida que é o seguinte…
No meu DAO tenho um ArrayList para listar os dados do banco. Segue código.
//Lista de Clientes Cadastrados
public List<Cliente> getListaClientes(){
try{
PreparedStatement stmt = this.connection.prepareStatement("select * from clientes order by empresa");
ResultSet rs = stmt.executeQuery();
List<Cliente> clientes = new ArrayList<Cliente>();
while(rs.last()){
//Criando os objetos Clientes
Cliente cliente = new Cliente();
cliente.setId (rs.getLong("id"));
cliente.setEmpresa (rs.getString("empresa"));
cliente.setEndereco (rs.getString("endereco"));
cliente.setBairro (rs.getString("bairro"));
cliente.setComplemento (rs.getString("complemento"));
cliente.setCidade (rs.getString("cidade"));
cliente.setEstado (rs.getString("estado"));
cliente.setTelefone1 (rs.getString("telefone1"));
cliente.setEmail1 (rs.getString("email1"));
cliente.setNome (rs.getString("nome"));
cliente.setCargo (rs.getString("cargo"));
cliente.setTelefone2 (rs.getString("telefone2"));
cliente.setEmail2 (rs.getString("email2"));
//Adicionando os objetos na lista
clientes.add(cliente);
}
rs.close();
stmt.close();
return clientes;
}catch(SQLException e){
System.out.println("Não foi possível imprimir lista dos clientes" + e);
throw new RuntimeException(e);
}
}
Beleza… Tenho uma JSP para listar essas dados em uma tabela, funcionando perfeitamente.
Agora eu preciso também mostrar os dados de um registro no formulário, para atualizar um cliente. Se eu chamar essa lista no form atualizar ele pega todos dos dados, quero que aparece um cliente de cada vez. Para isso, nesse mesmo código acima eu teria que colocar um BREAK; no final do while. Assim ele mostra apenas um registro.
Teria eu que ter dois Array List?
Um para mostrar todos os clientes em uma tabela e outro para mostrar somente um cliente com o comando break;!?
Outra dúvida relacionada.
Preciso criar botões de navegação (Primeiro, Anterior, Próximo, Ultimo). Qual a melhor forma para implementar essas ações para os botões?
Penso que poderia eu ter um Array List no meu DAO while(rs.first()) while(rs.next())…
Estou no caminho certo?
Mais uma vez conto com a orientação de vcs.
Desde já agradeço.
Por favor, poste títulos descritivos em seu tópico. O título “Dúvida” não dá qualquer dica para quem responde sobre do que se trata o tópico.
Desculpa… desviei minha atenção aqui com outra coisa e não me atentei. Deixei para editar o Assunto por ultimo :roll:
Deu pra escrever todo esse pedido de desculpas e não conseguiu mudar o título.
Ta realmente querendo ajuda. kkkkkkkk
Cara, você tem o array List, usa ele para popular a tabela.
Agora na hora que você escolher umá linha da tabela para mostrar no form, vai ter
de pegar um índice dessa linha, fazer um get(indice) desse objeto.
E usar os atributos desse objeto para preencher o formulário.
Me parece que você está confundindo muito o visual dos formulários e tabelas com
o conteúdo que vc tem na lista.
Você não vai parar o loop do teu while no ponto para mostrar o formulário daquele ítem.
Vc vai pegar na lista um objeto e com ele mostrar teu formulario.
Se alguém clicar em próximo, vc vai pegar o objeto do indice mais 1 e montar novo formulario. E assim por diante.
Tá faltando MVC para o teu sistema.
Tá… realmente,
As pessoas se atentam mais pelo que está escrito no Assunto…
Caro João, o problema não é listar os dados. Penso que a estrutura do meu projeto está correta.
Para eu popular o form, fiz o seguinte
<form action="mvc" name="formAtualizar" method="post">
<table border="0" aling="justify">
<c:forEach var="cliente" items="${dao.listaClientes}">
<tr>
<td>Id: </td> <td><input type="text" name="id" size="10" value="${cliente.id}"/></td>
...
</c:forEach>
...
Confesso que foi ideia minha, pegando como referência a forma como eu fiz para popular uma tabela.
Então… dessa forma que estou fazendo não está correta!?
Está correta pois teu objetivo nesse código é mostrar em um form todas as linhas de uma tabela.
O que não faz sentido é você querer usar a mesma forma para pegar as informações de uma única linha e
apresentar para edição.
Seu método, o do primeiro post, retorna uma lista. Essa lista pode ser colocada fora do método e pertencer
a classe. Assim o método vai continuar funcionando e retornando a lista para esta população que você faz
da tabela.
Daí na mesma classe você faz um outro método que recebe um índice como parâmetro e retorna apenas uma linha
para que com essas informacoes vc possa preencher o form de edicao.
Então…
A mesma forma que eu usei para popular o campo text ID eu fiz com os outros campos, todos os campos do formulário estão recebendo o último registro do banco de dados quando o usuário acessa o formulário.
O que eu fiz foi lançar um BREAK; para que só um registro fosse visualizado no form.
Diferente do que fiz para popular a lista de clientes cadastrados. Não colocando o BREAK; Assim ele me traz todas os registros do banco.
Quero dizer exatamente que eu tenho dois ArrayList no meu DAO. um com BREAK; e outro sem. Penso que essa não é a solução, meio que “deselegante”.
A orientação que peço é quanto a isso. Vc disse que eu não preciso parar o loop, como eu faço para pegar somente um registro e apresentar para edição?
Sinceramente, estou fazendo isso aqui meio que na “tora”, sou iniciante. Me deparo com uma implementação necessária, escrevo ela na parede, na mesa, ela aparece até nos meus sonhos, e corro atrás para encontrar a solução.
Fico grato pela atenção João.
Bem, é melhor eu mostrar em código o que estou sugerindo que fica um pouco mais elegante e controlado de fazer o outro formulário:
Primeiro eu mudo um pouco tua classe de DAO (ou sei lá o nome que vc deu)
public class DAO {
//Coloquei a lista aqui como atributo assim ela é vista por outros métodos.
private List<Cliente> clientes = new ArrayList<Cliente>();
public List<Cliente> getListaClientes(){
try{
PreparedStatement stmt = this.connection.prepareStatement("select * from clientes order by empresa");
ResultSet rs = stmt.executeQuery();
//Veja que eu tirei a Lista daqui e a coloquei como atributo da classe.
//Então quando esse método rodar, a lista vai ser carregada, e vai retornar
//Para vc popular tua tabela, mas vai ficar a disposição para vc usar em
//Outros métodos sem ter de fazer esse Select novamente.
while(rs.last()){
//Criando os objetos Clientes
Cliente cliente = new Cliente();
cliente.setId (rs.getLong("id"));
cliente.setEmpresa (rs.getString("empresa"));
cliente.setEndereco (rs.getString("endereco"));
cliente.setBairro (rs.getString("bairro"));
cliente.setComplemento (rs.getString("complemento"));
cliente.setCidade (rs.getString("cidade"));
cliente.setEstado (rs.getString("estado"));
cliente.setTelefone1 (rs.getString("telefone1"));
cliente.setEmail1 (rs.getString("email1"));
cliente.setNome (rs.getString("nome"));
cliente.setCargo (rs.getString("cargo"));
cliente.setTelefone2 (rs.getString("telefone2"));
cliente.setEmail2 (rs.getString("email2"));
//Adicionando os objetos na lista
clientes.add(cliente);
}
rs.close();
stmt.close();
return clientes;
}catch(SQLException e){
System.out.println("Não foi possível imprimir lista dos clientes" + e);
throw new RuntimeException(e);
}
}
//Agora outro método seria aquele que de devolve apenas um cliente da Lista já
//carregada
public Cliente getCliente(int id){
clientes.get(id);
}
}
E então no Form voce chama esse novo metodo passando o id do cliente desejado e recendo um
objeto cliente e com ele pode preencher os campos usando as propriedades respectivas.
E para navegar para o proximo cliente, basta aumentar em 1 o valor do id e chamar o método getCliente com esse no ID.
Se quiser voltar, diminue 1 e chama o método, assim é bem mais simples do que toda vez fazer essa lista toda correr.
Ou faça mais um método parecido com o teu, mas que te devolva na lista apenas um cliente do id passado por parametro:
Mudando a clausula Where do teu Select
public List<Cliente> getCliente(int id)(){
try{
PreparedStatement stmt = this.connection.prepareStatement("select * from clientes order by empresa where id = '" + id + "'");
ResultSet rs = stmt.executeQuery();
List<Cliente> clientes = new ArrayList<Cliente>();
while(rs.last()){
//Criando os objetos Clientes
Cliente cliente = new Cliente();
cliente.setId (rs.getLong("id"));
cliente.setEmpresa (rs.getString("empresa"));
cliente.setEndereco (rs.getString("endereco"));
cliente.setBairro (rs.getString("bairro"));
cliente.setComplemento (rs.getString("complemento"));
cliente.setCidade (rs.getString("cidade"));
cliente.setEstado (rs.getString("estado"));
cliente.setTelefone1 (rs.getString("telefone1"));
cliente.setEmail1 (rs.getString("email1"));
cliente.setNome (rs.getString("nome"));
cliente.setCargo (rs.getString("cargo"));
cliente.setTelefone2 (rs.getString("telefone2"));
cliente.setEmail2 (rs.getString("email2"));
//Adicionando os objetos na lista
clientes.add(cliente);
}
rs.close();
stmt.close();
return clientes;
}catch(SQLException e){
System.out.println("Não foi possível imprimir lista dos clientes" + e);
throw new RuntimeException(e);
}
}
Como vê, tem muitas formas de resolver essa questao.
Não consegui implementar nenhuma das duas formas.
É o seguinte, tenho acompanhado a apostila da caelum FJ21, é com referência dela que estou desenvolvendo meu projeto.
Nesses dois links que seguem, estão exemplos de como eu poderia fazer o que preciso. Fiz as alterações e tentei chamar os dados da JSP mas não consegui fazer com que populasse o form.
http://code.google.com/p/braido/source/browse/trunk/+braido/fj21-agenda/src/br/com/caelum/agenda/dao/ContatoDAO.java?r=98#
http://code.google.com/p/braido/source/browse/trunk/+braido/fj21-agenda/src/br/com/caelum/mvc/logica/AlteraContatoLogic.java?r=104
Estou novamente aqui para pedir uma ajuda de como faço para implementar isso que estou querendo. Estou navegando a alguns dias por aqui e outros vários lugares, testando varias formas de resolver isso e não acho uma solução.