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

HTTP Status 405 - HTTP method GET is not supported by this URL

Galera não estou conseguindo usar o método "doPost", segue abaixo meu código:

Classe NovaEmpresa:

package br.com.alura.gerenciador.web;

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 br.com.alura.gerenciador.Empresa;
import br.com.alura.gerenciador.dao.EmpresaDAO;

@WebServlet(urlPatterns = "/novaEmpresa")
public class NovaEmpresa extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String nome = req.getParameter("nome");
        Empresa empresa = new Empresa(nome);
        new EmpresaDAO().adiciona(empresa);
        PrintWriter writer = resp.getWriter();
        writer.println("<html><body>Empresa " + nome + " adicionada!</body></html>");
    }
}

Html index:

<html>
<body>
Bem vindo ao nosso gerenciador de empresas!<br/>

<form action="novaEmpresa" method="post">
    Nome: <input type="text" name="nome" /><br />
    <input type="submit" value="Enviar" />
</form>
</body>
</html>

Erro:

HTTP Status 405 - HTTP method GET is not supported by this URL

type Status report

message HTTP method GET is not supported by this URL

description The specified HTTP method is not allowed for the requested resource. Apache Tomcat/8.0.36

10 respostas

Olá, André.

Você está tentando fazer um requisição do tipo get no método doPost e este método só aceita requisição do tipo post.

Para a rota "/novaEmpresa" aceite requisições do tipo get você precisa mudar a assinatura do método doPost para doGet. Ou seja, é só trocar a linha:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

por esta:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

Se você que a rota "/novaEmpresa" aceite tanto requisições do tipo get e post você pode mudar a linha do doPost para:

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

Qualquer dúvida só falar :-)

[]'s Marco Bruno

Olá André,

a grande questão, como o Marco Bruno falou, é que está chegando uma requisição GET pra sua servlet. No entanto, o seu método "doPost" só é chamado como você gostaria se o chegar uma requisição POST. Olhando o seu código do HTML, não pareceu ter nenhum problema, afinal você está definindo a requisição pra POST na tag form.

Com esse código, o erro pode estar acontecendo quando o navegador já está com a URL "/novaEmpresa" e você aperta o Enter (por exemplo depois de reiniciar o TomCat), pois aí a requisição feita será um GET. Se, mesmo apertando o botão Enviar o problema continuar, teremos que investigar mais a fundo. :)

Olá, Bruno!

Cara o seguinte, fiz desta forma:

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String nome = req.getParameter("nome");
        Empresa empresa = new Empresa(nome);
        new EmpresaDAO().adiciona(empresa);
        PrintWriter writer = resp.getWriter();
        writer.println("<html><body>Empresa " + nome + " adicionada!</body></html>");

    }

Funcionou porém a saida no navegador saiu assim: "Empresa null adicionada!", por que?

E outra coisa, posso ter algum problema ou desvantagem em usar o método service() ao invés de get() ou post()?

Olá André,

A diferença é que o método service() recebe todas as requisições possíveis, como a GET e a POST, enquanto o método doGet() só é chamado com requisicões do tipo GET e o método doPost() só é chamado com requisições do tipo POST. A desvantagem é se queremos executar alguma lógica (como no nosso caso de inserir uma empresa) apenas com algum tipo específico de requisição (no nosso caso, o POST) pois, ao usar o método service(), o código dentro do método estará sendo executado com requisições do tipo GET também. Para inserir dados no banco de dados, como no caso desse exercício, o ideal é justamente aceitarmos apenas requisições do tipo POST.

Se a mensagem falou "Empresa null adicionada!", olhando o parâmetro do método println(), vemos que a variável nome está nula, ou seja, não chegou nenhum parâmetro com nome 'nome' pela requisição. Isso pode ter ocorrido pelo motivo que falei no post de cima, de ter a url /novaEmpresa no navegador e apenas apertar o Enter. Me confirma se foi isso que aconteceu, por favor. :)

Lembrando que o fluxo todo a se fazer é primeiro acessar a página do formulário colocando o caminho dele no navegador (/index.html), digitar o nome da empresa no campo certo e só então apertar o botão de 'Enviar' para enviar o parâmetro para a url /novaEmpresa através de uma requisição do tipo POST.

Qualquer dúvida, avisa aqui! :)

[]'s Ana Losnak

Oi Ana,

Então coloquei o método desta forma:

@WebServlet(urlPatterns = "/novaEmpresa")
public class NovaEmpresa extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String nome = req.getParameter("nome");
        Empresa empresa = new Empresa(nome);
        new EmpresaDAO().adiciona(empresa);
        PrintWriter writer = resp.getWriter();
        writer.println("<html><body>Empresa " + nome + " adicionada!</body></html>");

    }

Porém ele continua dando o erro abaixo:

HTTP Status 405 - HTTP method GET is not supported by this URL

type Status report

message HTTP method GET is not supported by this URL

description The specified HTTP method is not allowed for the requested resource. Apache Tomcat/8.0.36

Estou com o mesmo problema em outro exercício

Isso é bem estranho... Você não estaria chamando o / novaEmpresa direto na URL nao, ne?

Pq como essa URL só aceita POST, precisa sempre acessar primeiro o index.html com o formulario e aí clicar no botao que submete

Não chamo direto e quando clico no botão ele até vai para / novaEmpresa, porém ela fica em branco

solução!

Bem estranho mesmo..Se o seu código está igual você falou aqui e está seguindo o fluxo certinho, deve ser algum detalhe mínimo que tá travando tudo.

A página está em branco agora? Ou ainda tá aparecendo o mesmo erro?

Tenta clicar com o botão direito do mouse no TomCat (na aba Servers do Eclipse) pra limpar ele e o diretório respectivo. Aí tenta de novo: abrir o formulário primeiro, digitar algo na empresa, "Alura" por exemplo, e depois clicar no botão "Enviar".

E nesse momento que chama a /novaEmpresa e fica em branco, é aí que acontece a exception?

Consegui depois que limpei o TomCat, obrigado pessoal !!