[RESOLVIDO] Problema com Servlet - HTTP method GET is not supported by this URL

Olá,

Estou com um problema:
Meu projeto da faculdade é uma rede social. Tenho uma servlet pra efetuar a lógica do login e redirecionar pra uma Servlet que contem a página principal da rede ou voltar pra página inicial de login.
Quando o usuário consegue se logar, eu redireciono o usuário usando resp.sendRedirect(“main.do”);. O problema está quando chega em main.do, ele lança o erro “HTTP Status 405 - HTTP method GET is not supported by this URL”. Porém, eu tenho o método doGet() implementado em main.do. Não sei o que pode ser o problema. Alguém pode me ajudar?

Aqui estão os códigos das classes:
Classe de Login

[code]public class Login extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String login = (String) req.getParameter("login");
    String senha = (String) req.getParameter("senha");
    Usuario us = new Usuario(login,senha);
    LoginDAO ld = new LoginDAO();
    if(ld.logar(us)) {
        HttpSession session = req.getSession();
        UsuarioDAO ud = new UsuarioDAO();
        us = ud.recuperar(login);
        session.setAttribute("usuario", us);
        resp.sendRedirect("main.do");
    } else resp.sendRedirect("index.jsp");

}

}[/code]

Classe da Página Principal

[code]public class Main extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    HttpSession ss = request.getSession();
    Usuario us = (Usuario) ss.getAttribute("usuario");
    PrintWriter out = response.getWriter();
    StringBuffer sb = new StringBuffer();

    sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
    sb.append("<head>");
    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
    sb.append("<title>Dood - Perfil de ").append(us.getNick()).append("</title>");
    sb.append("<link href=\"STYLES/main.css\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\"/>");
    sb.append("</head>");
    sb.append("<body>");
    out.print(sb.toString());
    request.getRequestDispatcher("navbar.sw").include(request, response);
    out.println("</body></html>");
}

}[/code]

Lembrando que ainda to no primeiro módulo da disciplina, tecnologias mais avançadas eu ainda não sei usar.

Agradeço desde já pra quem ajudar :]

1 curtida

Oi Diogo,

Vc sabe quanto tempo faz que não é recomendado fazer o que você está fazendo? Criar o código de páginas dentro de um Servlet?
Enfim, talvez seja a forma que o professor tenha ensinado, mas te aconselho a dar uma estudada melhor na tecnologia depois de terminar seu trabalho.

Quando ao doGet, doPost, etc, vc precisa configurar seu formulário para o método ser o mesmo que está implementado no servlet. O seu formulário que manda a requisição está com o método como get ou post? Provavelmente deve estar como post.

Outra dica. No servlet, crie sempre um método para tratar todos os tipos de requisições, ai vc chama ele a partir da implementação dos métodos http. Algo assim:

[code]@Override
private void processRequest(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// aqui vem seu código…
}

// independente do métopdo http, o processRequest é chamado.
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req, resp);
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
processRequest(req, resp);
}[/code]
[]´s

1 curtida

Olá David,

Primeiramente, obrigado pelas dicas. Como você mesmo falou, o professor só ensinou dessa maneira até agora, posteriormente a gente deve fazer de outra forma. Quanto ao meu projeto: Até então no meu projeto só tenho um formulário que envia os dados para a classe Login por método POST, essa classe verifica se o usuário existe no banco e redireciona ou para a página inicial da rede ou de volta para o login. Quando ele está redirecionando para a página inicial, ele aponta o erro do método GET.

Tentei fazer do mesmo jeito que você postou ai e ele ainda continua a apontar que a classe Main não implementa GET.
Não tenho nem idéia do que fazer agora :frowning:

Como ficou:

[code]public class Main extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    HttpSession ss = request.getSession();
    Usuario us = (Usuario) ss.getAttribute("usuario");
    PrintWriter out = response.getWriter();
    StringBuffer sb = new StringBuffer();

    sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
    sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
    sb.append("<head>");
    sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
    sb.append("<title>Dood - Perfil de ").append(us.getNick()).append("</title>");
    sb.append("<link href=\"STYLES/main.css\" rel=\"stylesheet\" type=\"text/css\" media=\"screen\"/>");
    sb.append("</head>");
    sb.append("<body>");
    out.print(sb.toString());
    request.getRequestDispatcher("navbar.sw").include(request, response);
    out.println("</body></html>");
} 

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

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    processRequest(request, response);
}[/code]
1 curtida

Oi Diogo,

Vc pode passar o código do seu formulário e como seu Servle está mapeado no web.xml?

[]´s

Formulário

<form id="form1" method="post" action="login.do"> <p> login: <input name="login" type="text" id="login" size="20" /> <br /> senha: <input name="senha" type="password" id="senha" size="20" /> <input type="submit" name="enviar" id="enviar" value="entrar" /> </p> </form>
Arquivo web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>Profile</servlet-name> <servlet-class>business.Profile</servlet-class> </servlet> <servlet> <servlet-name>Login</servlet-name> <servlet-class>business.Login</servlet-class> </servlet> <servlet> <servlet-name>NavBar</servlet-name> <servlet-class>business.NavBar</servlet-class> </servlet> <servlet> <servlet-name>Main</servlet-name> <servlet-class>business.Main</servlet-class> </servlet> <servlet-mapping> <servlet-name>Profile</servlet-name> <url-pattern>/profile.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/login.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>NavBar</servlet-name> <url-pattern>/navbar.sw</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Main</servlet-name> <url-pattern>/main.do</url-pattern> </servlet-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

Descobri o problema, ele acusava erro no “navbar.sw” que eu estava incluindo em Main. Ele não implementava doGet().
Erro besta de iniciante mesmo. De qualquer maneira, muito obrigado pela ajuda =)

1 curtida

[quote=diogozero]Descobri o problema, ele acusava erro no “navbar.sw” que eu estava incluindo em Main. Ele não implementava doGet().
Erro besta de iniciante mesmo. De qualquer maneira, muito obrigado pela ajuda =)[/quote]

Beleza Diogo :wink:

[]´s