Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Servlet Parte 2 Controller

Boa noite! Acompanhando o curso de Servlet Criei um controller que recebe todas as requisições, porém me surgiu uma dúvida agora, tenho uma lista de empresas no JSP e ao lado de cada empresa um link para editar a empresa, até ai tudo bem! Porém ao clicar no link são enviados para o controller dois parâmetros, a ação que vai instanciar a classe e o ID para buscar essa empresa, mas analisando o código do controller não entendo como ele consegue repassar o ID já que ele só dura durante uma requisição. E também o controller não recebe e nem repassa esse ID em nenhum momento. Alguém pode me elucidar?

@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");

        HttpSession sessao = request.getSession();
        boolean usuarioNaoLogado = (sessao.getAttribute("usuarioLogado") == null);
        boolean ehUmaAcaoProtegida = !(paramAcao.equals("Login")|| paramAcao.equals("LoginForm"));
        if (ehUmaAcaoProtegida && usuarioNaoLogado) {
            response.sendRedirect("entrada?acao=LoginForm");
            return;
        }


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

            Class classe = Class.forName(nomeDaClasse);
            Acao acao = (Acao) classe.newInstance();
            nome = acao.executa(request, response);

        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
            throw new ServletException(e);
        }

        String[] tipoEndereco = nome.split(":");
        if (tipoEndereco[0].equals("forward")) {
            RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/view/" + tipoEndereco[1]);
            rd.forward(request, response);
        } else {
            response.sendRedirect(tipoEndereco[1]);
        }
    }
}
<%@page import="br.com.alura.gerenciador.modelo.Empresa"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

    Usuário Logado: ${usuarioLogado.login }

<br>
<br>
<br>

    <c:if test="${not empty empresaNome }">
        Empresa ${empresaNome } cadastrada com sucesso!
    </c:if>


    <br> Lista de Empresas:
    <br />

    <ul>
        <c:forEach items="${listaEmpresa }" var="empresa">

            <li>${empresa.nome }-<fmt:formatDate
                    value="${empresa.dataAbertura }" pattern="dd/MM/yyyy" /> <a
                href="<c:url value="/entrada?acao=MostraEmpresas&id=${empresa.id }" />">Editar</a>
                <a
                href='<c:url value="/entrada?acao=RemoveEmpresa&id=${empresa.id }" />'>Remover</a>
            </li>

        </c:forEach>

    </ul>



</body>
</html>
package br.com.alura.gerenciador.acao;

import java.io.IOException;

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

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

public class MostraEmpresas implements Acao {

    public String executa(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String paramId = request.getParameter("id");
        Integer id = Integer.valueOf(paramId);

        Banco banco = new Banco();
        Empresa empresa = banco.buscaEmpresaid(id);
        System.out.println(empresa.getNome());

        request.setAttribute("empresa", empresa);

        return "forward:formAlteraEmpresa.jsp";
    }

}
2 respostas
solução

Boa Noite Henry, Quando você faz uma requisição para a rota "/entrada", você recebe o objeto request, que tem os parâmetros como a acao e o Id. A acao é "convertida" na classe que será chamada e assim sendo chamado o método executa, como vemos abaixo:

nome = acao.executa(request, response);

perceba que ao chamar o metodo executa é passado como parametro o objeto request e o response, que é o mesmo que recebemos pela rota, então nele ainda temos os parâmetros acao , id e os outros atributos que normalmente uma request tem.

Além disso, entenda que as chamada de métodos entre classes dentro do seu projeto, não são consideradas requisições. Normalmente a requisição é o processo do lado do cliente (Client side) "chamando" o lado do Servidor (Server side).

Espero ter esclarecido suas duvidas.

Muito Obrigado Willian e desculpe a demora em responder!