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

Servlet parte 2: Autenticação, autorização e o padrão MVC - Aula 13

Olá, Nico.

Esse servlet abaixo seria considerado uma gambiara no mundo Java ???

package br.com.alura.servlets;

import java.io.IOException;

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.models.empresas.Database;
import br.com.alura.models.empresas.Empresa;

/**
 * Servlet implementation class Empresa
 */
@WebServlet({ "/empresa", "/empresa/form", "/empresa/remove" })
public class EmpresaServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

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

        //ServletContext context = request.getServletContext();
        //System.out.println(context.getContextPath());
        //System.out.println(context.getRealPath(context.getContextPath()));

        // /alura/empresa/form
        System.out.println(request.getRequestURI());
        // /alura
        System.out.println(request.getContextPath());

        ///empresa/form
        System.out.println(request.getRequestURI().substring(request.getContextPath().length()));

        switch(request.getRequestURI().substring(request.getContextPath().length())){

            case "/empresa/form":
                this.form(request, response);
                break;

            case "/empresa/remove":
                this.remove(request, response);
                break;

            default:
                this.index(request, response);
        }
    }

    /**
     * 
     * crud: create, read, update
     */
    protected void form(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Empresa empresa;

        // Se possui id por GET é um READ ou por POST é um UPDATE
        if(request.getParameterMap().containsKey("id")){

            empresa = Database.findOrNew((String)request.getParameter("id"));
        }
        // Senão possui id por GET é um NEW ou por POST é um CREATE
        else {

            empresa = Empresa.newInstance();
        }

        // create, update
        if(request.getMethod().equals("POST")){

            // Popula os dados na model
            empresa.setName(request.getParameter("name"));        
            empresa.setCreateAt(br.com.alura.utils.Date.encode(request.getParameter("createAt")));

            // Abre a transação
            Database db = new Database();
            db.beginTransation();

            try {

                db.save(empresa);
                db.commit();

                //request.setAttribute("message", String.format("Empresa %s salva com sucesso", request.getParameter("name")));
                // todo: mudar para sessão, quando for ensinada :(

                response.sendRedirect("/alura/empresa");
                return;// interrope o método para não gererar erro com o forward
            } 
            catch(Exception e) {

                db.rollBack();
                request.setAttribute("message", e.getMessage());
                request.setAttribute("empresa", empresa);
            }
        }
        // GET - new, read
        else {

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

        request.getRequestDispatcher("/empresa/form.jsp").forward(request, response);
    }

    /**
     * 
     * crud: remove
     */
    protected void remove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        if(!request.getParameterMap().containsKey("id")){            
            throw new ServletException("Nenhuma id foi especificada");
        }

        Integer id = Integer.valueOf(request.getParameter("id"));

        try {

            Database.newInstance().remove(id);
            request.setAttribute("message", String.format("Empresa %s foi removida com sucesso", id));
        }
        catch(Exception e) {
            request.setAttribute("message", "Falhou");
        }

        response.sendRedirect("/alura/empresa");
    }

    /**
     * 
     * crud: read
     */
    protected void index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Database db = new Database();

        request.setAttribute("rows", db.getAll());

        request.getRequestDispatcher("/empresa/list.jsp").forward(request, response);
    }
}

At Michael.

2 respostas
solução!

Oi Michael, tudo bem?

Eu diria que não segue boas práticas nem os padrões do mercado :)

abs, Nico

Boa noite. Não precisa ser polido, pode falar: "Gambiara".

Mas essa é a mestra de todas as gambiaras:

br.com.alura.filters.AuthFilter

@WebFilter({ "/empresa/*" })
public class AuthFilter implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;

        String route = httpRequest.getRequestURI()
            .substring(httpRequest.getContextPath().length())// retira somente /empresa em diante
            .replaceFirst("/", "");// remove a barra inicial

        String action;

        // Sem sesão somente pode acessar a action login ( GET e POST )
        if(httpRequest.getSession().getAttribute("user") == null){
            action = "login";
        }
        // Possui sessão
        else {

            // controler/action/id
            String[] arr = route.split("/");
            // primeira posição é a controller /empresa
            action = (arr.length >= 2) ? arr[1] : "index";// possui a segunda posição
            //Integer id = (arr.length == 3) ? Integer.valueOf(arr[2]) : 0; // Posui a terceira posição
        }

        httpRequest.setAttribute("action", action);

        chain.doFilter(request, response);
    }
}

br.com.alura.servlets.EmpresaServlet

@WebServlet({ "/empresa", "/empresa/form", "/empresa/remove", "/empresa/login", "/empresa/logout" })
public class EmpresaServlet extends HttpServlet {

    private static final long serialVersionUID = 3L;

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

        // /alura/empresa/form
        request.setAttribute("url", request.getRequestURI());

        String action = (String)request.getAttribute("action");

        if(action.isEmpty()){
            throw new ServletException("Action not found at servelet /empresa");
        }


        try {
            this.getClass()
                .getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class)
                    .invoke(this, request, response);
        } 
        catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
            e.printStackTrace();
        }
    }
}

Interessante é o WebFilter aceita algumas expressões como *, porém o WebServlet não.. Que pena.

Pensando melhor, se mudar o filter para /* usando esse parse acima da URI posso rotear para o servlet que eu quiser sem precisar declarar mais nenhuma rota, criando uma gambiara maior ainda. :)

Valeu!