Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Não consigo migrar o busca empresa

Ao testar, com a seguinte uri: http://localhost:8080/servlet/fazTudo?tarefa=BuscaEmpresa, é exibida a seguinte mensagem de erro:

HTTP Status 500 - org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: Property 'id' not found on type java.util.HashMap$Values

Segue abaixo as classes:

public class BuscaEmpresa implements Tarefa {

public BuscaEmpresa(){ System.out.println("Instanciando uma Servlet do tipo BuscaEmpresa " + this); }

@Override public String executa(HttpServletRequest req, HttpServletResponse response) {

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

Collection empresas = new EmpresaDAO().buscaPorSimilaridade(filtro);

req.setAttribute("empresas", empresas);

return "/WEB-INF/paginas/buscaEmpresa.jsp"; }

}

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

Resultado da busca:
  • ${empresas.id}: ${empresas.nome}
11 respostas

Boa noite, Daniella! Como vai?

Como está dizendo o erro, a propriedade id não está sendo encontrada no tipo java.util.HashMap$Values.

Repare que empresas é uma collection, sendo assim, para listar as empresas vc precisará iterar pela sua coleção, para aí sim, exibir o id e o nome de cada uma delas.

Boa noite Gabriel, tudo bem e vc?

Então o erro está na classe buscaEmpresa.jsp?

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

Resultado da busca:

  • ${empresas.id}: ${empresas.nome}

Pelo trecho de código que vc postou, sim.

Vc está utilizando uma taglib com prefixo "c". Com ela vc pode fazer um for, dessa forma (supondo que a coleção de empresas esteja chegando de forma correta na sua JSP):

<c:forEach var="empresa" items="${empresas}"> ${empresa.id}: ${empresa.nome} </c:forEach>

Troquei de: ${empresas.id}: ${empresas.nome} Para: ${empresa.id}: ${empresa.nome}

E ao executar apresenta o seguinte erro:

HTTP Status 500 - java.lang.ClassNotFoundException: br.com.alura.gerenciador.web.buscaEmpresa

type Exception report

message java.lang.ClassNotFoundException: br.com.alura.gerenciador.web.buscaEmpresa

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.ClassNotFoundException: br.com.alura.gerenciador.web.buscaEmpresa br.com.alura.gerenciador.web.Controller.service(Controller.java:33) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) br.com.alura.gerenciador.web.FiltroDeAuditoria.doFilter(FiltroDeAuditoria.java:53)

root cause

java.lang.ClassNotFoundException: br.com.alura.gerenciador.web.buscaEmpresa org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1891) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1734) java.lang.Class.forName0(Native Method) java.lang.Class.forName(Unknown Source) br.com.alura.gerenciador.web.Controller.service(Controller.java:25) javax.servlet.http.HttpServlet.service(HttpServlet.java:731) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) br.com.alura.gerenciador.web.FiltroDeAuditoria.doFilter(FiltroDeAuditoria.java:53)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.70 logs.

Oi Daniela!

O problema agora é ClassNotFoundException: br.com.alura.gerenciador.web.buscaEmpresa, ou seja, em algum lugar vc está fazendo referência a essa classe e ela não está sendo encontrada.

Vc poderia postar o código completo da classe BuscaEmpresa e da página buscaEmpresa.jsp?

Dica: ao postar um código, use a formatação para códigos para que a visualização possa ser melhor!

Boa noite Gabriel.

Segue o código, e desculpa pela formatação, nunca tinha utilizado o botão {} inserir código.

Obrigado desde já.

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

<html>
<head>
<meta charset="UTF-8">
</head>
<body>
    Resultado da busca:
    <ul>
        <c:forEach var="empresa" items="${empresas}">
            <li>${empresa.id}: ${empresa.nome}</li>
        </c:forEach>
    </ul>
</body>
</html>
public class BuscaEmpresa implements Tarefa {

    public BuscaEmpresa(){
        System.out.println("Instanciando uma Servlet do tipo BuscaEmpresa " + this);    
    }

    @Override
    public String executa(HttpServletRequest req, HttpServletResponse response) {

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

        Collection<Empresa> empresas = new EmpresaDAO().buscaPorSimilaridade(filtro);

        req.setAttribute("empresas", empresas);

        return "/WEB-INF/paginas/buscaEmpresa.jsp";
    }

}

Quanto ao botão de inserir código, relaxa! Sempre há uma primeira vez!

Em relação ao seu código, aparentemente está tudo correto! Eu devia ter pedido pra vc postar tbm a classe FazTudo, mas esqueci...

De qualquer forma, verifique se a url que vc está acessando é essa:

http://localhost:8080/gerenciador/fazTudo?tarefa=BuscaEmpresa

É importante que o "B" de BuscaEmpresa seja maiúsculo e o erro que vc descreveu diz exatamente que não está encontrando uma buscaEmpresa, com "b" minúsculo.

Verifique essa questão da url e, caso o erro se mantenha, dê um feedback trazendo o erro e a classe BuscaEmpresa.

Busquei com a seguinte URI: http://localhost:8080/servlet/Controller?tarefa=BuscaEmpresa

Apresentou o seguinte erro:

HTTP Status 404 - /servlet/Controller

type Status report

message /servlet/Controller

description The requested resource is not available.

Segue a classe "fazTudo", renomeada para "Controller":

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

    // Método sevice pegará todas as requisições
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String tarefa = req.getParameter("tarefa"); // ler o parâmetro em uma
                                                    // variável

        if (tarefa == null)
            throw new IllegalArgumentException("Você esqueceu de passar a tarefa");
        try {
            String nomeDaClasse = "br.com.alura.gerenciador.web." + tarefa;
            Class type = Class.forName(nomeDaClasse); // Localizar a classe
            Tarefa instancia = (Tarefa) type.newInstance(); // Instanciar a
                                                            // tarefa
            String pagina = instancia.executa(req, resp);

            RequestDispatcher requestDispatcher = req.getRequestDispatcher(pagina);
            requestDispatcher.forward(req, resp);
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

}
solução!

Boa noite, Daniella! Como vai?

Perdão pela demora! Os últimos dias foram bastante corridos e não pude responder.

Mas, vamos lá!

A mensagem de erro está informando que não conseguiu encontrar o recurso servlet/Controller. Isso está acontecendo pq a URL deve ser escrita seguindo este padrão:

http://localhost:8080/nome_do_projeto/servlet-urlPattern

Como a URL que vc tentou acessar é http://localhost:8080/servlet/Controller?tarefa=BuscaEmpresa, isso indica que o nome do seu projeto é "servlet" e que vc está tentando acessar a servlet mapeada para "/Controller". Mas, repare que a sua servlet chamada de Controller está mapeada para "/executa", ou seja, se todo o restante do código estiver correto, acessando a URL a seguir deve funcionar! Teste e me diz o resultado!

URL correta: http://localhost:8080/servlet/executa?tarefa=BuscaEmpresa

Boa tarde Gabriel, imagina,

Consegui obrigada pela sua ajuda!

Por nada, Daniella!

Sempre que tiver alguma dúvida, fique a vontade de postar aqui no fórum!

Bons estudos!