Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

A URL Servlet não está sendo encontrada

Olá

Estou com problemas quando vou acessar a Servlet via AJAX, ele diz não encontrar o script, segue os códigos que correspondem para o funcionamento da mesma. O erro que acontece é o seguinte :

jquery-1.10.3.js:4 POST http://localhost:8082/agendaContato/CadastroContato 404 ()

The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.

OBS: A aplicação está rodando normal, porém quando vou inserir um registro, que faço a utilização do código ajax com a URL pra Servlet, ele acontece o erro e cai no bloco catch

package br.com.agendaContato.servlets;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import br.com.agendaContato.objetos.Contato;
import java.sql.Connection;
import br.com.agendaContato.bd.conexao.Conexao;
import br.com.agendaContato.jdbc.JDBCContatoDAO;
import java.util.HashMap;
import java.util.Map;
import com.google.gson.Gson;


public class CadastroContato extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public CadastroContato(){
        super();
    }

    private void process(HttpServletRequest request, 
            HttpServletResponse response)
            throws ServletException, IOException {

        /*
         * Instanciar o objeto contato para a classe Contato
         * pois é nesta que armazenaremos os valores dos campos do
         * formulário contato que posteriormente serão gravados no banco
         * de dados
         */

        Contato contato = new Contato();

        try{
            /*
             * Recebendo os valores dos campos do formulário e os armazenando
             * em seus respectivos atributos na classe Contato
             */

            contato.setNome(request.getParameter("txtnome"));
            contato.setEndereco(request.getParameter("txtendereco"));
            contato.setTelefone(request.getParameter("txttelefone"));

            /*
             * Instancia a classe Conexao ao objeto conec visando
             * estabelecer a conexao com o banco de dados contato
             */
            Conexao conec = new Conexao();

            // Abrindo a conexão com o banco de dados
            Connection conexao = conec.abrirConexao();

            /*
             * Instanciar a classe JDBCContatoDAO ao objeto
             * jdbcContato visando a implementação da transação
             * implementar as transações de inserção edição
             * exclusão e consulta ao banco de dados contatos.
             */
            JDBCContatoDAO jdbcContato = new JDBCContatoDAO(conexao);
            /*
             * Chamar o método, inserir da interface ContatoDAO,
             * passando como parâmetro o objeto contato que, por sua vez,
             * contém os valores dos campos a serem inseridos na tabela
             * contato. Recebe e armazena do método inserir da classe JDBCCONTATODAO,
             * o resultado da inserção, verdadeiro ou falso
             * ou seja, conseguiu ou não inserir. Este resultado é armazenado na variavel
             * retorno
             */
            boolean retorno = jdbcContato.inserir(contato);
            // Fechar conexao com o banco de dados
            conec.fecharConexao();

            // Para retornar uma mensagem para o usuario
            Map<String, String> msg = new HashMap<String, String>();
            if(retorno){
                msg.put("msg","Contato cadastrado com sucesso.");
            }else{
                msg.put("msg","Não foi possivel cadastrar o contato.");
            }
            /*
             * Retorna a resposta(mensagem) para o usuário a partir do Json
             */
            String json = new Gson().toJson(msg);

            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(json);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        process(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        process(request, response);
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>agendaContato</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
      <description></description>
      <servlet-name>CadastroContato</servlet-name>
      <servlet-class>br.com.agendaContato.servlets.CadastroContato</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>CadastroContato</servlet-name>
      <url-pattern>/CadastroContato</url-pattern>
  </servlet-mapping>
</web-app>
SENAI.contato = new Object();
/*
 * Rotina JQuery com Ajax que implementa o método cadastrar, fazendo com que 
 * possamos validar os campos obrigatórios de preenchimento do formulário
 * contato e a partir da rotina Ajax, que configura as informações do método
 * do formulário contato, no caso "post", identifica o Servlet que receberá
 * mensagem que ao receber, do Servlet, o resultado da inclusão de dados via
 * JSON, apresentará o resultado da transação.
 * Faz a chamada ao método buscar, na tentativa de fazer a atualização na pagina(refresh)
*/
$(document).ready(function(){

    SENAI.contato.cadastrar = function(){

        if(document.getElementById("nome").value == "" ||
           document.getElementById("endereco").value == "" ||
           document.getElementById("telefone").value == ""){

            alert("Todos os campos são obrigatórios de preenchimento!");
            document.getElementById("nome").focus();
            return false;
        }else{

            $.ajax({
                type: "POST",
                url: "CadastroContato",
                data: $("#cadastrarContato").serialize(),
                success: function(msg){

                    var cfg = {
                            title: "Mensagem",
                            height: 250,
                            width: 400,
                            modal: true,
                            buttons: {
                                "OK":function(){
                                    $(this).dialog("close");
                                }
                            }
                    };

                    $("#msg").html(msg.msg);
                    $("#msg").dialog(cfg);

                    // Atualiza a tabela de contatos
                    SENAI.contato.buscar();
                },
                error:function(reset){
                    console.log(reset);
                    alert("Erro ao cadastrar um novo contato");
                }
            });
        }
    };

    /*
     * Implementação do método buscar que, por sua vez, captura os dados do formulário
     * e os armazena na variável valorBusca que, por sua vez, os remete para o Servlet.
     * Caso já tenham informações cadastradas, chama o método exibirContatos()
     */
    SENAI.contato.buscar = function(){
        var valorBuscar = $("#consultarContato").val();
        SENAI.contato.exibirContatos(undefined, valorBusca);
    }
});
13 respostas

Olá, Maria! Tudo bem com você? =)

Você chegou a fazer o mapeamento da Servlet no seu web.xml? Pergunto, pois não encontrei a anotação @WebServlet, então você teria que fazê-lo dessa segunda forma... =)

Fábio

Olá Fábio, o mapeamento está sendo feito, conforme o código acima, está assim:

br.com.agendaContato.servlets.CadastroContato

Maria,

Perdão, não tinha visto as tags ali no final... Só para constar... Aquelas tags estão dentro do seu arquivo web.xml, correto? Ou estão, como aparenta ali em cima, no mesmo arquivo da sua classe? =)

Fábio

Estão dentro do meu arquivo web.xml, configurei corretamente la, não sei se pode ser algum erro de porta ou de desenvolvimento mesmo.

Maria,

Você disse que está caindo dentro do bloco catch, entretanto, o fato de estar mostrando um 404, aparenta não estar nem chegando na classe. =|

Você chegou a ver alguma StackTrace com Exception? Se sim, pode postá-la aqui, por favor?

Fábio

Fábio, a pagina HTML mostra normal, porém ele não encontra a classe do Servlet, e cai no catch que está postado no JavaScript, nesta parte aqui:

                error:function(reset){
                    console.log(reset);
                    alert("Erro ao cadastrar um novo contato");
                }

Segue a imagem no link: http://ap.imagensbrasil.org/image/j3ppB9

Algum retorno professor? Eu resolvi o problema, dei clear no projeto e funcionou, porém criei outra Servlet, e deu a MESMA COISA, porém não deu certo apenas limpar o projeto, me ajudem!! kkk

Maria,

Tudo bem? =)

Desculpe a demora em responder... Estava tentando descobrir o que podia ser, porque seu código aparenta estar correto. Entretanto, ele não está encontrando a Servlet... =|

Essa outra Servlet que você criou, como está o código?

Fábio

Olá, está assim.

package br.com.agendaContato.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import br.com.agendaContato.bd.conexao.Conexao;
import br.com.agendaContato.objetos.Contato;
import br.com.agendaContato.jdbc.JDBCContatoDAO;
import com.google.gson.Gson;


public class ConsultaContato extends HttpServlet{
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */

    public ConsultaContato(){
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        process(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        process(request, response);
    }

    private void process(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
        List<Contato> contatos = new ArrayList<Contato>();

        // Chamar o método que grava o objeto usuario no banco de dados
        Conexao conec = new Conexao();
        Connection conexao = conec.abrirConexao();

        JDBCContatoDAO jdbcContato = new JDBCContatoDAO(conexao);
        contatos = jdbcContato.buscarPorNome(request.getParameter("valorBusca").toString());
        conec.fecharConexao();

        //para retornar um objeto para o usuario
        String json = new Gson().toJson(contatos);
        try{
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            response.getWriter().write(json);
        }catch(IOException e){
            e.printStackTrace();
        }
    }

}
    /*
     * Implementação do método buscar que, por sua vez, captura os dados do formulário
     * e os armazena na variável valorBusca que, por sua vez, os remete para o Servlet.
     * Caso já tenham informações cadastradas, chama o método exibirContatos()
     */
    SENAI.contato.buscar = function(){
        var valorBuscar = $("#consultarContato").val();
        SENAI.contato.exibirContatos(undefined, valorBusca);
    };

    // Rotina que exibe os contatos cadastrados 
    SENAI.contato.exibirContatos = function(listaDeContatos, valorBusca){
        var html = `<table class='table'>`
        html += `<tr>
                    <th>Nome</th>
                    <th>Endereco</th>
                    <th>Telefone</th>
                    <th>Ações</th>
                </tr>`;

        if(listaDeContatos != undefined && listaDeContatos.length > 0 && listaDeContatos[0].id != undefined){

            for(var i=0; i < listaDeContatos.length; i++){

                html += `<tr>
                            <td>${listaDeContatos[i].nome}</td>
                            <td>${listaDeContatos[i].endereco}</td>
                            <td>${listaDeContatos[i].telefone}</td>
                            <td>
                                <a class='link' onclick='SENAI.contato.editarContato(${listaDeContatos[i].id})'>Editar</a>
                                <a class='link' onclick='SENAI.contato.deletarContato(${listaDeContatos[i].id})'>Deletar</a>
                            </td>
                            </tr>`;
            }
        }else{
            if(listaDeContatos == undefined || (listaDeContatos != undefined && listaDeContatos.length > 0)){

                $.ajax({
                    type: "POST",
                    url: "ConsultaContato",
                    data: "ValorBusca="+valorBusca,
                    success:function(listaDeContatos){
                        SENAI.contato.exibirContatos(listaDeContatos);
                    },
                    error: function(rest){
                        alert("Erro ao consultar os contatos");
                    }
                });
            }else{
                html += "<tr><td colspan='3'>Nenhum registro encontrado</td></tr>";
            }
        }
        html += "</table>";
        $("#resultadoContatos").html(html);
    };

    SENAI.contato.exibirContatos(undefined, "");
});
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>agendaContato</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <description></description>
        <servlet-name>CadastroContato</servlet-name>
        <servlet-class>br.com.agendaContato.servlets.CadastroContato</servlet-class>
    </servlet>
    <servlet>
        <description></description>
        <servlet-name>ConsultaCadastro</servlet-name>
        <servlet-class>br.com.agendaContato.servlets.ConsultaCadastro</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CadastroContato</servlet-name>
        <url-pattern>/CadastroContato</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ConsultaCadastro</servlet-name>
        <url-pattern>/ConsultaCadastro</url-pattern>
    </servlet-mapping>
</web-app>

Declarei as duas servlet porem ele insisti no erro.

Resolvi o problema professor ! tks

Maria,

Como você resolveu? =)

Fábio

solução!

O primeiro erro foi apenas limpar o projeto e desativar o Build automático (não sei por que mas funcionou assim), depois ocorreu o mesmo erro, mas eu tinha esquecido de estender a classe HttpServlet.