1
resposta

Uso do mapeamento "/" com parâmetro

Olá Pessoal, Boa Noite !

Como ficaria com essa forma de mapeamento e trabalhando com parâmetros? Pois ai não poderíamos usar "uri&parametro=valor" pois o método getRequestURI() vai entender que tudo isso é uma URL e não vai encontrar...

Fico no aguardo... Obrigado !

1 resposta

Oie José, tudo bem contigo?

Perdão pela demora!

Essa solução que vou mostrar abaixo deve ser feita com o projeto desse curso finalizado.

Para isso ser implementado algumas mudanças teriam que ser feitas, principalmente nos "redirects" de cada classe do pacote "acao" e das jsps.

Inicialmente devemos alterar o "web.xml":

<filter-mapping>
    <filter-name>MF</filter-name>
    <url-pattern>/*</url-pattern>    // de /entrada para /*
  </filter-mapping>
  <filter>
    <filter-name>AF</filter-name>
    <filter-class>br.com.alura.gerenciador.servlet.AutorizacaoFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AF</filter-name>
    <url-pattern>/*</url-pattern> // de /entrada para /*
  </filter-mapping>
  <filter>
    <filter-name>CF</filter-name>
    <filter-class>br.com.alura.gerenciador.servlet.ControladorFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CF</filter-name>
    <url-pattern>/*</url-pattern>  // de /entrada para /*
  </filter-mapping>

Agora devemos fazer mudanças nos "filters":

AutorizacaoFilter:

//@WebFilter("/entrada")
public class AutorizacaoFilter implements Filter {


    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        System.out.println("AutorizacaoFilter");

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String url = request.getRequestURI();    // essa linha devolve por exemplo: "gerenciador/ListaEmpresas"
        String [] array = url.split("/");    // devemos pegar somente o que vem como "parametro" , ou seja, "ListaEmpresas" e para isso fazemos o split, que vai fragmentar essa string em uma array

        String paramAcao = array [2];    // aqui iremos pegar a posição 2 da array, ou seja, "ListaEmpresas" e iremos salver dentro de paramAcao


        System.out.println(paramAcao);

        //alterações sendo feitas

        HttpSession sessao = request.getSession();
        boolean usuarioNaoEstaLogado = (sessao.getAttribute("usuarioLogado") == null);
        boolean ehUmaAcaoProtegida = !(paramAcao.equals("Login") || paramAcao.equals("LoginForm"));

        if(ehUmaAcaoProtegida && usuarioNaoEstaLogado) {
//            response.sendRedirect("entrada?acao=LoginForm");
        response.sendRedirect("LoginForm");   // aqui deve ser alterado para apenas "LoginForm"
            return;
        }
        chain.doFilter(request, response);
    }
}

ControladorFilter:

public class ControladorFilter implements Filter {


    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        System.out.println("ControladorFilter");

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        // aqui fazemos igual ao "AutorizacaoFilter":
        String url = request.getRequestURI();  
        String [] array = url.split("/");   

        String paramAcao = array [2];

        System.out.println(paramAcao);

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

        String nome;
        try {
            Class classe = Class.forName(nomeDaClasse);
            Acao acao = (Acao) classe.newInstance();        
            nome = acao.executa(request,response);
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ServletException | IOException 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]);  // aqui tiramos a parte "entrada?acao=" e deixams apenas "tipoEEndereco[1]"
        }
    }
}

Fazendo essas mudanças acima apartir da url "http://localhost:8080/gerenciadorr/LoginForm" você já conseguirá chegar na página de login da aplicação. Entretanto, agora você terá que atualizar cada umas das JSPs e classes do pacote "acao" para fazer o redirecionamento correto.

Por exemplo na JSP "formLogin":

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:url value="/Login" var="linkServletNovaEmpresa" />     // o value deve ser "Login"
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <form action="${linkServletNovaEmpresa}" method="post">
        Login: <input type="text" name="login" /> Senha: <input
            type="password" name="senha"> <input type="submit" /> 
                // tirar o input que ficava aqui no final
    </form>
</body>
</html>

Fazendo essa mudança acima, após o login você já é redirecionado para a "ListaEmpresas" sem nenhum problema.

Espero que eu tenha ajudado!

Se tiver qualquer problema estarei por aqui :)

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