Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Redirecionamento no client e server side

Queria saber o por que de quando eu acesso a URL aparece o conteúdo do /WEB-INF/paginas/login.html porém o código que coloquei depois que seria o writer.println("

Testando fora do HTML"); não aparece. OBS: Apenas para conhecimento!!!
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        String email = req.getParameter("email");
        String senha = req.getParameter("senha");

        Usuario usuario = new UsuarioDAO().buscaPorEmailESenha(email, senha);

        PrintWriter writer = resp.getWriter();

        if (usuario == null) {
            writer.println("<html><body>Usuario inválido</body></html>");
        } else {
            HttpSession session = req.getSession();
            session.setAttribute("usuario.logado", usuario);
            RequestDispatcher dispatcher = req
                    .getRequestDispatcher("/WEB-INF/paginas/login.html");

            writer.println("<html><body>Testando fora do HTML</body></html>");
            dispatcher.forward(req, resp);

        }

    }
}
2 respostas
solução!

Olá, Carlos!

Ótimo teste que você fez! Parabéns! É assim que aprofundamos nas tecnologias.

No seu código, você fez um writer.println() antes de dar um dispatcher.forward().

Portanto, se fosse mostrada, a mensagem Testando fora do HTML viria antes do conteúdo do HTML.

O método request.getRequestDispatcher() apenas registra o "despachante". O que mandar seguir em frente é o forward.


Se olharmos no Javadoc do método forward do RequestDispatcher, veremos a seguinte explicação:

forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException. Uncommitted output in the response buffer is automatically cleared before the forward.

Há o conceito de commited output, que acontece quando invocamos o writer.flush(). O texto, nesse momento, é realmente enviado para o navegador. Nada pode ser escrito depois disso. Se escrever, dá erro!

Então, se você tentar fazer:

writer.println("<html><body>Testando fora do HTML</body></html>");
writer.flush();
dispatcher.forward(req, resp);

ocorreria um IllegalStateException.


Mas você não fez um flush, não é mesmo?

Se você não fez o flush, a saída não está commited.

E a documentação diz que qualquer saída uncommited antes do forward vai ser limpa.

Como limpou, você não viu o texto Testando fora do HTML.

Incrivel! Muito obrigado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software