[RESOLVIDO] Ajuda em Java / JSP

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.

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}

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?

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:

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.

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 =]

Posta o resultado aí depois, então !

[code] 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;

[/code]

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.

tente:

[code]

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

…[/code]

[quote=wbdsjunior]tente:

[code]

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

…[/code][/quote]
Grande ajuda!

Grato pela ajuda, pessoal. Agora funcionando redondinho.

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?

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

[code] 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);
	}

[/code]

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?

coloca um else:D

Onde?

Mais ou menos assim:

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

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! =]