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

Dúvidas sobre request

Não ficou muito claro em que momento é criado um novo request, para maior entendimento da minha dúvida, observe o fluxo abaixo

Controlador<<<<<

package br.com.alura.gerenciador.servlet;

import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

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.alura.gerenciador.acao.Acao;


@WebServlet("/entrada")
public class UnicaEntradaServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String paramAcao = request.getParameter("acao");

        String nomeDaClasse = "br.com.alura.gerenciador.acao." + paramAcao;

        String nome;
        try {
            Class classe = Class.forName(nomeDaClasse);//carrega a classe com o nome 
            Constructor<?> construtorPadrao = classe.getConstructor();
            Object acao =construtorPadrao.newInstance();
            nome = ((Acao) acao).executa(request,response);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
            throw new ServletException(e);
        }

        String[] tipoEEndereco = nome.split(":");
        if(tipoEEndereco[0].equals("forward")) {
            RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/" + tipoEEndereco[1]);
            rd.forward(request, response);
        } else {
            response.sendRedirect(tipoEEndereco[1]);
        }


    }

}

1- Acessamos : http://localhost:8080/gerenciador/entrada?acao=loginForm , e preenchemos os dados

package br.com.alura.gerenciador.acao;

import java.io.IOException;

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

public class loginForm implements Acao {

@Override
public String executa(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    // TODO Auto-generated method stub
    return "forward:formLogin.jsp";
}

} 2-depois através do nosso controlador , somos redirecionados para o formlogin.jsp:

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

<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

    <form action="${linkEntradaServlet }" method="post">

        login: <input type="text" name="login"  />
        senha: <input type="password" name="senha"  />

        <input type="hidden" name="acao" value="Login">

        <input type="submit" />
    </form>

</body>
</html>

3- depois digitamos usuário e senha, voltamos para nosso controlador e somos direcionados para classe login: package br.com.alura.gerenciador.acao;

import java.io.IOException; import java.util.Optional;

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

import br.com.alura.gerenciador.modelo.Banco; import br.com.alura.gerenciador.modelo.Usuario;

public class Login implements Acao{

@Override
public String executa(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String login = request.getParameter("Login");
    String senha = request.getParameter("senha");

    System.out.println("Logando " + login);


    Banco banco = new Banco();
     Usuario usuario = banco.existeUsuario(login,senha);

    if(usuario !=null) {
        System.out.println("Usuario existe");
        HttpSession sessao = request.getSession();
        sessao.setAttribute("usuarioLogado", usuario);
        request.setAttribute("usuarioLogado", usuario);
    }


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

}

Eu não entendi por que o meu request.setAtribute é perdido quando sou redirecionado para ListaEmpresas , como solução vinculamos o atributo a session. Não ficou muito claro em que momento novas "requests" estão sendo criadas, alguem consegue mapear, pra mim nos passos que citei?

1 resposta
solução!

Olá, Ney! Como vai? Vou tentar te ajudar.

É uma questão de comportamento.

O "atributo do request" tem curta duração, vive entre a solicitação do navegador e a resposta da ação em questão (Login, ListaEmpresa, outra ação). Ou seja, você não vai conseguir reutilizar e será obrigado a gerar novamente para cada ação.

O "atributo da sessão http" dura até o limite de tempo da sessão (definido no servidor/Tomcat) e é associado a uma "identificação", um código único gerado para o servidor identificar aquele navegador. Neste caso, enquanto a sessão estiver ativa, poderá reutilizá-la no mesmo navegador. Por exemplo, também pode ser utilizado para guardar informações de carrinhos de compras em um determinado site de e-commerce, entre outras coisas relacionadas ao "usuário".

Assista novamente o vídeo presente no tópico "04. HttpSession", item "02 Trabalhando com sessão", entre os minutos 04m50 e 13m30. O professor explica com detalhe e mostra no navegador. É possível observar o mesmo código de sessão (JSESSIONID) para as ações listaEmpresas e RemoveEmpresas que foram implementadas no exercício.