Olá, estou tentando instanciar uma classe, porém esta classe está dentro de uma biblioteca que eu mesmo fiz. A classe que estou tentando instanciar se chama ContatoDao. P/ fazer a instanciação estou usando o código:
<jsp:useBean id="dao" class="fj21.jdbc.dao.ContatoDao"/>
Mas não está encontrando a classe ContatoDao, Assim está a organização do projeto no eclipse:
Pela imagem parece que o jar está corretamente no classpath do projeto, então tem que verificar se essa classe possui um construtor default ou um sem argumentos para que o jsp:useBean consiga criar a instância.
Dê uma olhada: https://www.javatpoint.com/jsp-useBean-action
O eclipse não estava aceitando o código, deletei o jar e transformei a minha biblioteca em jar de novo, coloquei no mesmo build path do meu projeto novamente e agora o eclipse aceitou. Porém o erro continua quando rodo no apache Tomcat:
Type Exception Report
Message /lista-contatos.jsp (line: [13], column: [10]) The value for the useBean class attribute [fj21.jdbc.dao.ContatoDao] is invalid.
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.apache.jasper.JasperException: /lista-contatos.jsp (line: [13], column: [10]) The value for the useBean class attribute [fj21.jdbc.dao.ContatoDao] is invalid. org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:42) org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:443) org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:149) org.apache.jasper.compiler.Generator$GenerateVisitor.visit(Generator.java:1312) org.apache.jasper.compiler.Node$UseBean.accept(Node.java:1196) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2444) org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2450) org.apache.jasper.compiler.Node$Root.accept(Node.java:474) org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2392) org.apache.jasper.compiler.Generator.generate(Generator.java:3596) org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:255) org.apache.jasper.compiler.Compiler.compile(Compiler.java:379) org.apache.jasper.compiler.Compiler.compile(Compiler.java:358) org.apache.jasper.compiler.Compiler.compile(Compiler.java:345) org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:660) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:400) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
Note The full stack trace of the root cause is available in the server logs.
Obs: a classe que estou instanciando tem construtora sem parâmetros, inclusive a classe é essa:> /*
Seu papel será gerenciar a conexão e inserir Contatos no banco de dados.
*/
package fj21.jdbc.dao;import fj21.jdbc.ConnectionFactory;
import fj21.jdbc.modelo.Contato;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;/**
*
@author Rodrigo Rech
*/
public class ContatoDao {// a conexão com o baanco de dados private Connection connection; public ContatoDao() { this.connection = new ConnectionFactory().getConnection(); } public void adiciona(Contato contato) { String sql = "insert into contatos " + "(nome,email,endereco,dataNascimento)" + " values (?,?,?,?)"; try { // prepared statement para inserção PreparedStatement stmt = connection.prepareStatement(sql); // seta os valores stmt.setString(1,contato.getNome()); stmt.setString(2,contato.getEmail()); stmt.setString(3,contato.getEndereco()); stmt.setDate(4, new Date( contato.getDataNascimento().getTimeInMillis())); // executa stmt.execute(); stmt.close(); } catch (SQLException e) { throw new RuntimeException(e); } } public List<Contato> getLista() { try { List<Contato> contatos = new ArrayList<Contato>(); PreparedStatement stmt = this.connection. prepareStatement("select * from contatos"); ResultSet rs = stmt.executeQuery(); while (rs.next()) { // criando o objeto Contato Contato contato = new Contato(); contato.setId(rs.getLong("id")); contato.setNome(rs.getString("nome")); contato.setEmail(rs.getString("email")); contato.setEndereco(rs.getString("endereco")); // montando a data através do Calendar Calendar data = Calendar.getInstance(); data.setTime(rs.getDate("dataNascimento")); contato.setDataNascimento(data); // adicionando o objeto à lista contatos.add(contato); } rs.close(); stmt.close(); return contatos; } catch (SQLException e) { throw new RuntimeException(e); } }
}
Você consegue instanciar ContatoDao
em alguma classe do projeto onde essa JSP está?
Então, fui no src do projeto e criei um novo .java com o seguinte código:
import fj21.jdbc.dao.ContatoDao;
public class teste { public static void main(String[] args) { ContatoDao dao = new ContatoDao(); dao.getLista(); } }
Rodou tranquilamente
Verifique se o jar (dbConnection.jar) foi adicionado no war gerado do projeto que vc está rodando no tomcat.
Abra o war com alguma ferramenta de compactação como Winrar, Winzip, 7z, etc.
Não está, deveria estar dentro de 'WEB-INF/lib " ?
Sim. Quando o projeto eh empacotado num war para rodar no servidor, as dependências devem ir junto no war para funcionar.
Entendi, eu tinha esquecido de colocar o contatoDao na pasta lib, agora que coloquei o erro parou, porém está dando outro erro:
Type Exception Report
**Message** java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/caelum
**Description** The server encountered an unexpected condition that prevented it from fulfilling the request.
**Exception**
org.apache.jasper.JasperException: java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/caelum org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:599) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:515) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339) javax.servlet.http.HttpServlet.service(HttpServlet.java:728) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
**Root Cause**
Porém essa conexão com o banco é feita no contatoDao, e está funcionando corretamente quando testo no contatoDao sozinho. Será que estou colocando o driver jdbc do postgresql no lugar errado?
Tem que verificar se o jar do driver do postgresql tambem esta indo no war.
Posta o código desse método.
public Connection getConnection() {
try {
return DriverManager.getConnection("jdbc:postgresql://localhost:5432/caelum", "postgres", "senhacorreta");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Mude para:
public Connection getConnection() {
try {
Class.forName("org.postgresql.Driver");
return DriverManager.getConnection("jdbc:postgresql://localhost:5432/caelum", "postgres", "senhacorreta");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
Funcionou amigo, muito obrigado!!!