Solucionado (ver solução)
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!