Monday, March 30, 2015

Spark: Java Web com MongoDB a partir do método main

O Spark é um micro-container para aplicações Web em Java. Baseado no Sinatra, um ambiente para execução de aplicações Web em Ruby, trata-se de uma tecnologia leve e compacta. O projeto, até o momento, não é apadrinhado por nenhum player (empresa / fundação). A última versão emprega componentes e usa o modelo de programação do Java 8, tornando o código mais limpo e direto.

Trata-se de uma alternativa bem interessante para executar projetos, sem nenhuma burocracia, com foco apenas no código das funcionalidades. O trecho de código a seguir foi extraído do site do projeto, o tradicional HelloWorld, na versão Spark. Parecido com uma aplicação Java pura, o ponto de entrada é o método main. Nele usamos o método get do Spark para definir o fluxo de processamento para uma determinada URL:
import static spark.Spark.get;

public class HelloWorld {
    
    public static void main(String[] args) {
        get("/", (request, response) -> "Bem-vindo ao Spark!");
    }
    
}

Uma vez que a aplicação é executada e a URL http://localhost:4567/ acionada, o código dentro do método main é processado e o texto Bem-vindo ao Spark! apresentado pelo navegador. O Spark usa a porta 4567 por default.

Além do método get, na classe spark.Spark existem diversos métodos para semantica HTTP, como por exemplo: post, put, delete. A estrutura é bem simples, esses métodos possuem uma versão recebendo os argumentos:
  • String path: indica a URL que quando acionada executa o fluxo de código;
  • Route route: uma SAM (Lambda Java 8) que define o método handle responsável pelo fluxo de execução, com os argumentos request e response, retornando Object
Com o Maven, o setup do Spark é trivial. Basta definir a dependência para o JAR spark-core, de 89Kb.

Tenho usado o Spark a algum tempo, para implementar projetos pontuais. Vou destacar um projeto, baseado nas demonstrações da YaW, aonde demonstro como utilizar o MongoDB em uma aplicação Java Web. O projeto foi compartilhado e está disponível no meu Github. Outro detalhe sobre esse projeto é que o front-end foi desenvolvido com a tecnologia Freemaker, um template engine responsável por gerar HTML a partir de templates.

A seguir o trecho da classe MercadoriaController, responsável por carregar a lista de mercadorias:
    ...
    get("/", (request, response) -> {
        List mercadorias = mercadoriaDao.getAll();
        
        SimpleHash root = new SimpleHash();
        root.put("activeLista", true);
        root.put("mercadorias", mercadorias);
        
        if (request.params(":error") != null) {
            root.put("error", request.params("error"));
        }
            
        return new ModelAndView(root, "lista_template.ftl");
    }, new CustomFreeMarkerEngine());
    ...

Além de usar os componentes de acesso, o método get faz uso de FreeMarkerEngine para carregar o template Freemaker. A informação do template e o bean, com os dados dinâmicos para gerar o HTML são definidos no componente ModelAndView.

Nesse outro trecho da controller, o código que coloca a mercadoria em edição:
    ...
    get("/edit/:id", (request, response) -> {
        String idMercadoria = request.params(":id");
        Mercadoria mercadoria = null;
        
        try {
            mercadoria = mercadoriaDao.findById(new ObjectId(idMercadoria));
        } catch (Exception ex) {
            response.redirect("/?error=Registro não econtrado!");
            return null;
        }
         
        SimpleHash root = new SimpleHash();
        root.put("activeIncluir", true);
        root.put("mercadoria", new MercadoriaConverter().toRequest(mercadoria));
            
        return new ModelAndView(root, "mercadoria_template.ftl");
    }, new CustomFreeMarkerEngine());
    ...

Além do Freemaker, utilizamos nesse projeto o Bootstrap e JQuery.

No site oficial e no Github do Spark são disponibilizados maiores detalhes sobre o projeto.

@edermag

No comments: