1
resposta

Aplicação no Google Cloud não direciona para outra página

Pessoal, boa noite.

Testando minha aplicação localmente, funciona sem problema. Porém, quando faço o deploy para o Google Cloud App Engine, a pagina inicial (index.jsp) abre normalmente, porem quando redireciono para outra pagina, a pagina não é encontrada.

Por exemplo, se estou na pagina inicial e clico para listar cliente, a aplicação deve:

1 - Direcionar para a servlet /executar -> Controller.java

2 - Chamar o metodo executar do ListaCliente.java

3 - Direcionar paga a pagina listaCliente.jsp

Porém, apresenta o erro abaixo:

Error: Not Found The requested URL /executar was not found on this server.

Alguem poderia ajudar? Essa estrutura do Controller.java utilizei do curso de Servlet do Alura

Segue abaixo código:

INDEX.JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<body>


<form action="executar" method="POST">
    <input type="hidden" name="tarefa" value="ListaCliente">
    <input type="submit" value="Listar Clientes">
</form>

<form action="executar" method="POST">
    <input type="hidden" name="tarefa" value="InsereCliente">
    <input type="submit" value="Inserir Clientes">
</form>

<!-- <img src="imagens/cliente.png"/>  -->

</body>
</html>

Controller.java

package br.com.bariotti.cadastroclienteweb.web;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.bariotti.cadastroclienteweb.interfaces.Tarefa;

@WebServlet(urlPatterns = "/executar")
public class Controller extends HttpServlet{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

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

        String tarefa = req.getParameter("tarefa");

        if(tarefa == null) throw new IllegalArgumentException("Voce esqueceu de passar a tarefa");

        tarefa = "br.com.bariotti.cadastroclienteweb.web." + tarefa;

        try 
        {
            Class<?> tipo = Class.forName(tarefa);
            Tarefa instancia = (Tarefa) tipo.newInstance();
            String pagina = instancia.executa(req, resp);
            RequestDispatcher dispatcher = req.getRequestDispatcher(pagina);
            dispatcher.forward(req, resp);
        } 
        catch (Exception ex) 
        {
            throw new ServletException(ex);
        }
    }

}

ListaCliente.java

package br.com.bariotti.cadastroclienteweb.web;

import java.util.Collection;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.bariotti.cadastroclienteweb.controller.ClienteController;
import br.com.bariotti.cadastroclienteweb.interfaces.Tarefa;
import br.com.bariotti.cadastroclienteweb.model.Cliente;

public class ListaCliente implements Tarefa {

    public String executa(HttpServletRequest req, HttpServletResponse resp) throws Exception  {

        Collection<Cliente> clientes = ClienteController.retornarCliente();

        req.setAttribute("clientes", clientes);

        return "/WEB-INF/listarCliente.jsp";
    }
}

listarCliente.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<body>

    <h2>Resultado da busca:</h2>
    <br>
    <br>


    <table border="2" cellpadding="10" bordercolor="blue">
        <tr>
            <td>Id</td>
            <td>Nome</td>
            <td>Documento</td>
            <td>Tipo</td>
            <td>Avatar</td>
            <td>EXCLUIR</td>
            <td>ALTERAR</td>
        </tr>
        <c:forEach var="c" items="${clientes}">
            <form action="executar" method="POST">
            <!-- <input type="hidden" name="tarefa" value="ExcluiCliente">  -->
            <input type="hidden" name="id" value="${c.id}">
            <input type="hidden" name="nome" value="${c.nome}">
            <input type="hidden" name="documento" value="${c.documento}">
            <input type="hidden" name="tipo" value="${c.tipoCliente}">
            <input type="hidden" name="tipo" value="${c.imagem}">
                <tr>
                    <td><c:out value="${c.id}" /></td>
                    <td><c:out value="${c.nome}" /></td>
                    <td><c:out value="${c.documento}" /></td>
                    <td><c:out value="${c.tipoCliente}" /></td>
                    <td><img width="80px" height="80px" src="${c.mediaLink}"></td>    
                    <td><input type="submit" name="tarefa" value="ExcluiCliente"></td>
                    <td><input type="submit" name="tarefa" value="PreAlteraCliente"></td>
                </tr>
            </form>
        </c:forEach>
    </table>


    <br><br>
    <c:url value="/index.jsp" var="urlIndex"/>
    <a href="${urlIndex}">Voltar a pagina principal</a>

</body>
</html>
1 resposta

Oi Bruno,

O problema foi porque o Google App Engine não encontrou a sua servlet.

Se não me engano ele não funciona com a anotação @WebServlet. Você precisa então mapear as suas servlets do jeito antigo, via arquivo web.xml.

Adicione no arquivo web.xml do projeto o mapeamento da sua servlet:

<servlet>
    <servlet-name>Controller</servlet-name>
    <servlet-class>br.com.bariotti.cadastroclienteweb.web.Controller</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/executar</url-pattern>
</servlet-mapping>

Veja se resolve o problema.