Visão geral sobre o Grails Framework
Autor: Paulo Sousa | Publicado: 2014-03-18T03:37:00-03:00



Replicação:&nbsp;pode distribuir, cite o&nbsp;autor&nbsp;e adicione um link para este&nbsp;blog.

Para introduzir, devemos reconhecer que o uso das linguagens compiladas para pseudo-código possibilita uma melhor reutilização do trabalho do desenvolvedor. Ao ser compilado, um determinado sistema pode ser utilizado por vários hardwares. Mas, no caso de sistemas disponibilizados na Web a intenção é diferente. Os sistemas web são tratados com um alto nível de diligência em relação à performance e à compatibilidade. A performance, assim como a compatibilidade, é inevitavelmente influenciada pelo modo de programação e pelas tecnologias utilizadas (frameworks, bibliotecas, banco de dados, etc). Por isto, deve ser priorizada a utilização de ferramentas que &nbsp;induzam o desenvolvedor a realizar o seu trabalho da melhor forma. Neste sentido, o Grails (Framework Web Open Source para a plataforma Java) permite que o desenvolvedor foque na lógica de negócios do sistema ao invés de se preocupar na acoplação das tecnologias e nos padrões elementares.

O Grails utiliza a linguagem Groovy que&nbsp;é uma linguagem dinâmica que é executada sobre a JVM.&nbsp;Sobre as linguagens dinâmicas existe um ponto positivo relacionado à codificação: se utiliza menos símbolos e não são necessários de demasiados tratamentos nas operações. A linguagem Groovy teve seu início em 2003 com James Strachan e Bob McWhirter, e em Março de 2004 ele foi liberado seguindo a Java Specification Request (JSR 241). O Groovy foi criado para ser bastante parecida com Java, reduzindo a curva de aprendizagem dos desenvolvedores que já utilizavam o Java.

No Groovy há uma série de funções embutidas que auxiliam muito o desenvolvedor. Um bom exemplo disto é a função .each{} presente em todas as coleções de objetos que é utilizada para executar uma closure com os dados da coleção.

Grails Framework

Grails é um Framework Web Open Source e Full-stack (ambiente configurado com os principais recursos necessários para o desenvolvimento de um sistema Web que funcione de forma unificada). Ele é executado no Java Virtual Machine (JVM) e adota o modelo de desenvolvimento Model-view-controller (MVC). O MVC é um modelo de organização da arquitetura de sistemas Web que divide o desenvolvimento em três camadas: model, view e controller e tem como principal objetivo a separação da lógica, da persistência de dados e da visualização da aplicação.

O Grails é composto por um Servlet Container (servidor utilizado internamente para executar as aplicações desenvolvidas) e pelo Spring (framework que realiza o mapeamento dos dados e que é responsável pela convenção dos projetos). Além disso, o Grails utiliza o paradigma Convention Over Configuration (CoC). O CoC, em português, programação por convenção, é um modo de desenvolvimento que tem por objetivo diminuir a necessidade de tomada de decisão por meio do desenvolvedor. Neste paradigma são adotadas todas as configurações que são comumente utilizadas nos sistemas e caso haja necessidade, o desenvolvedor pode realizar as alterações desejadas.

Embora o Grails utiliza o Groovy como sua linguagem de programação padrão, ele também permite a utilização e até mesmo a intercalação com a linguagem Java. Isso é possível pelo fato de toda a codificação ser compilada para Bytecode Java e por ser interpretada pela JVM. Na Figura abaixo pode ser observada a arquitetura do Grails.





Arquitetura do Grails


O Grails Framework é composto por muitos componentes que juntos proporcionam um ambiente integrado com os principais recursos necessários para o desenvolvimento de um sistema. A seguir será definido cada um destes componentes.

Models (Domains): este conceito compreende o conjunto das entidades que existem num determinado sistema. Nele são definidas as propriedades e as operações básicas de um sistema. Cada Model representa uma tabela no banco de dados. Além disso, nos domains pode ser especificado o mapeamento da classe e das propriedades com as tabelas do banco. Uma das formas para se criar um Model é utilizando o seguinte comando: $ grails create-domain-class Sample.

Após a execução desse comando, será criada a classe Sample no arquivo SampleClass. Outra opção importante nos Models são as constraints (parte do código onde é possível especificar regras de validação na inserção dos dados).

Views: páginas que são criadas para serem apresentadas para o usuário. São conhecidas por Groovy Server Pages (GSP). Geralmente, acionam-se estas páginas por meios de controllers que processam uma chamada do cliente e retorna algum parâmetro para uma view de nome correspondente. Por exemplo, uma controller de nome PessoaController, por padrão, sempre retornará o resultado para a view pessoa.gsp, exceto se houver algum redirecionamento para outra controller ou view no decorrer da execução.

Controllers: as controllers interceptam as solicitações do usuário. A partir delas é possível acessar as domains, os services e as funcionalidades disponibilizadas pelos plugins instalados para a aplicação. Segundo Klein (2009, p. 41, tradução nossa) “As classes do controlador são os despachantes de uma aplicação Grails. Todos os pedidos do navegador vêm através de um controlador”. Após cada processamento de um controller é renderizada uma view do sistema.

Services &amp; Plug-in: geralmente, são serviços que realizam atividades que resolvem um determinado problema ou realizam uma determinada operação. Não é aconselhável manter na controller uma lógica que não seja específica de uma única entidade (classe) do sistema. Nestes casos deve-se utilizar os Services. Isso evita que o controller fique muito complexo e facilita o reuso da lógica. No caso dos Plug-ins, não é necessário codificar nenhuma funcionalidade. Eles são disponibilizados no site do Grails e, portanto, é necessário apenas instalá-los e utilizá-los.

SiteMesh: muitos sistemas utilizam alguma forma de organização de templates o que é muito importante para que algumas partes do layout possam ser reutilizadas sem que seja necessário a duplicação de código de interface. No Grails essa técnica é conhecida por SiteMesh. O SiteMesh é um Framework de layout que implementa o padrão design decorator (padrão que pode ser utilizado para estender funcionalidades de um objeto) para renderização do HTML. A utilização do SiteMesh possibilita não apenas a incorporação de conteúdo numa determinada página, mas sim uma fusão de dados.

Spring: o Spring Framework fornece suporte às configurações de infraestrutura que podem ser feitas em nível de aplicação, ou seja, os desenvolvedores não precisarão se preocupar com configurações sobre as tecnologias específicas do ambiente de implantação. Ele inclui injeção de dependência, suporte à programação orientada a aspectos, transações, cache, validação, formatação, suporte ao Hibernate e ao Quartz (serviço de agendamento que pode ser utilizado por qualquer aplicação Java) (SPRING, 2013, online).

GORM: recurso para mapeamento objeto relacional de aplicações Grails que utiliza o Hibernate 3.

Hibernate: Framework que propicia o mapeamento entre os campos de uma base de dados ao modelo-objeto de aplicações Java. Ao utilizá-lo pode-se optar por utilizar SQL ou Hibernate Query Language (HQL) que é uma linguagem cujas operações são realizadas com base nos objetos da aplicação.

HSQLDB: é o banco de dados padrão do Grails. Ao iniciar uma aplicação, se nenhuma configuração for realizada no arquivo Datasource.Groovy que fica na pasta Grails-app\conf dentro da aplicação, os dados serão armazenados no HSQLDB. Porém, na próxima vez que o sistema for iniciado os dados não estarão mais disponíveis. &nbsp; &nbsp; 

Gant: ferramenta utilizada no acionamento de tarefas de script Ant (biblioteca Java utilizada na construção de aplicações Java e no gerenciamento de dependências). Diferente do Ant, o Gant utiliza a linguagem Groovy em vez de XML para especificar o que deve ser feito na aplicação.

Java Enterprise Edition: plataforma de programação que possibilita o funcionamento de aplicações desenvolvidas em linguagens cujo compilador de Bytecodes tenha suporte à plataforma Java. Dentre estas linguagens pode-se mencionar o Java, o Scala, o Clojure e o Groovy.

Groovy: linguagem de Programação que é utilizada no desenvolvimento de sistemas baseados no Grails. Apesar do Grails também aceitar a linguagem de programação Java, o Groovy possui muitas vantagens em relação ao Java, entre elas pode-se citar os seguintes: Spread Operator, Elvis Operator, Safe Navigation, Getters e Setters implícitos. Abaixo é exposta a definição destes conceitos.


Spread Operator: recurso utilizado para acionar operações numa única instrução para todo um conjunto de elementos pertencentes a um determinado objeto. Este recurso é, geralmente, utilizado em collections sendo necessário utilizar apenas um asterisco antes da chamada do método (colecaoDeObjetos*.metodo()). O retorno da operação é um array contendo o retorno de cada chamada ao método.
Elvis Operator: operador ternário simplificado que utiliza a instrução “?:” para verificar se um objeto é falso ou nulo e, em caso afirmativo, retorna um valor determinado, caso contrário, retorna o próprio objeto verificado, conforme o seguinte exemplo: def displayName = user.name ?: "Anonymous".
Safe Navigation: verifica se um objeto está nulo antes de acessar suas propriedades ou seus métodos, evitando-se assim, a ocorrência de um NullPointerException. Utiliza-se este conceito conforme o exemplo a seguir: objeto?.propriedade. Dessa forma, o sistema apenas acessa a propriedade se o objeto não estiver nulo.
Getters e Setters: no Groovy não é necessário definir os Getters e Setters. A partir do momento em que as propriedades são definidas nos models, estes métodos são criados implicitamente.


Java Virtual Machine: máquina virtual que executa aplicações Java. Ela converte os Bytecodes em código de máquina permitindo que uma mesma aplicação seja executada em diversos tipos de hardware desde que exista uma versão apropriada da JVM para o hardware respectivo.

&nbsp;Jetty: o&nbsp;Jetty é o Servlet Container padrão do Grails. Ele é um projeto open-source livre para distribuição e uso comercial que foi desenvolvido em Java que provê um servidor HTTP, um cliente HTTP e um Servlet Container. Ele é muito utilizado pelos desenvolvedores por ser de fácil configuração, eliminando desperdício de tempo nos testes (ECLIPSE, 2013, online).

O Jetty é concorrente do Apache Tomcat (Servlet Container) e ficou bastante conhecido por ter sido utilizado no JBoss. O Jetty é disponibilizado pela fundação Eclipse e as suas versões anteriores são mantidas pelo Codehaus (ambiente colaborativo para a construção de projetos de código aberto).