[RESOLVIDO] - Erro HTTP 500 - Primeiro web application simples

Bom dia pessoal, estou fazendo meu primeiro projeto web no NetBeans e não consigo fazer a tela do login funcionar, pelo erro que estou recebendo o problema parece ser na servlet que criei, porém, não consigo descobrir o que está acontecendo.

Estou usando o PostgreSQL como banco de dados e o TomCat 9.0

Segue abaixo o erro que recebo ao fazer o submit do form

Exception

javax.servlet.ServletException: Error instantiating servlet class [servlets.acao3] org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.base/java.lang.Thread.run(Thread.java:835)

Root Cause

java.lang.RuntimeException: servlets.acao3.(acao3.java:1) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.base/java.lang.Thread.run(Thread.java:835)

Fico grato a quem possa me ajudar!

Boa tarde! Erro 500 é causado por erro interno do servidor. Tenta reiniciar o servidor, talvez volte. Senão voltar a funcionar, exclui o Apache e instala de novo

Vou testar assim que chegar em casa e te retorno.
Tentei reiniciar ele diversas vezes mas ele fica num loop infinito e não reinicia

Mostra o código, tanto a classe do servlet como o web.xml se estiver usando. Está dando um erro na hora que o servidor vai instanciar seu servlet e é difícil saber o que é sem olhar o código.

1 curtida

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>acao3</servlet-name>
        <servlet-class>servlets.acao3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>acao3</servlet-name>
        <url-pattern>/acao3</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

servlet acao3.java

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entidade.Usuario;
import dao.LoginUsuarioDAO;
import javax.servlet.RequestDispatcher;
import javax.swing.JOptionPane;

WebServlet(name = “acao3”, urlPatterns = {"/acao3"})
public class acao3 extends HttpServlet {

HttpServletRequest requisicao;
HttpServletResponse resposta;

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try ( PrintWriter out = response.getWriter()) {
             
    
     
    
    }
}




Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    requisicao = request;
    resposta = response; 
    //doGet(requisicao, resposta);

        String parametro = request.getParameter("param");
        
        if (parametro.equals("loginSistema")){
        String user = request.getParameter("user");
        String senha = request.getParameter("pass");
        
        Usuario u = new Usuario();
        u.setNome(user);
        u.setSenha(senha);
        LoginUsuarioDAO login = new LoginUsuarioDAO();                    
        
        if(login.Autenticar(u)){
            encaminharPagina("sucesso.jsp");
        } else {
            encaminharPagina("erro.jsp");
        }     
        }
    

    
}


Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

private void encaminharPagina(String pagina) {
    try {
    RequestDispatcher rd = requisicao.getRequestDispatcher(pagina);
    rd.forward(requisicao, resposta);
    } catch (IOException | ServletException e) {
    System.out.println("erro no encaminhamento: " + e);
    }

}

}

classe de apoio ConexaoBD

package apoio;

import java.sql.;
import java.util.
;

public class ConexaoBD {

private static ConexaoBD instancia = null;
private Connection conexao = null;

public ConexaoBD() {
    try {
        // Carrega informações do arquivo de propriedades
        Properties prop = new Properties();
        
        prop.load(getClass().getClassLoader().getResourceAsStream("apoio/db.properties"));
        String dbdriver = prop.getProperty("db.driver");
        String dburl = prop.getProperty("db.url");
        String dbuser = prop.getProperty("db.user");
        String dbsenha = prop.getProperty("db.senha");

        // Carrega Driver do Banco de Dados
        Class.forName(dbdriver);

        if (dbuser.length() != 0) // conexão COM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl, dbuser, dbsenha);
        } else // conexão SEM usuário e senha
        {
            conexao = DriverManager.getConnection(dburl);
        }

    } catch (Exception e) {
        System.err.println(e);
    }
}

// Retorna instancia
public static ConexaoBD getInstance() {
    if (instancia == null) {
        instancia = new ConexaoBD();
    }
    return instancia;
}

// Retorna conexão
public Connection getConnection() {
    if (conexao == null) {
        throw new RuntimeException("conexao==null");
    }
    return conexao;
}

// Efetua fechamento da conexão
public void shutDown() {
    try {
        conexao.close();
        instancia = null;
        conexao = null;
    } catch (Exception e) {
        System.err.println(e);
    }
}

}

classe Usuario

package entidade;

public class Usuario {
private int id;
private String nome;
private String senha;

public int getId(int id){
    return id;
}
public void setId(int ID){
    this.id = ID;
}
public String getNome(){
    return nome;
}
public void setNome(String NOME){
    this.nome = NOME;
}    
public String getSenha(){
    return senha;
}
public void setSenha(String SENHA){
    this.senha = SENHA;
}     

}

classe LoginUsuarioDAO

package dao;

import apoio.ConexaoBD;
import entidade.Usuario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class LoginUsuarioDAO {
public boolean Autenticar(Usuario u){

    try {
        Statement st = ConexaoBD.getInstance().getConnection().createStatement();
       
        String sql =    "select count(nome) as encontrou from usuario" +
                        " where usuario.nome = "+ u.getNome() +
                        " and usuario.senha = " + u.getSenha();
                    
        ResultSet resultado = st.executeQuery(sql);
        
        while(resultado.next()){
            return 1 == resultado.getInt("encontrou");  //se retornar apenas 1 registro, será verdadeiro              
        }             
    } catch (SQLException ex) {
        System.out.println("Erro ao fazer login: " + ex);
        return false;
    }
    return false;    
} 

}

texto em itálico

Código acima /\

Experimenta tirar as tags servlet e servlet-mapping (e tudo que tem dentro delas) do web.xml. Você já mapeou o servlet usando a annotation @WebServlet.

Tentei fazer isso e não resolveu @lvbarbosa

Depois de reinstalar o tomcat novamente recebo um erro diferente agora:

Root Cause

java.lang.RuntimeException: conexao == null
apoio.ConexaoBD.getConnection(ConexaoBD.java:49)
dao.ProdutoDAO.consultarProduto(ProdutoDAO.java:107)
org.apache.jsp.cadProduto_jsp._jspService(cadProduto_jsp.java:171)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

Manda o código da conexaoDB,

Segue

Nossa, mas não tem nenhum retorno de erro? Só quando fecha a conexão?

Eu faço desse jeito, se quiser adaptar pra vc, é até melhor

O erro é esse que te mandei mesmo, vou testar com esse teu código, imagino que para o postgre não muda nada além do driver, correto?

Uma pergunta besta, mas o antivirus pode influenciar no TomCat e bloquear ele de alguma forma? Única coisa que ainda não tentei foi desativar ele enquanto rodo

Então, é que na verdade esse não é o erro em si, é uma mensagem que você passou.

Pode ser que o erro seja nome de usuário inválido, senha inválida, url invalida, mas você só vê isso:

 conexao == null

É um erro não tratado.


Pro Postgres muda a URL tbm:

public Statement stm;// responsável por preparar e realizar pesquisas no banco de dados

    public ResultSet rs;//  responsável por armazenar o resultado de uma pesquisa passada para o Statement
    private final String driver = "org.postgresql.Driver";// responsável por identificar o serviço de banco de dados
    private final String caminho = "jdbc:postgresql://localhost:5432/banco";// responsável por setar o local do banco de dados
    private final String usuario = "postgres";
    private final String senha = "senha";

    public Connection conn; // responsável por realizar a conexão com o banco de dados

    public void conexao() { //Metodo Responsável por realizar a conexão com o banco
        try {// tentativa inicial
            System.setProperty("jdbc.Driver", driver); // seta a propriedade do driver de conexão
            conn = DriverManager.getConnection(caminho, usuario, senha); // realiza a conexão com o banco de dados
            //JOptionPane.showMessageDialog (null, "Conectado com Sucesso ao Banco de Dados!"); // imprime uma caixa de mensagens
            //System.out.println("Conectado"); // imprime uma caixa de mensagens
        } catch (SQLException ex) { // excessão
             ex.printStacktrace();      Logger.getLogger(ConectaBanco.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void executaSQL(String sql) {
        try {
            stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = stm.executeQuery(sql);
        } catch (SQLException ex) {
            ex.printStacktrace();  
        }

    }

    public void desconecta() {//metodo para fechar a conexão com o banco de dados
        try {
            conn.close(); //fecha a conexão
            //JOptionPane.showMessageDialog (null, "Desconectado com Sucesso!"); // imprime uma caixa de mensagens
            //System.out.println("Desconectado");
            //System.out.println();
        } catch (SQLException ex) {
            ex.printStacktrace();  
        }

    }

Sobre o antivírus, não afeta não, senão o Tomcat nem iniciava!! O seu problema agora está na classe de conexão

Agora com essa classe que te passei, vc vai chamar assim:

ConectaBanco conecta = new ConectaBanco(); //global

public boolean autenticar(Usuario u){ //Nome de método sempre com camelcase, ou com underline, tipo autenticarLogin ou autenticar_login
    conecta.conexao();
    try {
        String sql =  "SELECT COUNT(nome) AS encontrou FROM usuario WHERE nome= '" + u.getNome() + "' AND senha= '" + u.getSenha() + "'";

        conecta.executaSQL(sql);
        while(conecta.rs.next()){
            return 1 == resultado.getInt("encontrou");  //se retornar apenas 1 registro, será verdadeiro              
        }             
    } catch (SQLException ex) {
        System.out.println("Erro ao fazer login: " + ex);
        return false;
    } finally {
        conecta.desconecta();
    }
    return false;    
} 

Vou fazer um teste de meio dia e te retorno, muito obrigado pela ajuda

Implantei essas classes que tu enviou e recebo isso agora:

Exception
java.lang.NullPointerException apoio.ConectaBanco.desconecta(ConectaBanco.java:73) dao.LoginUsuarioDAO.Autenticar(LoginUsuarioDAO.java:28) servlets.acao3.doPost(acao3.java:69) javax.servlet.http.HttpServlet.service(HttpServlet.java:660) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

Boa, tem mais alguns erros em cima desse aí, manda eles também

HTTP Status 500 – Internal Server Error

Type Exception Report

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception
java.lang.NullPointerException
apoio.ConectaBanco.desconecta(ConectaBanco.java:73)
dao.LoginUsuarioDAO.Autenticar(LoginUsuarioDAO.java:28)
servlets.acao3.doPost(acao3.java:69)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

Note A pilha de erros completa da causa principal está disponível nos logs do servidor.

Apache Tomcat/9.0.24

Mas você está vendo esse erro na saída da IDE ou no site?