18 de out de 2012

Velocity Template Language (VTL)



Bom, decidi começar a escrever esse blog para compartilhar meus conhecimentos, experiências e mágoas que todos esses anos programando em Java me proporcionaram. Comecemos então pelas mágoas!

Se tem uma coisa que eu odeio em Java é JSP. Onde já se viu inserir código Java na camada de View? Ah, mas você pode usar as tag-libs... Aí eu te pergunto, você já fez um for, if ou criou uma variável usando tag-lib? Tem que concordar comigo que o negócio é difícil e nem um pouco intuitivo.

Deixando um pouco bronca de lado, para a minha alegria um certo dia fui apresentado ao Velocity, e desde então mandei o JSP pra PQP.

O Velocity é uma linguagem de template desenvolvida em Java. Ela pode ser usada tanto para aplicações standalone, que podem ser geradores de relatórios por exemplo, quanto para aplicações web sendo a camada de view do MVC.

Para começar vamos criar uma aplicação standalone simples usando velocity, só para ter uma noção de como a engine funciona e as suas principais tags de marcação.

Para construir o aplicativo vamos usar um projeto maven. Se você não tem a mínima idéia do que seja isso, chegou a hora de aprender. Tudo o que você precisa saber está nesse link: http://maven.apache.org/.

Dentro do nosso pom.xml você deve, portanto, inserir o velocity como dependencia.
    
      org.apache.velocity
      velocity
      1.7      
     
Aqui estão os passos para se criar a aplicação:
  1. Criar uma instância do VelocityEngine
  2. Criar um contexto onde serão inseridos as instâncias de objetos que o template vai utilizar
  3. Carregar um template
  4. Efetuar o merge do template com o contexto e obter o resultado, que é saída renderizada.
package com.velocityexemplo;

import java.io.StringWriter;
import java.io.Writer;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;

/**
 * Hello Velocity!
 *
 */
public class App {

    public static void main(String[] args) {
        VelocityEngine velocity = new VelocityEngine();
        velocity.init(ClassLoader.getSystemResource("velocity.properties").getFile());

        VelocityContext context = new VelocityContext();
        context.put("name", "Fulano");
        context.put("lista", new String[]{"Tomate","Cebola", "Macarrão", "Arroz", "Feijão"});

        Template template = velocity.getTemplate("hello-velocity.vm");    
        
        Writer writer = new StringWriter();
        template.merge(context, writer);
        
        System.out.println(writer);
    }
}

Na linha 3 você vai perceber que a engine foi inicializada utilizando um arquivo de configuração (velocity.properties). Não vou entrar em detalhes sobre a configuração, que você poderá obter no site oficial do projeto. A única linha relevante para entender o funcionamento do programa é essa aqui:
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader

Isso significa que os templates serão carregados a partir do classpath do projeto. Mas existe a possibilidade de carregá-los através de um diretório externo no filesystem da máquina.
Enfim... nas linhas seguintes foram criadas uma variável e um array. E o merge feito com o template hello-velocity.vm.
Até agora nós apenas criamos o aplicativo. A parte interessante vem a seguir... o template!
#include('header.vm')

Olá $name!

Aqui está a lista de compras do supermercado.

Lista de compras:
#set($count = 1)
#foreach($item in $lista)
  #if($item == 'Arroz')
    $count - $item (não esquecer)
  #else
    $count - $item 
  #end
  #set($count = $count + 1)    
#end

#parse('footer.vm')

A instrução #include, na linha 1, faz a inclusão de outro template.
A linha 3 faz a impressão da variável $name, incluida no contexto.
A instrução #set cria uma variável, neste caso um contador.
O #foreach faz a iteração sobre uma lista de objetos.
A instrução condicional #if/#elseif/#else é trivial.
E no final o #parse faz a inclusão de um template, mas diferentemente do #include, o #parse interpreta as instruções VLT(Velocity Template Language).

Bom, para um primeito post acho que está de bom tamanho. Para conhecer a fundo as instruções do Velocity, seguem abaixo os links. E no próximo post, minha dupla favorita. Não é o "Victor & Leo", e sim "Struts2 & Velocity".

http://velocity.apache.org/
http://velocity.apache.org/engine/devel/vtl-reference-guide.html

Código fonte: http://depositfiles.com/files/9marhpe10

Tá tirando, mano? Aqui é Java!

2 comentários:

  1. Olá, estou com um programa de cadastro de dados pessoais simples, desktop, utilizando o eclipse e maven. Sou novo na área, adicionei o velocity pelo maven mas no método main, ao pedir para importar as bibliotecas o java não reconnhece. Preciso de criar um software desktop e me parece que o velocity não serve, seria mais para java web?

    ResponderExcluir
  2. Adicionando, eu precisaria do velocity só para gerar uns relatórios em html a partir dos meus cadastros...

    ResponderExcluir