Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Instrução desnecessária?

Me parece que a solução do professor para a classe NovaEmpresa mantém a inclusão no "request" de um atributo "empresa" com o nome da empresa que não mais é necessário, uma vez que o retorno do método "executa()" não mais orienta para um "despacho" e sim para um "redirect" sem parâmetros. Também funciona, mas testei sem este "setAttribute" e deu certo.

public class NovaEmpresa {

public String executa(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("Cadastrando nova empresa");

    String nomeEmpresa = request.getParameter("nome");
    String paramDataEmpresa = request.getParameter("data");

    Date dataAbertura = null;
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        dataAbertura = sdf.parse(paramDataEmpresa);
    } catch (ParseException e) {
        throw new ServletException(e);
    }

    Empresa empresa = new Empresa();
    empresa.setNome(nomeEmpresa);
    empresa.setDataAbertura(dataAbertura);

    Banco banco = new Banco();
    banco.adiciona(empresa);

    request.setAttribute("empresa", empresa.getNome());

    return "redirect:entrada?acao=ListaEmpresas";
} 

}

1 resposta
solução!

Oie Sergio, tudo bem com você?

Na verdade o "request.setAttribute()" não funciona com o "redirect" apenas porque o "redirect" faz uso de duas requisições enquanto o "request.setAttribute()" sobrevive apenas à 1 requisição.

Observe o fluxo abaixo:

  1. Navegador faz requisição para servidor.
  2. Servidor devolve requisição para navegador com um atributo "pendurado" usando o redirect.
  3. Requisição é "destruída" em conjunto com o atributo.
  4. É criado uma nova requisição direcionando para o caminho indicado pelo redirect vindo da requisição que foi "destruída".

Nesse seu caso o código funcionou porque a "listaEmpresas.jsp" não precisa do atributo "empresa" para listar as "empresas" que estão no sistema. Por outro lado, não sei se você se recorda mas no primeiro curso de servlets na aula 06: "Redirecionando o fluxo", no segundo vídeo "Redirecionando pelo Navegador", o arquivo "listaEmpresas.jsp", além de listar as "empresas" ele também continha uma mensagem de informando que a empresa tinha sido cadastrada com sucesso, essa mensagem parou de aparecer quando foi trocado o método de "forward" para "redirect", confirmando aquele negócio de que o "request.setAttribute()" não sobrevive a mais de uma requisição.

Mais para frente nesse curso você verá, isso se não já tiver visto, uma forma de pendurar "atributos" de uma maneira que eles durem mais de uma requisição.

Espero que eu tenha ajudado, qualquer dúvida ou problema fico a disposição :)

Bons estudos!