Olá pessoal, estou desenvolvendo uma pequena aplicação Web, aparentemente não tive muitos problemas em configurar um pool de conexões, e a conexão com o banco de dados não apresenta nenhum erro aparente (pelo menos o programa não retorna nada que diga que está errado), então acredito ter um erro semântico em minha aplicação.
Eu preciso fazer uma simples consultada em um banco de dado e exibir numa JSP. Isso não deveria apresentar grande dificuldade pois acredito que deve ser uma atividade corriqueira pra quem desenvolve aplicações Web.
Ai vai o código pra ajudar:
Do JSP
<?xml version="1.0"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:c="http://java.sun.com/jsp/jstl/core"
version="2.0">
<jsp:directive.page isELIgnored="false" />
<jsp:directive.page contentType="text/html"/>
<jsp:output omit-xml-declaration="false"
doctype-root-element="html"
doctype-public="-//W3C//DTD XHTML 1.1//EN"
doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" />
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<title>Usuarios</title>
</head>
<body>
<p>Lista de usuarios</p>
<table>
<tr>
<th>ID</th>
</tr>
<jsp:useBean id="colecaoUsuario" class="com.teste.beans.colecaoUsuario"/>
<c:forEach var="usuario" items="${colecaoUsuario.usuario}">
<tr>
<td><c:out value="${usuario.id}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
</jsp:root>
Da Classe colecaoUsuario (Bean):
package com.teste.beans;
import java.util.*;
import com.teste.model.ModelFacade;
import com.teste.model.Usuario;
import java.io.Serializable;
public class colecaoUsuario implements Serializable{
private String clausula = new String();
public String getClausula()
{
return clausula;
}
public void setClausula(String clausula) {
this.clausula = clausula;
}
public Collection<Usuario> getUsuario()
{
Collection<Usuario> lista = ModelFacade.getUsuario(clausula);
return lista;
}
}
Classe ModelFacade:
package com.teste.model;
import com.teste.dao.UsuarioDAO;
import java.util.Collection;
public class ModelFacade {
public static Collection<Usuario> getUsuario(String clausula) {
if (clausula == null) {
clausula = new String();
}
UsuarioDAO pDao = new UsuarioDAO();
Collection<Usuario> lista = pDao.carregaUsuario(clausula);
return lista;
}
}
Classe UsuarioDAO:
package com.teste.dao;
import com.teste.model.*;
import java.sql.*;
import java.util.*;
import javax.naming.*;
import javax.sql.*;
import javax.swing.JOptionPane;
public class UsuarioDAO {
private Connection conexao = null;
private Statement afirmacao = null;
private PreparedStatement prepAfirmacao = null;
private ResultSet resultados = null;
private static final String nome_data_source = "java:comp/env/jdbc/Test";
private static final String consulta = "INSERT INTO usuario (id) VALUES (?)";
private void getConnection() {
if (conexao == null) {
Context contextoInicial;
try {
contextoInicial = new InitialContext();
DataSource poll = (DataSource) contextoInicial.lookup(nome_data_source);
conexao = poll.getConnection();
} catch (NamingException erro) {
erro.printStackTrace();
} catch (SQLException erro) {
JOptionPane.showMessageDialog(null, erro.toString(), nome_data_source, 1);
erro.printStackTrace();
}
}
}
public void persisteUsuario(Usuario pessoa){
try {
getConnection();
prepAfirmacao = conexao.prepareStatement(consulta);
prepAfirmacao.setInt(1, pessoa.getId());
prepAfirmacao.executeUpdate();
prepAfirmacao.close();
prepAfirmacao = null;
} catch (SQLException erro) {
erro.printStackTrace();
}finally{
limpa();
}
}
public Collection<Usuario> carregaUsuario(String clausula){
Collection<Usuario> lista = new ArrayList<Usuario>();
try {
getConnection();
Statement afirmacao_aux = conexao.createStatement();
ResultSet resultado = afirmacao_aux.executeQuery("SELECT * FROM pessoa" + clausula);
int id = 0;
Usuario pessoa = null;
while(resultado.next()){
id = resultado.getInt("id");
pessoa.setId(id);
lista.add(pessoa);
}
resultado.close();
resultado = null;
afirmacao_aux.close();
afirmacao_aux = null;
conexao.close();
conexao = null;
} catch (SQLException erro) {
erro.printStackTrace();
}finally{
limpa();
}
return lista;
}
private void limpa(){
if(resultados != null){
try {
resultados.close();
} catch (SQLException erro) {
erro.printStackTrace();
}
resultados = null;
}
if(afirmacao != null){
try {
afirmacao.close();
} catch (SQLException erro) {
erro.printStackTrace();
}
afirmacao = null;
}
if(prepAfirmacao != null){
try {
prepAfirmacao.close();
} catch (SQLException erro) {
erro.printStackTrace();
}
prepAfirmacao = null;
}
if(conexao != null){
try {
conexao.close();
} catch (SQLException erro) {
erro.printStackTrace();
}
conexao = null;
}
}
}
Eu criei a base de dados na mão utilizando o MySQL, não sei se isso é relevante mais eu uso Linux (Fedora 12) e NetBeans como IDE (Mas tô tentando migrar pro Eclipse =]).
O que deu pra perceber é que ele se conecta a base se dados porque se eu mudo o nome da base de dados no arquivo context.xml pra uma inexistente ele me reporta um erro dizendo que não encontrou tal base de dados.
Gostaria de saber se é um erro aparente, aquelas coisas que principiantes erram, conheço java razoavelmente mais sou marinheiro de primeira viajem em aplicações Web. O modo como estou tratando o problema é uma maneira razoavelmente boa?
Se o problema já aconteceu com alguém ou mesmo quem saiba dar um palpite, porque os meus já acabaram, toda ajuda é muito bem vinda.
Obrigado.