[RESOLVIDO] Ajuda em Java / JSP

15 respostas
A

Bom, olá. Primeiro post aqui.

Fiquei um bom tempo parado sem mexer em Java e JSP, cerca de dois meses, e muito do do conceito acabou fugindo da minha mente. Então cá estou eu, pedindo sua ajuda.

É algo meio básico por enquanto. Digamos que eu tenha uma classe Pessoa. Tal pessoa tem uma cidade, e tal cidade pertence a um estado, logicamente. No BD tudo isso está modelado, pessoa possui FK de cidade, e cidade FK de estado. No entanto, como traduzo isso para o código?

Erro um tanto amador, mas antes perguntar do que perder tempo quebrando a cabeça! =]

Agradeço a ajuda, pessoal.

15 Respostas

johnny_quest

No seu caso eu iria criar uma classe Endereço(Address)
que conteria a cidade e o estado, e fazeria composição
na classe Pessoa

Pessoa tem um endereço, e o endereço tem referências para o estado e para a cidade da pessoa.

Cria as classes :
Pessoa, Endereço.

No seu JSP você chama usando a EL

${pessoa.endereco.cidade}
${pessoa.endereco.estado}

A

Hmm. Eu estava pensando em algo do tipo ter uma classe Pessoa, uma Cidade e uma Estado. Exatamente como no BD, Pessoa possui um objeto Cidade, e Cidade possui um objeto Estado. O problema é que estou sofrendo na hora hora de buscar os dados.

Na hora de listar Pessoa, eu pretendo deixar Cidade e Estado lado a lado, como colunas na tabela. No entanto, esse é o meu problema. Não estou conseguindo fazer a busca. Alguma sugestão quanto a isso?

drigo.angelo

Você utiliza algum ORM? As suas classes DAO já estão prontas?

Uma vez eu fiz assim(adaptando para seu exemplo)(fiz os DAOs tudo “no braço”):
na classe PessoaDAO:

public Pessoa busca(String cpf){ String sql = "Select * from Pessoa where cpf = ?"; //PreparedStatement etc etc... executa a query Pessoa p = new Pessoa(); CidadeDAO c = new CidadeDAO(...); p.setNome(rs.getString("nome")); //Seta os valores no objeto p. p.setCidade(c.busca(rs.getInt("cidade"))); }
E no CidadeDAO:

public Cidade busca(int codigo){ String sql = "Select * from Cidade where codigo = ?" //Cria o preparedStatement, executa e pega o resultset... Cidade c = new Cidade(); EstatoDAO e = new EstadoDAO(); c.setEstado(e.busca(rs.getInt("estado"))); }

Não sei se ficou claro, mas é mais ou menos assim, pega a chave e vai populando os objetos :stuck_out_tongue:

johnny_quest

Seria melhor seguir um modelo mais Orientado à Objetos
do que seguir o modelo do banco.

Seria uma boa você aprender JPA
e utilizar hibernate como ORM no seu projeto.

Ficaria extremamente facil fazer qualquer consulta.

A

Não, não uso qualquer tipo de ORM, e restrições de tempo tornam proibitivo instalar uma neste momento. Sei que facilita, mas vou perder muito tempo pra implementar e aprender, já que estou meio que sozinho no projeto.

Acho que usar DAO é a solução - só preciso lembrar como usa direito. Vou dar uma pesquisada. Obrigado pela ajuda =]

drigo.angelo

Posta o resultado aí depois, então !

A
String sql = " SELECT * FROM CIDADE " +
					" WHERE ID_CIDADE = ? ";
			
			PreparedStatement ps = conn.prepareStatement( sql );
			
			ps.setInt(1, idCidade);
			
			ResultSet rs = ps.executeQuery();
			
			CidadeBean bean = new CidadeBean();
			Estado estado = new Estado();
			
			bean.setId( rs.getInt(1) );
			bean.setEstado( estado.buscarEstadoById(rs.getInt(2)) );
			bean.setNome( rs.getString(3) );
			
			return bean;

Estou com problema no setId, tá dando null pointer nessa parte. CidadeBean seria onde estão os dados de cidade, como ID, nome, tal e tal, além de um outro EstadoBean. Estado seria o DAO, é lá que eu tenho a função de acesso ao banco. Mas não sei o que tá rolando agora.

Edit - Em retrospecto, tudo isso é problema só em java, devia ter postado no outro sub-fórum.

wbdsjunior
tente:
...

ResultSet rs = ps.executeQuery();  
rs.next();

...
A
wbdsjunior:
tente:
...

ResultSet rs = ps.executeQuery();  
rs.next();

...
Grande ajuda!

Grato pela ajuda, pessoal. Agora funcionando redondinho.

A

Ok, encontrei novamente um probleminha, mas esse é de JSP mesmo.

Digamos que eu queira inserir um novo registro em uma tabela de dois atributos - ID e Nome. O ID é identidade, então não preciso adicioná-lo - só o nome.
Como devo proceder? Tenho três JSPs. Um de “leitura”, onde existe o campo “nome”, de onde vou pegar o valor.
O segundo JSP é o de confirmação. Aqui eu mostro mais ou menos o seguinte: “Deseja confirmar o registro:” X " com o nome : " Y “?”, com X sendo o número seguinte ao último ID presente na tabela, e Y sendo o nome que pretendo inserir.
O terceiro é apenas a confirmação do insert - mostra uma frase simples.

O meu problema está no que acontece após a confirmação do segundo JSP. Consigo passar os dados do primeiro pro java, e do java para o segundo JSP. Mas não consigo passar do segundo JSP para o java, para que possa realizar o insert pelo Dao. O que estou esquecendo?

Edit - Aproveitando o embalo, como preencher um combobox do banco? Aproveitando o exemplo da cidade usado antes, imagine uma tela hipotética de inserção de cidade. Eu quero ter um combobox com todos os estados presentes lá. Como fazer isso?

A

Me virei na questão do BD, e consegui resolver. Mas agora estou com um problema na hora de um redirecionamento. Tenho duas funções praticamente idênticas (nota-se que a segunda foi copiada e alterada da primeira), mas a primeira está dando um erro estranho. Não sei por qual razão, mas funciona perfeitamente em uma, e não na outra. Seguem os códigos:

if (btnNext != null && btnNext.equals("CadastrarA")) {
			request.getRequestDispatcher("/insertA.jsp").forward(request, response);
		}
if (btnNext != null && btnNext.equals("CadastrarB")) {

			List listaA;
			try {
				listaA = a.listarA();
				if( listaA != null ) {
					request.setAttribute( "lista", listaA );
				}
			} catch (Exception e) {
				//TODO Tratar o erro direcionando para uma página de erro.
			}
			request.getRequestDispatcher("/insertB.jsp").forward(request, response);
		}

B contém um A, como se fosse Cidade contém um Estado. Percebe-se que está "igual". Presume-se que há dados em ambas as tabelas, já fiz o debug e traz os dados perfeitamente. O problema é na hora do forward do A. Ali dá o seguinte erro:

java.lang.IllegalStateException: Cannot forward after response has been committed
	pacoteaqui.servlet.ReportServlet.service(ReportServlet.java:100)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Novamente, o problema é só no A, B funciona perfeitamente. Alguma luz?

drigo.angelo

coloca um else:D

A

Onde?

drigo.angelo

Mais ou menos assim:

if (cadastroA) forward(cadastroA) else if(cadastroB) //Do something forward(cadastroB);

A

Puuutz. Realmente. Não tinha um else ali. Tem uma porrada de ifs semelhantes, todos com else, só esse que não. Unbelievable. Adicionado o else, tudo certo. Grato novamente!

Edit - Tag de [RESOLVIDO] adicionada, espero não ter que remover! =]

Criado 7 de fevereiro de 2011
Ultima resposta 10 de fev. de 2011
Respostas 15
Participantes 4