O Grails é um framework web open-source que utiliza a linguagem Groovy, e outros frameworks consagrados como Hibernate, Spring e Sitemesh. O grails foi projetado para desenvolver aplicações CRUD (Create Read Update Delete) de forma simples e ágil, utilizando o modelo de “escrever código por convenção” introduzido pelo Ruby on Rails. O Grails está se propondo a trazer a produtividade do Ruby on Rails para a plataforma Java, porém ele possui uma grande vantagem, sendo que a linguagem Groovy roda sobre uma JVM, e pode utilizar classes Java e as diversas APIs que existem normalmente.

Neste artigo vamos construir uma aplicação CRUD para duas tabelas: Pessoa e Carro, sendo que uma Pessoa pode possuir vários carros. Uma busca de carros com AJAX também será implementada. Para demonstrar a integração com uma outra API, um exemplo de geração de PDF será implementado com o framework iText.

A linguagem Groovy

Groovy (padronizado pela JSR-241) é uma linguagem dinâmica e ágil para a plataforma Java, que possui muitas características de linguagens de script como Ruby, Python e Smalltalk, e ainda pode utilizar classes Java facilmente.

A sintaxe da linguagem também é similar ao Java, permitindo que os desenvolvedores Java se sintam em “casa” ao desenvolver aplicações ou ao começar a estudar o Groovy.

Linguagens de script estão ganhando cada vez mais popularidade, devido a quantidade reduzida de código fonte necessário para implementar determinadas funcionalidades, se comparado com uma implementação em Java. Veremos neste artigo como o Groovy realiza a integração com o Hibernate, e como é possível utilizar “métodos dinâmicos” sem implementar o código, tudo devido a flexibilidade da linguagem Groovy.

Para saber mais sobre Groovy é recomendável a leitura da edição 32 da revista Java Magazine.

Instalando o Grails

Para instalar o Grails basta descompactar o arquivo em alguma pasta, por exemplo c:\grails no Windows. A variável GRAILS_HOME deve ser configurada para este diretório. A variável PATH deve apontar para %GRAILS_HOME%\bin

Pronto! Após isto já é possível abrir um prompt e digitar “grails”.

Criando o Projeto

Abra um prompt, entre na pasta onde o projeto deverá ser criado e digite o comando grails create-app e informe o nome do projeto. Digite exemplo para este artigo.

 create-app:
 [input] Enter application name:
 exemplo
  > cd exemplo
  > grails create-app

Uma pasta com o nome do projeto, neste caso “exemplo”, será criada no diretório atual. Ainda no prompt, entre neste diretório para digitar os próximos comandos. A estrutura de diretórios é bastante simples, na pasta grails-app é onde ficam a maioria dos arquivos necessários para a aplicação:

%PROJECT_HOME%
 + grails-app
 + conf >> arquivos de configuração como DataSource
 + controllers >> Pasta onde ficam os controllers
 + domain >> Domain Model
 + i18n >> arquivo properties para internacionalização
 + services >> Classes que atuam como Serviços
 + taglib >> tag libraries
 + views >> Páginas em GSP ou JSP
 + layouts >> Templates para as páginas
 + lib >> Diretórios para inserir os jar’s
 + spring >> Para configurar os beans do Spring (opcional)
 + hibernate >> Para configurar o mapeamento do Hibernate manualmente (opcional)
 + war > A pasta war é onde fica o projeto Web.
 + WEB-INF > O commando “grails war” cria um “.war” pronto para ser instalado em
 um Servlet Container

Configurando o banco de dados

Para configurar o banco de dados utilizado pela aplicação, pode-se editar o arquivo /exemplo/grails-app/conf/ApplicationDataSource.groovy, o qual define a data source de conexão com o banco de dados, que por default é utilizado o HSQL em memória.

Para este artigo, não é necessário alterar nada neste arquivo, mas caso seja necessário utilizar outro banco de dados, basta alterar os parâmetros e copiar o driver JDBC para o diretório lib do projeto criado.

class ApplicationDataSource {
  boolean pooling = true
  String dbCreate = "create-drop" // 'create', 'create-drop','update'
  String url = "jdbc:hsqldb:mem:testDB"
  String driverClassName = "org.hsqldb.jdbcDriver"
  String username = "sa"
  String password = ""
}

O parâmetro dbCreate pode ser configurado para criar o banco de dados toda vez que reinciar a aplicação, ou somente para atualizar o banco caso novas tabelas ou colunas sejam encontradas. Caso as tabelas já existam e não devem ser alteradas, que é o caso de banco de dados legados, basta comentar esta linha.

Criando uma aplicação CRUD

Para criar aplicações CRUD com o Grails, é necessário criar as classes que serão persistidas. Vamos criar as classes Pessoa e Carro, onde uma Pessoa pode ter vários Carros.

Antes de continuar, certifique-se que você está no diretório do projeto criado anteriormente.

Abra o prompt e digite grails create-domain-class para criar uma classe, e informe o nome. Faça este procedimento para a classe Pessoa e Carro, conforme abaixo:

 > grails create-domain-class
 create-domain-class:
 [input] Enter domain class name:
 Pessoa
  …..
 > grails create-domain-class
 create-domain-class:
 [input] Enter domain class name:
 Carro

Os arquivos Pessoa.groovy e Carro.groovy serão criados no diretório exemplo/grails-app/domain. Edite os arquivos conforme abaixo:

class Pessoa { 
 Long id
 Long version

 String nome
 String email

 def relatesToMany = [ carros : Carro ]
 Set carros = new HashSet()

 String toString() { "${this.class.name} : $id" }
}

class Carro { 
 Long id
 Long version

 String nome
 int ano
 Date dataVenda

 Pessoa pessoa

 String toString() { "${this.class.name} : $id" }
}

O próximo passo é gerar a camada de controller e view para as classes acima, que pode ser facilmente feito pelo comando grails generate-all, conforme abaixo:

 > grails generate-all
 
 input-domain-class:
 [input] Enter domain class name:
 Pessoa
 …
 …
 > grails generate-all

 input-domain-class:
 [input] Enter domain class name:
 Carro

As classes de controle para a Pessoa e Carro foram criadas na pasta exemplo/grails-app/controllers e as views foram geradas na pasta exemplo/grails-app/views.

Pronto! Uma aplicação CRUD para cadastrar Pessoas e Carros acabou de ser construída. Agora podemos iniciar a aplicação através do comando grails run-app. Como a data source explicada anteriormente está configurada com o parâmetro dbCreate = create-drop", o bancode dados será automaticamente criado ao iniciar a aplicação.

A porta default do servidor é 8080, para alterar basta passar o argumento “server.port”, conforme abaixo.

 > grails run-app -Dserver.port=80
 …
 …
 …
 Run-app:watch-context:
 …

Acesse a aplicação em http://localhost/exemplo/, e os controles cadastrados poderão ser visualizados conforme a seguinte imagem:

fig01grails.JPG

Cadastre uma nova pessoa conforme visualizado abaixo, e depois crie um Carro para esta Pessoa.

fig02grails.JPG
fig03grails.JPG

Como você pode perceber, o Grails gerou uma aplicação CRUD completa para as classes desejadas, e também controlou o relacionamento de 1 para muitos que existe entre as tabelas Pessoa e Carro. Internamente o Grails utiliza o Hibernate para realizar a persistência.

Entendendo o código fonte gerado

Os “Controles” ficam na pasta exemplo/grails-app/controllers e as views em exemplo/grails-app/views. Abra a classe PessoaController.groovy e note que existe uma “action” para cada funcionalidade da aplicação, como listar todas as pessoas, criar uma nova, deletar, etc. A sintaxe é bastante simples, vamos verificar alguns pontos do código:

  def show = {
  [ pessoa : Pessoa.get( params.id ) ]
  }

A Action “show” mostra um pouco do poder do Grails, note que em apenas 1 linha, foi feito uma busca pelo ID da Pessoa, e criado uma variável “pessoa”, que é automaticamente inserida na request e pode ser acessada na página (show.gsp). Note que nenhum arquivo XML precisa ser configurado, e o arquivo show.gsp é utilizado por convenção, sendo que ele possui o mesmo nome da action.

O exemplo acima também mostra como a linguagem é dinâmica, note que o params.id retorna o parâmetro “id” passado como parâmetro, mas não foi necessário fazer um cast para chamar a função get. Também observe que a função get não foi implementada em lugar nenhum. Isto faz parte do pattern “Active Record” proposto pelo Marin Fowler, e utilizado extensivamente no Ruby on Rails. Neste pattern os objetos de modelo já possuem métodos de lógica de negócios e persistência.

Outros métodos podem ser utilzados, como save, delete, count, find, etc. Verifique no código fonte das classes de Controller como alguns destes métodos são utilizados.

Ainda métodos totalmente dinâmicos pode ser utilizados para consultar os objetos.

Na próxima seção, um exemplo de método dinâmico será implementado para realizar a busca de um Carro cadastrado.